UNPKG

sequential-workflow-designer-angular

Version:

Angular wrapper for Sequential Workflow Designer component.

268 lines 36.5 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Designer } from 'sequential-workflow-designer'; import * as i0 from "@angular/core"; export class DesignerComponent { constructor(ngZone, applicationRef) { this.ngZone = ngZone; this.applicationRef = applicationRef; this.onReady = new EventEmitter(); this.onDefinitionChanged = new EventEmitter(); this.onSelectedStepIdChanged = new EventEmitter(); this.onIsToolboxCollapsedChanged = new EventEmitter(); this.onIsEditorCollapsedChanged = new EventEmitter(); this.rootEditorProvider = (definition, context, isReadonly) => { if (!this.rootEditor) { throw new Error('Input "rootEditor" is not set'); } if (typeof this.rootEditor === 'function') { return this.rootEditor(definition, context, isReadonly); } return this.editorProvider(this.rootEditor, { definition, context, isReadonly }); }; this.stepEditorProvider = (step, context, definition, isReadonly) => { if (!this.stepEditor) { throw new Error('Input "stepEditor" is not set'); } if (typeof this.stepEditor === 'function') { return this.stepEditor(step, context, definition, isReadonly); } return this.editorProvider(this.stepEditor, { step, context, definition, isReadonly }); }; } ngAfterViewInit() { this.attach(); } ngOnChanges(changes) { const isFirstChange = Object.keys(changes).every(key => changes[key].firstChange); if (isFirstChange) { return; } if (this.designer) { const isSameDefinition = !changes['definition'] || changes['definition'].currentValue === this.designer.getDefinition(); if (isSameDefinition) { const isReadonlyChange = changes['isReadonly']; if (isReadonlyChange && isReadonlyChange.currentValue !== this.designer.isReadonly()) { this.designer.setIsReadonly(isReadonlyChange.currentValue); } const selectedStepIdChange = changes['selectedStepId']; if (selectedStepIdChange && selectedStepIdChange.currentValue !== this.designer.getSelectedStepId()) { if (selectedStepIdChange.currentValue) { this.designer.selectStepById(selectedStepIdChange.currentValue); } else { this.designer.clearSelectedStep(); } } const isToolboxCollapsedChange = changes['isToolboxCollapsed']; if (isToolboxCollapsedChange && isToolboxCollapsedChange.currentValue !== this.designer.isToolboxCollapsed()) { this.designer.setIsToolboxCollapsed(isToolboxCollapsedChange.currentValue); } const isEditorCollapsedChange = changes['isEditorCollapsed']; if (isEditorCollapsedChange && isEditorCollapsedChange.currentValue !== this.designer.isEditorCollapsed()) { this.designer.setIsEditorCollapsed(isEditorCollapsedChange.currentValue); } // The same reference of the definition = no change. return; } } this.attach(); } ngOnDestroy() { if (this.lastEmbeddedView) { this.applicationRef.detachView(this.lastEmbeddedView); this.lastEmbeddedView.destroy(); } } attach() { this.ngZone.runOutsideAngular(() => { if (!this.placeholder) { return; } if (!this.definition) { throw new Error('Input "definition" is not set'); } if (!this.stepsConfiguration) { throw new Error('Input "stepsConfiguration" is not set'); } if (this.toolboxConfiguration === undefined) { throw new Error('Input "toolboxConfiguration" is not set'); } if (this.controlBar === undefined) { throw new Error('Input "controlBar" is not set'); } if (this.designer) { this.designer.destroy(); this.designer = undefined; } let customActionHandler = this.customActionHandler; if (customActionHandler) { const cah = customActionHandler; customActionHandler = (action, step, sequence, context) => { this.ngZone.run(() => cah(action, step, sequence, context)); }; } const designer = Designer.create(this.placeholder.nativeElement, this.definition, { theme: this.theme, undoStackSize: this.undoStackSize, editors: this.areEditorsHidden ? false : { isCollapsed: this.isEditorCollapsed, rootEditorProvider: this.rootEditorProvider, stepEditorProvider: this.stepEditorProvider }, steps: this.stepsConfiguration, validator: this.validatorConfiguration, placeholder: this.placeholderConfiguration, toolbox: this.toolboxConfiguration ? { isCollapsed: this.isToolboxCollapsed, ...this.toolboxConfiguration } : false, controlBar: this.controlBar, contextMenu: this.contextMenu, keyboard: this.keyboard, preferenceStorage: this.preferenceStorage, extensions: this.extensions, isReadonly: this.isReadonly, i18n: this.i18n, uidGenerator: this.uidGenerator, customActionHandler }); designer.onReady.subscribe(() => { this.ngZone.run(() => this.onReady.emit(designer)); }); designer.onDefinitionChanged.subscribe(definition => { this.ngZone.run(() => this.onDefinitionChanged.emit(definition)); }); designer.onSelectedStepIdChanged.subscribe(stepId => { this.ngZone.run(() => this.onSelectedStepIdChanged.emit(stepId)); }); designer.onIsToolboxCollapsedChanged.subscribe(isCollapsed => { this.ngZone.run(() => this.onIsToolboxCollapsedChanged.emit(isCollapsed)); }); designer.onIsEditorCollapsedChanged.subscribe(isCollapsed => { this.ngZone.run(() => this.onIsEditorCollapsedChanged.emit(isCollapsed)); }); this.designer = designer; if (this.selectedStepId) { this.designer.selectStepById(this.selectedStepId); } }); } editorProvider(templateRef, editor) { return this.ngZone.run(() => { if (this.lastEmbeddedView) { this.applicationRef.detachView(this.lastEmbeddedView); this.lastEmbeddedView.destroy(); this.lastEmbeddedView = undefined; } this.lastEmbeddedView = templateRef.createEmbeddedView({ $implicit: editor }); this.applicationRef.attachView(this.lastEmbeddedView); const container = document.createElement('div'); container.className = 'sqd-editor-angular'; for (const node of this.lastEmbeddedView.rootNodes) { container.appendChild(node); } return container; }); } } DesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DesignerComponent, deps: [{ token: i0.NgZone }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component }); DesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: DesignerComponent, selector: "sqd-designer", inputs: { theme: "theme", undoStackSize: "undoStackSize", definition: "definition", stepsConfiguration: "stepsConfiguration", validatorConfiguration: "validatorConfiguration", placeholderConfiguration: "placeholderConfiguration", toolboxConfiguration: "toolboxConfiguration", controlBar: "controlBar", contextMenu: "contextMenu", keyboard: "keyboard", preferenceStorage: "preferenceStorage", extensions: "extensions", i18n: "i18n", customActionHandler: "customActionHandler", isReadonly: "isReadonly", selectedStepId: "selectedStepId", uidGenerator: "uidGenerator", isToolboxCollapsed: "isToolboxCollapsed", isEditorCollapsed: "isEditorCollapsed", areEditorsHidden: "areEditorsHidden", rootEditor: "rootEditor", stepEditor: "stepEditor" }, outputs: { onReady: "onReady", onDefinitionChanged: "onDefinitionChanged", onSelectedStepIdChanged: "onSelectedStepIdChanged", onIsToolboxCollapsedChanged: "onIsToolboxCollapsedChanged", onIsEditorCollapsedChanged: "onIsEditorCollapsedChanged" }, viewQueries: [{ propertyName: "placeholder", first: true, predicate: ["placeholder"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DesignerComponent, decorators: [{ type: Component, args: [{ selector: 'sqd-designer', template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ApplicationRef }]; }, propDecorators: { placeholder: [{ type: ViewChild, args: ['placeholder', { static: true }] }], theme: [{ type: Input, args: ['theme'] }], undoStackSize: [{ type: Input, args: ['undoStackSize'] }], definition: [{ type: Input, args: ['definition'] }], stepsConfiguration: [{ type: Input, args: ['stepsConfiguration'] }], validatorConfiguration: [{ type: Input, args: ['validatorConfiguration'] }], placeholderConfiguration: [{ type: Input, args: ['placeholderConfiguration'] }], toolboxConfiguration: [{ type: Input, args: ['toolboxConfiguration'] }], controlBar: [{ type: Input, args: ['controlBar'] }], contextMenu: [{ type: Input, args: ['contextMenu'] }], keyboard: [{ type: Input, args: ['keyboard'] }], preferenceStorage: [{ type: Input, args: ['preferenceStorage'] }], extensions: [{ type: Input, args: ['extensions'] }], i18n: [{ type: Input, args: ['i18n'] }], customActionHandler: [{ type: Input, args: ['customActionHandler'] }], isReadonly: [{ type: Input, args: ['isReadonly'] }], selectedStepId: [{ type: Input, args: ['selectedStepId'] }], uidGenerator: [{ type: Input, args: ['uidGenerator'] }], isToolboxCollapsed: [{ type: Input, args: ['isToolboxCollapsed'] }], isEditorCollapsed: [{ type: Input, args: ['isEditorCollapsed'] }], areEditorsHidden: [{ type: Input, args: ['areEditorsHidden'] }], rootEditor: [{ type: Input, args: ['rootEditor'] }], stepEditor: [{ type: Input, args: ['stepEditor'] }], onReady: [{ type: Output }], onDefinitionChanged: [{ type: Output }], onSelectedStepIdChanged: [{ type: Output }], onIsToolboxCollapsedChanged: [{ type: Output }], onIsEditorCollapsedChanged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzaWduZXIvc3JjL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uL2Rlc2lnbmVyL3NyYy9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR04sU0FBUyxFQUdULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR04sUUFBUSxFQWVSLE1BQU0sOEJBQThCLENBQUM7O0FBcUJ0QyxNQUFNLE9BQU8saUJBQWlCO0lBZ0U3QixZQUNrQixNQUFjLEVBQ2QsY0FBOEI7UUFEOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQVpoQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUV2Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXJELDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTVELGdDQUEyQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFMUQsK0JBQTBCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQThJeEQsdUJBQWtCLEdBQUcsQ0FBQyxVQUFzQixFQUFFLE9BQTBCLEVBQUUsVUFBbUIsRUFBRSxFQUFFO1lBQ2pILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDakQ7WUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3hEO1lBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFvQixJ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eEIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBR3BCLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSW5CLGdCQUFnQjtzQkFEdEIsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBR2xCLFVBQVU7c0JBRGhCLEtBQUs7dUJBQUMsWUFBWTtnQkFHWixVQUFVO3NCQURoQixLQUFLO3VCQUFDLFlBQVk7Z0JBSUgsT0FBTztzQkFEdEIsTUFBTTtnQkFHUyxtQkFBbUI7c0JBRGxDLE1BQU07Z0JBR1MsdUJBQXVCO3NCQUR0QyxNQUFNO2dCQUdTLDJCQUEyQjtzQkFEMUMsTUFBTTtnQkFHUywwQkFBMEI7c0JBRHpDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRBZnRlclZpZXdJbml0LFxuXHRBcHBsaWNhdGlvblJlZixcblx0Q29tcG9uZW50LFxuXHRFbGVtZW50UmVmLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdEV2ZW50RW1pdHRlcixcblx0SW5wdXQsXG5cdE5nWm9uZSxcblx0T25DaGFuZ2VzLFxuXHRPbkRlc3Ryb3ksXG5cdE91dHB1dCxcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG5cdEN1c3RvbUFjdGlvbkhhbmRsZXIsXG5cdERlZmluaXRpb24sXG5cdERlc2lnbmVyLFxuXHREZXNpZ25lckV4dGVuc2lvbixcblx0Um9vdEVkaXRvckNvbnRleHQsXG5cdFJvb3RFZGl0b3JQcm92aWRlcixcblx0S2V5Ym9hcmRDb25maWd1cmF0aW9uLFxuXHRTdGVwLFxuXHRTdGVwRWRpdG9yQ29udGV4dCxcblx0U3RlcEVkaXRvclByb3ZpZGVyLFxuXHRTdGVwc0NvbmZpZ3VyYXRpb24sXG5cdFRvb2xib3hDb25maWd1cmF0aW9uLFxuXHRVaWRHZW5lcmF0b3IsXG5cdFZhbGlkYXRvckNvbmZpZ3VyYXRpb24sXG5cdFBsYWNlaG9sZGVyQ29uZmlndXJhdGlvbixcblx0STE4bixcblx0UHJlZmVyZW5jZVN0b3JhZ2Vcbn0gZnJvbSAnc2VxdWVudGlhbC13b3JrZmxvdy1kZXNpZ25lcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vdEVkaXRvcldyYXBwZXIge1xuXHRkZWZpbml0aW9uOiBEZWZpbml0aW9uO1xuXHRjb250ZXh0OiBSb290RWRpdG9yQ29udGV4dDtcblx0aXNSZWFkb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwRWRpdG9yV3JhcHBlciB7XG5cdHN0ZXA6IFN0ZXA7XG5cdGRlZmluaXRpb246IERlZmluaXRpb247XG5cdGNvbnRleHQ6IFN0ZXBFZGl0b3JDb250ZXh0O1xuXHRpc1JlYWRvbmx5OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBBbmd1bGFyVG9vbGJveENvbmZpZ3VyYXRpb24gPSBPbWl0PFRvb2xib3hDb25maWd1cmF0aW9uLCAnaXNDb2xsYXBzZWQnPjtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnc3FkLWRlc2lnbmVyJyxcblx0dGVtcGxhdGVVcmw6ICcuL2Rlc2lnbmVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEZXNpZ25lckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblx0cHJpdmF0ZSBkZXNpZ25lcj86IERlc2lnbmVyO1xuXHRwcml2YXRlIGxhc3RFbWJlZGRlZFZpZXc/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj47XG5cblx0QFZpZXdDaGlsZCgncGxhY2Vob2xkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuXHRwcml2YXRlIHBsYWNlaG9sZGVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cblx0QElucHV0KCd0aGVtZScpXG5cdHB1YmxpYyB0aGVtZT86IHN0cmluZztcblx0QElucHV0KCd1bmRvU3RhY2tTaXplJylcblx0cHVibGljIHVuZG9TdGFja1NpemU/OiBudW1iZXI7XG5cdEBJbnB1dCgnZGVmaW5pdGlvbicpXG5cdHB1YmxpYyBkZWZpbml0aW9uPzogRGVmaW5pdGlvbjtcblx0QElucHV0KCdzdGVwc0NvbmZpZ3VyYXRpb24nKVxuXHRwdWJsaWMgc3RlcHNDb25maWd1cmF0aW9uPzogU3RlcHNDb25maWd1cmF0aW9uO1xuXHRASW5wdXQoJ3ZhbGlkYXRvckNvbmZpZ3VyYXRpb24nKVxuXHRwdWJsaWMgdmFsaWRhdG9yQ29uZmlndXJhdGlvbj86IFZhbGlkYXRvckNvbmZpZ3VyYXRpb247XG5cdEBJbnB1dCgncGxhY2Vob2xkZXJDb25maWd1cmF0aW9uJylcblx0cHVibGljIHBsYWNlaG9sZGVyQ29uZmlndXJhdGlvbj86IFBsYWNlaG9sZGVyQ29uZmlndXJhdGlvbjtcblx0QElucHV0KCd0b29sYm94Q29uZmlndXJhdGlvbicpXG5cdHB1YmxpYyB0b29sYm94Q29uZmlndXJhdGlvbj86IEFuZ3VsYXJUb29sYm94Q29uZmlndXJhdGlvbiB8IGZhbHNlO1xuXHRASW5wdXQoJ2NvbnRyb2xCYXInKVxuXHRwdWJsaWMgY29udHJvbEJhcj86IGJvb2xlYW47XG5cdEBJbnB1dCgnY29udGV4dE1lbnUnKVxuXHRwdWJsaWMgY29udGV4dE1lbnU/OiBib29sZWFuO1xuXHRASW5wdXQoJ2tleWJvYXJkJylcblx0cHVibGljIGtleWJvYXJkPzogYm9vbGVhbiB8IEtleWJvYXJkQ29uZmlndXJhdGlvbjtcblx0QElucHV0KCdwcmVmZXJlbmNlU3RvcmFnZScpXG5cdHB1YmxpYyBwcmVmZXJlbmNlU3RvcmFnZT86IFByZWZlcmVuY2VTdG9yYWdlO1xuXHRASW5wdXQoJ2V4dGVuc2lvbnMnKVxuXHRwdWJsaWMgZXh0ZW5zaW9ucz86IERlc2lnbmVyRXh0ZW5zaW9uW107XG5cdEBJbnB1dCgnaTE4bicpXG5cdHB1YmxpYyBpMThuPzogSTE4bjtcblx0QElucHV0KCdjdXN0b21BY3Rpb25IYW5kbGVyJylcblx0cHVibGljIGN1c3RvbUFjdGlvbkhhbmRsZXI/OiBDdXN0b21BY3Rpb25IYW5kbGVyO1xuXHRASW5wdXQoJ2lzUmVhZG9ubHknKVxuXHRwdWJsaWMgaXNSZWFkb25seT86IGJvb2xlYW47XG5cdEBJbnB1dCgnc2VsZWN0ZWRTdGVwSWQnKVxuXHRwdWJsaWMgc2VsZWN0ZWRTdGVwSWQ/OiBzdHJpbmcgfCBudWxsO1xuXHRASW5wdXQoJ3VpZEdlbmVyYXRvcicpXG5cdHB1YmxpYyB1aWRHZW5lcmF0b3I/OiBVaWRHZW5lcmF0b3I7XG5cdEBJbnB1dCgnaXNUb29sYm94Q29sbGFwc2VkJylcblx0cHVibGljIGlzVG9vbGJveENvbGxhcHNlZD86IGJvb2xlYW47XG5cdEBJbnB1dCgnaXNFZGl0b3JDb2xsYXBzZWQnKVxuXHRwdWJsaWMgaXNFZGl0b3JDb2xsYXBzZWQ/OiBib29sZWFuO1xuXG5cdEBJbnB1dCgnYXJlRWRpdG9yc0hpZGRlbicpXG5cdHB1YmxpYyBhcmVFZGl0b3JzSGlkZGVuPzogYm9vbGVhbjtcblx0QElucHV0KCdyb290RWRpdG9yJylcblx0cHVibGljIHJvb3RFZGl0b3I/OiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IFJvb3RFZGl0b3JQcm92aWRlcjtcblx0QElucHV0KCdzdGVwRWRpdG9yJylcblx0cHVibGljIHN0ZXBFZGl0b3I/OiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IFN0ZXBFZGl0b3JQcm92aWRlcjtcblxuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPERlc2lnbmVyPigpO1xuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uRGVmaW5pdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERlZmluaXRpb24+KCk7XG5cdEBPdXRwdXQoKVxuXHRwdWJsaWMgcmVhZG9ubHkgb25TZWxlY3RlZFN0ZXBJZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IG51bGw+KCk7XG5cdEBPdXRwdXQoKVxuXHRwdWJsaWMgcmVhZG9ubHkgb25Jc1Rvb2xib3hDb2xsYXBzZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uSXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmXG5cdCkge31cblxuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuXHRcdHRoaXMuYXR0YWNoKCk7XG5cdH1cblxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGNvbnN0IGlzRmlyc3RDaGFuZ2UgPSBPYmplY3Qua2V5cyhjaGFuZ2VzKS5ldmVyeShrZXkgPT4gY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlKTtcblx0XHRpZiAoaXNGaXJzdENoYW5nZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmRlc2lnbmVyKSB7XG5cdFx0XHRjb25zdCBpc1NhbWVEZWZpbml0aW9uID0gIWNoYW5nZXNbJ2RlZmluaXRpb24nXSB8fCBjaGFuZ2VzWydkZWZpbml0aW9uJ10uY3VycmVudFZhbHVlID09PSB0aGlzLmRlc2lnbmVyLmdldERlZmluaXRpb24oKTtcblx0XHRcdGlmIChpc1NhbWVEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGlzUmVhZG9ubHlDaGFuZ2UgPSBjaGFuZ2VzWydpc1JlYWRvbmx5J107XG5cdFx0XHRcdGlmIChpc1JlYWRvbmx5Q2hhbmdlICYmIGlzUmVhZG9ubHlDaGFuZ2UuY3VycmVudFZhbHVlICE9PSB0aGlzLmRlc2lnbmVyLmlzUmVhZG9ubHkoKSkge1xuXHRcdFx0XHRcdHRoaXMuZGVzaWduZXIuc2V0SXNSZWFkb25seShpc1JlYWRvbmx5Q2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzZWxlY3RlZFN0ZXBJZENoYW5nZSA9IGNoYW5nZXNbJ3NlbGVjdGVkU3RlcElkJ107XG5cdFx0XHRcdGlmIChzZWxlY3RlZFN0ZXBJZENoYW5nZSAmJiBzZWxlY3RlZFN0ZXBJZENoYW5nZS5jdXJyZW50VmFsdWUgIT09IHRoaXMuZGVzaWduZXIuZ2V0U2VsZWN0ZWRTdGVwSWQoKSkge1xuXHRcdFx0XHRcdGlmIChzZWxlY3RlZFN0ZXBJZENoYW5nZS5jdXJyZW50VmFsdWUpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVzaWduZXIuc2VsZWN0U3RlcEJ5SWQoc2VsZWN0ZWRTdGVwSWRDaGFuZ2UuY3VycmVudFZhbHVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGhpcy5kZXNpZ25lci5jbGVhclNlbGVjdGVkU3RlcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlzVG9vbGJveENvbGxhcHNlZENoYW5nZSA9IGNoYW5nZXNbJ2lzVG9vbGJveENvbGxhcHNlZCddO1xuXHRcdFx0XHRpZiAoaXNUb29sYm94Q29sbGFwc2VkQ2hhbmdlICYmIGlzVG9vbGJveENvbGxhcHNlZENoYW5nZS5jdXJyZW50VmFsdWUgIT09IHRoaXMuZGVzaWduZXIuaXNUb29sYm94Q29sbGFwc2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmRlc2lnbmVyLnNldElzVG9vbGJveENvbGxhcHNlZChpc1Rvb2xib3hDb2xsYXBzZWRDaGFuZ2UuY3VycmVudFZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGlzRWRpdG9yQ29sbGFwc2VkQ2hhbmdlID0gY2hhbmdlc1snaXNFZGl0b3JDb2xsYXBzZWQnXTtcblx0XHRcdFx0aWYgKGlzRWRpdG9yQ29sbGFwc2VkQ2hhbmdlICYmIGlzRWRpdG9yQ29sbGFwc2VkQ2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5kZXNpZ25lci5pc0VkaXRvckNvbGxhcHNlZCgpKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXNpZ25lci5zZXRJc0VkaXRvckNvbGxhcHNlZChpc0VkaXRvckNvbGxhcHNlZENoYW5nZS5jdXJyZW50VmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhlIHNhbWUgcmVmZXJlbmNlIG9mIHRoZSBkZWZpbml0aW9uID0gbm8gY2hhbmdlLlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5hdHRhY2goKTtcblx0fVxuXG5cdHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5sYXN0RW1iZWRkZWRWaWV3KSB7XG5cdFx0XHR0aGlzLmFwcGxpY2F0aW9uUmVmLmRldGFjaFZpZXcodGhpcy5sYXN0RW1iZWRkZWRWaWV3KTtcblx0XHRcdHRoaXMubGFzdEVtYmVkZGVkVmlldy5kZXN0cm95KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhdHRhY2goKSB7XG5cdFx0dGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5kZWZpbml0aW9uKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJkZWZpbml0aW9uXCIgaXMgbm90IHNldCcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0aGlzLnN0ZXBzQ29uZmlndXJhdGlvbikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwic3RlcHNDb25maWd1cmF0aW9uXCIgaXMgbm90IHNldCcpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMudG9vbGJveENvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwidG9vbGJveENvbmZpZ3VyYXRpb25cIiBpcyBub3Qgc2V0Jyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5jb250cm9sQmFyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnB1dCBcImNvbnRyb2xCYXJcIiBpcyBub3Qgc2V0Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRlc2lnbmVyKSB7XG5cdFx0XHRcdHRoaXMuZGVzaWduZXIuZGVzdHJveSgpO1xuXHRcdFx0XHR0aGlzLmRlc2lnbmVyID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgY3VzdG9tQWN0aW9uSGFuZGxlciA9IHRoaXMuY3VzdG9tQWN0aW9uSGFuZGxlcjtcblx0XHRcdGlmIChjdXN0b21BY3Rpb25IYW5kbGVyKSB7XG5cdFx0XHRcdGNvbnN0IGNhaCA9IGN1c3RvbUFjdGlvbkhhbmRsZXI7XG5cdFx0XHRcdGN1c3RvbUFjdGlvbkhhbmRsZXIgPSAoYWN0aW9uLCBzdGVwLCBzZXF1ZW5jZSwgY29udGV4dCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiBjYWgoYWN0aW9uLCBzdGVwLCBzZXF1ZW5jZSwgY29udGV4dCkpO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBkZXNpZ25lciA9IERlc2lnbmVyLmNyZWF0ZSh0aGlzLnBsYWNlaG9sZGVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMuZGVmaW5pdGlvbiwge1xuXHRcdFx0XHR0aGVtZTogdGhpcy50aGVtZSxcblx0XHRcdFx0dW5kb1N0YWNrU2l6ZTogdGhpcy51bmRvU3RhY2tTaXplLFxuXHRcdFx0XHRlZGl0b3JzOiB0aGlzLmFyZUVkaXRvcnNIaWRkZW5cblx0XHRcdFx0XHQ/IGZhbHNlXG5cdFx0XHRcdFx0OiB7XG5cdFx0XHRcdFx0XHRcdGlzQ29sbGFwc2VkOiB0aGlzLmlzRWRpdG9yQ29sbGFwc2VkLFxuXHRcdFx0XHRcdFx0XHRyb290RWRpdG9yUHJvdmlkZXI6IHRoaXMucm9vdEVkaXRvclByb3ZpZGVyLFxuXHRcdFx0XHRcdFx0XHRzdGVwRWRpdG9yUHJvdmlkZXI6IHRoaXMuc3RlcEVkaXRvclByb3ZpZGVyXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRzdGVwczogdGhpcy5zdGVwc0NvbmZpZ3VyYXRpb24sXG5cdFx0XHRcdHZhbGlkYXRvcjogdGhpcy52YWxpZGF0b3JDb25maWd1cmF0aW9uLFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlckNvbmZpZ3VyYXRpb24sXG5cdFx0XHRcdHRvb2xib3g6IHRoaXMudG9vbGJveENvbmZpZ3VyYXRpb25cblx0XHRcdFx0XHQ/IHtcblx0XHRcdFx0XHRcdFx0aXNDb2xsYXBzZWQ6IHRoaXMuaXNUb29sYm94Q29sbGFwc2VkLFxuXHRcdFx0XHRcdFx0XHQuLi50aGlzLnRvb2xib3hDb25maWd1cmF0aW9uXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0OiBmYWxzZSxcblx0XHRcdFx0Y29udHJvbEJhcjogdGhpcy5jb250cm9sQmFyLFxuXHRcdFx0XHRjb250ZXh0TWVudTogdGhpcy5jb250ZXh0TWVudSxcblx0XHRcdFx0a2V5Ym9hcmQ6IHRoaXMua2V5Ym9hcmQsXG5cdFx0XHRcdHByZWZlcmVuY2VTdG9yYWdlOiB0aGlzLnByZWZlcmVuY2VTdG9yYWdlLFxuXHRcdFx0XHRleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMsXG5cdFx0XHRcdGlzUmVhZG9ubHk6IHRoaXMuaXNSZWFkb25seSxcblx0XHRcdFx0aTE4bjogdGhpcy5pMThuLFxuXHRcdFx0XHR1aWRHZW5lcmF0b3I6IHRoaXMudWlkR2VuZXJhdG9yLFxuXHRcdFx0XHRjdXN0b21BY3Rpb25IYW5kbGVyXG5cdFx0XHR9KTtcblx0XHRcdGRlc2lnbmVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcblx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25SZWFkeS5lbWl0KGRlc2lnbmVyKSk7XG5cdFx0XHR9KTtcblx0XHRcdGRlc2lnbmVyLm9uRGVmaW5pdGlvbkNoYW5nZWQuc3Vic2NyaWJlKGRlZmluaXRpb24gPT4ge1xuXHRcdFx0XHR0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vbkRlZmluaXRpb25DaGFuZ2VkLmVtaXQoZGVmaW5pdGlvbikpO1xuXHRcdFx0fSk7XG5cdFx0XHRkZXNpZ25lci5vblNlbGVjdGVkU3RlcElkQ2hhbmdlZC5zdWJzY3JpYmUoc3RlcElkID0+IHtcblx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25TZWxlY3RlZFN0ZXBJZENoYW5nZWQuZW1pdChzdGVwSWQpKTtcblx0XHRcdH0pO1xuXHRcdFx0ZGVzaWduZXIub25Jc1Rvb2xib3hDb2xsYXBzZWRDaGFuZ2VkLnN1YnNjcmliZShpc0NvbGxhcHNlZCA9PiB7XG5cdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uSXNUb29sYm94Q29sbGFwc2VkQ2hhbmdlZC5lbWl0KGlzQ29sbGFwc2VkKSk7XG5cdFx0XHR9KTtcblx0XHRcdGRlc2lnbmVyLm9uSXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2VkLnN1YnNjcmliZShpc0NvbGxhcHNlZCA9PiB7XG5cdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uSXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2VkLmVtaXQoaXNDb2xsYXBzZWQpKTtcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5kZXNpZ25lciA9IGRlc2lnbmVyO1xuXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFN0ZXBJZCkge1xuXHRcdFx0XHR0aGlzLmRlc2lnbmVyLnNlbGVjdFN0ZXBCeUlkKHRoaXMuc2VsZWN0ZWRTdGVwSWQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSByb290RWRpdG9yUHJvdmlkZXIgPSAoZGVmaW5pdGlvbjogRGVmaW5pdGlvbiwgY29udGV4dDogUm9vdEVkaXRvckNvbnRleHQsIGlzUmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcblx0XHRpZiAoIXRoaXMucm9vdEVkaXRvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnB1dCBcInJvb3RFZGl0b3JcIiBpcyBub3Qgc2V0Jyk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdGhpcy5yb290RWRpdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb290RWRpdG9yKGRlZmluaXRpb24sIGNvbnRleHQsIGlzUmVhZG9ubHkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lZGl0b3JQcm92aWRlcjxSb290RWRpdG9yV3JhcHBlcj4odGhpcy5yb290RWRpdG9yLCB7XG5cdFx0XHRkZWZpbml0aW9uLFxuXHRcdFx0Y29udGV4dCxcblx0XHRcdGlzUmVhZG9ubHlcblx0XHR9KTtcblx0fTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHN0ZXBFZGl0b3JQcm92aWRlciA9IChzdGVwOiBTdGVwLCBjb250ZXh0OiBTdGVwRWRpdG9yQ29udGV4dCwgZGVmaW5pdGlvbjogRGVmaW5pdGlvbiwgaXNSZWFkb25seTogYm9vbGVhbikgPT4ge1xuXHRcdGlmICghdGhpcy5zdGVwRWRpdG9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwic3RlcEVkaXRvclwiIGlzIG5vdCBzZXQnKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0aGlzLnN0ZXBFZGl0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiB0aGlzLnN0ZXBFZGl0b3Ioc3RlcCwgY29udGV4dCwgZGVmaW5pdGlvbiwgaXNSZWFkb25seSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVkaXRvclByb3ZpZGVyPFN0ZXBFZGl0b3JXcmFwcGVyPih0aGlzLnN0ZXBFZGl0b3IsIHtcblx0XHRcdHN0ZXAsXG5cdFx0XHRjb250ZXh0LFxuXHRcdFx0ZGVmaW5pdGlvbixcblx0XHRcdGlzUmVhZG9ubHlcblx0XHR9KTtcblx0fTtcblxuXHRwcml2YXRlIGVkaXRvclByb3ZpZGVyPEU+KHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjx1bmtub3duPiwgZWRpdG9yOiBFKSB7XG5cdFx0cmV0dXJuIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5sYXN0RW1iZWRkZWRWaWV3KSB7XG5cdFx0XHRcdHRoaXMuYXBwbGljYXRpb25SZWYuZGV0YWNoVmlldyh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpO1xuXHRcdFx0XHR0aGlzLmxhc3RFbWJlZGRlZFZpZXcuZGVzdHJveSgpO1xuXHRcdFx0XHR0aGlzLmxhc3RFbWJlZGRlZFZpZXcgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubGFzdEVtYmVkZGVkVmlldyA9IHRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh7XG5cdFx0XHRcdCRpbXBsaWNpdDogZWRpdG9yXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuYXBwbGljYXRpb25SZWYuYXR0YWNoVmlldyh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpO1xuXG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdGNvbnRhaW5lci5jbGFzc05hbWUgPSAnc3FkLWVkaXRvci1hbmd1bGFyJztcblx0XHRcdGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzLmxhc3RFbWJlZGRlZFZpZXcucm9vdE5vZGVzKSB7XG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChub2RlKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb250YWluZXI7XG5cdFx0fSk7XG5cdH1cbn1cbiIsIjxkaXYgI3BsYWNlaG9sZGVyIGNsYXNzPVwic3FkLWRlc2lnbmVyLWFuZ3VsYXJcIj48L2Rpdj5cbiJdfQ==