@neocomplexx/ngx-neo-directives
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
660 lines • 48.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/ngx-command/command.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
// tslint:disable:indent
import { Directive, Input, ElementRef, InjectionToken, Renderer2 } from '@angular/core';
import { Subject, BehaviorSubject, combineLatest, timer } from 'rxjs';
import { map, tap, filter, switchMap } from 'rxjs/operators';
import { OnReturnDirective } from '../onReturn.directive';
/** @type {?} */
export var COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG');
/** @type {?} */
export var COMMAND_DEFAULT_CONFIG = {
executingCssClass: 'executing',
};
/*
export function provideConfig(config: CommandOptions): any {
return Object.assign({}, COMMAND_DEFAULT_CONFIG, config);
} */
/**
*
* ### Example with options
* ```html
* <button [command]='saveCmd' [commandOptions]='{executingCssClass: 'in-progress'}'>Save</button>
* ```
*/
var CommandDirective = /** @class */ (function () {
function CommandDirective(renderer, element) {
this.renderer = renderer;
this.element = element;
this.stopPropagation = false;
// @HostBinding('disabled') isDisabled: boolean;
this.setEnabled = true;
this.config = COMMAND_DEFAULT_CONFIG;
this.ownDisabledState = false;
this.commandDisabledChanged = false;
}
/**
* @return {?}
*/
CommandDirective.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
// console.log('[commandDirective::init]');
this.commandOptions = Object.assign({}, this.config, this.commandOptions);
if (!this.command) {
throw new Error('[commandDirective] command should be defined!');
}
else {
this.command.verifyCommandExecutionPipe();
this.command.setNextFocus(this.commandNextFocus);
this.command.setEnabledValue(this.setEnabled);
}
// if (this.element.nativeElement.localName === 'button') {
// let thisAux = this; // Set up a new observer
// var observer = new MutationObserver(function(mutations) {
// mutations.forEach(function(mutation) {
// // Check the modified attributeName is "disabled"
// if(!thisAux.commandDisabledChanged) {
// if (mutation.attributeName === "disabled") {
// thisAux.ownDisabledState = thisAux.element.nativeElement.disabled;
// }
// } else {
// thisAux.commandDisabledChanged = false;
// }
// });
// });
// // Configure to only listen to attribute changes
// var config = { attributes: true };
// // Start observing myElem
// observer.observe(this.element.nativeElement, config);
// }
this.canExecute$$ = this.command.canExecute$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
function (x) {
if (_this.element.nativeElement.localName === 'button') {
_this.commandDisabledChanged = true;
if (_this.commandValue == _this.command.executingParam) {
_this.element.nativeElement.disabled = !x;
// } else {
// this.element.nativeElement.disabled = !(!this.ownDisabledState && x);
}
}
}))).subscribe();
this.isExecuting$$ = this.command.isExecuting$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
function (x) {
// console.log('[commandDirective::isExecuting$]', x);
x ? _this.renderer.addClass(_this.element.nativeElement, _this.commandOptions.executingCssClass) : _this.renderer.removeClass(_this.element.nativeElement, _this.commandOptions.executingCssClass);
}))).subscribe();
if (this.isMobileOperatingSystem()) {
this.element.nativeElement.addEventListener('touchstart', (/**
* @param {?} event
* @return {?}
*/
function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
event.preventDefault();
event.stopPropagation();
if (this.element.nativeElement.localName === 'input') {
return [2 /*return*/];
}
this.executeCommand();
return [2 /*return*/];
});
}); }));
this.element.nativeElement.addEventListener('focusin', (/**
* @param {?} event
* @return {?}
*/
function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
return [2 /*return*/];
});
}); }));
}
else {
this.element.nativeElement.addEventListener('keydown', (/**
* @param {?} event
* @return {?}
*/
function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
if ((event.which === 13 || event.keyCode === 13)) {
event.preventDefault();
event.stopPropagation();
this.executeCommand();
}
return [2 /*return*/];
});
}); }));
this.element.nativeElement.addEventListener('click', (/**
* @param {?} event
* @return {?}
*/
function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
if (this.element.nativeElement.localName === 'input') {
return [2 /*return*/];
}
event.preventDefault();
if (this.stopPropagation) {
event.stopPropagation();
}
this.executeCommand();
return [2 /*return*/];
});
}); }));
}
};
/**
* @return {?}
*/
CommandDirective.prototype.executeCommand = /**
* @return {?}
*/
function () {
if (!this.element.nativeElement.disabled)
this.command.canExecute = true;
this.command.verifyCommandExecutionPipe();
this.command.execute(this.commandValue);
};
/**
* @return {?}
*/
CommandDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.command) {
this.command.destroy();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
};
/**
* @private
* @return {?}
*/
CommandDirective.prototype.isMobileOperatingSystem = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var isMobile = false;
/** @type {?} */
var userAgent = navigator.userAgent || navigator.vendor;
// Windows Phone must come first because its UA also contains "Android"
if (/windows phone/i.test(userAgent)) {
isMobile = true; // "Windows Phone";
}
else if (/android/i.test(userAgent)) {
isMobile = true; // "Android";
}
else if (/iPad|iPhone|iPod/.test(userAgent)) {
// iOS detection from: http://stackoverflow.com/a/9039885/177710
isMobile = true; // "iOS";
}
isMobile = false;
return isMobile; // "unknown";
};
CommandDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[command]'
},] }
];
/** @nocollapse */
CommandDirective.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: ElementRef }
]; };
CommandDirective.propDecorators = {
command: [{ type: Input }],
commandOptions: [{ type: Input }],
commandCanExecute: [{ type: Input }],
commandValue: [{ type: Input }],
stopPropagation: [{ type: Input }],
commandNextFocus: [{ type: Input }],
setEnabled: [{ type: Input }]
};
return CommandDirective;
}());
export { CommandDirective };
if (false) {
/** @type {?} */
CommandDirective.prototype.command;
/** @type {?} */
CommandDirective.prototype.commandOptions;
/** @type {?} */
CommandDirective.prototype.commandCanExecute;
/** @type {?} */
CommandDirective.prototype.commandValue;
/** @type {?} */
CommandDirective.prototype.stopPropagation;
/** @type {?} */
CommandDirective.prototype.commandNextFocus;
/** @type {?} */
CommandDirective.prototype.setEnabled;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.canExecute$$;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.isExecuting$$;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.config;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.ownDisabledState;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.commandDisabledChanged;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.renderer;
/**
* @type {?}
* @private
*/
CommandDirective.prototype.element;
}
/**
* @record
*/
export function CommandOptions() { }
if (false) {
/**
* Css Class which gets added/removed on the Command element's host while Command isExecuting$.
*
* @type {?}
*/
CommandOptions.prototype.executingCssClass;
}
/**
* @record
*/
export function ICommand() { }
if (false) {
/** @type {?} */
ICommand.prototype.executingParam;
/**
* Determines whether the command is currently executing.
* @type {?}
*/
ICommand.prototype.isExecuting;
/** @type {?|undefined} */
ICommand.prototype.isExecuting$;
/**
* Determines whether the command can execute or not.
* @type {?}
*/
ICommand.prototype.canExecute;
/** @type {?|undefined} */
ICommand.prototype.canExecute$;
/**
* Execute function to invoke.
* @param {?=} value
* @return {?}
*/
ICommand.prototype.execute = function (value) { };
/**
* Execute function to invoke and return a result in Promise.
* @param {?=} value
* @return {?}
*/
ICommand.prototype.executeWithResult = function (value) { };
/**
* Disposes all resources held by subscriptions.
* @return {?}
*/
ICommand.prototype.destroy = function () { };
/**
* @return {?}
*/
ICommand.prototype.verifyCommandExecutionPipe = function () { };
/**
* @param {?} element
* @return {?}
*/
ICommand.prototype.setNextFocus = function (element) { };
/**
* @param {?} enable
* @return {?}
*/
ICommand.prototype.setEnabledValue = function (enable) { };
}
/**
* Command object used to encapsulate information which is needed to perform an action.
*/
var /**
* Command object used to encapsulate information which is needed to perform an action.
*/
Command = /** @class */ (function () {
/**
* Creates an instance of Command.
*/
function Command(executeParam, canExecute$, isAsync, delay) {
var _this = this;
this.executeParam = executeParam;
this.isAsync = isAsync;
this.delay = delay;
this.isExecuting = false;
this.isExecuting$ = new BehaviorSubject(false);
this.canExecute = true;
this.executionPipe$ = new Subject();
this.setEnabled = true;
if (canExecute$) {
this.canExecute$ = combineLatest(this.isExecuting$, canExecute$, (/**
* @param {?} isExecuting
* @param {?} canExecuteResult
* @return {?}
*/
function (isExecuting, canExecuteResult) {
// console.log('[command::combineLatest$] update!', { isExecuting, canExecuteResult });
_this.isExecuting = isExecuting;
_this.canExecute = !isExecuting && canExecuteResult;
return _this.canExecute;
}));
this.canExecute$$ = this.canExecute$.subscribe();
}
else {
this.canExecute$ = this.isExecuting$.pipe(map((/**
* @param {?} x
* @return {?}
*/
function (x) {
/** @type {?} */
var canExecute = !x;
_this.canExecute = canExecute;
return canExecute;
})));
this.isExecuting$$ = this.isExecuting$.pipe(tap((/**
* @param {?} x
* @return {?}
*/
function (x) { return _this.isExecuting = x; })))
.subscribe();
}
this.buildExecutionPipe(executeParam, isAsync, delay);
}
/**
* @return {?}
*/
Command.prototype.verifyCommandExecutionPipe = /**
* @return {?}
*/
function () {
if (this.executionPipe$.observers.length === 0) {
this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay);
}
};
/**
* @param {?=} value
* @return {?}
*/
Command.prototype.execute = /**
* @param {?=} value
* @return {?}
*/
function (value) {
this.executingParam = value;
this.executionPipe$.next(value);
};
/**
* @param {?=} value
* @return {?}
*/
Command.prototype.executeWithResult = /**
* @param {?=} value
* @return {?}
*/
function (value) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
this.executingParam = value;
this.executionPipe$.next(value);
return [4 /*yield*/, this.result];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
/**
* @return {?}
*/
Command.prototype.destroy = /**
* @return {?}
*/
function () {
if (this.executionPipe$$) {
this.executionPipe$$.unsubscribe();
}
if (this.canExecute$$) {
this.canExecute$$.unsubscribe();
}
if (this.isExecuting$$) {
this.isExecuting$$.unsubscribe();
}
if (this.isExecuting$) {
this.isExecuting$.complete();
}
if (this.asyncAction != null) {
this.asyncAction = null;
this.resultAsyncAction = null;
}
};
/**
* @private
* @param {?} executeParm
* @param {?=} isAsync
* @param {?=} delay
* @return {?}
*/
Command.prototype.buildExecutionPipe = /**
* @private
* @param {?} executeParm
* @param {?=} isAsync
* @param {?=} delay
* @return {?}
*/
function (executeParm, isAsync, delay) {
var _this = this;
/** @type {?} */
var pipe$ = this.executionPipe$.pipe(filter((/**
* @return {?}
*/
function () { return _this.canExecute; })), tap((/**
* @return {?}
*/
function () {
_this.isExecuting$.next(true);
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(undefined);
}
})));
pipe$ = isAsync
? pipe$.pipe(switchMap((/**
* @param {?} value
* @return {?}
*/
function (value) {
if (delay && delay > 0) {
if (_this.delaySubscribe) {
_this.delaySubscribe.unsubscribe();
}
/** @type {?} */
var delayTimer = timer(delay);
_this.delaySubscribe = delayTimer.subscribe((/**
* @param {?} t
* @return {?}
*/
function (t) { executeParm(value); }));
return Promise.resolve(null);
}
else {
/** @type {?} */
var result = executeParm(value);
return Promise.resolve(result);
}
})))
: pipe$.pipe(tap((/**
* @param {?} value
* @return {?}
*/
function (value) { executeParm(value); })));
pipe$ = pipe$.pipe(tap((/**
* @return {?}
*/
function () {
// console.log('[command::excutionPipe$] do#2 - set idle');
_this.isExecuting$.next(false);
_this.executingParam = undefined;
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction);
}
OnReturnDirective.setNextFocus(_this.elementNextFocus, _this.setEnabled);
}), (/**
* @param {?} e
* @return {?}
*/
function (e) {
console.log('[command::excutionPipe$] do#2 error - set idle' + e.toString());
_this.isExecuting$.next(false);
_this.executingParam = undefined;
if (isAsync && _this.asyncAction != null) {
_this.resultAsyncAction = _this.asyncAction(_this.resultAsyncAction);
}
_this.buildExecutionPipe(executeParm, isAsync, delay);
})));
this.executionPipe$$ = pipe$.subscribe();
};
/**
* @param {?} element
* @return {?}
*/
Command.prototype.setNextFocus = /**
* @param {?} element
* @return {?}
*/
function (element) {
this.elementNextFocus = element;
};
/**
* @param {?} enabled
* @return {?}
*/
Command.prototype.setEnabledValue = /**
* @param {?} enabled
* @return {?}
*/
function (enabled) {
this.setEnabled = enabled;
};
return Command;
}());
/**
* Command object used to encapsulate information which is needed to perform an action.
*/
export { Command };
if (false) {
/** @type {?} */
Command.prototype.isExecuting;
/** @type {?} */
Command.prototype.isExecuting$;
/** @type {?} */
Command.prototype.canExecute;
/** @type {?} */
Command.prototype.canExecute$;
/**
* @type {?}
* @private
*/
Command.prototype.executionPipe$;
/**
* @type {?}
* @private
*/
Command.prototype.isExecuting$$;
/**
* @type {?}
* @private
*/
Command.prototype.canExecute$$;
/**
* @type {?}
* @private
*/
Command.prototype.executionPipe$$;
/**
* @type {?}
* @private
*/
Command.prototype.elementNextFocus;
/** @type {?} */
Command.prototype.result;
/** @type {?} */
Command.prototype.asyncAction;
/** @type {?} */
Command.prototype.resultAsyncAction;
/** @type {?} */
Command.prototype.executingParam;
/**
* @type {?}
* @private
*/
Command.prototype.delaySubscribe;
/**
* @type {?}
* @private
*/
Command.prototype.setEnabled;
/**
* @type {?}
* @private
*/
Command.prototype.executeParam;
/**
* @type {?}
* @private
*/
Command.prototype.isAsync;
/**
* @type {?}
* @private
*/
Command.prototype.delay;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLyIsInNvdXJjZXMiOlsibGliL25neC1jb21tYW5kL2NvbW1hbmQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUE0QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUxRCxNQUFNLEtBQU8sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFTLGdCQUFnQixDQUFDOztBQUUxRSxNQUFNLEtBQU8sc0JBQXNCLEdBQW1CO0lBQ3JELGlCQUFpQixFQUFFLFdBQVc7Q0FDOUI7Ozs7Ozs7Ozs7OztBQWNEO0lBc0JDLDBCQUNTLFFBQW1CLEVBQ25CLE9BQW1CO1FBRG5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQWRuQixvQkFBZSxHQUFHLEtBQUssQ0FBQzs7UUFHeEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUluQixXQUFNLEdBQW1CLHNCQUFzQixDQUFDO1FBRWhELHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QiwyQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFLbkMsQ0FBQzs7OztJQUVMLG1DQUFROzs7SUFBUjtRQUFBLGlCQW1GQztRQWxGQSwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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Q0FBQyxBQTVJRCxJQTRJQzs7Ozs7OztJQTFJQSw4QkFBb0I7O0lBQ3BCLCtCQUFtRDs7SUFDbkQsNkJBQWtCOztJQUNsQiw4QkFBaUM7Ozs7O0lBRWpDLGlDQUEyQzs7Ozs7SUFDM0MsZ0NBQW9DOzs7OztJQUNwQywrQkFBbUM7Ozs7O0lBQ25DLGtDQUFzQzs7Ozs7SUFFdEMsbUNBQThCOztJQUU5Qix5QkFBNEI7O0lBRTVCLDhCQUFpQzs7SUFDakMsb0NBQThCOztJQUU5QixpQ0FBMkI7Ozs7O0lBRTNCLGlDQUFxQzs7Ozs7SUFFckMsNkJBQTBCOzs7OztJQU16QiwrQkFBbUM7Ozs7O0lBRW5DLDBCQUF5Qjs7Ozs7SUFDekIsd0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6aW5kZW50XG5cbmltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0LCBFbGVtZW50UmVmLCBJbmplY3Rpb25Ub2tlbiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwLCBmaWx0ZXIsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgT25SZXR1cm5EaXJlY3RpdmUgfSBmcm9tICcuLi9vblJldHVybi5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgQ09NTUFORF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nPignQ09NTUFORF9DT05GSUcnKTtcblxuZXhwb3J0IGNvbnN0IENPTU1BTkRfREVGQVVMVF9DT05GSUc6IENvbW1hbmRPcHRpb25zID0ge1xuXHRleGVjdXRpbmdDc3NDbGFzczogJ2V4ZWN1dGluZycsXG59O1xuLypcbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlQ29uZmlnKGNvbmZpZzogQ29tbWFuZE9wdGlvbnMpOiBhbnkge1xuXHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgQ09NTUFORF9ERUZBVUxUX0NPTkZJRywgY29uZmlnKTtcbn0gKi9cblxuXG4vKipcbiAqXG4gKiAjIyMgRXhhbXBsZSB3aXRoIG9wdGlvbnNcbiAqIGBgYGh0bWxcbiAqIDxidXR0b24gW2NvbW1hbmRdPSdzYXZlQ21kJyBbY29tbWFuZE9wdGlvbnNdPSd7ZXhlY3V0aW5nQ3NzQ2xhc3M6ICdpbi1wcm9ncmVzcyd9Jz5TYXZlPC9idXR0b24+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG5cdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3Jcblx0c2VsZWN0b3I6ICdbY29tbWFuZF0nXG59KVxuZXhwb3J0IGNsYXNzIENvbW1hbmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cblx0QElucHV0KCkgY29tbWFuZDogSUNvbW1hbmQ7XG5cdEBJbnB1dCgpIGNvbW1hbmRPcHRpb25zOiBDb21tYW5kT3B0aW9ucztcblx0QElucHV0KCkgY29tbWFuZENhbkV4ZWN1dGU6IGJvb2xlYW47XG5cdEBJbnB1dCgpIGNvbW1hbmRWYWx1ZTogYW55O1xuXHRASW5wdXQoKSBzdG9wUHJvcGFnYXRpb24gPSBmYWxzZTtcblx0QElucHV0KCkgY29tbWFuZE5leHRGb2N1czogYW55O1xuXHQvLyBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJykgaXNEaXNhYmxlZDogYm9vbGVhbjtcblx0QElucHV0KCkgc2V0RW5hYmxlZCA9IHRydWU7XG5cdHByaXZhdGUgY2FuRXhlY3V0ZSQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgaXNFeGVjdXRpbmckJDogU3Vic2NyaXB0aW9uO1xuXG5cdHByaXZhdGUgY29uZmlnOiBDb21tYW5kT3B0aW9ucyA9IENPTU1BTkRfREVGQVVMVF9DT05GSUc7XG5cblx0cHJpdmF0ZSBvd25EaXNhYmxlZFN0YXRlID0gZmFsc2U7XG5cdHByaXZhdGUgY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcblx0XHRwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcblx0KSB7IH1cblxuXHRuZ09uSW5pdCgpIHtcblx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmREaXJlY3RpdmU6OmluaXRdJyk7XG5cdFx0dGhpcy5jb21tYW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY29uZmlnLCB0aGlzLmNvbW1hbmRPcHRpb25zKTtcblxuXHRcdGlmICghdGhpcy5jb21tYW5kKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tjb21tYW5kRGlyZWN0aXZlXSBjb21tYW5kIHNob3VsZCBiZSBkZWZpbmVkIScpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmNvbW1hbmQudmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcblx0XHRcdHRoaXMuY29tbWFuZC5zZXROZXh0Rm9jdXModGhpcy5jb21tYW5kTmV4dEZvY3VzKTtcblx0XHRcdHRoaXMuY29tbWFuZC5zZXRFbmFibGVkVmFsdWUodGhpcy5zZXRFbmFibGVkKTtcblx0XHR9XG5cblx0XHQvLyBpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnYnV0dG9uJykge1xuXHRcdC8vIFx0bGV0IHRoaXNBdXggPSB0aGlzO1x0Ly8gU2V0IHVwIGEgbmV3IG9ic2VydmVyXG5cdFx0Ly8gXHR2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcblx0XHQvLyBcdFx0bXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24obXV0YXRpb24pIHtcblx0XHQvLyBcdFx0XHQvLyBDaGVjayB0aGUgbW9kaWZpZWQgYXR0cmlidXRlTmFtZSBpcyBcImRpc2FibGVkXCJcblx0XHQvLyBcdFx0XHRpZighdGhpc0F1eC5jb21tYW5kRGlzYWJsZWRDaGFuZ2VkKSB7XG5cdFx0Ly8gXHRcdFx0XHRpZiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gXCJkaXNhYmxlZFwiKSB7XG5cdFx0Ly8gXHRcdFx0XHRcdHRoaXNBdXgub3duRGlzYWJsZWRTdGF0ZSA9IHRoaXNBdXguZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkO1xuXHRcdC8vIFx0XHRcdFx0fVxuXHRcdC8vIFx0XHRcdH0gZWxzZSB7XG5cdFx0Ly8gXHRcdFx0XHR0aGlzQXV4LmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSBmYWxzZTtcblx0XHQvLyBcdFx0XHR9XG5cdFx0Ly8gXHRcdH0pO1xuXHRcdC8vIFx0fSk7XG5cdFx0Ly8gXHQvLyBDb25maWd1cmUgdG8gb25seSBsaXN0ZW4gdG8gYXR0cmlidXRlIGNoYW5nZXNcblx0XHQvLyBcdHZhciBjb25maWcgPSB7IGF0dHJpYnV0ZXM6IHRydWUgfTtcblx0XHQvLyBcdC8vIFN0YXJ0IG9ic2VydmluZyBteUVsZW1cblx0XHQvLyBcdG9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNvbmZpZyk7XG5cdFx0Ly8gfVxuXG5cdFx0dGhpcy5jYW5FeGVjdXRlJCQgPSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSQucGlwZShcblx0XHRcdHRhcCh4ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmxvY2FsTmFtZSA9PT0gJ2J1dHRvbicpIHtcblx0XHRcdFx0XHR0aGlzLmNvbW1hbmREaXNhYmxlZENoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGlmICh0aGlzLmNvbW1hbmRWYWx1ZSA9PSB0aGlzLmNvbW1hbmQuZXhlY3V0aW5nUGFyYW0pIHtcblx0XHRcdFx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gIXg7XG5cdFx0XHRcdFx0XHQvLyB9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gXHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9ICEoIXRoaXMub3duRGlzYWJsZWRTdGF0ZSAmJiB4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLmlzRXhlY3V0aW5nJCQgPSB0aGlzLmNvbW1hbmQuaXNFeGVjdXRpbmckLnBpcGUoXG5cdFx0XHR0YXAoeCA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZERpcmVjdGl2ZTo6aXNFeGVjdXRpbmckXScsIHgpO1xuICAgICAgICB4ID8gdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgdGhpcy5jb21tYW5kT3B0aW9ucy5leGVjdXRpbmdDc3NDbGFzcykgOiB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbW1hbmRPcHRpb25zLmV4ZWN1dGluZ0Nzc0NsYXNzKTtcblx0XHRcdH0pKS5zdWJzY3JpYmUoKTtcblxuXHRcdGlmICh0aGlzLmlzTW9iaWxlT3BlcmF0aW5nU3lzdGVtKCkpIHtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBhc3luYyAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgYXN5bmMgKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGFzeW5jIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuXHRcdFx0XHRpZiAoKGV2ZW50LndoaWNoID09PSAxMyB8fCBldmVudC5rZXlDb2RlID09PSAxMykpIHtcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnaW5wdXQnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdGlmICh0aGlzLnN0b3BQcm9wYWdhdGlvbikge1xuXHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHR9XG5cblx0ZXhlY3V0ZUNvbW1hbmQoKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5kaXNhYmxlZCkgdGhpcy5jb21tYW5kLmNhbkV4ZWN1dGUgPSB0cnVlO1xuXHRcdHRoaXMuY29tbWFuZC52ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpO1xuXHRcdHRoaXMuY29tbWFuZC5leGVjdXRlKHRoaXMuY29tbWFuZFZhbHVlKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLmNvbW1hbmQpIHsgdGhpcy5jb21tYW5kLmRlc3Ryb3koKTsgfVxuXHRcdGlmICh0aGlzLmNhbkV4ZWN1dGUkJCkgeyB0aGlzLmNhbkV4ZWN1dGUkJC51bnN1YnNjcmliZSgpOyB9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckJCkgeyB0aGlzLmlzRXhlY3V0aW5nJCQudW5zdWJzY3JpYmUoKTsgfVxuXHR9XG5cblx0cHJpdmF0ZSBpc01vYmlsZU9wZXJhdGluZ1N5c3RlbSgpOiBib29sZWFuIHtcblx0XHRsZXQgaXNNb2JpbGUgPSBmYWxzZTtcblx0XHRjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3I7XG5cblx0XHQvLyBXaW5kb3dzIFBob25lIG11c3QgY29tZSBmaXJzdCBiZWNhdXNlIGl0cyBVQSBhbHNvIGNvbnRhaW5zIFwiQW5kcm9pZFwiXG5cdFx0aWYgKC93aW5kb3dzIHBob25lL2kudGVzdCh1c2VyQWdlbnQpKSB7XG5cdFx0XHRpc01vYmlsZSA9IHRydWU7IC8vIFwiV2luZG93cyBQaG9uZVwiO1xuXHRcdH0gZWxzZSBpZiAoL2FuZHJvaWQvaS50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJBbmRyb2lkXCI7XG5cdFx0fSBlbHNlIGlmICgvaVBhZHxpUGhvbmV8aVBvZC8udGVzdCh1c2VyQWdlbnQpKSB7XG5cdFx0XHQvLyBpT1MgZGV0ZWN0aW9uIGZyb206IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzkwMzk4ODUvMTc3NzEwXG5cdFx0XHRpc01vYmlsZSA9IHRydWU7IC8vIFwiaU9TXCI7XG5cdFx0fVxuXG5cdFx0aXNNb2JpbGUgPSBmYWxzZTtcblxuXHRcdHJldHVybiBpc01vYmlsZTsgLy8gXCJ1bmtub3duXCI7XG5cdH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kT3B0aW9ucyB7XG5cdC8qKlxuXHQgKiBDc3MgQ2xhc3Mgd2hpY2ggZ2V0cyBhZGRlZC9yZW1vdmVkIG9uIHRoZSBDb21tYW5kIGVsZW1lbnQncyBob3N0IHdoaWxlIENvbW1hbmQgaXNFeGVjdXRpbmckLlxuXHQgKlxuXHQgKi9cblx0ZXhlY3V0aW5nQ3NzQ2xhc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tbWFuZCB7XG5cblx0ZXhlY3V0aW5nUGFyYW06IGFueTtcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuXG5cdCAqL1xuXHRpc0V4ZWN1dGluZzogYm9vbGVhbjtcblx0aXNFeGVjdXRpbmckPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZSBvciBub3QuXG5cdCAqL1xuXHRjYW5FeGVjdXRlOiBib29sZWFuO1xuXHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cdC8qKlxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZS5cblx0ICovXG5cdGV4ZWN1dGUodmFsdWU/OiBhbnkpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIGZ1bmN0aW9uIHRvIGludm9rZSBhbmQgcmV0dXJuIGEgcmVzdWx0IGluIFByb21pc2UuXG5cdCAqL1xuXHRleGVjdXRlV2l0aFJlc3VsdCh2YWx1ZT86IGFueSk6IFByb21pc2U8YW55Pjtcblx0LyoqXG5cdCAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSBzdWJzY3JpcHRpb25zLlxuXHQgKi9cblx0ZGVzdHJveSgpOiB2b2lkO1xuXG5cdHZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XG5cblx0c2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSk7XG5cblx0c2V0RW5hYmxlZFZhbHVlKGVuYWJsZTogYm9vbGVhbik7XG5cbn1cblxuXG4vKipcbiAqIENvbW1hbmQgb2JqZWN0IHVzZWQgdG8gZW5jYXBzdWxhdGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgbmVlZGVkIHRvIHBlcmZvcm0gYW4gYWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ29tbWFuZCBpbXBsZW1lbnRzIElDb21tYW5kIHtcblxuXHRpc0V4ZWN1dGluZyA9IGZhbHNlO1xuXHRpc0V4ZWN1dGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblx0Y2FuRXhlY3V0ZSA9IHRydWU7XG5cdGNhbkV4ZWN1dGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG5cdHByaXZhdGUgZXhlY3V0aW9uUGlwZSQgPSBuZXcgU3ViamVjdDx7fT4oKTtcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgY2FuRXhlY3V0ZSQkOiBTdWJzY3JpcHRpb247XG5cdHByaXZhdGUgZXhlY3V0aW9uUGlwZSQkOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBlbGVtZW50TmV4dEZvY3VzOiBhbnk7XG5cblx0cHVibGljIHJlc3VsdDogUHJvbWlzZTxhbnk+O1xuXG5cdHB1YmxpYyBhc3luY0FjdGlvbjogKGFueSkgPT4gYW55O1xuXHRwdWJsaWMgcmVzdWx0QXN5bmNBY3Rpb246IGFueTtcblxuXHRwdWJsaWMgZXhlY3V0aW5nUGFyYW06IGFueTtcblxuXHRwcml2YXRlIGRlbGF5U3Vic2NyaWJlOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBzZXRFbmFibGVkID0gdHJ1ZTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb21tYW5kLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSBleGVjdXRlUGFyYW06IChhbnk/KSA9PiBhbnksXG5cdFx0Y2FuRXhlY3V0ZSQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+LFxuXHRcdHByaXZhdGUgaXNBc3luYz86IGJvb2xlYW4sXG5cdFx0cHJpdmF0ZSBkZWxheT86IG51bWJlclxuXHQpIHtcblx0XHRpZiAoY2FuRXhlY3V0ZSQpIHtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSBjb21iaW5lTGF0ZXN0KFxuXHRcdFx0XHR0aGlzLmlzRXhlY3V0aW5nJCxcblx0XHRcdFx0Y2FuRXhlY3V0ZSRcblx0XHRcdFx0LCAoaXNFeGVjdXRpbmcsIGNhbkV4ZWN1dGVSZXN1bHQpID0+IHtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnW2NvbW1hbmQ6OmNvbWJpbmVMYXRlc3QkXSB1cGRhdGUhJywgeyBpc0V4ZWN1dGluZywgY2FuRXhlY3V0ZVJlc3VsdCB9KTtcblx0XHRcdFx0XHR0aGlzLmlzRXhlY3V0aW5nID0gaXNFeGVjdXRpbmc7XG5cdFx0XHRcdFx0dGhpcy5jYW5FeGVjdXRlID0gIWlzRXhlY3V0aW5nICYmIGNhbkV4ZWN1dGVSZXN1bHQ7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2FuRXhlY3V0ZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY2FuRXhlY3V0ZSQuc3Vic2NyaWJlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQgPSB0aGlzLmlzRXhlY3V0aW5nJC5waXBlKG1hcCh4ID0+IHtcblx0XHRcdFx0Y29uc3QgY2FuRXhlY3V0ZSA9ICF4O1xuXHRcdFx0XHR0aGlzLmNhbkV4ZWN1dGUgPSBjYW5FeGVjdXRlO1xuXHRcdFx0XHRyZXR1cm4gY2FuRXhlY3V0ZTtcblx0XHRcdH0pKTtcblx0XHRcdHRoaXMuaXNFeGVjdXRpbmckJCA9IHRoaXMuaXNFeGVjdXRpbmckLnBpcGUoXG5cdFx0XHRcdHRhcCh4ID0+IHRoaXMuaXNFeGVjdXRpbmcgPSB4KSlcblx0XHRcdFx0LnN1YnNjcmliZSgpO1xuXHRcdH1cblx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFyYW0sIGlzQXN5bmMsIGRlbGF5KTtcblx0fVxuXG5cdHB1YmxpYyB2ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpIHtcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJC5vYnNlcnZlcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZSh0aGlzLmV4ZWN1dGVQYXJhbSwgdGhpcy5pc0FzeW5jLCB0aGlzLmRlbGF5KTtcblx0XHR9XG5cdH1cblxuXHRleGVjdXRlKHZhbHVlPzogYW55KSB7XG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XG5cdH1cblxuXHRhc3luYyBleGVjdXRlV2l0aFJlc3VsdCh2YWx1ZT86IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHZhbHVlO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQubmV4dCh2YWx1ZSk7XG5cdFx0cmV0dXJuIGF3YWl0IHRoaXMucmVzdWx0O1xuXHR9XG5cblx0ZGVzdHJveSgpIHtcblx0XHRpZiAodGhpcy5leGVjdXRpb25QaXBlJCQpIHtcblx0XHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkLnVuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmNhbkV4ZWN1dGUkJCkge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckJCkge1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkLnVuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmlzRXhlY3V0aW5nJCkge1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQuY29tcGxldGUoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7XG5cdFx0XHR0aGlzLmFzeW5jQWN0aW9uID0gbnVsbDtcblx0XHRcdHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJtOiAoYW55PykgPT4gYW55LCBpc0FzeW5jPzogYm9vbGVhbiwgZGVsYXk/OiBudW1iZXIpIHtcblx0XHRsZXQgcGlwZSQgPSB0aGlzLmV4ZWN1dGlvblBpcGUkLnBpcGUoXG5cdFx0XHRmaWx0ZXIoKCkgPT4gdGhpcy5jYW5FeGVjdXRlKSxcblx0XHRcdHRhcCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQodHJ1ZSk7XG5cdFx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih1bmRlZmluZWQpOyB9XG5cdFx0XHR9KSk7XG5cblx0XHRwaXBlJCA9IGlzQXN5bmNcblx0XHRcdD8gcGlwZSQucGlwZShzd2l0Y2hNYXAoKHZhbHVlKSA9PiB7XG5cdFx0XHRcdGlmIChkZWxheSAmJiBkZWxheSA+IDApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5kZWxheVN1YnNjcmliZSkgeyB0aGlzLmRlbGF5U3Vic2NyaWJlLnVuc3Vic2NyaWJlKCk7IH1cblx0XHRcdFx0XHRjb25zdCBkZWxheVRpbWVyID0gdGltZXIoZGVsYXkpO1xuXHRcdFx0XHRcdHRoaXMuZGVsYXlTdWJzY3JpYmUgPSBkZWxheVRpbWVyLnN1YnNjcmliZSh0ID0+IHsgZXhlY3V0ZVBhcm0odmFsdWUpOyB9KTtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdCA9IGV4ZWN1dGVQYXJtKHZhbHVlKTtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKVxuXHRcdFx0OiBwaXBlJC5waXBlKHRhcCgodmFsdWUpID0+IHsgZXhlY3V0ZVBhcm0odmFsdWUpOyB9KSk7XG5cblx0XHRwaXBlJCA9IHBpcGUkLnBpcGUodGFwKCgpID0+IHtcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiAtIHNldCBpZGxlJyk7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5uZXh0KGZhbHNlKTtcblx0XHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cblx0XHRcdE9uUmV0dXJuRGlyZWN0aXZlLnNldE5leHRGb2N1cyh0aGlzLmVsZW1lbnROZXh0Rm9jdXMsIHRoaXMuc2V0RW5hYmxlZCk7XG5cdFx0fSxcblx0XHRcdChlKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdbY29tbWFuZDo6ZXhjdXRpb25QaXBlJF0gZG8jMiBlcnJvciAtIHNldCBpZGxlJyArIGUudG9TdHJpbmcoKSk7XG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRpZiAoaXNBc3luYyAmJiB0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHsgdGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IHRoaXMuYXN5bmNBY3Rpb24odGhpcy5yZXN1bHRBc3luY0FjdGlvbik7IH1cblx0XHRcdFx0dGhpcy5idWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcm0sIGlzQXN5bmMsIGRlbGF5KTtcblx0XHRcdH0pKTtcblx0XHR0aGlzLmV4ZWN1dGlvblBpcGUkJCA9IHBpcGUkLnN1YnNjcmliZSgpO1xuXHR9XG5cblx0cHVibGljIHNldE5leHRGb2N1cyhlbGVtZW50OiBhbnkpIHtcblx0XHR0aGlzLmVsZW1lbnROZXh0Rm9jdXMgPSBlbGVtZW50O1xuXHR9XG5cdHB1YmxpYyBzZXRFbmFibGVkVmFsdWUoZW5hYmxlZCkge1xuXHRcdHRoaXMuc2V0RW5hYmxlZCA9IGVuYWJsZWQ7XG5cdH1cbn1cbiJdfQ==