UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

700 lines (699 loc) 63 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { Http, RequestOptions } from '@angular/http'; import { CONNECTION_DATA } from '../share/IConnectionManager'; import { BackgroundProcessManager } from './BackgroundProcessManager.service'; import { ConnectionManager } from './ConnectionManager.service'; import { DefaultConnectionManager } from '../share/DefaultConnectionManager'; var /** @type {?} */ RUNNING = 'RUNNING'; var /** @type {?} */ BASE_URL = 'http://10.10.2.22/api'; /** * <p style="text-indent: 2em;"> * A <code>ng</code> service class implementing [[InstanceConnectionManager]] service interface. Please see [[InstanceConnectionManager]] for more details. * </p> * * @author shiorin, tee4cute */ var InstanceConnectionManager = /** @class */ (function () { function InstanceConnectionManager(connectionManager, http, bgProcessMgr) { this.seletedInstanceId = ""; this.http = http; this.bgProcessMgr = bgProcessMgr; this.connectionManager = connectionManager; this.instanceConnectionManagerMap = {}; } /** * @param {?} instanceUUID * @return {?} */ InstanceConnectionManager.prototype.getNodes = /** * @param {?} instanceUUID * @return {?} */ function (instanceUUID) { if (this.connectionManager !== null && typeof this.connectionManager !== 'undefined') { var /** @type {?} */ url = BASE_URL + "/instance/" + instanceUUID + "/node"; var /** @type {?} */ requestOptionsArgs = new RequestOptions(); return this.connectionManager.getWithHttpInfo(url, requestOptionsArgs); } else { return Promise.reject(null); } }; /** * @param {?} instanceUUID * @param {?=} loginData * @return {?} */ InstanceConnectionManager.prototype.setUpInstance = /** * @param {?} instanceUUID * @param {?=} loginData * @return {?} */ function (instanceUUID, loginData) { var _this = this; return new Promise(function (resolve, reject) { _this.getNodes(instanceUUID).then(function (res) { var /** @type {?} */ itemNodes = JSON.parse(res._body).items; var /** @type {?} */ runnintMode = false; var _loop_1 = function (itemNode) { if (itemNode.status === RUNNING) { runnintMode = true; var /** @type {?} */ conMgr_1 = new DefaultConnectionManager(null, _this.http, _this.bgProcessMgr); conMgr_1.setName(itemNode._uuid); //Set for test. var /** @type {?} */ url = itemNode.serverNode.hostName == "localhost" ? "http://10.10.2.22" : itemNode.serverNode.hostName; url += ":" + itemNode.servicePort + "/api"; conMgr_1.addBaseURLs(url); if (loginData !== undefined) { url += "/user/login"; _this.connectionManager.postWithHttpInfo(url, loginData, new RequestOptions()).then(function (res) { var /** @type {?} */ sessionId = JSON.parse((/** @type {?} */ (res))._body).sessionId; conMgr_1.setDefaultHeader('Session-Id', sessionId); _this.instanceConnectionManagerMap[instanceUUID] = conMgr_1; resolve(itemNodes); }).catch(function (error) { _this.instanceConnectionManagerMap[instanceUUID] = conMgr_1; reject(error); }); } else { _this.instanceConnectionManagerMap[instanceUUID] = conMgr_1; } } }; try { for (var itemNodes_1 = tslib_1.__values(itemNodes), itemNodes_1_1 = itemNodes_1.next(); !itemNodes_1_1.done; itemNodes_1_1 = itemNodes_1.next()) { var itemNode = itemNodes_1_1.value; _loop_1(itemNode); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (itemNodes_1_1 && !itemNodes_1_1.done && (_a = itemNodes_1.return)) _a.call(itemNodes_1); } finally { if (e_1) throw e_1.error; } } if (loginData === undefined) { if (runnintMode) { resolve(itemNodes); } reject(itemNodes); } var e_1, _a; }).catch(function (error) { reject(error); }); }); }; /** * @param {?} instanced * @return {?} */ InstanceConnectionManager.prototype.setUpInstances = /** * @param {?} instanced * @return {?} */ function (instanced) { if (instanced === undefined || instanced === null) { return Promise.resolve([]); } var /** @type {?} */ proms = []; for (var /** @type {?} */ instanceUUID in instanced) { if (instanceUUID === null || instanceUUID === undefined) { continue; } proms.push(this.setUpInstance(instanceUUID, instanced[instanceUUID])); } return Promise.all(proms); }; /** * @param {?} instanceUUID * @return {?} */ InstanceConnectionManager.prototype.tearDownInstance = /** * @param {?} instanceUUID * @return {?} */ function (instanceUUID) { delete this.instanceConnectionManagerMap[instanceUUID]; }; /** * @return {?} */ InstanceConnectionManager.prototype.getInstanceConnectionManager = /** * @return {?} */ function () { if (this.seletedInstanceId === undefined || this.seletedInstanceId === null) { return null; } return this.instanceConnectionManagerMap[this.seletedInstanceId]; }; /** * @param {?} instanceUUID * @return {?} */ InstanceConnectionManager.prototype.selectInstance = /** * @param {?} instanceUUID * @return {?} */ function (instanceUUID) { this.seletedInstanceId = instanceUUID; }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.get = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().get(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.getWithHttpInfo = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().getWithHttpInfo(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.post = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().post(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.postWithHttpInfo = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().postWithHttpInfo(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.put = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().put(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.putWithHttpInfo = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().putWithHttpInfo(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.delete = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().delete(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.deleteWithHttpInfo = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().deleteWithHttpInfo(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.patch = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().patch(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.patchWithHttpInfo = /** * @param {?} url * @param {?} body * @param {?} requestOptionsArgs * @return {?} */ function (url, body, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().patchWithHttpInfo(url, body, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.head = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().head(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.headWithHttpInfo = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().headWithHttpInfo(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.options = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().options(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.optionsWithHttpInfo = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().optionsWithHttpInfo(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.request = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().request(url, requestOptionsArgs); }; /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ InstanceConnectionManager.prototype.requestWithHttpInfo = /** * @param {?} url * @param {?} requestOptionsArgs * @return {?} */ function (url, requestOptionsArgs) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { return Promise.reject('Connection Manager is not setup yes.'); } return this.getInstanceConnectionManager().requestWithHttpInfo(url, requestOptionsArgs); }; /** * @return {?} */ InstanceConnectionManager.prototype.getRunningProcessesCount = /** * @return {?} */ function () { if (this.seletedInstanceId === null || this.seletedInstanceId === undefined) { return null; } if (this.bgProcessMgr != null && typeof this.bgProcessMgr !== 'undefined') { this.bgProcessMgr.getRunningProcessesCount(CONNECTION_DATA, this.seletedInstanceId); } return 0; }; /** * @return {?} */ InstanceConnectionManager.prototype.getRunningProcesses = /** * @return {?} */ function () { if (this.seletedInstanceId === null || this.seletedInstanceId === undefined) { return null; } if (this.bgProcessMgr != null && typeof this.bgProcessMgr !== 'undefined') { this.bgProcessMgr.getRunningProcesses(CONNECTION_DATA, this.seletedInstanceId); } return []; }; /** * @return {?} */ InstanceConnectionManager.prototype.getConnectionQuality = /** * @return {?} */ function () { // TODO return this.connectionManager.getConnectionQuality(); }; /** * @param {?} urls * @return {?} */ InstanceConnectionManager.prototype.setBaseURLs = /** * @param {?} urls * @return {?} */ function (urls) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().setBaseURLs(urls); }; /** * @return {?} */ InstanceConnectionManager.prototype.resetBaseURLs = /** * @return {?} */ function () { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().resetBaseURLs(); }; /** * @param {?} key * @param {?} value * @return {?} */ InstanceConnectionManager.prototype.setDefaultHeader = /** * @param {?} key * @param {?} value * @return {?} */ function (key, value) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().setDefaultHeader(key, value); }; /** * @param {?} key * @return {?} */ InstanceConnectionManager.prototype.removeDefaultHeader = /** * @param {?} key * @return {?} */ function (key) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().removeDefaultHeader(key); }; /** * @return {?} */ InstanceConnectionManager.prototype.resetDefaultHeaders = /** * @return {?} */ function () { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().resetDefaultHeaders(); }; /** * @param {?} key * @param {?} value * @return {?} */ InstanceConnectionManager.prototype.setSearch = /** * @param {?} key * @param {?} value * @return {?} */ function (key, value) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().setSearch(key, value); }; /** * @param {?} key * @return {?} */ InstanceConnectionManager.prototype.removeSearch = /** * @param {?} key * @return {?} */ function (key) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().removeSearch(key); }; /** * @return {?} */ InstanceConnectionManager.prototype.resetSearch = /** * @return {?} */ function () { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().resetSearch(); }; /** * @param {?} key * @param {?} value * @return {?} */ InstanceConnectionManager.prototype.setParam = /** * @param {?} key * @param {?} value * @return {?} */ function (key, value) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().setParam(key, value); }; /** * @param {?} key * @return {?} */ InstanceConnectionManager.prototype.removeParam = /** * @param {?} key * @return {?} */ function (key) { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().removeParam(key); }; /** * @return {?} */ InstanceConnectionManager.prototype.resetParams = /** * @return {?} */ function () { if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().resetParams(); }; /** * @return {?} */ InstanceConnectionManager.prototype.getName = /** * @return {?} */ function () { return this.name; }; /** * @param {?} name * @return {?} */ InstanceConnectionManager.prototype.setName = /** * @param {?} name * @return {?} */ function (name) { this.name = name; if (this.getInstanceConnectionManager() === null || this.getInstanceConnectionManager() === undefined) { throw ('Connection Manager is not setup yes.'); } this.getInstanceConnectionManager().setName(name); }; /** * @template R * @param {?} type * @return {?} */ InstanceConnectionManager.prototype.createResource = /** * @template R * @param {?} type * @return {?} */ function (type) { return this.getInstanceConnectionManager().createResource(type); }; InstanceConnectionManager.decorators = [ { type: Injectable }, ]; /** @nocollapse */ InstanceConnectionManager.ctorParameters = function () { return [ { type: ConnectionManager, }, { type: Http, }, { type: BackgroundProcessManager, }, ]; }; return InstanceConnectionManager; }()); export { InstanceConnectionManager }; function InstanceConnectionManager_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ InstanceConnectionManager.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ InstanceConnectionManager.ctorParameters; /** @type {?} */ InstanceConnectionManager.prototype.instanceConnectionManagerMap; /** @type {?} */ InstanceConnectionManager.prototype.connectionManager; /** @type {?} */ InstanceConnectionManager.prototype.http; /** @type {?} */ InstanceConnectionManager.prototype.bgProcessMgr; /** @type {?} */ InstanceConnectionManager.prototype.seletedInstanceId; /** @type {?} */ InstanceConnectionManager.prototype.name; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZS9JbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQVksY0FBYyxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQXNCLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWhFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTdFLHFCQUFNLE9BQU8sR0FBVyxTQUFTLENBQUM7QUFDbEMscUJBQU0sUUFBUSxHQUFXLHVCQUF1QixDQUFDOzs7Ozs7Ozs7SUFvQjdDLG1DQUFZLGlCQUFvQyxFQUFFLElBQVUsRUFBRSxZQUFzQztRQUVoRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0tBRTFDOzs7OztJQUVPLDRDQUFROzs7O2NBQUMsWUFBb0I7UUFDakMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25GLHFCQUFJLEdBQUcsR0FBUSxRQUFRLEdBQUcsWUFBWSxHQUFHLFlBQVksR0FBRyxPQUFPLENBQUM7WUFFaEUscUJBQUksa0JBQWtCLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUU5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUMxRTtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7Ozs7Ozs7SUFHRSxpREFBYTs7Ozs7Y0FBQyxZQUFvQixFQUFFLFNBQWU7O1FBRXRELE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQy9CLEtBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRztnQkFDakMscUJBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFFNUMscUJBQUksV0FBVyxHQUFHLEtBQUssQ0FBQzt3Q0FDZixRQUFRO29CQUNiLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQzt3QkFFOUIsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDbkIscUJBQUksUUFBTSxHQUFHLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO3dCQUM5RSxRQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7d0JBRy9CLHFCQUFJLEdBQUcsR0FBVyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzt3QkFDbkgsR0FBRyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQzt3QkFDM0MsUUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFFeEIsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBRTFCLEdBQUcsSUFBSSxhQUFhLENBQUM7NEJBQ3JCLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxHQUFHO2dDQUNuRixxQkFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBQyxHQUFVLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0NBQ3pELFFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0NBQ2pELEtBQUksQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFNLENBQUM7Z0NBQ3pELE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs2QkFDdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0NBQ1gsS0FBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQU0sQ0FBQztnQ0FDekQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUNqQixDQUFDLENBQUM7eUJBQ047d0JBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ0osS0FBSSxDQUFDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQU0sQ0FBQzt5QkFDNUQ7cUJBQ0o7OztvQkEzQkwsR0FBRyxDQUFDLENBQWlCLElBQUEsY0FBQSxpQkFBQSxTQUFTLENBQUEsb0NBQUE7d0JBQXpCLElBQUksUUFBUSxzQkFBQTtnQ0FBUixRQUFRO3FCQTRCaEI7Ozs7Ozs7OztnQkFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzt3QkFDZCxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ3RCO29CQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDckI7O2FBRUosQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFDLEtBQUs7Z0JBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pCLENBQUMsQ0FBQztTQUNOLENBQUMsQ0FBQzs7Ozs7O0lBSUEsa0RBQWM7Ozs7Y0FBQyxTQUFjO1FBRWhDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDOUI7UUFFRCxxQkFBSSxLQUFLLEdBQW1CLEVBQUUsQ0FBQztRQUUvQixHQUFHLENBQUMsQ0FBQyxxQkFBSSxZQUFZLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxRQUFRLENBQUM7YUFDWjtZQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFJdkIsb0RBQWdCOzs7O2NBQUMsWUFBb0I7UUFDeEMsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUM7Ozs7O0lBR3BELGdFQUE0Qjs7OztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDZjtRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Ozs7OztJQUc5RCxrREFBYzs7OztjQUFDLFlBQW9CO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7Ozs7Ozs7SUFHbkMsdUNBQUc7Ozs7O2NBQUMsR0FBVyxFQUFFLGtCQUFzQztRQUMxRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7OztJQUdyRSxtREFBZTs7Ozs7Y0FBQyxHQUFXLEVBQUUsa0JBQXNDO1FBQ3RFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7OztJQUdqRix3Q0FBSTs7Ozs7O2NBQUMsR0FBVyxFQUFFLElBQVMsRUFBRSxrQkFBc0M7UUFDdEUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7OztJQUc1RSxvREFBZ0I7Ozs7OztjQUFDLEdBQVcsRUFBRSxJQUFTLEVBQUUsa0JBQXNDO1FBQ2xGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7OztJQUd4Rix1Q0FBRzs7Ozs7O2NBQUMsR0FBVyxFQUFFLElBQVMsRUFBRSxrQkFBc0M7UUFDckUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7OztJQUczRSxtREFBZTs7Ozs7O2NBQUMsR0FBVyxFQUFFLElBQVMsRUFBRSxrQkFBc0M7UUFDakYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7O0lBR3ZGLDBDQUFNOzs7OztjQUFDLEdBQVcsRUFBRSxrQkFBc0M7UUFDN0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7SUFHeEUsc0RBQWtCOzs7OztjQUFDLEdBQVcsRUFBRSxrQkFBc0M7UUFDekUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7Ozs7SUFHcEYseUNBQUs7Ozs7OztjQUFDLEdBQVcsRUFBRSxJQUFTLEVBQUUsa0JBQXNDO1FBQ3ZFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7Ozs7SUFHN0UscURBQWlCOzs7Ozs7Y0FBQyxHQUFXLEVBQUUsSUFBUyxFQUFFLGtCQUFzQztRQUNuRixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7OztJQUd6Rix3Q0FBSTs7Ozs7Y0FBQyxHQUFXLEVBQUUsa0JBQXNDO1FBQzNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7O0lBR3RFLG9EQUFnQjs7Ozs7Y0FBQyxHQUFXLEVBQUUsa0JBQXNDO1FBQ3ZFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDakU7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7SUFHbEYsMkNBQU87Ozs7O2NBQUMsR0FBVyxFQUFFLGtCQUFzQztRQUM5RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7OztJQUd6RSx1REFBbUI7Ozs7O2NBQUMsR0FBVyxFQUFFLGtCQUFzQztRQUMxRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDOzs7Ozs7O0lBR3JGLDJDQUFPOzs7OztjQUFDLEdBQVcsRUFBRSxrQkFBc0M7UUFDOUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Ozs7Ozs7SUFHekUsdURBQW1COzs7OztjQUFDLEdBQVcsRUFBRSxrQkFBc0M7UUFDMUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNqRTtRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQzs7Ozs7SUFHckYsNERBQXdCOzs7O1FBRTNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDMUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNmO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDdkY7UUFFRCxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7OztJQUlOLHVEQUFtQjs7OztRQUV0QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDZjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsTUFBTSxDQUFDLEVBQUUsQ0FBQzs7Ozs7SUFHUCx3REFBb0I7Ozs7O1FBRXZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7Ozs7O0lBR2xELCtDQUFXOzs7O2NBQUMsSUFBYztRQUM3QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7SUFHbkQsaURBQWE7Ozs7UUFDaEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQzs7Ozs7OztJQUdqRCxvREFBZ0I7Ozs7O2NBQUMsR0FBVyxFQUFFLEtBQWE7UUFDOUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Ozs7OztJQUc5RCx1REFBbUI7Ozs7Y0FBQyxHQUFXO1FBQ2xDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7O0lBRzFELHVEQUFtQjs7OztRQUN0QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Ozs7Ozs7SUFHdkQsNkNBQVM7Ozs7O2NBQUMsR0FBVyxFQUFFLEtBQVU7UUFDcEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFHdkQsZ0RBQVk7Ozs7Y0FBQyxHQUFXO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7OztJQUduRCwrQ0FBVzs7OztRQUNkLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Ozs7Ozs7SUFHL0MsNENBQVE7Ozs7O2NBQUMsR0FBVyxFQUFFLEtBQVU7UUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEcsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDOzs7Ozs7SUFHdEQsK0NBQVc7Ozs7Y0FBQyxHQUFXO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7OztJQUdsRCwrQ0FBVzs7OztRQUNkLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLE1BQU0sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Ozs7O0lBRy9DLDJDQUFPOzs7O1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Ozs7OztJQUdkLDJDQUFPOzs7O2NBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7OztJQUcvQyxrREFBYzs7Ozs7Y0FBbUMsSUFBMkM7UUFDakcsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O2dCQWxXckUsVUFBVTs7OztnQkFmRixpQkFBaUI7Z0JBSGpCLElBQUk7Z0JBRUosd0JBQXdCOztvQ0FIakM7O1NBb0JhLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHAsIFJlc3BvbnNlLCBSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnNBcmdzLCBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgeyBJQ29ubmVjdGlvbk1hbmFnZXIsIENPTk5FQ1RJT05fREFUQSB9IGZyb20gJy4uL3NoYXJlL0lDb25uZWN0aW9uTWFuYWdlcic7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIgfSBmcm9tICcuL0JhY2tncm91bmRQcm9jZXNzTWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IENvbm5lY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi9Db25uZWN0aW9uTWFuYWdlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFic3RyYWN0U2VydmVyUmVzb3VyY2UgfSBmcm9tICcuLi9zaGFyZS9BYnN0cmFjdFNlcnZlclJlc291cmNlJztcbmltcG9ydCB7IERlZmF1bHRDb25uZWN0aW9uTWFuYWdlciB9IGZyb20gJy4uL3NoYXJlL0RlZmF1bHRDb25uZWN0aW9uTWFuYWdlcic7XG5cbmNvbnN0IFJVTk5JTkc6IHN0cmluZyA9ICdSVU5OSU5HJztcbmNvbnN0IEJBU0VfVVJMOiBzdHJpbmcgPSAnaHR0cDovLzEwLjEwLjIuMjIvYXBpJztcblxuXG4vKipcbiAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDJlbTtcIj5cbiAqIEEgPGNvZGU+bmc8L2NvZGU+IHNlcnZpY2UgY2xhc3MgaW1wbGVtZW50aW5nIFtbSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcl1dIHNlcnZpY2UgaW50ZXJmYWNlLiBQbGVhc2Ugc2VlIFtbSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcl1dIGZvciBtb3JlIGRldGFpbHMuXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElDb25uZWN0aW9uTWFuYWdlciB7XG5cbiAgICBwcml2YXRlIGluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXJNYXA6IGFueTtcbiAgICBwcml2YXRlIGNvbm5lY3Rpb25NYW5hZ2VyOiBDb25uZWN0aW9uTWFuYWdlcjtcbiAgICBwcml2YXRlIGh0dHA6IEh0dHA7XG4gICAgcHJpdmF0ZSBiZ1Byb2Nlc3NNZ3I6IEJhY2tncm91bmRQcm9jZXNzTWFuYWdlcjtcbiAgICBwcml2YXRlIHNlbGV0ZWRJbnN0YW5jZUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uTWFuYWdlcjogQ29ubmVjdGlvbk1hbmFnZXIsIGh0dHA6IEh0dHAsIGJnUHJvY2Vzc01ncjogQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyKSB7XG5cbiAgICAgICAgdGhpcy5zZWxldGVkSW5zdGFuY2VJZCA9IFwiXCI7XG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XG4gICAgICAgIHRoaXMuYmdQcm9jZXNzTWdyID0gYmdQcm9jZXNzTWdyO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyID0gY29ubmVjdGlvbk1hbmFnZXI7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlck1hcCA9IHt9O1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2RlcyhpbnN0YW5jZVVVSUQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IHVybDogYW55ID0gQkFTRV9VUkwgKyBcIi9pbnN0YW5jZS9cIiArIGluc3RhbmNlVVVJRCArIFwiL25vZGVcIjtcblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RPcHRpb25zQXJncyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVwSW5zdGFuY2UoaW5zdGFuY2VVVUlEOiBzdHJpbmcsIGxvZ2luRGF0YT86IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0Tm9kZXMoaW5zdGFuY2VVVUlEKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXRlbU5vZGVzID0gSlNPTi5wYXJzZShyZXMuX2JvZHkpLml0ZW1zO1xuXG4gICAgICAgICAgICAgICAgbGV0IHJ1bm5pbnRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbU5vZGUgb2YgaXRlbU5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtTm9kZS5zdGF0dXMgPT09IFJVTk5JTkcpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmludE1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbk1nciA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvbk1hbmFnZXIobnVsbCwgdGhpcy5odHRwLCB0aGlzLmJnUHJvY2Vzc01ncik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25NZ3Iuc2V0TmFtZShpdGVtTm9kZS5fdXVpZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IGZvciB0ZXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nID0gaXRlbU5vZGUuc2VydmVyTm9kZS5ob3N0TmFtZSA9PSBcImxvY2FsaG9zdFwiID8gXCJodHRwOi8vMTAuMTAuMi4yMlwiIDogaXRlbU5vZGUuc2VydmVyTm9kZS5ob3N0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSBcIjpcIiArIGl0ZW1Ob2RlLnNlcnZpY2VQb3J0ICsgXCIvYXBpXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25NZ3IuYWRkQmFzZVVSTHModXJsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2luRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gXCIvdXNlci9sb2dpblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIucG9zdFdpdGhIdHRwSW5mbyh1cmwsIGxvZ2luRGF0YSwgbmV3IFJlcXVlc3RPcHRpb25zKCkpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2Vzc2lvbklkID0gSlNPTi5wYXJzZSgocmVzIGFzIGFueSkuX2JvZHkpLnNlc3Npb25JZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uTWdyLnNldERlZmF1bHRIZWFkZXIoJ1Nlc3Npb24tSWQnLCBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXJNYXBbaW5zdGFuY2VVVUlEXSA9IGNvbk1ncjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpdGVtTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXJNYXBbaW5zdGFuY2VVVUlEXSA9IGNvbk1ncjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyTWFwW2luc3RhbmNlVVVJRF0gPSBjb25NZ3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobG9naW5EYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbnRNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGl0ZW1Ob2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZWplY3QoaXRlbU5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXBJbnN0YW5jZXMoaW5zdGFuY2VkOiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlZCA9PT0gdW5kZWZpbmVkIHx8IGluc3RhbmNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJvbXM6IFByb21pc2U8YW55PltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5zdGFuY2VVVUlEIGluIGluc3RhbmNlZCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlVVVJRCA9PT0gbnVsbCB8fCBpbnN0YW5jZVVVSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcm9tcy5wdXNoKHRoaXMuc2V0VXBJbnN0YW5jZShpbnN0YW5jZVVVSUQsIGluc3RhbmNlZFtpbnN0YW5jZVVVSURdKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbXMpO1xuXG4gICAgfVxuXG4gICAgcHVibGljIHRlYXJEb3duSW5zdGFuY2UoaW5zdGFuY2VVVUlEOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlck1hcFtpbnN0YW5jZVVVSURdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCk6IENvbm5lY3Rpb25NYW5hZ2VyIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZXRlZEluc3RhbmNlSWQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnNlbGV0ZWRJbnN0YW5jZUlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXJNYXBbdGhpcy5zZWxldGVkSW5zdGFuY2VJZF07XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdEluc3RhbmNlKGluc3RhbmNlVVVJRDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZXRlZEluc3RhbmNlSWQgPSBpbnN0YW5jZVVVSUQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCh1cmw6IHN0cmluZywgcmVxdWVzdE9wdGlvbnNBcmdzOiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkgPT09IG51bGwgfHwgdGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDb25uZWN0aW9uIE1hbmFnZXIgaXMgbm90IHNldHVwIHllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0KHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V2l0aEh0dHBJbmZvKHVybDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uc0FyZ3M6IFJlcXVlc3RPcHRpb25zQXJncyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0SW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcigpID09PSBudWxsIHx8IHRoaXMuZ2V0SW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcigpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnQ29ubmVjdGlvbiBNYW5hZ2VyIGlzIG5vdCBzZXR1cCB5ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcigpLmdldFdpdGhIdHRwSW5mbyh1cmwsIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3QodXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgcmVxdWVzdE9wdGlvbnNBcmdzOiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBpZiAodGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkgPT09IG51bGwgfHwgdGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDb25uZWN0aW9uIE1hbmFnZXIgaXMgbm90IHNldHVwIHllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKCkucG9zdCh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHBvc3RXaXRoSHR0cEluZm8odXJsOiBzdHJpbmcsIGJvZHk6IGFueSwgcmVxdWVzdE9wdGlvbnNBcmdzOiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIGlmICh0aGlzLmdldEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIoKSA9PT0gbnVsbCB8fCB0aGlzLmdldEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0Nvbm5lY3Rpb24gTWFuYWdlciBpcyBub3Qgc2V0dXAgeWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIoKS5wb3N0V2l0aEh0dHBJbmZvKHVybCwgYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcbiAgICB9XG5cbiAgICBwdW