UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

254 lines 34.2 kB
import { __decorate, __metadata, __param } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DoCheck, ElementRef, HostBinding, HostListener, Input, NgZone, OnInit, Inject, OnDestroy, NgModuleRef } from '@angular/core'; import { DataType } from '../../data-operations/data-util'; import { SortingDirection } from '../../data-operations/sorting-expression.interface'; import { GridBaseAPIService } from '../api.service'; import { IgxColumnComponent } from '../columns/column.component'; import { IgxFilteringService } from '../filtering/grid-filtering.service'; import { IgxColumnResizingService } from '../resizing/resizing.service'; import { IgxOverlayService } from '../../services/overlay/overlay'; import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/grid.excel-style-filtering.component'; import { VerticalAlignment } from '../../services/overlay/utilities'; import { AutoPositionStrategy } from '../../services/overlay/position/auto-position-strategy'; import { useAnimation } from '@angular/animations'; import { filter, takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { fadeIn, fadeOut } from '../../animations/main'; import { AbsoluteScrollStrategy } from '../../services/overlay/scroll/absolute-scroll-strategy'; /** * @hidden */ let IgxGridHeaderComponent = class IgxGridHeaderComponent { constructor(gridAPI, colResizingService, cdr, elementRef, zone, _filteringService, _moduleRef, _overlayService) { this.gridAPI = gridAPI; this.colResizingService = colResizingService; this.cdr = cdr; this.elementRef = elementRef; this.zone = zone; this._filteringService = _filteringService; this._moduleRef = _moduleRef; this._overlayService = _overlayService; this._destroy$ = new Subject(); this.hostRole = 'columnheader'; this.tabindex = 0; this.sortDirection = SortingDirection.None; } get styleClasses() { const defaultClasses = [ 'igx-grid__th--fw', this.column.headerClasses ]; const classList = { 'igx-grid__th': !this.column.columnGroup, 'asc': this.ascending, 'desc': this.descending, 'igx-grid__th--number': this.column.dataType === DataType.Number, 'igx-grid__th--sortable': this.column.sortable, 'igx-grid__th--filtrable': this.column.filterable && this.grid.filteringService.isFilterRowVisible, 'igx-grid__th--sorted': this.sorted }; for (const klass of Object.keys(classList)) { if (classList[klass]) { defaultClasses.push(klass); } } return defaultClasses.join(' '); } get height() { if (this.grid.hasColumnGroups) { return (this.grid.maxLevelHeaderDepth + 1 - this.column.level) * this.grid.defaultRowHeight / this.grid._baseFontSize; } return null; } get ascending() { return this.sortDirection === SortingDirection.Asc; } get descending() { return this.sortDirection === SortingDirection.Desc; } get sortingIcon() { if (this.sortDirection !== SortingDirection.None) { // arrow_downward and arrow_upward // are material icons ligature strings return this.sortDirection === SortingDirection.Asc ? 'arrow_upward' : 'arrow_downward'; } return 'arrow_upward'; } get sorted() { return this.sortDirection !== SortingDirection.None; } get filterIconClassName() { return this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon'; } get headerID() { return `${this.gridID}_${this.column.field}`; } ngOnInit() { this.initFilteringSettings(); } ngDoCheck() { this.getSortDirection(); this.cdr.markForCheck(); } ngOnDestroy() { this._destroy$.next(true); this._destroy$.complete(); if (this._componentOverlayId) { this._overlayService.hide(this._componentOverlayId); } } onClick(event) { if (!this.colResizingService.isColumnResizing) { event.stopPropagation(); if (this.grid.filteringService.isFilterRowVisible) { if (this.column.filterable && !this.column.columnGroup && !this.grid.filteringService.isFilterComplex(this.column.field)) { this.grid.filteringService.filteredColumn = this.column; } } else if (this.column.sortable) { this.triggerSort(); } } } onFilteringIconClick(event) { event.stopPropagation(); this.toggleFilterDropdown(); } get grid() { return this.gridAPI.grid; } getSortDirection() { const expr = this.gridAPI.grid.sortingExpressions.find((x) => x.fieldName === this.column.field); this.sortDirection = expr ? expr.dir : SortingDirection.None; } onSortingIconClick(event) { if (this.grid.filteringService.isFilterRowVisible) { event.stopPropagation(); this.triggerSort(); } } triggerSort() { const groupingExpr = this.grid.groupingExpressions ? this.grid.groupingExpressions.find((expr) => expr.fieldName === this.column.field) : null; const sortDir = groupingExpr ? this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.Asc : SortingDirection.Desc : this.sortDirection + 1 > SortingDirection.Desc ? SortingDirection.None : this.sortDirection + 1; this.sortDirection = sortDir; this.grid.sort({ fieldName: this.column.field, dir: this.sortDirection, ignoreCase: this.column.sortingIgnoreCase, strategy: this.column.sortStrategy }); } toggleFilterDropdown() { if (!this._componentOverlayId) { const headerTarget = this.elementRef.nativeElement; const filterIconTarget = headerTarget.querySelector('.' + this.filterIconClassName); this._filterMenuOverlaySettings.positionStrategy.settings.target = filterIconTarget; this._filterMenuOverlaySettings.outlet = this.grid.outlet; this._componentOverlayId = this._overlayService.attach(IgxGridExcelStyleFilteringComponent, this._filterMenuOverlaySettings, this._moduleRef); this._overlayService.show(this._componentOverlayId, this._filterMenuOverlaySettings); } } initFilteringSettings() { this._filterMenuPositionSettings = { verticalStartPoint: VerticalAlignment.Bottom, openAnimation: useAnimation(fadeIn, { params: { duration: '250ms' } }), closeAnimation: useAnimation(fadeOut, { params: { duration: '200ms' } }) }; this._filterMenuOverlaySettings = { closeOnOutsideClick: true, modal: false, positionStrategy: new AutoPositionStrategy(this._filterMenuPositionSettings), scrollStrategy: new AbsoluteScrollStrategy() }; this._overlayService.onOpening.pipe(filter((overlay) => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe((eventArgs) => { this.onOverlayOpening(eventArgs); }); this._overlayService.onClosed.pipe(filter(overlay => overlay.id === this._componentOverlayId), takeUntil(this._destroy$)).subscribe(() => { this.onOverlayClosed(); }); } onOverlayOpening(eventArgs) { const instance = eventArgs.componentRef.instance; if (instance) { instance.initialize(this.column, this._overlayService, eventArgs.id); } } onOverlayClosed() { this._componentOverlayId = null; } }; IgxGridHeaderComponent.ctorParameters = () => [ { type: GridBaseAPIService }, { type: IgxColumnResizingService }, { type: ChangeDetectorRef }, { type: ElementRef }, { type: NgZone }, { type: IgxFilteringService }, { type: NgModuleRef }, { type: IgxOverlayService, decorators: [{ type: Inject, args: [IgxOverlayService,] }] } ]; __decorate([ Input(), __metadata("design:type", IgxColumnComponent) ], IgxGridHeaderComponent.prototype, "column", void 0); __decorate([ Input(), __metadata("design:type", String) ], IgxGridHeaderComponent.prototype, "gridID", void 0); __decorate([ HostBinding('class'), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxGridHeaderComponent.prototype, "styleClasses", null); __decorate([ HostBinding('style.height.rem'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxGridHeaderComponent.prototype, "height", null); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object) ], IgxGridHeaderComponent.prototype, "hostRole", void 0); __decorate([ HostBinding('attr.tabindex'), __metadata("design:type", Object) ], IgxGridHeaderComponent.prototype, "tabindex", void 0); __decorate([ HostBinding('attr.id'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxGridHeaderComponent.prototype, "headerID", null); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxGridHeaderComponent.prototype, "onClick", null); IgxGridHeaderComponent = __decorate([ Component({ changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, selector: 'igx-grid-header', template: "<ng-template #defaultColumn>\n <span [attr.title]=\"column.header || column.field\">{{ column.header || column.field }}</span>\n</ng-template>\n\n<span class=\"igx-grid__th-title\">\n <ng-container *ngTemplateOutlet=\"column.headerTemplate ? column.headerTemplate : defaultColumn; context: { $implicit: column, column: column}\">\n </ng-container>\n</span>\n<div class=\"igx-grid__th-icons\" *ngIf=\"!column.columnGroup\">\n <igx-icon [attr.draggable]=\"false\"\n class=\"sort-icon\"\n *ngIf=\"column.sortable\"\n (click)=\"onSortingIconClick($event)\">\n {{sortingIcon}}\n </igx-icon>\n\n <igx-icon [ngClass]=\"filterIconClassName\" [attr.draggable]=\"false\" (click)=\"onFilteringIconClick($event)\"\n *ngIf=\"grid.allowFiltering == true && column.filterable && grid.filterMode == 'excelStyleFilter'\">\n filter_list\n </igx-icon>\n</div>\n" }), __param(7, Inject(IgxOverlayService)), __metadata("design:paramtypes", [GridBaseAPIService, IgxColumnResizingService, ChangeDetectorRef, ElementRef, NgZone, IgxFilteringService, NgModuleRef, IgxOverlayService]) ], IgxGridHeaderComponent); export { IgxGridHeaderComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULE9BQU8sRUFDUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDcEgsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVB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SyxFQUFFOzhCQUNPLGtCQUFrQjtzREFBQztBQUdsQztJQURDLEtBQUssRUFBRTs7c0RBQ2M7QUFHdEI7SUFEQyxXQUFXLENBQUMsT0FBTyxDQUFDOzs7MERBdUJwQjtBQUdEO0lBREMsV0FBVyxDQUFDLGtCQUFrQixDQUFDOzs7b0RBTS9CO0FBNEJEO0lBREMsV0FBVyxDQUFDLFdBQVcsQ0FBQzs7d0RBQ1E7QUFHakM7SUFEQyxXQUFXLENBQUMsZUFBZSxDQUFDOzt3REFDVDtBQUdwQjtJQURDLFdBQVcsQ0FBQyxTQUFTLENBQUM7OztzREFHdEI7QUFrQ0Q7SUFEQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7cURBYWpDO0FBOUhRLHNCQUFzQjtJQU5sQyxTQUFTLENBQUM7UUFDUCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtRQUMvQyxtQkFBbUIsRUFBRSxLQUFLO1FBQzFCLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IscTVCQUEyQztLQUM5QyxDQUFDO0lBNkZPLFdBQUEsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7cUNBUFYsa0JBQWtCO1FBQ1Asd0JBQXdCO1FBQ3ZDLGlCQUFpQjtRQUNWLFVBQVU7UUFDaEIsTUFBTTtRQUNRLG1CQUFtQjtRQUMxQixXQUFXO1FBQ3FCLGlCQUFpQjtHQTVGaEUsc0JBQXNCLENBNE5sQztTQTVOWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBEb0NoZWNrLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE5nWm9uZSxcbiAgICBPbkluaXQsXG4gICAgSW5qZWN0LFxuICAgIE9uRGVzdHJveSxcbiAgICBOZ01vZHVsZVJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2RhdGEtdXRpbCc7XG5pbXBvcnQgeyBTb3J0aW5nRGlyZWN0aW9uIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL3NvcnRpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JpZEJhc2VBUElTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4Q29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcbmltcG9ydCB7IElneEZpbHRlcmluZ1NlcnZpY2UgfSBmcm9tICcuLi9maWx0ZXJpbmcvZ3JpZC1maWx0ZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hHcmlkQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2dyaWQtYmFzZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi4vcmVzaXppbmcvcmVzaXppbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvb3ZlcmxheSc7XG5pbXBvcnQgeyBJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9ncmlkLmV4Y2VsLXN0eWxlLWZpbHRlcmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgT3ZlcmxheVNldHRpbmdzLCBQb3NpdGlvblNldHRpbmdzLCBWZXJ0aWNhbEFsaWdubWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvdXRpbGl0aWVzJztcbmltcG9ydCB7IEF1dG9Qb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb3ZlcmxheS9wb3NpdGlvbi9hdXRvLXBvc2l0aW9uLXN0cmF0ZWd5JztcbmltcG9ydCB7IHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmYWRlSW4sIGZhZGVPdXQgfSBmcm9tICcuLi8uLi9hbmltYXRpb25zL21haW4nO1xuaW1wb3J0IHsgQWJzb2x1dGVTY3JvbGxTdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvc2Nyb2xsL2Fic29sdXRlLXNjcm9sbC1zdHJhdGVneSc7XG5pbXBvcnQgeyBHcmlkVHlwZSB9IGZyb20gJy4uL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBzZWxlY3RvcjogJ2lneC1ncmlkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBfY29tcG9uZW50T3ZlcmxheUlkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3M6IFBvc2l0aW9uU2V0dGluZ3M7XG4gICAgcHJpdmF0ZSBfZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzO1xuICAgIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ3JpZElEOiBzdHJpbmc7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgICBnZXQgc3R5bGVDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDbGFzc2VzID0gW1xuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZncnLFxuICAgICAgICAgICAgdGhpcy5jb2x1bW4uaGVhZGVyQ2xhc3Nlc1xuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHtcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgnOiAhdGhpcy5jb2x1bW4uY29sdW1uR3JvdXAsXG4gICAgICAgICAgICAnYXNjJzogdGhpcy5hc2NlbmRpbmcsXG4gICAgICAgICAgICAnZGVzYyc6IHRoaXMuZGVzY2VuZGluZyxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLW51bWJlcic6IHRoaXMuY29sdW1uLmRhdGFUeXBlID09PSBEYXRhVHlwZS5OdW1iZXIsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1zb3J0YWJsZSc6IHRoaXMuY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tZmlsdHJhYmxlJzogdGhpcy5jb2x1bW4uZmlsdGVyYWJsZSAmJiB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1zb3J0ZWQnOiB0aGlzLnNvcnRlZFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qga2xhc3Mgb2YgT2JqZWN0LmtleXMoY2xhc3NMaXN0KSkge1xuICAgICAgICAgICAgaWYgKGNsYXNzTGlzdFtrbGFzc10pIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q2xhc3Nlcy5wdXNoKGtsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdENsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0LnJlbScpXG4gICAgZ2V0IGhlaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZC5oYXNDb2x1bW5Hcm91cHMpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5ncmlkLm1heExldmVsSGVhZGVyRGVwdGggKyAxIC0gdGhpcy5jb2x1bW4ubGV2ZWwpICogdGhpcy5ncmlkLmRlZmF1bHRSb3dIZWlnaHQgLyB0aGlzLmdyaWQuX2Jhc2VGb250U2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgYXNjZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYztcbiAgICB9XG5cbiAgICBnZXQgZGVzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5EZXNjO1xuICAgIH1cblxuICAgIGdldCBzb3J0aW5nSWNvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zb3J0RGlyZWN0aW9uICE9PSBTb3J0aW5nRGlyZWN0aW9uLk5vbmUpIHtcbiAgICAgICAgICAgIC8vIGFycm93X2Rvd253YXJkIGFuZCBhcnJvd191cHdhcmRcbiAgICAgICAgICAgIC8vIGFyZSBtYXRlcmlhbCBpY29ucyBsaWdhdHVyZSBzdHJpbmdzXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGlyZWN0aW9uID09PSBTb3J0aW5nRGlyZWN0aW9uLkFzYyA/ICdhcnJvd191cHdhcmQnIDogJ2Fycm93X2Rvd253YXJkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2Fycm93X3Vwd2FyZCc7XG4gICAgfVxuXG4gICAgZ2V0IHNvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiAhPT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJJY29uQ2xhc3NOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID8gJ2lneC1leGNlbC1maWx0ZXJfX2ljb24tLWZpbHRlcmVkJyA6ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGhvc3RSb2xlID0gJ2NvbHVtbmhlYWRlcic7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIGdldCBoZWFkZXJJRCgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuZ3JpZElEfV8ke3RoaXMuY29sdW1uLmZpZWxkfWA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNvcnREaXJlY3Rpb24gPSBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGdyaWRBUEk6IEdyaWRCYXNlQVBJU2VydmljZTxJZ3hHcmlkQmFzZURpcmVjdGl2ZSAmIEdyaWRUeXBlPixcbiAgICAgICAgcHVibGljIGNvbFJlc2l6aW5nU2VydmljZTogSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHB1YmxpYyB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgX2ZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgX21vZHVsZVJlZjogTmdNb2R1bGVSZWY8YW55PixcbiAgICAgICAgQEluamVjdChJZ3hPdmVybGF5U2VydmljZSkgcHJpdmF0ZSBfb3ZlcmxheVNlcnZpY2U6IElneE92ZXJsYXlTZXJ2aWNlXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RmlsdGVyaW5nU2V0dGluZ3MoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICB0aGlzLmdldFNvcnREaXJlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVNlcnZpY2UuaGlkZSh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb2xSZXNpemluZ1NlcnZpY2UuaXNDb2x1bW5SZXNpemluZykge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlckNvbXBsZXgodGhpcy5jb2x1bW4uZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbHVtbi5zb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbkZpbHRlcmluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUZpbHRlckRyb3Bkb3duKCk7XG4gICAgfVxuXG4gICAgZ2V0IGdyaWQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5ncmlkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTb3J0RGlyZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBleHByID0gdGhpcy5ncmlkQVBJLmdyaWQuc29ydGluZ0V4cHJlc3Npb25zLmZpbmQoKHgpID0+IHguZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCk7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IGV4cHIgPyBleHByLmRpciA6IFNvcnRpbmdEaXJlY3Rpb24uTm9uZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Tb3J0aW5nSWNvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyU29ydCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyU29ydCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBpbmdFeHByID0gdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMgP1xuICAgICAgICAgICAgdGhpcy5ncmlkLmdyb3VwaW5nRXhwcmVzc2lvbnMuZmluZCgoZXhwcikgPT4gZXhwci5maWVsZE5hbWUgPT09IHRoaXMuY29sdW1uLmZpZWxkKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHNvcnREaXIgPSBncm91cGluZ0V4cHIgP1xuICAgICAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uICsgMSA+IFNvcnRpbmdEaXJlY3Rpb24uRGVzYyA/IFNvcnRpbmdEaXJlY3Rpb24uQXNjIDogU29ydGluZ0RpcmVjdGlvbi5EZXNjXG4gICAgICAgICAgICA6IHRoaXMuc29ydERpcmVjdGlvbiArIDEgPiBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyBTb3J0aW5nRGlyZWN0aW9uLk5vbmUgOiB0aGlzLnNvcnREaXJlY3Rpb24gKyAxO1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBzb3J0RGlyO1xuICAgICAgICB0aGlzLmdyaWQuc29ydCh7IGZpZWxkTmFtZTogdGhpcy5jb2x1bW4uZmllbGQsIGRpcjogdGhpcy5zb3J0RGlyZWN0aW9uLCBpZ25vcmVDYXNlOiB0aGlzLmNvbHVtbi5zb3J0aW5nSWdub3JlQ2FzZSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiB0aGlzLmNvbHVtbi5zb3J0U3RyYXRlZ3kgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVGaWx0ZXJEcm9wZG93bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclRhcmdldCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgZmlsdGVySWNvblRhcmdldCA9IGhlYWRlclRhcmdldC5xdWVyeVNlbGVjdG9yKCcuJyArIHRoaXMuZmlsdGVySWNvbkNsYXNzTmFtZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MucG9zaXRpb25TdHJhdGVneS5zZXR0aW5ncy50YXJnZXQgPSBmaWx0ZXJJY29uVGFyZ2V0O1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLmdyaWQub3V0bGV0O1xuXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmF0dGFjaChJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudCwgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncywgdGhpcy5fbW9kdWxlUmVmKTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fY29tcG9uZW50T3ZlcmxheUlkLCB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbHRlcmluZ1NldHRpbmdzKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICAgICAgb3BlbkFuaW1hdGlvbjogdXNlQW5pbWF0aW9uKGZhZGVJbiwge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogJzI1MG1zJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2xvc2VBbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlT3V0LCB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAnMjAwbXMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogdHJ1ZSxcbiAgICAgICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBBdXRvUG9zaXRpb25TdHJhdGVneSh0aGlzLl9maWx0ZXJNZW51UG9zaXRpb25TZXR0aW5ncyksXG4gICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogbmV3IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3koKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9uT3BlbmluZy5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChvdmVybGF5KSA9PiBvdmVybGF5LmlkID09PSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKChldmVudEFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheU9wZW5pbmcoZXZlbnRBcmdzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLm9uQ2xvc2VkLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIob3ZlcmxheSA9PiBvdmVybGF5LmlkID09PSB0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUNsb3NlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk92ZXJsYXlPcGVuaW5nKGV2ZW50QXJncykge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGV2ZW50QXJncy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQ7XG4gICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuaW5pdGlhbGl6ZSh0aGlzLmNvbHVtbiwgdGhpcy5fb3ZlcmxheVNlcnZpY2UsIGV2ZW50QXJncy5pZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uT3ZlcmxheUNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkID0gbnVsbDtcbiAgICB9XG59XG4iXX0=