UNPKG

@neocomplexx/ngx-neo-directives

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

595 lines 45.7 kB
/** * @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 const COMMAND_CONFIG = new InjectionToken('COMMAND_CONFIG'); /** @type {?} */ export const 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> * ``` */ export class CommandDirective { /** * @param {?} renderer * @param {?} element */ constructor(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 {?} */ ngOnInit() { // 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 {?} */ 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 {?} */ 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 {?} */ (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { event.preventDefault(); event.stopPropagation(); if (this.element.nativeElement.localName === 'input') { return; } this.executeCommand(); }))); this.element.nativeElement.addEventListener('focusin', (/** * @param {?} event * @return {?} */ (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { event.preventDefault(); event.stopPropagation(); this.executeCommand(); }))); } else { this.element.nativeElement.addEventListener('keydown', (/** * @param {?} event * @return {?} */ (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { if ((event.which === 13 || event.keyCode === 13)) { event.preventDefault(); event.stopPropagation(); this.executeCommand(); } }))); this.element.nativeElement.addEventListener('click', (/** * @param {?} event * @return {?} */ (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (this.element.nativeElement.localName === 'input') { return; } event.preventDefault(); if (this.stopPropagation) { event.stopPropagation(); } this.executeCommand(); }))); } } /** * @return {?} */ executeCommand() { if (!this.element.nativeElement.disabled) this.command.canExecute = true; this.command.verifyCommandExecutionPipe(); this.command.execute(this.commandValue); } /** * @return {?} */ ngOnDestroy() { if (this.command) { this.command.destroy(); } if (this.canExecute$$) { this.canExecute$$.unsubscribe(); } if (this.isExecuting$$) { this.isExecuting$$.unsubscribe(); } } /** * @private * @return {?} */ isMobileOperatingSystem() { /** @type {?} */ let isMobile = false; /** @type {?} */ const 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 = () => [ { 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 }] }; 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. */ export class Command { /** * Creates an instance of Command. * @param {?} executeParam * @param {?=} canExecute$ * @param {?=} isAsync * @param {?=} delay */ constructor(executeParam, canExecute$, isAsync, delay) { 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 {?} */ (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 {?} */ x => { /** @type {?} */ const canExecute = !x; this.canExecute = canExecute; return canExecute; }))); this.isExecuting$$ = this.isExecuting$.pipe(tap((/** * @param {?} x * @return {?} */ x => this.isExecuting = x))) .subscribe(); } this.buildExecutionPipe(executeParam, isAsync, delay); } /** * @return {?} */ verifyCommandExecutionPipe() { if (this.executionPipe$.observers.length === 0) { this.buildExecutionPipe(this.executeParam, this.isAsync, this.delay); } } /** * @param {?=} value * @return {?} */ execute(value) { this.executingParam = value; this.executionPipe$.next(value); } /** * @param {?=} value * @return {?} */ executeWithResult(value) { return tslib_1.__awaiter(this, void 0, void 0, function* () { this.executingParam = value; this.executionPipe$.next(value); return yield this.result; }); } /** * @return {?} */ destroy() { 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 {?} */ buildExecutionPipe(executeParm, isAsync, delay) { /** @type {?} */ let pipe$ = this.executionPipe$.pipe(filter((/** * @return {?} */ () => this.canExecute)), tap((/** * @return {?} */ () => { this.isExecuting$.next(true); if (isAsync && this.asyncAction != null) { this.resultAsyncAction = this.asyncAction(undefined); } }))); pipe$ = isAsync ? pipe$.pipe(switchMap((/** * @param {?} value * @return {?} */ (value) => { if (delay && delay > 0) { if (this.delaySubscribe) { this.delaySubscribe.unsubscribe(); } /** @type {?} */ const delayTimer = timer(delay); this.delaySubscribe = delayTimer.subscribe((/** * @param {?} t * @return {?} */ t => { executeParm(value); })); return Promise.resolve(null); } else { /** @type {?} */ const result = executeParm(value); return Promise.resolve(result); } }))) : pipe$.pipe(tap((/** * @param {?} value * @return {?} */ (value) => { executeParm(value); }))); pipe$ = pipe$.pipe(tap((/** * @return {?} */ () => { // 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 {?} */ (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 {?} */ setNextFocus(element) { this.elementNextFocus = element; } /** * @param {?} enabled * @return {?} */ setEnabledValue(enabled) { this.setEnabled = enabled; } } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbmVvY29tcGxleHgvbmd4LW5lby1kaXJlY3RpdmVzLyIsInNvdXJjZXMiOlsibGliL25neC1jb21tYW5kL2NvbW1hbmQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUE0QixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUxRCxNQUFNLE9BQU8sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFTLGdCQUFnQixDQUFDOztBQUUxRSxNQUFNLE9BQU8sc0JBQXNCLEdBQW1CO0lBQ3JELGlCQUFpQixFQUFFLFdBQVc7Q0FDOUI7Ozs7Ozs7Ozs7OztBQWtCRCxNQUFNLE9BQU8sZ0JBQWdCOzs7OztJQWtCNUIsWUFDUyxRQUFtQixFQUNuQixPQUFtQjtRQURuQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFkbkIsb0JBQWUsR0FBRyxLQUFLLENBQUM7O1FBR3hCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFJbkIsV0FBTSxHQUFtQixzQkFBc0IsQ0FBQztRQUVoRCxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lBS25DLENBQUM7Ozs7SUFFTCxRQUFRO1FBQ1AsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FB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SUFFakMsaUNBQTJDOzs7OztJQUMzQyxnQ0FBb0M7Ozs7O0lBQ3BDLCtCQUFtQzs7Ozs7SUFDbkMsa0NBQXNDOzs7OztJQUV0QyxtQ0FBOEI7O0lBRTlCLHlCQUE0Qjs7SUFFNUIsOEJBQWlDOztJQUNqQyxvQ0FBOEI7O0lBRTlCLGlDQUEyQjs7Ozs7SUFFM0IsaUNBQXFDOzs7OztJQUVyQyw2QkFBMEI7Ozs7O0lBTXpCLCtCQUFtQzs7Ozs7SUFFbkMsMEJBQXlCOzs7OztJQUN6Qix3QkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTppbmRlbnRcblxuaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQsIEVsZW1lbnRSZWYsIEluamVjdGlvblRva2VuLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBPblJldHVybkRpcmVjdGl2ZSB9IGZyb20gJy4uL29uUmV0dXJuLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBDT01NQU5EX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdDT01NQU5EX0NPTkZJRycpO1xuXG5leHBvcnQgY29uc3QgQ09NTUFORF9ERUZBVUxUX0NPTkZJRzogQ29tbWFuZE9wdGlvbnMgPSB7XG5cdGV4ZWN1dGluZ0Nzc0NsYXNzOiAnZXhlY3V0aW5nJyxcbn07XG4vKlxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVDb25maWcoY29uZmlnOiBDb21tYW5kT3B0aW9ucyk6IGFueSB7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBDT01NQU5EX0RFRkFVTFRfQ09ORklHLCBjb25maWcpO1xufSAqL1xuXG5cbi8qKlxuICpcbiAqICMjIyBFeGFtcGxlIHdpdGggb3B0aW9uc1xuICogYGBgaHRtbFxuICogPGJ1dHRvbiBbY29tbWFuZF09J3NhdmVDbWQnIFtjb21tYW5kT3B0aW9uc109J3tleGVjdXRpbmdDc3NDbGFzczogJ2luLXByb2dyZXNzJ30nPlNhdmU8L2J1dHRvbj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuXHRzZWxlY3RvcjogJ1tjb21tYW5kXSdcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuXHRASW5wdXQoKSBjb21tYW5kOiBJQ29tbWFuZDtcblx0QElucHV0KCkgY29tbWFuZE9wdGlvbnM6IENvbW1hbmRPcHRpb25zO1xuXHRASW5wdXQoKSBjb21tYW5kQ2FuRXhlY3V0ZTogYm9vbGVhbjtcblx0QElucHV0KCkgY29tbWFuZFZhbHVlOiBhbnk7XG5cdEBJbnB1dCgpIHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlO1xuXHRASW5wdXQoKSBjb21tYW5kTmV4dEZvY3VzOiBhbnk7XG5cdC8vIEBIb3N0QmluZGluZygnZGlzYWJsZWQnKSBpc0Rpc2FibGVkOiBib29sZWFuO1xuXHRASW5wdXQoKSBzZXRFbmFibGVkID0gdHJ1ZTtcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBpc0V4ZWN1dGluZyQkOiBTdWJzY3JpcHRpb247XG5cblx0cHJpdmF0ZSBjb25maWc6IENvbW1hbmRPcHRpb25zID0gQ09NTUFORF9ERUZBVUxUX0NPTkZJRztcblxuXHRwcml2YXRlIG93bkRpc2FibGVkU3RhdGUgPSBmYWxzZTtcblx0cHJpdmF0ZSBjb21tYW5kRGlzYWJsZWRDaGFuZ2VkID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXHRcdHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZlxuXHQpIHsgfVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZERpcmVjdGl2ZTo6aW5pdF0nKTtcblx0XHR0aGlzLmNvbW1hbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWcsIHRoaXMuY29tbWFuZE9wdGlvbnMpO1xuXG5cdFx0aWYgKCF0aGlzLmNvbW1hbmQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignW2NvbW1hbmREaXJlY3RpdmVdIGNvbW1hbmQgc2hvdWxkIGJlIGRlZmluZWQhJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY29tbWFuZC52ZXJpZnlDb21tYW5kRXhlY3V0aW9uUGlwZSgpO1xuXHRcdFx0dGhpcy5jb21tYW5kLnNldE5leHRGb2N1cyh0aGlzLmNvbW1hbmROZXh0Rm9jdXMpO1xuXHRcdFx0dGhpcy5jb21tYW5kLnNldEVuYWJsZWRWYWx1ZSh0aGlzLnNldEVuYWJsZWQpO1xuXHRcdH1cblxuXHRcdC8vIGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdidXR0b24nKSB7XG5cdFx0Ly8gXHRsZXQgdGhpc0F1eCA9IHRoaXM7XHQvLyBTZXQgdXAgYSBuZXcgb2JzZXJ2ZXJcblx0XHQvLyBcdHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykge1xuXHRcdC8vIFx0XHRtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikge1xuXHRcdC8vIFx0XHRcdC8vIENoZWNrIHRoZSBtb2RpZmllZCBhdHRyaWJ1dGVOYW1lIGlzIFwiZGlzYWJsZWRcIlxuXHRcdC8vIFx0XHRcdGlmKCF0aGlzQXV4LmNvbW1hbmREaXNhYmxlZENoYW5nZWQpIHtcblx0XHQvLyBcdFx0XHRcdGlmIChtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSBcImRpc2FibGVkXCIpIHtcblx0XHQvLyBcdFx0XHRcdFx0dGhpc0F1eC5vd25EaXNhYmxlZFN0YXRlID0gdGhpc0F1eC5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQ7XG5cdFx0Ly8gXHRcdFx0XHR9XG5cdFx0Ly8gXHRcdFx0fSBlbHNlIHtcblx0XHQvLyBcdFx0XHRcdHRoaXNBdXguY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IGZhbHNlO1xuXHRcdC8vIFx0XHRcdH1cblx0XHQvLyBcdFx0fSk7XG5cdFx0Ly8gXHR9KTtcblx0XHQvLyBcdC8vIENvbmZpZ3VyZSB0byBvbmx5IGxpc3RlbiB0byBhdHRyaWJ1dGUgY2hhbmdlc1xuXHRcdC8vIFx0dmFyIGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSB9O1xuXHRcdC8vIFx0Ly8gU3RhcnQgb2JzZXJ2aW5nIG15RWxlbVxuXHRcdC8vIFx0b2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcblx0XHQvLyB9XG5cblx0XHR0aGlzLmNhbkV4ZWN1dGUkJCA9IHRoaXMuY29tbWFuZC5jYW5FeGVjdXRlJC5waXBlKFxuXHRcdFx0dGFwKHggPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQubG9jYWxOYW1lID09PSAnYnV0dG9uJykge1xuXHRcdFx0XHRcdHRoaXMuY29tbWFuZERpc2FibGVkQ2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0aWYgKHRoaXMuY29tbWFuZFZhbHVlID09IHRoaXMuY29tbWFuZC5leGVjdXRpbmdQYXJhbSkge1xuXHRcdFx0XHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSAheDtcblx0XHRcdFx0XHRcdC8vIH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gISghdGhpcy5vd25EaXNhYmxlZFN0YXRlICYmIHgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xuXHRcdHRoaXMuaXNFeGVjdXRpbmckJCA9IHRoaXMuY29tbWFuZC5pc0V4ZWN1dGluZyQucGlwZShcblx0XHRcdHRhcCh4ID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tjb21tYW5kRGlyZWN0aXZlOjppc0V4ZWN1dGluZyRdJywgeCk7XG4gICAgICAgIHggPyB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCB0aGlzLmNvbW1hbmRPcHRpb25zLmV4ZWN1dGluZ0Nzc0NsYXNzKSA6IHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuY29tbWFuZE9wdGlvbnMuZXhlY3V0aW5nQ3NzQ2xhc3MpO1xuXHRcdFx0fSkpLnN1YnNjcmliZSgpO1xuXG5cdFx0aWYgKHRoaXMuaXNNb2JpbGVPcGVyYXRpbmdTeXN0ZW0oKSkge1xuXHRcdFx0dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGFzeW5jIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0aWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmxvY2FsTmFtZSA9PT0gJ2lucHV0Jykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDb21tYW5kKCk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBhc3luYyAoZXZlbnQpID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNvbW1hbmQoKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgYXN5bmMgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICgoZXZlbnQud2hpY2ggPT09IDEzIHx8IGV2ZW50LmtleUNvZGUgPT09IDEzKSkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5sb2NhbE5hbWUgPT09ICdpbnB1dCcpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0aWYgKHRoaXMuc3RvcFByb3BhZ2F0aW9uKSB7XG5cdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5leGVjdXRlQ29tbWFuZCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1cblxuXHRleGVjdXRlQ29tbWFuZCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB0aGlzLmNvbW1hbmQuY2FuRXhlY3V0ZSA9IHRydWU7XG5cdFx0dGhpcy5jb21tYW5kLnZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCk7XG5cdFx0dGhpcy5jb21tYW5kLmV4ZWN1dGUodGhpcy5jb21tYW5kVmFsdWUpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0aWYgKHRoaXMuY29tbWFuZCkgeyB0aGlzLmNvbW1hbmQuZGVzdHJveSgpOyB9XG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7IHRoaXMuY2FuRXhlY3V0ZSQkLnVuc3Vic2NyaWJlKCk7IH1cblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQkKSB7IHRoaXMuaXNFeGVjdXRpbmckJC51bnN1YnNjcmliZSgpOyB9XG5cdH1cblxuXHRwcml2YXRlIGlzTW9iaWxlT3BlcmF0aW5nU3lzdGVtKCk6IGJvb2xlYW4ge1xuXHRcdGxldCBpc01vYmlsZSA9IGZhbHNlO1xuXHRcdGNvbnN0IHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnZlbmRvcjtcblxuXHRcdC8vIFdpbmRvd3MgUGhvbmUgbXVzdCBjb21lIGZpcnN0IGJlY2F1c2UgaXRzIFVBIGFsc28gY29udGFpbnMgXCJBbmRyb2lkXCJcblx0XHRpZiAoL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJXaW5kb3dzIFBob25lXCI7XG5cdFx0fSBlbHNlIGlmICgvYW5kcm9pZC9pLnRlc3QodXNlckFnZW50KSkge1xuXHRcdFx0aXNNb2JpbGUgPSB0cnVlOyAvLyBcIkFuZHJvaWRcIjtcblx0XHR9IGVsc2UgaWYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHVzZXJBZ2VudCkpIHtcblx0XHRcdC8vIGlPUyBkZXRlY3Rpb24gZnJvbTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTAzOTg4NS8xNzc3MTBcblx0XHRcdGlzTW9iaWxlID0gdHJ1ZTsgLy8gXCJpT1NcIjtcblx0XHR9XG5cblx0XHRpc01vYmlsZSA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGlzTW9iaWxlOyAvLyBcInVua25vd25cIjtcblx0fVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcblx0LyoqXG5cdCAqIENzcyBDbGFzcyB3aGljaCBnZXRzIGFkZGVkL3JlbW92ZWQgb24gdGhlIENvbW1hbmQgZWxlbWVudCdzIGhvc3Qgd2hpbGUgQ29tbWFuZCBpc0V4ZWN1dGluZyQuXG5cdCAqXG5cdCAqL1xuXHRleGVjdXRpbmdDc3NDbGFzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21tYW5kIHtcblxuXHRleGVjdXRpbmdQYXJhbTogYW55O1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGV4ZWN1dGluZy5cblx0ICovXG5cdGlzRXhlY3V0aW5nOiBib29sZWFuO1xuXHRpc0V4ZWN1dGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlIG9yIG5vdC5cblx0ICovXG5cdGNhbkV4ZWN1dGU6IGJvb2xlYW47XG5cdGNhbkV4ZWN1dGUkPzogT2JzZXJ2YWJsZTxib29sZWFuPjtcblx0LyoqXG5cdCAqIEV4ZWN1dGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuXHQgKi9cblx0ZXhlY3V0ZSh2YWx1ZT86IGFueSk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGUgZnVuY3Rpb24gdG8gaW52b2tlIGFuZCByZXR1cm4gYSByZXN1bHQgaW4gUHJvbWlzZS5cblx0ICovXG5cdGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+O1xuXHQvKipcblx0ICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBoZWxkIGJ5IHN1YnNjcmlwdGlvbnMuXG5cdCAqL1xuXHRkZXN0cm95KCk6IHZvaWQ7XG5cblx0dmVyaWZ5Q29tbWFuZEV4ZWN1dGlvblBpcGUoKTtcblxuXHRzZXROZXh0Rm9jdXMoZWxlbWVudDogYW55KTtcblxuXHRzZXRFbmFibGVkVmFsdWUoZW5hYmxlOiBib29sZWFuKTtcblxufVxuXG5cbi8qKlxuICogQ29tbWFuZCBvYmplY3QgdXNlZCB0byBlbmNhcHN1bGF0ZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZWVkZWQgdG8gcGVyZm9ybSBhbiBhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21tYW5kIGltcGxlbWVudHMgSUNvbW1hbmQge1xuXG5cdGlzRXhlY3V0aW5nID0gZmFsc2U7XG5cdGlzRXhlY3V0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXHRjYW5FeGVjdXRlID0gdHJ1ZTtcblx0Y2FuRXhlY3V0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cblx0cHJpdmF0ZSBleGVjdXRpb25QaXBlJCA9IG5ldyBTdWJqZWN0PHt9PigpO1xuXHRwcml2YXRlIGlzRXhlY3V0aW5nJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBjYW5FeGVjdXRlJCQ6IFN1YnNjcmlwdGlvbjtcblx0cHJpdmF0ZSBleGVjdXRpb25QaXBlJCQ6IFN1YnNjcmlwdGlvbjtcblxuXHRwcml2YXRlIGVsZW1lbnROZXh0Rm9jdXM6IGFueTtcblxuXHRwdWJsaWMgcmVzdWx0OiBQcm9taXNlPGFueT47XG5cblx0cHVibGljIGFzeW5jQWN0aW9uOiAoYW55KSA9PiBhbnk7XG5cdHB1YmxpYyByZXN1bHRBc3luY0FjdGlvbjogYW55O1xuXG5cdHB1YmxpYyBleGVjdXRpbmdQYXJhbTogYW55O1xuXG5cdHByaXZhdGUgZGVsYXlTdWJzY3JpYmU6IFN1YnNjcmlwdGlvbjtcblxuXHRwcml2YXRlIHNldEVuYWJsZWQgPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENvbW1hbmQuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGV4ZWN1dGVQYXJhbTogKGFueT8pID0+IGFueSxcblx0XHRjYW5FeGVjdXRlJD86IE9ic2VydmFibGU8Ym9vbGVhbj4sXG5cdFx0cHJpdmF0ZSBpc0FzeW5jPzogYm9vbGVhbixcblx0XHRwcml2YXRlIGRlbGF5PzogbnVtYmVyXG5cdCkge1xuXHRcdGlmIChjYW5FeGVjdXRlJCkge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCA9IGNvbWJpbmVMYXRlc3QoXG5cdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLFxuXHRcdFx0XHRjYW5FeGVjdXRlJFxuXHRcdFx0XHQsIChpc0V4ZWN1dGluZywgY2FuRXhlY3V0ZVJlc3VsdCkgPT4ge1xuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKCdbY29tbWFuZDo6Y29tYmluZUxhdGVzdCRdIHVwZGF0ZSEnLCB7IGlzRXhlY3V0aW5nLCBjYW5FeGVjdXRlUmVzdWx0IH0pO1xuXHRcdFx0XHRcdHRoaXMuaXNFeGVjdXRpbmcgPSBpc0V4ZWN1dGluZztcblx0XHRcdFx0XHR0aGlzLmNhbkV4ZWN1dGUgPSAhaXNFeGVjdXRpbmcgJiYgY2FuRXhlY3V0ZVJlc3VsdDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jYW5FeGVjdXRlO1xuXHRcdFx0XHR9KTtcblx0XHRcdHRoaXMuY2FuRXhlY3V0ZSQkID0gdGhpcy5jYW5FeGVjdXRlJC5zdWJzY3JpYmUoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5jYW5FeGVjdXRlJCA9IHRoaXMuaXNFeGVjdXRpbmckLnBpcGUobWFwKHggPT4ge1xuXHRcdFx0XHRjb25zdCBjYW5FeGVjdXRlID0gIXg7XG5cdFx0XHRcdHRoaXMuY2FuRXhlY3V0ZSA9IGNhbkV4ZWN1dGU7XG5cdFx0XHRcdHJldHVybiBjYW5FeGVjdXRlO1xuXHRcdFx0fSkpO1xuXHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQkID0gdGhpcy5pc0V4ZWN1dGluZyQucGlwZShcblx0XHRcdFx0dGFwKHggPT4gdGhpcy5pc0V4ZWN1dGluZyA9IHgpKVxuXHRcdFx0XHQuc3Vic2NyaWJlKCk7XG5cdFx0fVxuXHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKGV4ZWN1dGVQYXJhbSwgaXNBc3luYywgZGVsYXkpO1xuXHR9XG5cblx0cHVibGljIHZlcmlmeUNvbW1hbmRFeGVjdXRpb25QaXBlKCkge1xuXHRcdGlmICh0aGlzLmV4ZWN1dGlvblBpcGUkLm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMuYnVpbGRFeGVjdXRpb25QaXBlKHRoaXMuZXhlY3V0ZVBhcmFtLCB0aGlzLmlzQXN5bmMsIHRoaXMuZGVsYXkpO1xuXHRcdH1cblx0fVxuXG5cdGV4ZWN1dGUodmFsdWU/OiBhbnkpIHtcblx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdmFsdWU7XG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcblx0fVxuXG5cdGFzeW5jIGV4ZWN1dGVXaXRoUmVzdWx0KHZhbHVlPzogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHR0aGlzLmV4ZWN1dGluZ1BhcmFtID0gdmFsdWU7XG5cdFx0dGhpcy5leGVjdXRpb25QaXBlJC5uZXh0KHZhbHVlKTtcblx0XHRyZXR1cm4gYXdhaXQgdGhpcy5yZXN1bHQ7XG5cdH1cblxuXHRkZXN0cm95KCkge1xuXHRcdGlmICh0aGlzLmV4ZWN1dGlvblBpcGUkJCkge1xuXHRcdFx0dGhpcy5leGVjdXRpb25QaXBlJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuY2FuRXhlY3V0ZSQkKSB7XG5cdFx0XHR0aGlzLmNhbkV4ZWN1dGUkJC51bnN1YnNjcmliZSgpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5pc0V4ZWN1dGluZyQkKSB7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJCQudW5zdWJzY3JpYmUoKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuaXNFeGVjdXRpbmckKSB7XG5cdFx0XHR0aGlzLmlzRXhlY3V0aW5nJC5jb21wbGV0ZSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmFzeW5jQWN0aW9uICE9IG51bGwpIHtcblx0XHRcdHRoaXMuYXN5bmNBY3Rpb24gPSBudWxsO1xuXHRcdFx0dGhpcy5yZXN1bHRBc3luY0FjdGlvbiA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBidWlsZEV4ZWN1dGlvblBpcGUoZXhlY3V0ZVBhcm06IChhbnk/KSA9PiBhbnksIGlzQXN5bmM/OiBib29sZWFuLCBkZWxheT86IG51bWJlcikge1xuXHRcdGxldCBwaXBlJCA9IHRoaXMuZXhlY3V0aW9uUGlwZSQucGlwZShcblx0XHRcdGZpbHRlcigoKSA9PiB0aGlzLmNhbkV4ZWN1dGUpLFxuXHRcdFx0dGFwKCgpID0+IHtcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dCh0cnVlKTtcblx0XHRcdFx0aWYgKGlzQXN5bmMgJiYgdGhpcy5hc3luY0FjdGlvbiAhPSBudWxsKSB7IHRoaXMucmVzdWx0QXN5bmNBY3Rpb24gPSB0aGlzLmFzeW5jQWN0aW9uKHVuZGVmaW5lZCk7IH1cblx0XHRcdH0pKTtcblxuXHRcdHBpcGUkID0gaXNBc3luY1xuXHRcdFx0PyBwaXBlJC5waXBlKHN3aXRjaE1hcCgodmFsdWUpID0+IHtcblx0XHRcdFx0aWYgKGRlbGF5ICYmIGRlbGF5ID4gMCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmRlbGF5U3Vic2NyaWJlKSB7IHRoaXMuZGVsYXlTdWJzY3JpYmUudW5zdWJzY3JpYmUoKTsgfVxuXHRcdFx0XHRcdGNvbnN0IGRlbGF5VGltZXIgPSB0aW1lcihkZWxheSk7XG5cdFx0XHRcdFx0dGhpcy5kZWxheVN1YnNjcmliZSA9IGRlbGF5VGltZXIuc3Vic2NyaWJlKHQgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gZXhlY3V0ZVBhcm0odmFsdWUpO1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSkpXG5cdFx0XHQ6IHBpcGUkLnBpcGUodGFwKCh2YWx1ZSkgPT4geyBleGVjdXRlUGFybSh2YWx1ZSk7IH0pKTtcblxuXHRcdHBpcGUkID0gcGlwZSQucGlwZSh0YXAoKCkgPT4ge1xuXHRcdFx0Ly8gY29uc29sZS5sb2coJ1tjb21tYW5kOjpleGN1dGlvblBpcGUkXSBkbyMyIC0gc2V0IGlkbGUnKTtcblx0XHRcdHRoaXMuaXNFeGVjdXRpbmckLm5leHQoZmFsc2UpO1xuXHRcdFx0dGhpcy5leGVjdXRpbmdQYXJhbSA9IHVuZGVmaW5lZDtcblx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih0aGlzLnJlc3VsdEFzeW5jQWN0aW9uKTsgfVxuXHRcdFx0T25SZXR1cm5EaXJlY3RpdmUuc2V0TmV4dEZvY3VzKHRoaXMuZWxlbWVudE5leHRGb2N1cywgdGhpcy5zZXRFbmFibGVkKTtcblx0XHR9LFxuXHRcdFx0KGUpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ1tjb21tYW5kOjpleGN1dGlvblBpcGUkXSBkbyMyIGVycm9yIC0gc2V0IGlkbGUnICsgZS50b1N0cmluZygpKTtcblx0XHRcdFx0dGhpcy5pc0V4ZWN1dGluZyQubmV4dChmYWxzZSk7XG5cdFx0XHRcdHRoaXMuZXhlY3V0aW5nUGFyYW0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGlmIChpc0FzeW5jICYmIHRoaXMuYXN5bmNBY3Rpb24gIT0gbnVsbCkgeyB0aGlzLnJlc3VsdEFzeW5jQWN0aW9uID0gdGhpcy5hc3luY0FjdGlvbih0aGlzLnJlc3VsdEFzeW5jQWN0aW9uKTsgfVxuXHRcdFx0XHR0aGlzLmJ1aWxkRXhlY3V0aW9uUGlwZShleGVjdXRlUGFybSwgaXNBc3luYywgZGVsYXkpO1xuXHRcdFx0fSkpO1xuXHRcdHRoaXMuZXhlY3V0aW9uUGlwZSQkID0gcGlwZSQuc3Vic2NyaWJlKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TmV4dEZvY3VzKGVsZW1lbnQ6IGFueSkge1xuXHRcdHRoaXMuZWxlbWVudE5leHRGb2N1cyA9IGVsZW1lbnQ7XG5cdH1cblx0cHVibGljIHNldEVuYWJsZWRWYWx1ZShlbmFibGVkKSB7XG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZW5hYmxlZDtcblx0fVxufVxuIl19