com.phloxui
Version:
PhloxUI Ng2+ Framework
668 lines (667 loc) • 45.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { LoaderStatus } from './LoaderStatus';
import { EventUtils } from '../share/utils/EventUtils';
import { PAUSE_EVENT, RESUME_EVENT, STOP_EVENT } from '../share/CustomEventType';
var LoadProcessor = /** @class */ (function () {
function LoadProcessor(continueOnReject) {
this.status = LoaderStatus.STOPPED;
this.processes = [];
this.processed = [];
this.disabled = false;
this.isFirstStarted = false;
this.successResult = {};
this.rejectResult = {};
this.processCompleteEvent = new EventEmitter();
this.processResolveEvent = new EventEmitter();
this.processRejectEvent = new EventEmitter();
this.taskStartEvent = new EventEmitter();
this.taskCompleteEvent = new EventEmitter();
this.taskResolveEvent = new EventEmitter();
this.taskRejectEvent = new EventEmitter();
this.pauseEvent = new EventEmitter();
this.resumeEvent = new EventEmitter();
this.startEvent = new EventEmitter();
this.stopEvent = new EventEmitter();
if (continueOnReject === null || typeof continueOnReject !== 'boolean') {
this.continueOnReject = true;
}
else {
this.continueOnReject = continueOnReject;
}
}
/**
* @param {?} type
* @param {?} success
* @param {?} error
* @return {?}
*/
LoadProcessor.prototype.getCustomEventObject = /**
* @param {?} type
* @param {?} success
* @param {?} error
* @return {?}
*/
function (type, success, error) {
var /** @type {?} */ successCount = Object.keys(this.successResult).length;
var /** @type {?} */ errorCount = Object.keys(this.rejectResult).length;
var /** @type {?} */ totalCount = this.processes.length + this.processed.length;
var /** @type {?} */ percent = 0;
if (totalCount > 0) {
percent = this.processes.length * (100 / totalCount);
}
var /** @type {?} */ wrapData = {
success: success,
error: error,
percent: percent,
totalCount: totalCount,
processed: successCount + errorCount,
successCount: successCount,
errorCount: errorCount
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(type, null, wrapData, null);
return ev;
};
/**
* @return {?}
*/
LoadProcessor.prototype.startNextProcess = /**
* @return {?}
*/
function () {
var _this = this;
if (this.processes.length > 0) {
var /** @type {?} */ firstProccess_1 = this.processes[0];
var /** @type {?} */ processName_1 = firstProccess_1.getName();
return firstProccess_1.start().then(function (result) {
_this.successResult[processName_1] = result;
// remove first & insert processed
// remove first & insert processed
_this.remove(0);
_this.processed.push(firstProccess_1);
return _this.startNextProcess();
}, function (rejResult) {
_this.rejectResult[processName_1] = rejResult;
// remove first & insert processed
// remove first & insert processed
_this.remove(0);
_this.processed.push(firstProccess_1);
if (_this.continueOnReject) {
return _this.startNextProcess();
}
return Promise.reject(rejResult);
});
}
return Promise.resolve();
};
/**
* @param {?} disabled
* @return {?}
*/
LoadProcessor.prototype.setDisabled = /**
* @param {?} disabled
* @return {?}
*/
function (disabled) {
this.disabled = disabled;
if (this.processes !== null) {
try {
for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) {
var process_1 = _b.value;
process_1.setDisabled(this.disabled);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
}
var e_1, _c;
};
/**
* @return {?}
*/
LoadProcessor.prototype.isDisabled = /**
* @return {?}
*/
function () {
return this.disabled;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getRunningProcess = /**
* @return {?}
*/
function () {
try {
for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) {
var loadProcess = _b.value;
if (loadProcess.isRunning() || loadProcess.isPaused()) {
return loadProcess;
}
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_2) throw e_2.error; }
}
return null;
var e_2, _c;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getRunningPercent = /**
* @return {?}
*/
function () {
var /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
return runningProcess.getPercent();
}
return 0;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getRunningTaskCount = /**
* @return {?}
*/
function () {
var /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
return runningProcess.getTaskCount();
}
return 0;
};
/**
* @param {?} process
* @return {?}
*/
LoadProcessor.prototype.addProcess = /**
* @param {?} process
* @return {?}
*/
function (process) {
var _this = this;
if (process !== null && process !== undefined) {
process.setContinueOnReject(this.continueOnReject);
process.getTaskRejectEvent().subscribe(function (event) {
_this.taskRejectEvent.emit(event);
});
process.getTaskResolveEvent().subscribe(function (event) {
_this.taskResolveEvent.emit(event);
});
process.getTaskCompleteEvent().subscribe(function (event) {
_this.taskCompleteEvent.emit(event);
});
process.getTaskStartEvent().subscribe(function (event) {
_this.taskStartEvent.emit(event);
});
this.processes.push(process);
}
return this;
};
/**
* @param {?} process
* @return {?}
*/
LoadProcessor.prototype.removeProcess = /**
* @param {?} process
* @return {?}
*/
function (process) {
var /** @type {?} */ index = this.processes.indexOf(process);
return this.remove(index);
};
/**
* @param {?} index
* @return {?}
*/
LoadProcessor.prototype.remove = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (index < this.processes.length) {
this.processes.splice(index, 1);
}
return this;
};
/**
* @return {?}
*/
LoadProcessor.prototype.start = /**
* @return {?}
*/
function () {
var _this = this;
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isFirstStarted) {
throw new Error('Process was started or has been process');
}
if (this.isStopped()) {
this.status = LoaderStatus.RUNNING;
this.isFirstStarted = true;
}
// promise start
return new Promise(function (resolve, reject) {
_this.startNextProcess().then(function (result) {
resolve(_this.successResult);
}, function (rejectResult) {
reject(_this.rejectResult);
});
});
};
/**
* @return {?}
*/
LoadProcessor.prototype.pause = /**
* @return {?}
*/
function () {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isRunning()) {
this.status = LoaderStatus.PAUSED;
}
var /** @type {?} */ ev = this.getCustomEventObject(PAUSE_EVENT, null, null);
this.pauseEvent.emit(ev);
var /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.pause();
}
};
/**
* @return {?}
*/
LoadProcessor.prototype.resume = /**
* @return {?}
*/
function () {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isPaused()) {
this.status = LoaderStatus.RUNNING;
}
var /** @type {?} */ ev = this.getCustomEventObject(RESUME_EVENT, null, null);
this.resumeEvent.emit(ev);
var /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.resume();
}
};
/**
* @return {?}
*/
LoadProcessor.prototype.stop = /**
* @return {?}
*/
function () {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isRunning() || this.isPaused()) {
this.status = LoaderStatus.STOPPED;
}
var /** @type {?} */ ev = this.getCustomEventObject(STOP_EVENT, null, null);
this.stopEvent.emit(ev);
var /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.stop();
}
};
/**
* @return {?}
*/
LoadProcessor.prototype.getState = /**
* @return {?}
*/
function () {
return this.status;
};
/**
* @return {?}
*/
LoadProcessor.prototype.isRunning = /**
* @return {?}
*/
function () {
return this.status === LoaderStatus.RUNNING;
};
/**
* @return {?}
*/
LoadProcessor.prototype.isPaused = /**
* @return {?}
*/
function () {
return this.status === LoaderStatus.PAUSED;
};
/**
* @return {?}
*/
LoadProcessor.prototype.isStopped = /**
* @return {?}
*/
function () {
return this.status === LoaderStatus.STOPPED;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getContinueOnReject = /**
* @return {?}
*/
function () {
return this.continueOnReject;
};
/**
* @param {?} continueOnReject
* @return {?}
*/
LoadProcessor.prototype.setContinueOnReject = /**
* @param {?} continueOnReject
* @return {?}
*/
function (continueOnReject) {
if (this.isFirstStarted) {
throw new Error('Process was started or has been process');
}
this.continueOnReject = continueOnReject;
if (this.processes !== null && this.processes !== undefined) {
try {
for (var _a = tslib_1.__values(this.processes), _b = _a.next(); !_b.done; _b = _a.next()) {
var process_2 = _b.value;
process_2.setContinueOnReject(this.continueOnReject);
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_3) throw e_3.error; }
}
}
var e_3, _c;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getPauseEvent = /**
* @return {?}
*/
function () {
return this.pauseEvent;
};
/**
* @param {?} pauseEvent
* @return {?}
*/
LoadProcessor.prototype.setPauseEvent = /**
* @param {?} pauseEvent
* @return {?}
*/
function (pauseEvent) {
this.pauseEvent = pauseEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getResumeEvent = /**
* @return {?}
*/
function () {
return this.resumeEvent;
};
/**
* @param {?} resumeEvent
* @return {?}
*/
LoadProcessor.prototype.setResumeEvent = /**
* @param {?} resumeEvent
* @return {?}
*/
function (resumeEvent) {
this.resumeEvent = resumeEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getStartEvent = /**
* @return {?}
*/
function () {
return this.startEvent;
};
/**
* @param {?} startEvent
* @return {?}
*/
LoadProcessor.prototype.setStartEvent = /**
* @param {?} startEvent
* @return {?}
*/
function (startEvent) {
this.startEvent = startEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getStopEvent = /**
* @return {?}
*/
function () {
return this.stopEvent;
};
/**
* @param {?} stopEvent
* @return {?}
*/
LoadProcessor.prototype.setStopEvent = /**
* @param {?} stopEvent
* @return {?}
*/
function (stopEvent) {
this.stopEvent = stopEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getProcessCompleteEvent = /**
* @return {?}
*/
function () {
return this.processCompleteEvent;
};
/**
* @param {?} processCompleteEvent
* @return {?}
*/
LoadProcessor.prototype.setProcessCompleteEvent = /**
* @param {?} processCompleteEvent
* @return {?}
*/
function (processCompleteEvent) {
this.processCompleteEvent = processCompleteEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getProcessResolveEvent = /**
* @return {?}
*/
function () {
return this.processResolveEvent;
};
/**
* @param {?} processResolveEvent
* @return {?}
*/
LoadProcessor.prototype.setProcessResolveEvent = /**
* @param {?} processResolveEvent
* @return {?}
*/
function (processResolveEvent) {
this.processResolveEvent = processResolveEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getProcessRejectEvent = /**
* @return {?}
*/
function () {
return this.processRejectEvent;
};
/**
* @param {?} processRejectEvent
* @return {?}
*/
LoadProcessor.prototype.setProcessRejectEvent = /**
* @param {?} processRejectEvent
* @return {?}
*/
function (processRejectEvent) {
this.processRejectEvent = processRejectEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getTaskStartEvent = /**
* @return {?}
*/
function () {
return this.taskStartEvent;
};
/**
* @param {?} taskStartEvent
* @return {?}
*/
LoadProcessor.prototype.setTaskStartEvent = /**
* @param {?} taskStartEvent
* @return {?}
*/
function (taskStartEvent) {
this.taskStartEvent = taskStartEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getTaskCompleteEvent = /**
* @return {?}
*/
function () {
return this.taskCompleteEvent;
};
/**
* @param {?} taskCompleteEvent
* @return {?}
*/
LoadProcessor.prototype.setTaskCompleteEvent = /**
* @param {?} taskCompleteEvent
* @return {?}
*/
function (taskCompleteEvent) {
this.taskCompleteEvent = taskCompleteEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getTaskResolveEvent = /**
* @return {?}
*/
function () {
return this.taskResolveEvent;
};
/**
* @param {?} taskResolveEvent
* @return {?}
*/
LoadProcessor.prototype.setTaskResolveEvent = /**
* @param {?} taskResolveEvent
* @return {?}
*/
function (taskResolveEvent) {
this.taskResolveEvent = taskResolveEvent;
};
/**
* @return {?}
*/
LoadProcessor.prototype.getTaskRejectEvent = /**
* @return {?}
*/
function () {
return this.taskRejectEvent;
};
/**
* @param {?} taskRejectEvent
* @return {?}
*/
LoadProcessor.prototype.setTaskRejectEvent = /**
* @param {?} taskRejectEvent
* @return {?}
*/
function (taskRejectEvent) {
this.taskRejectEvent = taskRejectEvent;
};
return LoadProcessor;
}());
export { LoadProcessor };
function LoadProcessor_tsickle_Closure_declarations() {
/** @type {?} */
LoadProcessor.prototype.processes;
/** @type {?} */
LoadProcessor.prototype.processed;
/** @type {?} */
LoadProcessor.prototype.disabled;
/** @type {?} */
LoadProcessor.prototype.status;
/** @type {?} */
LoadProcessor.prototype.isFirstStarted;
/** @type {?} */
LoadProcessor.prototype.continueOnReject;
/** @type {?} */
LoadProcessor.prototype.successResult;
/** @type {?} */
LoadProcessor.prototype.rejectResult;
/** @type {?} */
LoadProcessor.prototype.processCompleteEvent;
/** @type {?} */
LoadProcessor.prototype.processResolveEvent;
/** @type {?} */
LoadProcessor.prototype.processRejectEvent;
/** @type {?} */
LoadProcessor.prototype.taskStartEvent;
/** @type {?} */
LoadProcessor.prototype.taskCompleteEvent;
/** @type {?} */
LoadProcessor.prototype.taskResolveEvent;
/** @type {?} */
LoadProcessor.prototype.taskRejectEvent;
/** @type {?} */
LoadProcessor.prototype.pauseEvent;
/** @type {?} */
LoadProcessor.prototype.resumeEvent;
/** @type {?} */
LoadProcessor.prototype.startEvent;
/** @type {?} */
LoadProcessor.prototype.stopEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9Mb2FkUHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFDdEMsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxJQUFBO0lBdUJFLHVCQUFZLGdCQUEwQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlB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QyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Ozs7OztJQUd6Qiw0Q0FBb0I7Ozs7Y0FBQyxpQkFBb0M7UUFDOUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDOzs7OztJQUd0QywyQ0FBbUI7Ozs7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzs7Ozs7O0lBR3hCLDJDQUFtQjs7OztjQUFDLGdCQUFtQztRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7Ozs7O0lBR3BDLDBDQUFrQjs7OztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7O0lBR3ZCLDBDQUFrQjs7OztjQUFDLGVBQWtDO1FBQzFELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDOzt3QkFwWTNDO0lBc1lDLENBQUE7QUE3WEQseUJBNlhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJTG9hZGVyIH0gZnJvbSAnLi9JTG9hZGVyJztcbmltcG9ydCB7IExvYWRlclN0YXR1cyB9IGZyb20gJy4vTG9hZGVyU3RhdHVzJztcbmltcG9ydCB7IExvYWRQcm9jZXNzIH0gZnJvbSAnLi9Mb2FkUHJvY2Vzcyc7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQge1xuICBQQVVTRV9FVkVOVCwgUkVTVU1FX0VWRU5ULCBTVE9QX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBMb2FkUHJvY2Vzc29yIGltcGxlbWVudHMgSUxvYWRlciB7XG5cbiAgcHJpdmF0ZSBwcm9jZXNzZXM6IExvYWRQcm9jZXNzW107XG4gIHByaXZhdGUgcHJvY2Vzc2VkOiBMb2FkUHJvY2Vzc1tdO1xuICBwcml2YXRlIGRpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHN0YXR1czogTG9hZGVyU3RhdHVzO1xuICBwcml2YXRlIGlzRmlyc3RTdGFydGVkOiBib29sZWFuO1xuICBwcml2YXRlIGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgc3VjY2Vzc1Jlc3VsdDogYW55O1xuICBwcml2YXRlIHJlamVjdFJlc3VsdDogYW55O1xuICBwcml2YXRlIHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcml2YXRlIHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSB0YXNrQ29tcGxldGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1JlamVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSByZXN1bWVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RvcEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuXG4gIGNvbnN0cnVjdG9yKGNvbnRpbnVlT25SZWplY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuU1RPUFBFRDtcbiAgICB0aGlzLnByb2Nlc3NlcyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkID0gW107XG4gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNGaXJzdFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NSZXN1bHQgPSB7fTtcbiAgICB0aGlzLnJlamVjdFJlc3VsdCA9IHt9O1xuXG4gICAgdGhpcy5wcm9jZXNzQ29tcGxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy50YXNrU3RhcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnBhdXNlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5yZXN1bWVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBpZiAoY29udGludWVPblJlamVjdCA9PT0gbnVsbCB8fCB0eXBlb2YgY29udGludWVPblJlamVjdCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRXZlbnRPYmplY3QodHlwZTogYW55LCBzdWNjZXNzOiBhbnksIGVycm9yOiBhbnkpOiBhbnkge1xuICAgIGxldCBzdWNjZXNzQ291bnQgPSBPYmplY3Qua2V5cyh0aGlzLnN1Y2Nlc3NSZXN1bHQpLmxlbmd0aDtcbiAgICBsZXQgZXJyb3JDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMucmVqZWN0UmVzdWx0KS5sZW5ndGg7XG4gICAgbGV0IHRvdGFsQ291bnQgPSB0aGlzLnByb2Nlc3Nlcy5sZW5ndGggKyB0aGlzLnByb2Nlc3NlZC5sZW5ndGg7XG4gICAgbGV0IHBlcmNlbnQgPSAwO1xuICAgIGlmICh0b3RhbENvdW50ID4gMCkge1xuICAgICAgcGVyY2VudCA9IHRoaXMucHJvY2Vzc2VzLmxlbmd0aCAqICgxMDAgLyB0b3RhbENvdW50KTtcbiAgICB9XG5cbiAgICBsZXQgd3JhcERhdGEgPSB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgcGVyY2VudDogcGVyY2VudCxcbiAgICAgIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQsXG4gICAgICBwcm9jZXNzZWQ6IHN1Y2Nlc3NDb3VudCArIGVycm9yQ291bnQsXG4gICAgICBzdWNjZXNzQ291bnQ6IHN1Y2Nlc3NDb3VudCxcbiAgICAgIGVycm9yQ291bnQ6IGVycm9yQ291bnRcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQodHlwZSwgbnVsbCwgd3JhcERhdGEsIG51bGwpO1xuXG4gICAgcmV0dXJuIGV2O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydE5leHRQcm9jZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmaXJzdFByb2NjZXNzID0gdGhpcy5wcm9jZXNzZXNbMF07XG4gICAgICBsZXQgcHJvY2Vzc05hbWUgPSBmaXJzdFByb2NjZXNzLmdldE5hbWUoKTtcblxuICAgICAgcmV0dXJuIGZpcnN0UHJvY2Nlc3Muc3RhcnQoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Y2Nlc3NSZXN1bHRbcHJvY2Vzc05hbWVdID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCAmIGluc2VydCBwcm9jZXNzZWRcbiAgICAgICAgdGhpcy5yZW1vdmUoMCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkLnB1c2goZmlyc3RQcm9jY2Vzcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnROZXh0UHJvY2VzcygpO1xuICAgICAgfSwgKHJlalJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucmVqZWN0UmVzdWx0W3Byb2Nlc3NOYW1lXSA9IHJlalJlc3VsdDtcblxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgJiBpbnNlcnQgcHJvY2Vzc2VkXG4gICAgICAgIHRoaXMucmVtb3ZlKDApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZC5wdXNoKGZpcnN0UHJvY2Nlc3MpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRpbnVlT25SZWplY3QpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE5leHRQcm9jZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVqUmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIGlmIGlzRGlzYWJsZSBhbGwgYWN0aW9uXG4gIHB1YmxpYyBzZXREaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcblxuICAgIGlmICh0aGlzLnByb2Nlc3NlcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgcHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgICBwcm9jZXNzLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIGdldFJ1bm5pbmdQcm9jZXNzKCk6IExvYWRQcm9jZXNzIHtcbiAgICBmb3IgKGxldCBsb2FkUHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgaWYgKGxvYWRQcm9jZXNzLmlzUnVubmluZygpIHx8IGxvYWRQcm9jZXNzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9jZXNzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJ1bm5pbmdQcm9jZXNzLmdldFBlcmNlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nVGFza0NvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcnVubmluZ1Byb2Nlc3MuZ2V0VGFza0NvdW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvY2Vzcyhwcm9jZXNzOiBMb2FkUHJvY2Vzcyk6IExvYWRQcm9jZXNzb3Ige1xuICAgIGlmIChwcm9jZXNzICE9PSBudWxsICYmIHByb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tSZWplY3RFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tSZWplY3RFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrUmVzb2x2ZUV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1Jlc29sdmVFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrQ29tcGxldGVFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tTdGFydEV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1N0YXJ0RXZlbnQuZW1pdChldmVudCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wcm9jZXNzZXMucHVzaChwcm9jZXNzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQcm9jZXNzKHByb2Nlc3M6IExvYWRQcm9jZXNzKTogTG9hZFByb2Nlc3NvciB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5wcm9jZXNzZXMuaW5kZXhPZihwcm9jZXNzKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmUoaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZShpbmRleDogbnVtYmVyKTogTG9hZFByb2Nlc3NvciB7XG4gICAgaWYgKGluZGV4IDwgdGhpcy5wcm9jZXNzZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByb2Nlc3Nlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvY2VzcyBpcyBkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmlyc3RTdGFydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3Mgd2FzIHN0YXJ0ZWQgb3IgaGFzIGJlZW4gcHJvY2VzcycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3RvcHBlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgICAgdGhpcy5pc0ZpcnN0U3RhcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvbWlzZSBzdGFydFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0TmV4dFByb2Nlc3MoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuc3VjY2Vzc1Jlc3VsdCk7XG4gICAgICB9LCAocmVqZWN0UmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgcmVqZWN0KHRoaXMucmVqZWN0UmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhdXNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUEFVU0VfRVZFTlQsIG51bGwsIG51bGwpO1xuICAgIHRoaXMucGF1c2VFdmVudC5lbWl0KGV2KTtcblxuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVubmluZ1Byb2Nlc3MucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdW1lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUkVTVU1FX0VWRU5ULCBudWxsLCBudWxsKTtcbiAgICB0aGlzLnJlc3VtZUV2ZW50LmVtaXQoZXYpO1xuXG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydW5uaW5nUHJvY2Vzcy5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKCkgfHwgdGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoU1RPUF9FVkVOVCwgbnVsbCwgbnVsbCk7XG4gICAgdGhpcy5zdG9wRXZlbnQuZW1pdChldik7XG5cbiAgICBsZXQgcnVubmluZ1Byb2Nlc3MgPSB0aGlzLmdldFJ1bm5pbmdQcm9jZXNzKCk7XG4gICAgaWYgKHJ1bm5pbmdQcm9jZXNzICE9PSBudWxsICYmIHJ1bm5pbmdQcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bm5pbmdQcm9jZXNzLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKTogTG9hZGVyU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXM7XG4gIH1cblxuICBwdWJsaWMgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLlJVTk5JTkc7XG4gIH1cblxuICBwdWJsaWMgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICB9XG5cbiAgcHVibGljIGlzU3RvcHBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRpbnVlT25SZWplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGludWVPblJlamVjdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250aW51ZU9uUmVqZWN0KGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0U3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIHdhcyBzdGFydGVkIG9yIGhhcyBiZWVuIHByb2Nlc3MnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuXG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzICE9PSBudWxsICYmIHRoaXMucHJvY2Vzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IHByb2Nlc3Mgb2YgdGhpcy5wcm9jZXNzZXMpIHtcbiAgICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFBhdXNlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0UGF1c2VFdmVudChwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucGF1c2VFdmVudCA9IHBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdW1lRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3VtZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFJlc3VtZUV2ZW50KHJlc3VtZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucmVzdW1lRXZlbnQgPSByZXN1bWVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGFydEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0RXZlbnQoc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFN0b3BFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0b3BFdmVudChzdG9wRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBzdG9wRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvY2Vzc0NvbXBsZXRlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NDb21wbGV0ZUV2ZW50KHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzc0NvbXBsZXRlRXZlbnQgPSBwcm9jZXNzQ29tcGxldGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9jZXNzUmVzb2x2ZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZXNvbHZlRXZlbnQocHJvY2Vzc1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBwcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFByb2Nlc3NSZWplY3RFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlamVjdEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZWplY3RFdmVudChwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBwcm9jZXNzUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1N0YXJ0RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tTdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFRhc2tTdGFydEV2ZW50KHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1N0YXJ0RXZlbnQgPSB0YXNrU3RhcnRFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrQ29tcGxldGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudGFza0NvbXBsZXRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza0NvbXBsZXRlRXZlbnQodGFza0NvbXBsZXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy50YXNrQ29tcGxldGVFdmVudCA9IHRhc2tDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFRhc2tSZXNvbHZlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1Jlc29sdmVFdmVudCh0YXNrUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IHRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1JlamVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy50YXNrUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1JlamVjdEV2ZW50KHRhc2tSZWplY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IHRhc2tSZWplY3RFdmVudDtcbiAgfVxufVxuIl19