com.phloxui
Version:
PhloxUI Ng2+ Framework
246 lines (245 loc) • 26.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
import { BackgroundProcess } from '../share/model/BackgroundProcess';
import { ObservableManager } from './ObservableManager.service';
const /** @type {?} */ PROCESS_START_TOPIC_NAME = 'bg-proc-mgr.process.start';
const /** @type {?} */ PROCESS_END_TOPIC_NAME = 'bg-proc-mgr.process.end';
const /** @type {?} */ PROCESS_ERROR_TOPIC_NAME = 'bg-proc-mgr.process.error';
/**
* <p style="text-indent: 2em;">
* A <code>ng</code> service class providing <code>background process</code> execution machanism. This class is an implementation of
* [[IBackgroundProcessManager]]. So, please see [[IBackgroundProcessManager]] for more information.
* </p>
*
* @see [[IBackgroundProcessManager]]
* @see [[BackgroundProcess]]
*
* @author shiorin, tee4cute
*/
export class BackgroundProcessManager {
/**
* @param {?} obsvMgr
*/
constructor(obsvMgr) {
this.processesPool = [];
this.obsvMgr = obsvMgr;
}
/**
* @param {?} processFunc
* @param {?=} processType
* @param {?=} name
* @param {?=} option
* @return {?}
*/
getWrapperProcess(processFunc, processType, name, option) {
let /** @type {?} */ processProm = Promise.resolve(null);
if (processFunc !== null && typeof processFunc === 'function') {
let /** @type {?} */ returnVal = processFunc.call(null, null);
if (typeof returnVal === 'undefined') {
// function with no return
processProm = Promise.resolve(returnVal);
}
else if (typeof returnVal === 'object') {
if (returnVal instanceof Promise) {
processProm = returnVal;
}
else {
processProm = Promise.resolve(returnVal);
}
}
else {
processProm = Promise.resolve(returnVal);
}
}
let /** @type {?} */ result = new BackgroundProcess(processProm, processType, name, undefined, option);
return result;
}
/**
* @param {?} bgProcess
* @param {?} options
* @return {?}
*/
isMatchAllOptions(bgProcess, options) {
let /** @type {?} */ isMatchAll = true;
if (bgProcess !== null && bgProcess !== undefined) {
if (options !== null && options !== undefined) {
for (let /** @type {?} */ key in options) {
let /** @type {?} */ optVal = options[key];
if (bgProcess.options !== null && bgProcess.options !== undefined) {
let /** @type {?} */ bgProcVal = bgProcess.options[key];
if (optVal !== bgProcVal) {
isMatchAll = false;
break;
}
}
else {
isMatchAll = false;
break;
}
}
}
}
else {
if (options !== null && options !== undefined) {
isMatchAll = false;
}
}
return isMatchAll;
}
/**
* <p style="text-indent: 1em;">
* Please see [[IBackgroundProcessManager.execute]] for more information.
* </p>
*
* @see [[IBackgroundProcessManager.execute]]
* @param {?} processFunc
* @param {?=} options
* @return {?}
*/
execute(processFunc, options) {
if (processFunc === null || typeof processFunc === 'undefined') {
return null;
}
let /** @type {?} */ processType = null;
let /** @type {?} */ name = null;
if (options !== null && typeof options !== 'undefined') {
processType = options.type;
name = options.name;
}
// return wrapper promise
let /** @type {?} */ bgProcess = this.getWrapperProcess(processFunc, processType, name, options);
if (bgProcess !== null && bgProcess.process !== null) {
this.processesPool.push(bgProcess);
// start onprocess adding
if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') {
this.obsvMgr.publish(BackgroundProcessManager.PROCESS_START_TOPIC_NAME, bgProcess);
}
let /** @type {?} */ wrapBgProcess = new Promise((resolve, reject) => {
bgProcess.process.then((result) => {
bgProcess.result = result;
resolve(result);
let /** @type {?} */ index = this.processesPool.indexOf(bgProcess);
if (index >= 0) {
this.processesPool.splice(index, 1);
}
if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') {
this.obsvMgr.publish(BackgroundProcessManager.PROCESS_END_TOPIC_NAME, bgProcess);
}
}, (error) => {
bgProcess.error = error;
reject(error);
let /** @type {?} */ index = this.processesPool.indexOf(bgProcess);
if (index >= 0) {
this.processesPool.splice(index, 1);
}
if (this.obsvMgr !== null && typeof this.obsvMgr !== 'undefined') {
this.obsvMgr.publish(BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME, bgProcess);
}
});
});
return wrapBgProcess;
}
return null;
}
/**
* <p style="text-indent: 1em;">
* Please see [[IBackgroundProcessManager.getRunningProcessesCount]] for more information.
* </p>
*
* @see [[IBackgroundProcessManager.getRunningProcessesCount]]
* @param {?} typeName
* @param {?} name
* @param {?=} options
* @return {?}
*/
getRunningProcessesCount(typeName, name, options) {
return this.getRunningProcesses(typeName, name, options).length;
}
/**
* <p style="text-indent: 1em;">
* Please see [[IBackgroundProcessManager.getRunningProcesses]] for more information. This method returns
* an array of process model class [[BackgroundProcess]].
* </p>
*
* @see [[IBackgroundProcessManager.getRunningProcesses]]
* @param {?} typeName
* @param {?} name
* @param {?=} options
* @return {?}
*/
getRunningProcesses(typeName, name, options) {
if (typeName === null && name === null) {
return this.processesPool;
}
let /** @type {?} */ result = [];
for (let /** @type {?} */ process of this.processesPool) {
let /** @type {?} */ pType = process.type;
let /** @type {?} */ pName = process.name;
let /** @type {?} */ pUserAction = process.userAction;
let /** @type {?} */ allMatch = true;
if (typeName !== null && typeName !== undefined) {
if (typeName !== pType) {
allMatch = false;
}
}
if (name !== null && name !== undefined) {
if (name !== pName) {
allMatch = false;
}
}
// check more is allMatch
if (allMatch && options !== null && typeof options !== 'undefined') {
if (options.userAction !== null && typeof options.userAction !== 'undefined') {
if (pUserAction !== options.userAction) {
allMatch = false;
}
}
// check more is allMatch
if (allMatch) {
let /** @type {?} */ isMatchAllOpt = this.isMatchAllOptions(process, options);
if (!isMatchAllOpt) {
allMatch = false;
}
}
}
// check more is allMatch
if (allMatch) {
result.push(process);
}
}
return result;
}
}
BackgroundProcessManager.PROCESS_START_TOPIC_NAME = PROCESS_START_TOPIC_NAME;
BackgroundProcessManager.PROCESS_END_TOPIC_NAME = PROCESS_END_TOPIC_NAME;
BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME = PROCESS_ERROR_TOPIC_NAME;
BackgroundProcessManager.decorators = [
{ type: Injectable },
];
/** @nocollapse */
BackgroundProcessManager.ctorParameters = () => [
{ type: ObservableManager, },
];
function BackgroundProcessManager_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
BackgroundProcessManager.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
BackgroundProcessManager.ctorParameters;
/** @type {?} */
BackgroundProcessManager.PROCESS_START_TOPIC_NAME;
/** @type {?} */
BackgroundProcessManager.PROCESS_END_TOPIC_NAME;
/** @type {?} */
BackgroundProcessManager.PROCESS_ERROR_TOPIC_NAME;
/** @type {?} */
BackgroundProcessManager.prototype.processesPool;
/** @type {?} */
BackgroundProcessManager.prototype.obsvMgr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL0JhY2tncm91bmRQcm9jZXNzTWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWhFLHVCQUFNLHdCQUF3QixHQUFXLDJCQUEyQixDQUFDO0FBQ3JFLHVCQUFNLHNCQUFzQixHQUFXLHlCQUF5QixDQUFDO0FBQ2pFLHVCQUFNLHdCQUF3QixHQUFXLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7QUFjckUsTUFBTTs7OztJQVNKLFlBQVksT0FBMEI7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7S0FDeEI7Ozs7Ozs7O0lBRU8saUJBQWlCLENBQUMsV0FBcUIsRUFBRSxXQUFvQixFQUFFLElBQWEsRUFBRSxNQUFZO1FBQ2hHLHFCQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksT0FBTyxXQUFXLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM5RCxxQkFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsRUFBRSxDQUFDLENBQUMsT0FBTyxTQUFTLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzs7Z0JBRXJDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FB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cUJBQ2xCO2lCQUNGO2FBQ0Y7O1lBR0QsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3RCO1NBQ0Y7UUFFRCxNQUFNLENBQUMsTUFBTSxDQUFDOzs7b0RBdk0wQyx3QkFBd0I7a0RBQzFCLHNCQUFzQjtvREFDcEIsd0JBQXdCOztZQUxuRixVQUFVOzs7O1lBakJGLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIgfSBmcm9tICcuLi9zaGFyZS9JQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyJztcbmltcG9ydCB7IEJhY2tncm91bmRQcm9jZXNzIH0gZnJvbSAnLi4vc2hhcmUvbW9kZWwvQmFja2dyb3VuZFByb2Nlc3MnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1hbmFnZXIgfSBmcm9tICcuL09ic2VydmFibGVNYW5hZ2VyLnNlcnZpY2UnO1xuXG5jb25zdCBQUk9DRVNTX1NUQVJUX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLnN0YXJ0JztcbmNvbnN0IFBST0NFU1NfRU5EX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLmVuZCc7XG5jb25zdCBQUk9DRVNTX0VSUk9SX1RPUElDX05BTUU6IHN0cmluZyA9ICdiZy1wcm9jLW1nci5wcm9jZXNzLmVycm9yJztcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBIDxjb2RlPm5nPC9jb2RlPiBzZXJ2aWNlIGNsYXNzIHByb3ZpZGluZyA8Y29kZT5iYWNrZ3JvdW5kIHByb2Nlc3M8L2NvZGU+IGV4ZWN1dGlvbiBtYWNoYW5pc20uIFRoaXMgY2xhc3MgaXMgYW4gaW1wbGVtZW50YXRpb24gb2ZcbiAqIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlcl1dLiBTbywgcGxlYXNlIHNlZSBbW0lCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXJdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqIDwvcD5cbiAqXG4gKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlcl1dXG4gKiBAc2VlIFtbQmFja2dyb3VuZFByb2Nlc3NdXVxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJhY2tncm91bmRQcm9jZXNzTWFuYWdlciBpbXBsZW1lbnRzIElCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPQ0VTU19TVEFSVF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBQUk9DRVNTX1NUQVJUX1RPUElDX05BTUU7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPQ0VTU19FTkRfVE9QSUNfTkFNRTogc3RyaW5nID0gUFJPQ0VTU19FTkRfVE9QSUNfTkFNRTtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9DRVNTX0VSUk9SX1RPUElDX05BTUU6IHN0cmluZyA9IFBST0NFU1NfRVJST1JfVE9QSUNfTkFNRTtcblxuICBwcml2YXRlIHByb2Nlc3Nlc1Bvb2w6IEJhY2tncm91bmRQcm9jZXNzW107XG4gIHByaXZhdGUgb2Jzdk1ncjogT2JzZXJ2YWJsZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3Iob2Jzdk1ncjogT2JzZXJ2YWJsZU1hbmFnZXIpIHtcbiAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wgPSBbXTtcbiAgICB0aGlzLm9ic3ZNZ3IgPSBvYnN2TWdyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXcmFwcGVyUHJvY2Vzcyhwcm9jZXNzRnVuYzogRnVuY3Rpb24sIHByb2Nlc3NUeXBlPzogc3RyaW5nLCBuYW1lPzogc3RyaW5nLCBvcHRpb24/OiBhbnkpOiBCYWNrZ3JvdW5kUHJvY2VzcyB7XG4gICAgbGV0IHByb2Nlc3NQcm9tID0gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXG4gICAgaWYgKHByb2Nlc3NGdW5jICE9PSBudWxsICYmIHR5cGVvZiBwcm9jZXNzRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IHJldHVyblZhbCA9IHByb2Nlc3NGdW5jLmNhbGwobnVsbCwgbnVsbCk7XG4gICAgICBpZiAodHlwZW9mIHJldHVyblZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZnVuY3Rpb24gd2l0aCBubyByZXR1cm5cbiAgICAgICAgcHJvY2Vzc1Byb20gPSBQcm9taXNlLnJlc29sdmUocmV0dXJuVmFsKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJldHVyblZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHJldHVyblZhbCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICBwcm9jZXNzUHJvbSA9IHJldHVyblZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzUHJvbSA9IFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzUHJvbSA9IFByb21pc2UucmVzb2x2ZShyZXR1cm5WYWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IEJhY2tncm91bmRQcm9jZXNzID0gbmV3IEJhY2tncm91bmRQcm9jZXNzKHByb2Nlc3NQcm9tLCBwcm9jZXNzVHlwZSwgbmFtZSwgdW5kZWZpbmVkLCBvcHRpb24pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaXNNYXRjaEFsbE9wdGlvbnMoYmdQcm9jZXNzOiBCYWNrZ3JvdW5kUHJvY2Vzcywgb3B0aW9uczogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGlzTWF0Y2hBbGwgPSB0cnVlO1xuXG4gICAgaWYgKGJnUHJvY2VzcyAhPT0gbnVsbCAmJiBiZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IG9wdFZhbCA9IG9wdGlvbnNba2V5XTtcblxuICAgICAgICAgIGlmIChiZ1Byb2Nlc3Mub3B0aW9ucyAhPT0gbnVsbCAmJiBiZ1Byb2Nlc3Mub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgYmdQcm9jVmFsID0gYmdQcm9jZXNzLm9wdGlvbnNba2V5XTtcblxuICAgICAgICAgICAgaWYgKG9wdFZhbCAhPT0gYmdQcm9jVmFsKSB7XG4gICAgICAgICAgICAgIGlzTWF0Y2hBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlzTWF0Y2hBbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXNNYXRjaEFsbCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpc01hdGNoQWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogUGxlYXNlIHNlZSBbW0lCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuZXhlY3V0ZV1dIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiA8L3A+XG4gICAqXG4gICAqIEBzZWUgW1tJQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLmV4ZWN1dGVdXVxuICAgKi9cbiAgcHVibGljIGV4ZWN1dGUocHJvY2Vzc0Z1bmM6IEZ1bmN0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocHJvY2Vzc0Z1bmMgPT09IG51bGwgfHwgdHlwZW9mIHByb2Nlc3NGdW5jID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHByb2Nlc3NUeXBlID0gbnVsbDtcbiAgICBsZXQgbmFtZSA9IG51bGw7XG4gICAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwcm9jZXNzVHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICAgIG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIHdyYXBwZXIgcHJvbWlzZVxuICAgIGxldCBiZ1Byb2Nlc3MgPSB0aGlzLmdldFdyYXBwZXJQcm9jZXNzKHByb2Nlc3NGdW5jLCBwcm9jZXNzVHlwZSwgbmFtZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoYmdQcm9jZXNzICE9PSBudWxsICYmIGJnUHJvY2Vzcy5wcm9jZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wucHVzaChiZ1Byb2Nlc3MpO1xuXG4gICAgICAvLyBzdGFydCBvbnByb2Nlc3MgYWRkaW5nXG4gICAgICBpZiAodGhpcy5vYnN2TWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9ic3ZNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMub2Jzdk1nci5wdWJsaXNoKEJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5QUk9DRVNTX1NUQVJUX1RPUElDX05BTUUsIGJnUHJvY2Vzcyk7XG4gICAgICB9XG5cbiAgICAgIGxldCB3cmFwQmdQcm9jZXNzID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBiZ1Byb2Nlc3MucHJvY2Vzcy50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICBiZ1Byb2Nlc3MucmVzdWx0ID0gcmVzdWx0O1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wcm9jZXNzZXNQb29sLmluZGV4T2YoYmdQcm9jZXNzKTtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzZXNQb29sLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMub2Jzdk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5vYnN2TWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5vYnN2TWdyLnB1Ymxpc2goQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLlBST0NFU1NfRU5EX1RPUElDX05BTUUsIGJnUHJvY2Vzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBiZ1Byb2Nlc3MuZXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG5cbiAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLnByb2Nlc3Nlc1Bvb2wuaW5kZXhPZihiZ1Byb2Nlc3MpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3Nlc1Bvb2wuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5vYnN2TWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9ic3ZNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLm9ic3ZNZ3IucHVibGlzaChCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIuUFJPQ0VTU19FUlJPUl9UT1BJQ19OQU1FLCBiZ1Byb2Nlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHdyYXBCZ1Byb2Nlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBQbGVhc2Ugc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzQ291bnRdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICogPC9wPlxuICAgKlxuICAgKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzQ291bnRdXVxuICAgKi9cbiAgcHVibGljIGdldFJ1bm5pbmdQcm9jZXNzZXNDb3VudCh0eXBlTmFtZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFJ1bm5pbmdQcm9jZXNzZXModHlwZU5hbWUsIG5hbWUsIG9wdGlvbnMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAxZW07XCI+XG4gICAqIFBsZWFzZSBzZWUgW1tJQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLmdldFJ1bm5pbmdQcm9jZXNzZXNdXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gVGhpcyBtZXRob2QgcmV0dXJuc1xuICAgKiBhbiBhcnJheSBvZiBwcm9jZXNzIG1vZGVsIGNsYXNzIFtbQmFja2dyb3VuZFByb2Nlc3NdXS5cbiAgICogPC9wPlxuICAgKlxuICAgKiBAc2VlIFtbSUJhY2tncm91bmRQcm9jZXNzTWFuYWdlci5nZXRSdW5uaW5nUHJvY2Vzc2VzXV1cbiAgICovXG4gIHB1YmxpYyBnZXRSdW5uaW5nUHJvY2Vzc2VzKHR5cGVOYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IEJhY2tncm91bmRQcm9jZXNzW10ge1xuICAgIGlmICh0eXBlTmFtZSA9PT0gbnVsbCAmJiBuYW1lID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZXNQb29sO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBwcm9jZXNzIG9mIHRoaXMucHJvY2Vzc2VzUG9vbCkge1xuICAgICAgbGV0IHBUeXBlOiBzdHJpbmcgPSBwcm9jZXNzLnR5cGU7XG4gICAgICBsZXQgcE5hbWU6IHN0cmluZyA9IHByb2Nlc3MubmFtZTtcbiAgICAgIGxldCBwVXNlckFjdGlvbjogYm9vbGVhbiA9IHByb2Nlc3MudXNlckFjdGlvbjtcbiAgICAgIGxldCBhbGxNYXRjaDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAgIGlmICh0eXBlTmFtZSAhPT0gbnVsbCAmJiB0eXBlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZSAhPT0gcFR5cGUpIHtcbiAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lICE9PSBudWxsICYmIG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAobmFtZSAhPT0gcE5hbWUpIHtcbiAgICAgICAgICBhbGxNYXRjaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG1vcmUgaXMgYWxsTWF0Y2hcbiAgICAgIGlmIChhbGxNYXRjaCAmJiBvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAob3B0aW9ucy51c2VyQWN0aW9uICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zLnVzZXJBY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKHBVc2VyQWN0aW9uICE9PSBvcHRpb25zLnVzZXJBY3Rpb24pIHtcbiAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgbW9yZSBpcyBhbGxNYXRjaFxuICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICBsZXQgaXNNYXRjaEFsbE9wdCA9IHRoaXMuaXNNYXRjaEFsbE9wdGlvbnMocHJvY2Vzcywgb3B0aW9ucyk7XG5cbiAgICAgICAgICBpZiAoIWlzTWF0Y2hBbGxPcHQpIHtcbiAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIG1vcmUgaXMgYWxsTWF0Y2hcbiAgICAgIGlmIChhbGxNYXRjaCkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=