UNPKG

dynamic-mat-table

Version:

dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.

158 lines 22.8 kB
import { ContentChild, Directive, forwardRef, Input, NgZone } from '@angular/core'; import { VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling'; import { distinctUntilChanged, filter, map, switchMap, takeUntil, takeWhile, tap } from 'rxjs/operators'; import { TableVirtualScrollDataSource } from './table-data-source'; import { MatTable } from '@angular/material/table'; import { FixedSizeTableVirtualScrollStrategy } from './fixed-size-table-virtual-scroll-strategy'; import { Subject } from 'rxjs'; export function _tableVirtualScrollDirectiveStrategyFactory(tableDir) { return tableDir.scrollStrategy; } const stickyHeaderSelector = '.mat-header-row .mat-table-sticky'; const stickyFooterSelector = '.mat-footer-row .mat-table-sticky'; const defaults = { rowHeight: 48, headerHeight: 56, headerEnabled: true, footerHeight: 48, footerEnabled: false, bufferMultiplier: 0.7 }; export class TableItemSizeDirective { constructor(zone) { this.zone = zone; this.alive = true; // tslint:disable-next-line:no-input-rename this.rowHeight = defaults.rowHeight; this.headerEnabled = defaults.headerEnabled; this.headerHeight = defaults.headerHeight; this.footerEnabled = defaults.footerEnabled; this.footerHeight = defaults.footerHeight; this.bufferMultiplier = defaults.bufferMultiplier; // @Output() requestRendering: EventEmitter<any> = new EventEmitter(); this.scrollStrategy = new FixedSizeTableVirtualScrollStrategy(); this.dataSourceChanges = new Subject(); } ngOnDestroy() { this.alive = false; this.dataSourceChanges.complete(); } isAlive() { return () => this.alive; } isStickyEnabled() { return !!this.scrollStrategy.viewport && this.table._headerRowDefs .map(def => def.sticky) .reduce((prevState, state) => prevState && state, true); } ngAfterContentInit() { const switchDataSourceOrigin = this.table._switchDataSource; this.table._switchDataSource = (dataSource) => { switchDataSourceOrigin.call(this.table, dataSource); this.connectDataSource(dataSource); }; this.connectDataSource(this.table.dataSource); this.scrollStrategy.stickyChange .pipe(filter(() => this.isStickyEnabled()), tap(() => { if (!this.stickyPositions) { this.initStickyPositions(); } }), takeWhile(this.isAlive())) .subscribe((stickyOffset) => { this.setSticky(stickyOffset); }); } connectDataSource(dataSource) { this.dataSourceChanges.next(); if (dataSource instanceof TableVirtualScrollDataSource) { dataSource .dataToRender$ .pipe(distinctUntilChanged(), takeUntil(this.dataSourceChanges), takeWhile(this.isAlive()), tap(data => this.scrollStrategy.dataLength = data === null || data === void 0 ? void 0 : data.length), switchMap(data => this.scrollStrategy .renderedRangeStream .pipe(map(({ start, end }) => { // this.requestRendering.emit({from: start, to: end}); return typeof start !== 'number' || typeof end !== 'number' ? data : data.slice(start, end); })))) .subscribe(data => { this.zone.run(() => { dataSource.dataOfRange$.next(data); }); }); } else { throw new Error('[tvsItemSize] requires TableVirtualScrollDataSource be set as [dataSource] of [mat-table]'); } } ngOnChanges() { const config = { rowHeight: +this.rowHeight || defaults.rowHeight, headerHeight: this.headerEnabled ? +this.headerHeight || defaults.headerHeight : 0, footerHeight: this.footerEnabled ? +this.footerHeight || defaults.footerHeight : 0, bufferMultiplier: +this.bufferMultiplier || defaults.bufferMultiplier }; this.scrollStrategy.setConfig(config); } setSticky(offset) { this.scrollStrategy.viewport.elementRef.nativeElement.querySelectorAll(stickyHeaderSelector) .forEach((el) => { const parent = el.parentElement; let baseOffset = 0; if (this.stickyPositions.has(parent)) { baseOffset = this.stickyPositions.get(parent); } el.style.top = `${baseOffset - offset}px`; }); this.scrollStrategy.viewport.elementRef.nativeElement.querySelectorAll(stickyFooterSelector) .forEach((el) => { const parent = el.parentElement; let baseOffset = 0; if (this.stickyPositions.has(parent)) { baseOffset = this.stickyPositions.get(parent); } el.style.bottom = `${-baseOffset + offset}px`; }); } initStickyPositions() { this.stickyPositions = new Map(); this.scrollStrategy.viewport.elementRef.nativeElement.querySelectorAll(stickyHeaderSelector) .forEach(el => { const parent = el.parentElement; if (!this.stickyPositions.has(parent)) { this.stickyPositions.set(parent, parent.offsetTop); } }); } } /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TableItemSizeDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'cdk-virtual-scroll-viewport[tvsItemSize]', providers: [{ provide: VIRTUAL_SCROLL_STRATEGY, useFactory: _tableVirtualScrollDirectiveStrategyFactory, deps: [forwardRef(() => TableItemSizeDirective)] }] },] } ]; /** * @type {function(): !Array<(null|{ * type: ?, * decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>), * })>} * @nocollapse */ TableItemSizeDirective.ctorParameters = () => [ { type: NgZone } ]; /** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ TableItemSizeDirective.propDecorators = { rowHeight: [{ type: Input, args: ['tvsItemSize',] }], headerEnabled: [{ type: Input }], headerHeight: [{ type: Input }], footerEnabled: [{ type: Input }], footerHeight: [{ type: Input }], bufferMultiplier: [{ type: Input }], table: [{ type: ContentChild, args: [MatTable, { static: true },] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2R5bmFtaWMtbWF0LXRhYmxlL3NyYy9saWIvY29yZXMvdGFibGUtaXRlbS1zaXplLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUNBLEVBQ29CLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNyRCxLQUFLLEVBQUUsTUFBTSxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVqRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRy9CLE1BQU0sVUFBVSwyQ0FBMkMsQ0FBQyxRQUFnQztJQUUxRixPQUFPLFFBQVEsQ0FBQyxjQUFjLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sb0JBQW9CLEdBQUcsbUNBQW1DLENBQUM7QUFDakUsTUFBTSxvQkFBb0IsR0FBRyxtQ0FBbUMsQ0FBQztBQUVqRSxNQUFNLFFBQVEsR0FBRztJQUNmLFNBQVMsRUFBRSxFQUFFO0lBQ2IsWUFBWSxFQUFFLEVBQUU7SUFDaEIsYUFBYSxFQUFFLElBQUk7SUFDbkIsWUFBWSxFQUFFLEVBQUU7SUFDaEIsYUFBYSxFQUFFLEtBQUs7SUFDcEIsZ0JBQWdCLEVBQUUsR0FBRztDQUN0QixDQUFDO0FB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VUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLG1CQUFtQjtRQUV6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUM7YUFDekYsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBRVosTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ3JDO2dCQUNFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDcEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Ozs7WUFsTEYsU0FBUyxTQUFDO2dCQUNULDhDQUE4QztnQkFDOUMsUUFBUSxFQUFFLDBDQUEwQztnQkFDcEQsU0FBUyxFQUFFLENBQUM7d0JBQ1YsT0FBTyxFQUFFLHVCQUF1Qjt3QkFDaEMsVUFBVSxFQUFFLDJDQUEyQzt3QkFDdkQsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7cUJBQ2pELENBQUM7YUFDSDs7Ozs7Ozs7OztZQXBDUSxNQUFNOzs7O3dCQTBDWixLQUFLLFNBQUMsYUFBYTs0QkFHbkIsS0FBSzsyQkFHTCxLQUFLOzRCQUdMLEtBQUs7MkJBR0wsS0FBSzsrQkFHTCxLQUFLO29CQUdMLFlBQVksU0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0XHJcbntcclxuICBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGQsIERpcmVjdGl2ZSwgZm9yd2FyZFJlZixcclxuICBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3V0cHV0LCBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFrZVdoaWxlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgfSBmcm9tICcuL3RhYmxlLWRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEZpeGVkU2l6ZVRhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi9maXhlZC1zaXplLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXN0cmF0ZWd5JztcclxuaW1wb3J0IHsgQ2RrSGVhZGVyUm93RGVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfdGFibGVWaXJ0dWFsU2Nyb2xsRGlyZWN0aXZlU3RyYXRlZ3lGYWN0b3J5KHRhYmxlRGlyOiBUYWJsZUl0ZW1TaXplRGlyZWN0aXZlKVxyXG57XHJcbiAgcmV0dXJuIHRhYmxlRGlyLnNjcm9sbFN0cmF0ZWd5O1xyXG59XHJcblxyXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcubWF0LWhlYWRlci1yb3cgLm1hdC10YWJsZS1zdGlja3knO1xyXG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcubWF0LWZvb3Rlci1yb3cgLm1hdC10YWJsZS1zdGlja3knO1xyXG5cclxuY29uc3QgZGVmYXVsdHMgPSB7XHJcbiAgcm93SGVpZ2h0OiA0OCxcclxuICBoZWFkZXJIZWlnaHQ6IDU2LFxyXG4gIGhlYWRlckVuYWJsZWQ6IHRydWUsXHJcbiAgZm9vdGVySGVpZ2h0OiA0OCxcclxuICBmb290ZXJFbmFibGVkOiBmYWxzZSxcclxuICBidWZmZXJNdWx0aXBsaWVyOiAwLjdcclxufTtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFt0dnNJdGVtU2l6ZV0nLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICAgdXNlRmFjdG9yeTogX3RhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVN0cmF0ZWd5RmFjdG9yeSxcclxuICAgIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IFRhYmxlSXRlbVNpemVEaXJlY3RpdmUpXVxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUl0ZW1TaXplRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIHByaXZhdGUgYWxpdmUgPSB0cnVlO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCd0dnNJdGVtU2l6ZScpXHJcbiAgcm93SGVpZ2h0ID0gZGVmYXVsdHMucm93SGVpZ2h0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckVuYWJsZWQgPSBkZWZhdWx0cy5oZWFkZXJFbmFibGVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckhlaWdodCA9IGRlZmF1bHRzLmhlYWRlckhlaWdodDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJFbmFibGVkID0gZGVmYXVsdHMuZm9vdGVyRW5hYmxlZDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJIZWlnaHQgPSBkZWZhdWx0cy5mb290ZXJIZWlnaHQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnVmZmVyTXVsdGlwbGllciA9IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXI7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoTWF0VGFibGUsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlOiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuICAvLyBAT3V0cHV0KCkgcmVxdWVzdFJlbmRlcmluZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHNjcm9sbFN0cmF0ZWd5ID0gbmV3IEZpeGVkU2l6ZVRhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5KCk7XHJcblxyXG4gIGRhdGFTb3VyY2VDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHN0aWNreVBvc2l0aW9uczogTWFwPEhUTUxFbGVtZW50LCBudW1iZXI+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSlcclxuICB7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpXHJcbiAge1xyXG4gICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlQ2hhbmdlcy5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0FsaXZlKClcclxuICB7XHJcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5hbGl2ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTdGlja3lFbmFibGVkKCk6IGJvb2xlYW5cclxuICB7XHJcbiAgICByZXR1cm4gISF0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0ICYmICgodGhpcy50YWJsZSBhcyBhbnkpLl9oZWFkZXJSb3dEZWZzIGFzIENka0hlYWRlclJvd0RlZltdKVxyXG4gICAgICAubWFwKGRlZiA9PiBkZWYuc3RpY2t5KVxyXG4gICAgICAucmVkdWNlKChwcmV2U3RhdGUsIHN0YXRlKSA9PiBwcmV2U3RhdGUgJiYgc3RhdGUsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KClcclxuICB7XHJcbiAgICBjb25zdCBzd2l0Y2hEYXRhU291cmNlT3JpZ2luID0gKHRoaXMudGFibGUgYXMgYW55KS5fc3dpdGNoRGF0YVNvdXJjZTtcclxuICAgICh0aGlzLnRhYmxlIGFzIGFueSkuX3N3aXRjaERhdGFTb3VyY2UgPSAoZGF0YVNvdXJjZTogYW55KSA9PlxyXG4gICAge1xyXG4gICAgICBzd2l0Y2hEYXRhU291cmNlT3JpZ2luLmNhbGwodGhpcy50YWJsZSwgZGF0YVNvdXJjZSk7XHJcbiAgICAgIHRoaXMuY29ubmVjdERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuY29ubmVjdERhdGFTb3VyY2UodGhpcy50YWJsZS5kYXRhU291cmNlKTtcclxuXHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnN0aWNreUNoYW5nZVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc1N0aWNreUVuYWJsZWQoKSksXHJcbiAgICAgICAgdGFwKCgpID0+XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnN0aWNreVBvc2l0aW9ucylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0U3RpY2t5UG9zaXRpb25zKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdGFrZVdoaWxlKHRoaXMuaXNBbGl2ZSgpKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHN0aWNreU9mZnNldCkgPT5cclxuICAgICAge1xyXG4gICAgICAgIHRoaXMuc2V0U3RpY2t5KHN0aWNreU9mZnNldCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29ubmVjdERhdGFTb3VyY2UoZGF0YVNvdXJjZTogYW55KVxyXG4gIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlKVxyXG4gICAge1xyXG4gICAgICBkYXRhU291cmNlXHJcbiAgICAgICAgLmRhdGFUb1JlbmRlciRcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kYXRhU291cmNlQ2hhbmdlcyksXHJcbiAgICAgICAgICB0YWtlV2hpbGUodGhpcy5pc0FsaXZlKCkpLFxyXG4gICAgICAgICAgdGFwKGRhdGEgPT4gdGhpcy5zY3JvbGxTdHJhdGVneS5kYXRhTGVuZ3RoID0gZGF0YT8ubGVuZ3RoKSxcclxuICAgICAgICAgIHN3aXRjaE1hcChkYXRhID0+XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3lcclxuICAgICAgICAgICAgICAucmVuZGVyZWRSYW5nZVN0cmVhbVxyXG4gICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKCh7IHN0YXJ0LCBlbmQgfSkgPT5cclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5yZXF1ZXN0UmVuZGVyaW5nLmVtaXQoe2Zyb206IHN0YXJ0LCB0bzogZW5kfSk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygc3RhcnQgIT09ICdudW1iZXInIHx8IHR5cGVvZiBlbmQgIT09ICdudW1iZXInID8gZGF0YSA6IGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgIClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZShkYXRhID0+XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmRhdGFPZlJhbmdlJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2VcclxuICAgIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbdHZzSXRlbVNpemVdIHJlcXVpcmVzIFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgYmUgc2V0IGFzIFtkYXRhU291cmNlXSBvZiBbbWF0LXRhYmxlXScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKVxyXG4gIHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgcm93SGVpZ2h0OiArdGhpcy5yb3dIZWlnaHQgfHwgZGVmYXVsdHMucm93SGVpZ2h0LFxyXG4gICAgICBoZWFkZXJIZWlnaHQ6IHRoaXMuaGVhZGVyRW5hYmxlZCA/ICt0aGlzLmhlYWRlckhlaWdodCB8fCBkZWZhdWx0cy5oZWFkZXJIZWlnaHQgOiAwLFxyXG4gICAgICBmb290ZXJIZWlnaHQ6IHRoaXMuZm9vdGVyRW5hYmxlZCA/ICt0aGlzLmZvb3RlckhlaWdodCB8fCBkZWZhdWx0cy5mb290ZXJIZWlnaHQgOiAwLFxyXG4gICAgICBidWZmZXJNdWx0aXBsaWVyOiArdGhpcy5idWZmZXJNdWx0aXBsaWVyIHx8IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXJcclxuICAgIH07XHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnNldENvbmZpZyhjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgc2V0U3RpY2t5KG9mZnNldClcclxuICB7XHJcbiAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnZpZXdwb3J0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PlxyXG4gICAgICB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBsZXQgYmFzZU9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGJhc2VPZmZzZXQgPSB0aGlzLnN0aWNreVBvc2l0aW9ucy5nZXQocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWwuc3R5bGUudG9wID0gYCR7YmFzZU9mZnNldCAtIG9mZnNldH1weGA7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zY3JvbGxTdHJhdGVneS52aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzdGlja3lGb290ZXJTZWxlY3RvcilcclxuICAgICAgLmZvckVhY2goKGVsOiBIVE1MRWxlbWVudCkgPT5cclxuICAgICAge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IGJhc2VPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmICh0aGlzLnN0aWNreVBvc2l0aW9ucy5oYXMocGFyZW50KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBiYXNlT2Zmc2V0ID0gdGhpcy5zdGlja3lQb3NpdGlvbnMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IGAkey1iYXNlT2Zmc2V0ICsgb2Zmc2V0fXB4YDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTdGlja3lQb3NpdGlvbnMoKVxyXG4gIHtcclxuICAgIHRoaXMuc3RpY2t5UG9zaXRpb25zID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgbnVtYmVyPigpO1xyXG4gICAgdGhpcy5zY3JvbGxTdHJhdGVneS52aWV3cG9ydC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzdGlja3lIZWFkZXJTZWxlY3RvcilcclxuICAgICAgLmZvckVhY2goZWwgPT5cclxuICAgICAge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0aWNreVBvc2l0aW9ucy5oYXMocGFyZW50KSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aGlzLnN0aWNreVBvc2l0aW9ucy5zZXQocGFyZW50LCBwYXJlbnQub2Zmc2V0VG9wKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=