@ui-tool/core
Version:
213 lines • 30 kB
JavaScript
import { ChangeDetectionStrategy, Component, Inject, Injector, Input } from '@angular/core';
import { v4 as uuid } from 'uuid';
import { Subject } from 'rxjs';
import { DISPLAY_SPINNER_OPTIONS, SPINNER_HOST, SPINNER_METHOD_INVOKE_CALLBACK, SPINNER_REQUEST_ID, SPINNER_SERVICE } from '../../constants/injectors/injectors';
import { BasicSpinnerComponent } from './basic-spinner/basic-spinner.component';
import { filter } from 'rxjs/operators';
import { SpinnerCommands } from '../../constants';
import { PurgeSpinnerCommand } from '../../models';
import * as i0 from "@angular/core";
export class SpinnerContainerComponent {
//#endregion
//#region Constructor
constructor(_spinnerService, _viewContainerRef, _changeDetectorRef, __injector) {
this._spinnerService = _spinnerService;
this._viewContainerRef = _viewContainerRef;
this._changeDetectorRef = _changeDetectorRef;
this.__injector = __injector;
this.id = uuid();
this.__id = uuid();
this.__hostClass = '';
this.__preserveLatestRequest = true;
this.__contexts = [];
this._visibilityEvent$ = new Subject();
}
//#endregion
//#region Accessors
set id(value) {
this.__id = value;
if (this._visibilityChangedSubscription && !this._visibilityChangedSubscription.closed) {
this._visibilityChangedSubscription.unsubscribe();
this._visibilityEvent$.next(undefined);
}
// Register spinner visibility changed event.
this._visibilityChangedSubscription = this._spinnerService
.hookSpinnerVisibilityEvent(value)
.subscribe((event) => this._visibilityEvent$.next(event));
}
get id() {
return this.__id;
}
set preserveLatestRequest(value) {
this.__preserveLatestRequest = value;
}
get preserveLatestRequest() {
return this.__preserveLatestRequest;
}
//#endregion
//#region Life cycle hooks
ngOnInit() {
// Subscription registration.
this.__localVisibilityRequestHandleSubscription = this._visibilityEvent$
.pipe(filter(command => command?.containerId === this.__id), filter(command => command !== null && command !== undefined))
.subscribe(command => {
this._handleVisibilityChangedEvent(command);
this._changeDetectorRef.markForCheck();
});
}
ngAfterViewInit() {
// Update component id to trigger spinner event.
this.id = this.__id || uuid();
}
//#endregion
//#region Methods
// Called when component is destroyed.
ngOnDestroy() {
this._visibilityChangedSubscription?.unsubscribe();
this._visibilityEvent$?.unsubscribe();
this.__localVisibilityRequestHandleSubscription?.unsubscribe();
}
// Handle visibility changed event.
_handleVisibilityChangedEvent(command) {
// Invalid command & view container ref.
if (!command || !this._viewContainerRef) {
return;
}
if (command.kind === SpinnerCommands.display) {
const actualCommand = command;
let purge = false;
if (actualCommand.options) {
purge = actualCommand.options.purge || false;
}
if (purge) {
const purgeRequest = new PurgeSpinnerCommand(actualCommand.containerId);
this._handleVisibilityChangedEvent(purgeRequest);
}
else if (this.__preserveLatestRequest) {
// Get the latest context.
const context = this._getLatestContext();
context?.context?.componentRef?.destroy();
}
this._displaySpinner(actualCommand, -1);
return;
}
if (command.kind === SpinnerCommands.close) {
const actualCommand = command;
if (actualCommand.id) {
this._dismissByRequestId(actualCommand.id);
}
// There is at least one display request. Display that one.
const { context, index: latestIndex } = this._getLatestContext();
if (context && latestIndex > -1) {
this._displaySpinner(context.command, latestIndex);
}
return;
}
if (command.kind === SpinnerCommands.purge) {
while (true) {
if (!this.__contexts.length) {
break;
}
this._dismissByRequestId(this.__contexts[0].command?.id, true);
}
return;
}
}
_displaySpinner(displaySpinnerRequest, index) {
if (!displaySpinnerRequest || !this._viewContainerRef) {
return;
}
const commandContext = {
command: displaySpinnerRequest,
componentRef: null
};
if (!(index < 0 || index >= this.__contexts.length)) {
this.__contexts[index].componentRef?.destroy();
}
const childInjector = Injector.create({
providers: [
{
provide: SPINNER_METHOD_INVOKE_CALLBACK,
useValue: displaySpinnerRequest.options?.invokedMethod
},
{
provide: SPINNER_REQUEST_ID,
useValue: displaySpinnerRequest.id
},
{
provide: DISPLAY_SPINNER_OPTIONS,
useValue: displaySpinnerRequest.options
},
{
provide: SPINNER_HOST,
useValue: displaySpinnerRequest.containerId
}
],
parent: this.__injector
});
if (!displaySpinnerRequest.options || !displaySpinnerRequest.options.instanceType) {
const componentRef = this._viewContainerRef.createComponent(BasicSpinnerComponent, {
injector: childInjector
});
componentRef.changeDetectorRef.markForCheck();
commandContext.componentRef = componentRef;
}
else {
const componentRef = this._viewContainerRef.createComponent(displaySpinnerRequest.options.instanceType, {
injector: childInjector
});
componentRef.changeDetectorRef.markForCheck();
commandContext.componentRef = componentRef;
}
if (index < 0 || index >= this.__contexts.length) {
this.__contexts.push(commandContext);
}
else {
this.__contexts[index] = commandContext;
}
}
_dismissByRequestId(requestId, force) {
const index = this.__contexts.findIndex(x => x.command?.id === requestId);
if (index < 0) {
return;
}
const context = this.__contexts[index];
if (!context) {
return;
}
const command = context.command;
if (!command || command.kind !== SpinnerCommands.display) {
return;
}
// Spinner cannot be closed.
const closingHandler = command?.options?.closing;
if (!force && closingHandler && !closingHandler()) {
return;
}
context.componentRef?.destroy();
context.componentRef = null;
command?.options?.closed?.(force || false);
this.__contexts.splice(index, 1);
}
_getLatestContext() {
if (this.__contexts.length < 1) {
return { context: null, index: -1 };
}
const lastIndex = this.__contexts.length - 1;
return { context: this.__contexts[lastIndex], index: lastIndex };
}
}
SpinnerContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SpinnerContainerComponent, deps: [{ token: SPINNER_SERVICE }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
SpinnerContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: SpinnerContainerComponent, selector: "cms-spinner-container", inputs: { id: "id", preserveLatestRequest: "preserveLatestRequest" }, ngImport: i0, template: '', isInline: true, styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SpinnerContainerComponent, decorators: [{
type: Component,
args: [{ selector: 'cms-spinner-container', template: '', changeDetection: ChangeDetectionStrategy.OnPush, styles: [""] }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [SPINNER_SERVICE]
}] }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, propDecorators: { id: [{
type: Input
}], preserveLatestRequest: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9tb2R1bGVzL3NwaW5uZXIvc3Bpbm5lci1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUtOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxFQUFFLElBQUksSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFlBQVksRUFDckMsOEJBQThCLEVBQzlCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2hCLE1BQU0scUNBQXFDLENBQUM7QUFJN0MsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQWtCLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFDOztBQWFsRSxNQUFNLE9BQU8seUJBQXlCO0lBeURwQyxZQUFZO0lBRVoscUJBQXFCO0lBRXJCLFlBQ3NDLGVBQWdDLEVBQ2hDLGlCQUFtQyxFQUNuQyxrQkFBcUMsRUFDdkMsVUFBb0I7UUFIbEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3RELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFFakIs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QVM7K0JBQ0UsdUJBQXVCLFlBQ3ZCLEVBQUUsbUJBRUssdUJBQXVCLENBQUMsTUFBTTs7MEJBK0QzQixNQUFNOzJCQUFDLGVBQWU7a0lBL0IvQixFQUFFO3NCQURaLEtBQUs7Z0JBb0JLLHFCQUFxQjtzQkFEL0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Y0IGFzIHV1aWR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRElTUExBWV9TUElOTkVSX09QVElPTlMsIFNQSU5ORVJfSE9TVCxcbiAgU1BJTk5FUl9NRVRIT0RfSU5WT0tFX0NBTExCQUNLLFxuICBTUElOTkVSX1JFUVVFU1RfSUQsXG4gIFNQSU5ORVJfU0VSVklDRVxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvaW5qZWN0b3JzL2luamVjdG9ycyc7XG5pbXBvcnQge0lTcGlubmVyU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvaW50ZXJmYWNlcy9zcGlubmVyLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7RGlzcGxheVNwaW5uZXJDb21tYW5kfSBmcm9tICcuLi8uLi9tb2RlbHMvaW1wbGVtZW50YXRpb25zL3NwaW5uZXJzL2Rpc3BsYXktc3Bpbm5lci1jb21tYW5kJztcbmltcG9ydCB7RGVsZXRlU3Bpbm5lckNvbW1hbmR9IGZyb20gJy4uLy4uL21vZGVscy9pbXBsZW1lbnRhdGlvbnMvc3Bpbm5lcnMvZGVsZXRlLXNwaW5uZXItY29tbWFuZCc7XG5pbXBvcnQge0Jhc2ljU3Bpbm5lckNvbXBvbmVudH0gZnJvbSAnLi9iYXNpYy1zcGlubmVyL2Jhc2ljLXNwaW5uZXIuY29tcG9uZW50JztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1NwaW5uZXJDb21tYW5kc30gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7SVNwaW5uZXJDb21tYW5kLCBQdXJnZVNwaW5uZXJDb21tYW5kfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuXG5kZWNsYXJlIHR5cGUgU3Bpbm5lckNvbW1hbmRDb250ZXh0ID0ge1xuICBjb21tYW5kOiBEaXNwbGF5U3Bpbm5lckNvbW1hbmQsXG4gIGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gfCBudWxsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjbXMtc3Bpbm5lci1jb250YWluZXInLFxuICB0ZW1wbGF0ZTogJycsXG4gIHN0eWxlVXJsczogWydzcGlubmVyLWNvbnRhaW5lci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTcGlubmVyQ29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vI3JlZ2lvbiBQcm9wZXJ0aWVzXG5cbiAgLy8gSWQgb2YgbG9hZGluZyBzcGlubmVyLlxuICBwcml2YXRlIF9faWQ6IHN0cmluZztcblxuICAvLyBXaGV0aGVyIHNwaW5uZXIgb25seSBkaXNwbGF5cyB0aGUgbGF0ZXN0IHJlcXVlc3Qgb25seSBvciBub3QuXG4gIHByaXZhdGUgX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3Q6IGJvb2xlYW47XG5cbiAgLy8gQ2xhc3Mgd2hpY2ggaXMgYXBwbGllZCB0byBob3N0IGNvbXBvbmVudC5cbiAgcHJpdmF0ZSBfX2hvc3RDbGFzczogc3RyaW5nO1xuXG4gIC8vIFN1YmplY3Qgd2hpY2ggZW1pdHMgc3Bpbm5lciB2aXNpYmlsaXR5IGV2ZW50LlxuICBwcml2YXRlIHJlYWRvbmx5IF92aXNpYmlsaXR5RXZlbnQkOiBTdWJqZWN0PElTcGlubmVyQ29tbWFuZCB8IG51bGw+O1xuXG4gIC8vIE1hcHBpbmcgYmV0d2VlbiBkaXNwbGF5IHJlcXVlc3QgaWQgJiBkaXNwbGF5ZWQgY29tcG9uZW50LlxuICBwcml2YXRlIHJlYWRvbmx5IF9fY29udGV4dHM6IFNwaW5uZXJDb21tYW5kQ29udGV4dFtdO1xuXG4gIC8vIFN1YnNjcmlwdGlvbiB0byBoYW5kbGUgbG9jYWwgdmlzaWJpbGl0eSByZXF1ZXN0LlxuICBwcml2YXRlIF9fbG9jYWxWaXNpYmlsaXR5UmVxdWVzdEhhbmRsZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFN1YnNjcmlwdGlvbiB3YXRjaCBsaXN0LlxuICBwcm90ZWN0ZWQgX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEFjY2Vzc29yc1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX19pZCA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uICYmICF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcbiAgICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl92aXNpYmlsaXR5RXZlbnQkLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBzcGlubmVyIHZpc2liaWxpdHkgY2hhbmdlZCBldmVudC5cbiAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMuX3NwaW5uZXJTZXJ2aWNlXG4gICAgICAuaG9va1NwaW5uZXJWaXNpYmlsaXR5RXZlbnQodmFsdWUpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRGlzcGxheVNwaW5uZXJDb21tYW5kIHwgRGVsZXRlU3Bpbm5lckNvbW1hbmQpID0+IHRoaXMuX3Zpc2liaWxpdHlFdmVudCQubmV4dChldmVudCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9faWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHByZXNlcnZlTGF0ZXN0UmVxdWVzdCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3QgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcHJlc2VydmVMYXRlc3RSZXF1ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9fcHJlc2VydmVMYXRlc3RSZXF1ZXN0O1xuICB9XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENvbnN0cnVjdG9yXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKEBJbmplY3QoU1BJTk5FUl9TRVJWSUNFKVxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zcGlubmVyU2VydmljZTogSVNwaW5uZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9faW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5pZCA9IHV1aWQoKTtcblxuICAgIHRoaXMuX19pZCA9IHV1aWQoKTtcbiAgICB0aGlzLl9faG9zdENsYXNzID0gJyc7XG4gICAgdGhpcy5fX3ByZXNlcnZlTGF0ZXN0UmVxdWVzdCA9IHRydWU7XG5cbiAgICB0aGlzLl9fY29udGV4dHMgPSBbXTtcbiAgICB0aGlzLl92aXNpYmlsaXR5RXZlbnQkID0gbmV3IFN1YmplY3Q8SVNwaW5uZXJDb21tYW5kIHwgbnVsbD4oKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBMaWZlIGN5Y2xlIGhvb2tzXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLy8gU3Vic2NyaXB0aW9uIHJlZ2lzdHJhdGlvbi5cbiAgICB0aGlzLl9fbG9jYWxWaXNpYmlsaXR5UmVxdWVzdEhhbmRsZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3Zpc2liaWxpdHlFdmVudCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoY29tbWFuZCA9PiBjb21tYW5kPy5jb250YWluZXJJZCA9PT0gdGhpcy5fX2lkKSxcbiAgICAgICAgZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZCAhPT0gbnVsbCAmJiBjb21tYW5kICE9PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShjb21tYW5kID0+IHtcbiAgICAgICAgdGhpcy5faGFuZGxlVmlzaWJpbGl0eUNoYW5nZWRFdmVudChjb21tYW5kKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIGNvbXBvbmVudCBpZCB0byB0cmlnZ2VyIHNwaW5uZXIgZXZlbnQuXG4gICAgdGhpcy5pZCA9IHRoaXMuX19pZCB8fCB1dWlkKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gTWV0aG9kc1xuXG4gIC8vIENhbGxlZCB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3Zpc2liaWxpdHlFdmVudCQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fX2xvY2FsVmlzaWJpbGl0eVJlcXVlc3RIYW5kbGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgdmlzaWJpbGl0eSBjaGFuZ2VkIGV2ZW50LlxuICBwcm90ZWN0ZWQgX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2VkRXZlbnQoY29tbWFuZDogSVNwaW5uZXJDb21tYW5kIHwgbnVsbCk6IHZvaWQge1xuXG4gICAgLy8gSW52YWxpZCBjb21tYW5kICYgdmlldyBjb250YWluZXIgcmVmLlxuICAgIGlmICghY29tbWFuZCB8fCAhdGhpcy5fdmlld0NvbnRhaW5lclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb21tYW5kLmtpbmQgPT09IFNwaW5uZXJDb21tYW5kcy5kaXNwbGF5KSB7XG4gICAgICBjb25zdCBhY3R1YWxDb21tYW5kID0gY29tbWFuZCBhcyBEaXNwbGF5U3Bpbm5lckNvbW1hbmQ7XG5cbiAgICAgIGxldCBwdXJnZSA9IGZhbHNlO1xuICAgICAgaWYgKGFjdHVhbENvbW1hbmQub3B0aW9ucykge1xuICAgICAgICBwdXJnZSA9IGFjdHVhbENvbW1hbmQub3B0aW9ucy5wdXJnZSB8fCBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHB1cmdlKSB7XG4gICAgICAgIGNvbnN0IHB1cmdlUmVxdWVzdCA9IG5ldyBQdXJnZVNwaW5uZXJDb21tYW5kKGFjdHVhbENvbW1hbmQuY29udGFpbmVySWQpO1xuICAgICAgICB0aGlzLl9oYW5kbGVWaXNpYmlsaXR5Q2hhbmdlZEV2ZW50KHB1cmdlUmVxdWVzdCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX19wcmVzZXJ2ZUxhdGVzdFJlcXVlc3QpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBsYXRlc3QgY29udGV4dC5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldExhdGVzdENvbnRleHQoKTtcbiAgICAgICAgY29udGV4dD8uY29udGV4dD8uY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rpc3BsYXlTcGlubmVyKGFjdHVhbENvbW1hbmQsIC0xKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29tbWFuZC5raW5kID09PSBTcGlubmVyQ29tbWFuZHMuY2xvc2UpIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbW1hbmQgPSBjb21tYW5kIGFzIERlbGV0ZVNwaW5uZXJDb21tYW5kO1xuICAgICAgaWYgKGFjdHVhbENvbW1hbmQuaWQpIHtcbiAgICAgICAgdGhpcy5fZGlzbWlzc0J5UmVxdWVzdElkKGFjdHVhbENvbW1hbmQuaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgZGlzcGxheSByZXF1ZXN0LiBEaXNwbGF5IHRoYXQgb25lLlxuICAgICAgY29uc3Qge2NvbnRleHQsIGluZGV4OiBsYXRlc3RJbmRleH0gPSB0aGlzLl9nZXRMYXRlc3RDb250ZXh0KCk7XG4gICAgICBpZiAoY29udGV4dCAmJiBsYXRlc3RJbmRleCA+IC0xKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXlTcGlubmVyKGNvbnRleHQuY29tbWFuZCwgbGF0ZXN0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbW1hbmQua2luZCA9PT0gU3Bpbm5lckNvbW1hbmRzLnB1cmdlKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuX19jb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rpc21pc3NCeVJlcXVlc3RJZCh0aGlzLl9fY29udGV4dHNbMF0uY29tbWFuZD8uaWQsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9kaXNwbGF5U3Bpbm5lcihkaXNwbGF5U3Bpbm5lclJlcXVlc3Q6IERpc3BsYXlTcGlubmVyQ29tbWFuZCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgaWYgKCFkaXNwbGF5U3Bpbm5lclJlcXVlc3QgfHwgIXRoaXMuX3ZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kQ29udGV4dDogU3Bpbm5lckNvbW1hbmRDb250ZXh0ID0ge1xuICAgICAgY29tbWFuZDogZGlzcGxheVNwaW5uZXJSZXF1ZXN0LFxuICAgICAgY29tcG9uZW50UmVmOiBudWxsXG4gICAgfTtcblxuICAgIGlmICghKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9fY29udGV4dHMubGVuZ3RoKSkge1xuICAgICAgdGhpcy5fX2NvbnRleHRzW2luZGV4XS5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9NRVRIT0RfSU5WT0tFX0NBTExCQUNLLFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9ucz8uaW52b2tlZE1ldGhvZFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9SRVFVRVNUX0lELFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3QuaWRcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERJU1BMQVlfU1BJTk5FUl9PUFRJT05TLFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9uc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogU1BJTk5FUl9IT1NULFxuICAgICAgICAgIHVzZVZhbHVlOiBkaXNwbGF5U3Bpbm5lclJlcXVlc3QuY29udGFpbmVySWRcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHBhcmVudDogdGhpcy5fX2luamVjdG9yXG4gICAgfSk7XG5cbiAgICBpZiAoIWRpc3BsYXlTcGlubmVyUmVxdWVzdC5vcHRpb25zIHx8ICFkaXNwbGF5U3Bpbm5lclJlcXVlc3Qub3B0aW9ucy5pbnN0YW5jZVR5cGUpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KEJhc2ljU3Bpbm5lckNvbXBvbmVudCwge1xuICAgICAgICBpbmplY3RvcjogY2hpbGRJbmplY3RvclxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBjb21tYW5kQ29udGV4dC5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGRpc3BsYXlTcGlubmVyUmVxdWVzdC5vcHRpb25zLmluc3RhbmNlVHlwZSwge1xuICAgICAgICBpbmplY3RvcjogY2hpbGRJbmplY3RvclxuICAgICAgfSk7XG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICBjb21tYW5kQ29udGV4dC5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9fY29udGV4dHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9fY29udGV4dHMucHVzaChjb21tYW5kQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19jb250ZXh0c1tpbmRleF0gPSBjb21tYW5kQ29udGV4dDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Rpc21pc3NCeVJlcXVlc3RJZChyZXF1ZXN0SWQ6IHN0cmluZywgZm9yY2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9fY29udGV4dHMuZmluZEluZGV4KHggPT4geC5jb21tYW5kPy5pZCA9PT0gcmVxdWVzdElkKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX19jb250ZXh0c1tpbmRleF07XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZCA9IGNvbnRleHQuY29tbWFuZDtcbiAgICBpZiAoIWNvbW1hbmQgfHwgY29tbWFuZC5raW5kICE9PSBTcGlubmVyQ29tbWFuZHMuZGlzcGxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNwaW5uZXIgY2Fubm90IGJlIGNsb3NlZC5cbiAgICBjb25zdCBjbG9zaW5nSGFuZGxlciA9IGNvbW1hbmQ/Lm9wdGlvbnM/LmNsb3Npbmc7XG4gICAgaWYgKCFmb3JjZSAmJiBjbG9zaW5nSGFuZGxlciAmJiAhY2xvc2luZ0hhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRleHQuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgY29udGV4dC5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgIGNvbW1hbmQ/Lm9wdGlvbnM/LmNsb3NlZD8uKGZvcmNlIHx8IGZhbHNlKTtcbiAgICB0aGlzLl9fY29udGV4dHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZ2V0TGF0ZXN0Q29udGV4dCgpOiB7IGNvbnRleHQ6IFNwaW5uZXJDb21tYW5kQ29udGV4dCB8IG51bGwsIGluZGV4OiBudW1iZXIgfSB7XG4gICAgaWYgKHRoaXMuX19jb250ZXh0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4ge2NvbnRleHQ6IG51bGwsIGluZGV4OiAtMX07XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEluZGV4ID0gdGhpcy5fX2NvbnRleHRzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIHtjb250ZXh0OiB0aGlzLl9fY29udGV4dHNbbGFzdEluZGV4XSwgaW5kZXg6IGxhc3RJbmRleH07XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxufVxuIl19