UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

249 lines 35.7 kB
import { Directive, EventEmitter, HostBinding, Input, Output, } from '@angular/core'; import { ReplaySubject, distinctUntilChanged, fromEvent, shareReplay, takeUntil } from 'rxjs'; import { TemplateUtil } from './template.util'; import * as i0 from "@angular/core"; export class DokuTable { constructor(elementRef, renderer, ngZone, envInjector, appRef, injector) { this.elementRef = elementRef; this.renderer = renderer; this.ngZone = ngZone; this.envInjector = envInjector; this.appRef = appRef; this.injector = injector; /** * Listen for column sort changes. */ this.sortChange = new EventEmitter(); this._sortChange = new EventEmitter(); this.sortChange$ = this._sortChange.asObservable().pipe(shareReplay()); this.destroy$ = new ReplaySubject(); } get classes() { return ['d-table']; } get totalColumn() { return this.elementRef.nativeElement.querySelectorAll('thead tr th').length; } ngOnInit() { this._sortChange .asObservable() .pipe(distinctUntilChanged((previous, current) => previous.activeSorter === current.activeSorter), takeUntil(this.destroy$)) .subscribe((props) => { const emitEvent = props?.options?.emitEvent ?? true; if (emitEvent) this.sortChange.emit(props?.activeSorter); }); } ngOnDestroy() { this.containerElement = undefined; this.filledElement = undefined; this.noDataElement = undefined; this.noDataContentRef?.destroy(); this.loadingElement = undefined; this.loadingContentRef?.destroy(); this.errorElement = undefined; this.errorContentRef?.destroy(); this.destroy$.next(true); this.destroy$.complete(); } ngOnChanges(changes) { const activeSorter = changes['activeSorter']; if (activeSorter?.previousValue !== activeSorter?.currentValue) { setTimeout(() => this._sortChange.emit({ activeSorter: activeSorter?.currentValue }), 0); } const status = changes['status']; if (status?.previousValue !== status?.currentValue) { this.handleBodyVisibilityByStatus(); } const customNoData = changes['customNoData']; if (customNoData?.previousValue !== customNoData?.currentValue) { this.handleCustomNoData(); } const customLoading = changes['customLoading']; if (customLoading?.previousValue !== customLoading?.currentValue) { this.handleCustomLoading(); } const customError = changes['customError']; if (customError?.previousValue !== customError?.currentValue) { this.handleCustomError(); } } ngAfterViewInit() { this.containerElement = this.createContainer(); const parentNode = this.elementRef.nativeElement.parentNode; // Insert container element before the table element. this.renderer.insertBefore(parentNode, this.containerElement, this.elementRef.nativeElement); // Remove the table element. this.renderer.removeChild(parentNode, this.elementRef.nativeElement); // Append the table element inside the container element. this.renderer.appendChild(this.containerElement, this.elementRef.nativeElement); // Assign filled tbody to variable this.filledElement = this.elementRef.nativeElement.querySelector('tbody'); // Append others tbody (no data, loading) this.initNoDataElement(); this.initLoadingElement(); this.initErrorElement(); // Handle table body visibility this.handleBodyVisibilityByStatus(); // Handle resize when window resized this.onResize(); } /** * Change active sorter programmatically. * @param activeSorter Value of the active sorter. Provide `undefined` to clear sorter. * @param options.emitEvent Whether to emit an event for `sortChange`. Default is `true`. */ changeActiveSorter(activeSorter, options) { this.activeSorter = activeSorter; this._sortChange.emit({ activeSorter, options }); } onResize() { this.ngZone.runOutsideAngular(() => { fromEvent(window, 'resize') .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.resizeNoDataElementWidth(); this.resizeLoadingElementWidth(); this.resizeErrorElementWidth(); }); }); } createContainer() { const element = this.renderer.createElement('div'); this.renderer.addClass(element, 'd-table-container'); return element; } initNoDataElement() { this.noDataElement = TemplateUtil.createNoDataElement({ renderer: this.renderer, totalColumn: this.totalColumn, }); this.renderer.insertBefore(this.elementRef.nativeElement, this.noDataElement.bodyElement, this.filledElement); this.handleCustomNoData(); this.resizeNoDataElementWidth(); } handleCustomNoData() { if (!this.noDataElement) return; this.noDataContentRef?.destroy(); TemplateUtil.updateNoDataContent({ appRef: this.appRef, noDataElement: this.noDataElement, renderer: this.renderer, content: this.customNoData, injector: this.injector, }); } resizeNoDataElementWidth() { if (!this.noDataElement) return; const containerWidth = this.containerElement?.clientWidth ? this.containerElement.clientWidth + 'px' : '100%'; this.noDataElement.contentElement.style.width = containerWidth; } initLoadingElement() { this.loadingElement = TemplateUtil.createLoadingElement({ renderer: this.renderer, totalColumn: this.totalColumn, applicationRef: this.appRef, environmentInjector: this.envInjector, }); this.renderer.insertBefore(this.elementRef.nativeElement, this.loadingElement.bodyElement, this.filledElement); this.handleCustomLoading(); this.resizeLoadingElementWidth(); } resizeLoadingElementWidth() { if (!this.loadingElement) return; const containerWidth = this.containerElement?.clientWidth ? this.containerElement.clientWidth + 'px' : '100%'; this.loadingElement.contentElement.style.width = containerWidth; } handleCustomLoading() { if (!this.loadingElement) return; this.loadingContentRef?.destroy(); TemplateUtil.updateLoadingContent({ appRef: this.appRef, envInjector: this.envInjector, loadingElement: this.loadingElement, renderer: this.renderer, content: this.customLoading, injector: this.injector, }); } initErrorElement() { this.errorElement = TemplateUtil.createErrorElement({ renderer: this.renderer, totalColumn: this.totalColumn, }); this.renderer.insertBefore(this.elementRef.nativeElement, this.errorElement.bodyElement, this.filledElement); this.handleCustomError(); this.resizeErrorElementWidth(); } handleCustomError() { if (!this.errorElement) return; this.errorContentRef?.destroy(); TemplateUtil.updateErrorContent({ appRef: this.appRef, errorElement: this.errorElement, renderer: this.renderer, content: this.customError, injector: this.injector, }); } resizeErrorElementWidth() { if (!this.errorElement) return; const containerWidth = this.containerElement?.clientWidth ? this.containerElement.clientWidth + 'px' : '100%'; this.errorElement.contentElement.style.width = containerWidth; } handleBodyVisibilityByStatus() { if (!this.filledElement || !this.noDataElement || !this.loadingElement || !this.errorElement) { return; } this.filledElement.style.display = 'none'; this.noDataElement.bodyElement.style.display = 'none'; this.loadingElement.bodyElement.style.display = 'none'; this.errorElement.bodyElement.style.display = 'none'; if (this.status === 'loading') this.loadingElement.bodyElement.style.display = ''; if (this.status === 'empty') this.noDataElement.bodyElement.style.display = ''; if (this.status === 'error') this.errorElement.bodyElement.style.display = ''; if (!this.status) this.filledElement.style.display = ''; } } DokuTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTable, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); DokuTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTable, isStandalone: true, selector: "[doku-table]", inputs: { activeSorter: "activeSorter", status: "status", customNoData: "customNoData", customLoading: "customLoading", customError: "customError" }, outputs: { sortChange: "sortChange" }, host: { properties: { "class": "this.classes" } }, exportAs: ["dokuTable"], usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTable, decorators: [{ type: Directive, args: [{ selector: '[doku-table]', exportAs: 'dokuTable', standalone: true, }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: i0.Injector }]; }, propDecorators: { activeSorter: [{ type: Input }], status: [{ type: Input }], customNoData: [{ type: Input }], customLoading: [{ type: Input }], customError: [{ type: Input }], sortChange: [{ type: Output }], classes: [{ type: HostBinding, args: ['class'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3RhYmxlL3RhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0wsU0FBUyxFQUdULFlBQVksRUFDWixXQUFXLEVBRVgsS0FBSyxFQUtMLE1BQU0sR0FJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFPL0MsTUFBTSxPQUFPLFNBQVM7SUErRHBCLFlBQ1UsVUFBc0IsRUFDdEIsUUFBbUIsRUFDbkIsTUFBYyxFQUNkLFdBQWdDLEVBQ2hDLE1BQXNCLEVBQ3RCLFFBQWtCO1FBTGxCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVU7UUE5QjVCOztXQUVHO1FBRUgsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQyxDQUFDO1FBRXBELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBR3BDLENBQUM7UUFDSyxnQkFBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFZcEUsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7SUFTcEMsQ0FBQztJQUVKLElBQ2MsT0FBTztRQUNuQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckIsQ0FB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LENBQUM7UUFFckQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsRixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTztZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUMxRCxDQUFDOztzR0FyVFUsU0FBUzswRkFBVCxTQUFTOzJGQUFULFNBQVM7a0JBTHJCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtpQkFDakI7b09BTVUsWUFBWTtzQkFBcEIsS0FBSztnQkFhRyxNQUFNO3NCQUFkLEtBQUs7Z0JBT0csWUFBWTtzQkFBcEIsS0FBSztnQkFPRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTU4sVUFBVTtzQkFEVCxNQUFNO2dCQStCTyxPQUFPO3NCQURwQixXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb21FdmVudCwgc2hhcmVSZXBsYXksIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdUFjdGl2ZVNvcnRlciB9IGZyb20gJy4vdGFibGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRlbXBsYXRlVXRpbCB9IGZyb20gJy4vdGVtcGxhdGUudXRpbCc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkb2t1LXRhYmxlXScsXG4gIGV4cG9ydEFzOiAnZG9rdVRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRhYmxlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBJbml0aWFsIGFjdGl2ZSBzb3J0ZXIgZm9yIGNvbHVtbi5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmVTb3J0ZXI/OiBEb2t1QWN0aXZlU29ydGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBkYXRhLlxuICAgKlxuICAgKiAtIGBsb2FkaW5nYCwgd2lsbCBzaG93IGxvYWRpbmcgY29udGVudCBvbiB0aGUgdGFibGUgYm9keVxuICAgKiAtIGBlbXB0eWAsIHdpbGwgc2hvdyBubyBkYXRhIGNvbnRlbnQgb24gdGhlIHRhYmxlIGJvZHlcbiAgICogLSBgZXJyb3JgLCB3aWxsIHNob3cgZXJyb3IgY29udGVudCBvbiB0aGUgdGFibGUgYm9keVxuICAgKlxuICAgKiBJZiBzdGF0dXMgaXMgYHVuZGVmaW5lZGAsIGl0IG1lYW5zIGRhdGEgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgc3RhdHVzPzogJ2xvYWRpbmcnIHwgJ2VtcHR5JyB8ICdlcnJvcic7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBlbXB0eWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCkgY3VzdG9tTm9EYXRhPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBsb2FkaW5nYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21Mb2FkaW5nPzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEN1c3RvbSB0ZXh0IG9yIHRlbXBsYXRlIG9uIHRoZSB0YWJsZSBib2R5IHdoZW4gc3RhdHVzIGlzIGBlcnJvcmAuXG4gICAqL1xuICBASW5wdXQoKSBjdXN0b21FcnJvcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGNvbHVtbiBzb3J0IGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgc29ydENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RG9rdUFjdGl2ZVNvcnRlciB8IHVuZGVmaW5lZD4oKTtcblxuICBwcm90ZWN0ZWQgX3NvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBhY3RpdmVTb3J0ZXI/OiBEb2t1QWN0aXZlU29ydGVyIHwgdW5kZWZpbmVkO1xuICAgIG9wdGlvbnM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfTtcbiAgfT4oKTtcbiAgcHJvdGVjdGVkIHNvcnRDaGFuZ2UkID0gdGhpcy5fc29ydENoYW5nZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KCkpO1xuXG4gIHByaXZhdGUgY29udGFpbmVyRWxlbWVudD86IEhUTUxEaXZFbGVtZW50O1xuXG4gIHByaXZhdGUgZmlsbGVkRWxlbWVudD86IEhUTUxUYWJsZVNlY3Rpb25FbGVtZW50O1xuICBwcml2YXRlIG5vRGF0YUVsZW1lbnQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBUZW1wbGF0ZVV0aWwuY3JlYXRlTm9EYXRhRWxlbWVudD47XG4gIHByaXZhdGUgbm9EYXRhQ29udGVudFJlZj86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC51cGRhdGVOb0RhdGFDb250ZW50PjtcbiAgcHJpdmF0ZSBsb2FkaW5nRWxlbWVudD86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC5jcmVhdGVMb2FkaW5nRWxlbWVudD47XG4gIHByaXZhdGUgbG9hZGluZ0NvbnRlbnRSZWY/OiBSZXR1cm5UeXBlPHR5cGVvZiBUZW1wbGF0ZVV0aWwudXBkYXRlTG9hZGluZ0NvbnRlbnQ+O1xuICBwcml2YXRlIGVycm9yRWxlbWVudD86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC5jcmVhdGVFcnJvckVsZW1lbnQ+O1xuICBwcml2YXRlIGVycm9yQ29udGVudFJlZj86IFJldHVyblR5cGU8dHlwZW9mIFRlbXBsYXRlVXRpbC51cGRhdGVFcnJvckNvbnRlbnQ+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIHByb3RlY3RlZCBnZXQgY2xhc3NlcygpOiBOZ0NsYXNzWyduZ0NsYXNzJ10ge1xuICAgIHJldHVybiBbJ2QtdGFibGUnXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdG90YWxDb2x1bW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCd0aGVhZCB0ciB0aCcpLmxlbmd0aDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NvcnRDaGFuZ2VcbiAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91cywgY3VycmVudCkgPT4gcHJldmlvdXMuYWN0aXZlU29ydGVyID09PSBjdXJyZW50LmFjdGl2ZVNvcnRlciksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocHJvcHMpID0+IHtcbiAgICAgICAgY29uc3QgZW1pdEV2ZW50ID0gcHJvcHM/Lm9wdGlvbnM/LmVtaXRFdmVudCA/PyB0cnVlO1xuICAgICAgICBpZiAoZW1pdEV2ZW50KSB0aGlzLnNvcnRDaGFuZ2UuZW1pdChwcm9wcz8uYWN0aXZlU29ydGVyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZmlsbGVkRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5vRGF0YUVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5ub0RhdGFDb250ZW50UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy5sb2FkaW5nRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmdDb250ZW50UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lcnJvckNvbnRlbnRSZWY/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVNvcnRlciA9IGNoYW5nZXNbJ2FjdGl2ZVNvcnRlciddO1xuICAgIGlmIChhY3RpdmVTb3J0ZXI/LnByZXZpb3VzVmFsdWUgIT09IGFjdGl2ZVNvcnRlcj8uY3VycmVudFZhbHVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3NvcnRDaGFuZ2UuZW1pdCh7IGFjdGl2ZVNvcnRlcjogYWN0aXZlU29ydGVyPy5jdXJyZW50VmFsdWUgfSksIDApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IGNoYW5nZXNbJ3N0YXR1cyddO1xuICAgIGlmIChzdGF0dXM/LnByZXZpb3VzVmFsdWUgIT09IHN0YXR1cz8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmhhbmRsZUJvZHlWaXNpYmlsaXR5QnlTdGF0dXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Ob0RhdGEgPSBjaGFuZ2VzWydjdXN0b21Ob0RhdGEnXTtcbiAgICBpZiAoY3VzdG9tTm9EYXRhPy5wcmV2aW91c1ZhbHVlICE9PSBjdXN0b21Ob0RhdGE/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5oYW5kbGVDdXN0b21Ob0RhdGEoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21Mb2FkaW5nID0gY2hhbmdlc1snY3VzdG9tTG9hZGluZyddO1xuICAgIGlmIChjdXN0b21Mb2FkaW5nPy5wcmV2aW91c1ZhbHVlICE9PSBjdXN0b21Mb2FkaW5nPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tTG9hZGluZygpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbUVycm9yID0gY2hhbmdlc1snY3VzdG9tRXJyb3InXTtcbiAgICBpZiAoY3VzdG9tRXJyb3I/LnByZXZpb3VzVmFsdWUgIT09IGN1c3RvbUVycm9yPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ3VzdG9tRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICBjb25zdCBwYXJlbnROb2RlID0gKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5wYXJlbnROb2RlO1xuXG4gICAgLy8gSW5zZXJ0IGNvbnRhaW5lciBlbGVtZW50IGJlZm9yZSB0aGUgdGFibGUgZWxlbWVudC5cbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnROb2RlLCB0aGlzLmNvbnRhaW5lckVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGFibGUgZWxlbWVudC5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIC8vIEFwcGVuZCB0aGUgdGFibGUgZWxlbWVudCBpbnNpZGUgdGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXJFbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAvLyBBc3NpZ24gZmlsbGVkIHRib2R5IHRvIHZhcmlhYmxlXG4gICAgdGhpcy5maWxsZWRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKTtcblxuICAgIC8vIEFwcGVuZCBvdGhlcnMgdGJvZHkgKG5vIGRhdGEsIGxvYWRpbmcpXG4gICAgdGhpcy5pbml0Tm9EYXRhRWxlbWVudCgpO1xuICAgIHRoaXMuaW5pdExvYWRpbmdFbGVtZW50KCk7XG4gICAgdGhpcy5pbml0RXJyb3JFbGVtZW50KCk7XG5cbiAgICAvLyBIYW5kbGUgdGFibGUgYm9keSB2aXNpYmlsaXR5XG4gICAgdGhpcy5oYW5kbGVCb2R5VmlzaWJpbGl0eUJ5U3RhdHVzKCk7XG5cbiAgICAvLyBIYW5kbGUgcmVzaXplIHdoZW4gd2luZG93IHJlc2l6ZWRcbiAgICB0aGlzLm9uUmVzaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIGFjdGl2ZSBzb3J0ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogQHBhcmFtIGFjdGl2ZVNvcnRlciBWYWx1ZSBvZiB0aGUgYWN0aXZlIHNvcnRlci4gUHJvdmlkZSBgdW5kZWZpbmVkYCB0byBjbGVhciBzb3J0ZXIuXG4gICAqIEBwYXJhbSBvcHRpb25zLmVtaXRFdmVudCBXaGV0aGVyIHRvIGVtaXQgYW4gZXZlbnQgZm9yIGBzb3J0Q2hhbmdlYC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBjaGFuZ2VBY3RpdmVTb3J0ZXIoYWN0aXZlU29ydGVyPzogRG9rdUFjdGl2ZVNvcnRlciwgb3B0aW9ucz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy5hY3RpdmVTb3J0ZXIgPSBhY3RpdmVTb3J0ZXI7XG4gICAgdGhpcy5fc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlU29ydGVyLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2l6ZU5vRGF0YUVsZW1lbnRXaWR0aCgpO1xuICAgICAgICAgIHRoaXMucmVzaXplTG9hZGluZ0VsZW1lbnRXaWR0aCgpO1xuICAgICAgICAgIHRoaXMucmVzaXplRXJyb3JFbGVtZW50V2lkdGgoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbnRhaW5lcigpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50LCAnZC10YWJsZS1jb250YWluZXInKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE5vRGF0YUVsZW1lbnQoKSB7XG4gICAgdGhpcy5ub0RhdGFFbGVtZW50ID0gVGVtcGxhdGVVdGlsLmNyZWF0ZU5vRGF0YUVsZW1lbnQoe1xuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICB0b3RhbENvbHVtbjogdGhpcy50b3RhbENvbHVtbixcbiAgICB9KTtcbiAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgdGhpcy5ub0RhdGFFbGVtZW50LmJvZHlFbGVtZW50LFxuICAgICAgdGhpcy5maWxsZWRFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmhhbmRsZUN1c3RvbU5vRGF0YSgpO1xuICAgIHRoaXMucmVzaXplTm9EYXRhRWxlbWVudFdpZHRoKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUN1c3RvbU5vRGF0YSgpIHtcbiAgICBpZiAoIXRoaXMubm9EYXRhRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMubm9EYXRhQ29udGVudFJlZj8uZGVzdHJveSgpO1xuICAgIFRlbXBsYXRlVXRpbC51cGRhdGVOb0RhdGFDb250ZW50KHtcbiAgICAgIGFwcFJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBub0RhdGFFbGVtZW50OiB0aGlzLm5vRGF0YUVsZW1lbnQsXG4gICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlcixcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY3VzdG9tTm9EYXRhLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZU5vRGF0YUVsZW1lbnRXaWR0aCgpIHtcbiAgICBpZiAoIXRoaXMubm9EYXRhRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbGVtZW50Py5jbGllbnRXaWR0aFxuICAgICAgPyB0aGlzLmNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnXG4gICAgICA6ICcxMDAlJztcbiAgICB0aGlzLm5vRGF0YUVsZW1lbnQuY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdExvYWRpbmdFbGVtZW50KCkge1xuICAgIHRoaXMubG9hZGluZ0VsZW1lbnQgPSBUZW1wbGF0ZVV0aWwuY3JlYXRlTG9hZGluZ0VsZW1lbnQoe1xuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICB0b3RhbENvbHVtbjogdGhpcy50b3RhbENvbHVtbixcbiAgICAgIGFwcGxpY2F0aW9uUmVmOiB0aGlzLmFwcFJlZixcbiAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQsXG4gICAgICB0aGlzLmZpbGxlZEVsZW1lbnRcbiAgICApO1xuICAgIHRoaXMuaGFuZGxlQ3VzdG9tTG9hZGluZygpO1xuICAgIHRoaXMucmVzaXplTG9hZGluZ0VsZW1lbnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVMb2FkaW5nRWxlbWVudFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5sb2FkaW5nRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5jb250YWluZXJFbGVtZW50Py5jbGllbnRXaWR0aFxuICAgICAgPyB0aGlzLmNvbnRhaW5lckVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnXG4gICAgICA6ICcxMDAlJztcbiAgICB0aGlzLmxvYWRpbmdFbGVtZW50LmNvbnRlbnRFbGVtZW50LnN0eWxlLndpZHRoID0gY29udGFpbmVyV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUN1c3RvbUxvYWRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5sb2FkaW5nQ29udGVudFJlZj8uZGVzdHJveSgpO1xuICAgIFRlbXBsYXRlVXRpbC51cGRhdGVMb2FkaW5nQ29udGVudCh7XG4gICAgICBhcHBSZWY6IHRoaXMuYXBwUmVmLFxuICAgICAgZW52SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsXG4gICAgICBsb2FkaW5nRWxlbWVudDogdGhpcy5sb2FkaW5nRWxlbWVudCxcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgY29udGVudDogdGhpcy5jdXN0b21Mb2FkaW5nLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRFcnJvckVsZW1lbnQoKSB7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQgPSBUZW1wbGF0ZVV0aWwuY3JlYXRlRXJyb3JFbGVtZW50KHtcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgdG90YWxDb2x1bW46IHRoaXMudG90YWxDb2x1bW4sXG4gICAgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgIHRoaXMuZXJyb3JFbGVtZW50LmJvZHlFbGVtZW50LFxuICAgICAgdGhpcy5maWxsZWRFbGVtZW50XG4gICAgKTtcbiAgICB0aGlzLmhhbmRsZUN1c3RvbUVycm9yKCk7XG4gICAgdGhpcy5yZXNpemVFcnJvckVsZW1lbnRXaWR0aCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDdXN0b21FcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lcnJvckNvbnRlbnRSZWY/LmRlc3Ryb3koKTtcbiAgICBUZW1wbGF0ZVV0aWwudXBkYXRlRXJyb3JDb250ZW50KHtcbiAgICAgIGFwcFJlZjogdGhpcy5hcHBSZWYsXG4gICAgICBlcnJvckVsZW1lbnQ6IHRoaXMuZXJyb3JFbGVtZW50LFxuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICBjb250ZW50OiB0aGlzLmN1c3RvbUVycm9yLFxuICAgICAgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2l6ZUVycm9yRWxlbWVudFdpZHRoKCkge1xuICAgIGlmICghdGhpcy5lcnJvckVsZW1lbnQpIHJldHVybjtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyRWxlbWVudD8uY2xpZW50V2lkdGhcbiAgICAgID8gdGhpcy5jb250YWluZXJFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4J1xuICAgICAgOiAnMTAwJSc7XG4gICAgdGhpcy5lcnJvckVsZW1lbnQuY29udGVudEVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQm9keVZpc2liaWxpdHlCeVN0YXR1cygpIHtcbiAgICBpZiAoIXRoaXMuZmlsbGVkRWxlbWVudCB8fCAhdGhpcy5ub0RhdGFFbGVtZW50IHx8ICF0aGlzLmxvYWRpbmdFbGVtZW50IHx8ICF0aGlzLmVycm9yRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsbGVkRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMubm9EYXRhRWxlbWVudC5ib2R5RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmVycm9yRWxlbWVudC5ib2R5RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnbG9hZGluZycpIHRoaXMubG9hZGluZ0VsZW1lbnQuYm9keUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2VtcHR5JykgdGhpcy5ub0RhdGFFbGVtZW50LmJvZHlFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdlcnJvcicpIHRoaXMuZXJyb3JFbGVtZW50LmJvZHlFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBpZiAoIXRoaXMuc3RhdHVzKSB0aGlzLmZpbGxlZEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB9XG59XG4iXX0=