@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
305 lines • 37.5 kB
JavaScript
import { __decorate, __metadata, __param, __values } 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
*/
var IgxGridHeaderComponent = /** @class */ (function () {
function IgxGridHeaderComponent(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;
}
Object.defineProperty(IgxGridHeaderComponent.prototype, "styleClasses", {
get: function () {
var e_1, _a;
var defaultClasses = [
'igx-grid__th--fw',
this.column.headerClasses
];
var 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
};
try {
for (var _b = __values(Object.keys(classList)), _c = _b.next(); !_c.done; _c = _b.next()) {
var klass = _c.value;
if (classList[klass]) {
defaultClasses.push(klass);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return defaultClasses.join(' ');
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "height", {
get: function () {
if (this.grid.hasColumnGroups) {
return (this.grid.maxLevelHeaderDepth + 1 - this.column.level) * this.grid.defaultRowHeight / this.grid._baseFontSize;
}
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "ascending", {
get: function () {
return this.sortDirection === SortingDirection.Asc;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "descending", {
get: function () {
return this.sortDirection === SortingDirection.Desc;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "sortingIcon", {
get: function () {
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';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "sorted", {
get: function () {
return this.sortDirection !== SortingDirection.None;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "filterIconClassName", {
get: function () {
return this.column.filteringExpressionsTree ? 'igx-excel-filter__icon--filtered' : 'igx-excel-filter__icon';
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxGridHeaderComponent.prototype, "headerID", {
get: function () {
return this.gridID + "_" + this.column.field;
},
enumerable: true,
configurable: true
});
IgxGridHeaderComponent.prototype.ngOnInit = function () {
this.initFilteringSettings();
};
IgxGridHeaderComponent.prototype.ngDoCheck = function () {
this.getSortDirection();
this.cdr.markForCheck();
};
IgxGridHeaderComponent.prototype.ngOnDestroy = function () {
this._destroy$.next(true);
this._destroy$.complete();
if (this._componentOverlayId) {
this._overlayService.hide(this._componentOverlayId);
}
};
IgxGridHeaderComponent.prototype.onClick = function (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();
}
}
};
IgxGridHeaderComponent.prototype.onFilteringIconClick = function (event) {
event.stopPropagation();
this.toggleFilterDropdown();
};
Object.defineProperty(IgxGridHeaderComponent.prototype, "grid", {
get: function () {
return this.gridAPI.grid;
},
enumerable: true,
configurable: true
});
IgxGridHeaderComponent.prototype.getSortDirection = function () {
var _this = this;
var expr = this.gridAPI.grid.sortingExpressions.find(function (x) { return x.fieldName === _this.column.field; });
this.sortDirection = expr ? expr.dir : SortingDirection.None;
};
IgxGridHeaderComponent.prototype.onSortingIconClick = function (event) {
if (this.grid.filteringService.isFilterRowVisible) {
event.stopPropagation();
this.triggerSort();
}
};
IgxGridHeaderComponent.prototype.triggerSort = function () {
var _this = this;
var groupingExpr = this.grid.groupingExpressions ?
this.grid.groupingExpressions.find(function (expr) { return expr.fieldName === _this.column.field; }) : null;
var 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 });
};
IgxGridHeaderComponent.prototype.toggleFilterDropdown = function () {
if (!this._componentOverlayId) {
var headerTarget = this.elementRef.nativeElement;
var 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);
}
};
IgxGridHeaderComponent.prototype.initFilteringSettings = function () {
var _this = this;
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(function (overlay) { return overlay.id === _this._componentOverlayId; }), takeUntil(this._destroy$)).subscribe(function (eventArgs) {
_this.onOverlayOpening(eventArgs);
});
this._overlayService.onClosed.pipe(filter(function (overlay) { return overlay.id === _this._componentOverlayId; }), takeUntil(this._destroy$)).subscribe(function () {
_this.onOverlayClosed();
});
};
IgxGridHeaderComponent.prototype.onOverlayOpening = function (eventArgs) {
var instance = eventArgs.componentRef.instance;
if (instance) {
instance.initialize(this.column, this._overlayService, eventArgs.id);
}
};
IgxGridHeaderComponent.prototype.onOverlayClosed = function () {
this._componentOverlayId = null;
};
IgxGridHeaderComponent.ctorParameters = function () { return [
{ 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);
return IgxGridHeaderComponent;
}());
export { IgxGridHeaderComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkcy9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULE9BQU8sRUFDUCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDdEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDcEgsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVB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c0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25Jbml0LFxuICAgIEluamVjdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgTmdNb2R1bGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHsgU29ydGluZ0RpcmVjdGlvbiB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLWV4cHJlc3Npb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRCYXNlQVBJU2VydmljZSB9IGZyb20gJy4uL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7IElneENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hGaWx0ZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEJhc2VEaXJlY3RpdmUgfSBmcm9tICcuLi9ncmlkLWJhc2UuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneENvbHVtblJlc2l6aW5nU2VydmljZSB9IGZyb20gJy4uL3Jlc2l6aW5nL3Jlc2l6aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuLi9maWx0ZXJpbmcvZXhjZWwtc3R5bGUvZ3JpZC5leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IE92ZXJsYXlTZXR0aW5ncywgUG9zaXRpb25TZXR0aW5ncywgVmVydGljYWxBbGlnbm1lbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3V0aWxpdGllcyc7XG5pbXBvcnQgeyBBdXRvUG9zaXRpb25TdHJhdGVneSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vYXV0by1wb3NpdGlvbi1zdHJhdGVneSc7XG5pbXBvcnQgeyB1c2VBbmltYXRpb24gfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmFkZUluLCBmYWRlT3V0IH0gZnJvbSAnLi4vLi4vYW5pbWF0aW9ucy9tYWluJztcbmltcG9ydCB7IEFic29sdXRlU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5L3Njcm9sbC9hYnNvbHV0ZS1zY3JvbGwtc3RyYXRlZ3knO1xuaW1wb3J0IHsgR3JpZFR5cGUgfSBmcm9tICcuLi9jb21tb24vZ3JpZC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gICAgc2VsZWN0b3I6ICdpZ3gtZ3JpZC1oZWFkZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ncmlkLWhlYWRlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4R3JpZEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHByaXZhdGUgX2NvbXBvbmVudE92ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZpbHRlck1lbnVQb3NpdGlvblNldHRpbmdzOiBQb3NpdGlvblNldHRpbmdzO1xuICAgIHByaXZhdGUgX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncztcbiAgICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2x1bW46IElneENvbHVtbkNvbXBvbmVudDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdyaWRJRDogc3RyaW5nO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gICAgZ2V0IHN0eWxlQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkZWZhdWx0Q2xhc3NlcyA9IFtcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLWZ3JyxcbiAgICAgICAgICAgIHRoaXMuY29sdW1uLmhlYWRlckNsYXNzZXNcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB7XG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoJzogIXRoaXMuY29sdW1uLmNvbHVtbkdyb3VwLFxuICAgICAgICAgICAgJ2FzYyc6IHRoaXMuYXNjZW5kaW5nLFxuICAgICAgICAgICAgJ2Rlc2MnOiB0aGlzLmRlc2NlbmRpbmcsXG4gICAgICAgICAgICAnaWd4LWdyaWRfX3RoLS1udW1iZXInOiB0aGlzLmNvbHVtbi5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuTnVtYmVyLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tc29ydGFibGUnOiB0aGlzLmNvbHVtbi5zb3J0YWJsZSxcbiAgICAgICAgICAgICdpZ3gtZ3JpZF9fdGgtLWZpbHRyYWJsZSc6IHRoaXMuY29sdW1uLmZpbHRlcmFibGUgJiYgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlLFxuICAgICAgICAgICAgJ2lneC1ncmlkX190aC0tc29ydGVkJzogdGhpcy5zb3J0ZWRcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtsYXNzIG9mIE9iamVjdC5rZXlzKGNsYXNzTGlzdCkpIHtcbiAgICAgICAgICAgIGlmIChjbGFzc0xpc3Rba2xhc3NdKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdENsYXNzZXMucHVzaChrbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodC5yZW0nKVxuICAgIGdldCBoZWlnaHQoKSB7XG4gICAgICAgIGlmICh0aGlzLmdyaWQuaGFzQ29sdW1uR3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZ3JpZC5tYXhMZXZlbEhlYWRlckRlcHRoICsgMSAtIHRoaXMuY29sdW1uLmxldmVsKSAqIHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0IC8gdGhpcy5ncmlkLl9iYXNlRm9udFNpemU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0IGFzY2VuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5Bc2M7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb24gPT09IFNvcnRpbmdEaXJlY3Rpb24uRGVzYztcbiAgICB9XG5cbiAgICBnZXQgc29ydGluZ0ljb24oKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbiAhPT0gU29ydGluZ0RpcmVjdGlvbi5Ob25lKSB7XG4gICAgICAgICAgICAvLyBhcnJvd19kb3dud2FyZCBhbmQgYXJyb3dfdXB3YXJkXG4gICAgICAgICAgICAvLyBhcmUgbWF0ZXJpYWwgaWNvbnMgbGlnYXR1cmUgc3RyaW5nc1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ydERpcmVjdGlvbiA9PT0gU29ydGluZ0RpcmVjdGlvbi5Bc2MgPyAnYXJyb3dfdXB3YXJkJyA6ICdhcnJvd19kb3dud2FyZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdhcnJvd191cHdhcmQnO1xuICAgIH1cblxuICAgIGdldCBzb3J0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb24gIT09IFNvcnRpbmdEaXJlY3Rpb24uTm9uZTtcbiAgICB9XG5cbiAgICBnZXQgZmlsdGVySWNvbkNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uLmZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA/ICdpZ3gtZXhjZWwtZmlsdGVyX19pY29uLS1maWx0ZXJlZCcgOiAnaWd4LWV4Y2VsLWZpbHRlcl9faWNvbic7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyBob3N0Um9sZSA9ICdjb2x1bW5oZWFkZXInO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBnZXQgaGVhZGVySUQoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmdyaWRJRH1fJHt0aGlzLmNvbHVtbi5maWVsZH1gO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzb3J0RGlyZWN0aW9uID0gU29ydGluZ0RpcmVjdGlvbi5Ob25lO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBncmlkQVBJOiBHcmlkQmFzZUFQSVNlcnZpY2U8SWd4R3JpZEJhc2VEaXJlY3RpdmUgJiBHcmlkVHlwZT4sXG4gICAgICAgIHB1YmxpYyBjb2xSZXNpemluZ1NlcnZpY2U6IElneENvbHVtblJlc2l6aW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwdWJsaWMgem9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIF9maWx0ZXJpbmdTZXJ2aWNlOiBJZ3hGaWx0ZXJpbmdTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9tb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT4sXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByaXZhdGUgX292ZXJsYXlTZXJ2aWNlOiBJZ3hPdmVybGF5U2VydmljZVxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdEZpbHRlcmluZ1NldHRpbmdzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICAgICAgdGhpcy5nZXRTb3J0RGlyZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlTZXJ2aWNlLmhpZGUodGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuY29sUmVzaXppbmdTZXJ2aWNlLmlzQ29sdW1uUmVzaXppbmcpIHtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyUm93VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbHVtbi5maWx0ZXJhYmxlICYmICF0aGlzLmNvbHVtbi5jb2x1bW5Hcm91cCAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJDb21wbGV4KHRoaXMuY29sdW1uLmZpZWxkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IHRoaXMuY29sdW1uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2x1bW4uc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJTb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25GaWx0ZXJpbmdJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy50b2dnbGVGaWx0ZXJEcm9wZG93bigpO1xuICAgIH1cblxuICAgIGdldCBncmlkKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuZ3JpZDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U29ydERpcmVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IHRoaXMuZ3JpZEFQSS5ncmlkLnNvcnRpbmdFeHByZXNzaW9ucy5maW5kKCh4KSA9PiB4LmZpZWxkTmFtZSA9PT0gdGhpcy5jb2x1bW4uZmllbGQpO1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSBleHByID8gZXhwci5kaXIgOiBTb3J0aW5nRGlyZWN0aW9uLk5vbmU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uU29ydGluZ0ljb25DbGljayhldmVudCkge1xuICAgICAgICBpZiAodGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclNvcnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlclNvcnQoKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwaW5nRXhwciA9IHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zID9cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5ncm91cGluZ0V4cHJlc3Npb25zLmZpbmQoKGV4cHIpID0+IGV4cHIuZmllbGROYW1lID09PSB0aGlzLmNvbHVtbi5maWVsZCkgOiBudWxsO1xuICAgICAgICBjb25zdCBzb3J0RGlyID0gZ3JvdXBpbmdFeHByID9cbiAgICAgICAgICAgIHRoaXMuc29ydERpcmVjdGlvbiArIDEgPiBTb3J0aW5nRGlyZWN0aW9uLkRlc2MgPyBTb3J0aW5nRGlyZWN0aW9uLkFzYyA6IFNvcnRpbmdEaXJlY3Rpb24uRGVzY1xuICAgICAgICAgICAgOiB0aGlzLnNvcnREaXJlY3Rpb24gKyAxID4gU29ydGluZ0RpcmVjdGlvbi5EZXNjID8gU29ydGluZ0RpcmVjdGlvbi5Ob25lIDogdGhpcy5zb3J0RGlyZWN0aW9uICsgMTtcbiAgICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydERpcjtcbiAgICAgICAgdGhpcy5ncmlkLnNvcnQoeyBmaWVsZE5hbWU6IHRoaXMuY29sdW1uLmZpZWxkLCBkaXI6IHRoaXMuc29ydERpcmVjdGlvbiwgaWdub3JlQ2FzZTogdGhpcy5jb2x1bW4uc29ydGluZ0lnbm9yZUNhc2UsXG4gICAgICAgICAgICBzdHJhdGVneTogdGhpcy5jb2x1bW4uc29ydFN0cmF0ZWd5IH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlRmlsdGVyRHJvcGRvd24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJUYXJnZXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlckljb25UYXJnZXQgPSBoZWFkZXJUYXJnZXQucXVlcnlTZWxlY3RvcignLicgKyB0aGlzLmZpbHRlckljb25DbGFzc05hbWUpO1xuXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJNZW51T3ZlcmxheVNldHRpbmdzLnBvc2l0aW9uU3RyYXRlZ3kuc2V0dGluZ3MudGFyZ2V0ID0gZmlsdGVySWNvblRhcmdldDtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5ncmlkLm91dGxldDtcblxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkID1cbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5hdHRhY2goSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQsIHRoaXMuX2ZpbHRlck1lbnVPdmVybGF5U2V0dGluZ3MsIHRoaXMuX21vZHVsZVJlZik7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5zaG93KHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCwgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRGaWx0ZXJpbmdTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MgPSB7XG4gICAgICAgICAgICB2ZXJ0aWNhbFN0YXJ0UG9pbnQ6IFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSxcbiAgICAgICAgICAgIG9wZW5BbmltYXRpb246IHVzZUFuaW1hdGlvbihmYWRlSW4sIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246ICcyNTBtcydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNsb3NlQW5pbWF0aW9uOiB1c2VBbmltYXRpb24oZmFkZU91dCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogJzIwMG1zJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyTWVudU92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICBtb2RhbDogZmFsc2UsXG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQXV0b1Bvc2l0aW9uU3RyYXRlZ3kodGhpcy5fZmlsdGVyTWVudVBvc2l0aW9uU2V0dGluZ3MpLFxuICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KClcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vbk9wZW5pbmcucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigob3ZlcmxheSkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoZXZlbnRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlPcGVuaW5nKGV2ZW50QXJncyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9vdmVybGF5U2VydmljZS5vbkNsb3NlZC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKG92ZXJsYXkgPT4gb3ZlcmxheS5pZCA9PT0gdGhpcy5fY29tcG9uZW50T3ZlcmxheUlkKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk92ZXJsYXlDbG9zZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25PdmVybGF5T3BlbmluZyhldmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBldmVudEFyZ3MuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50O1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmluaXRpYWxpemUodGhpcy5jb2x1bW4sIHRoaXMuX292ZXJsYXlTZXJ2aWNlLCBldmVudEFyZ3MuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk92ZXJsYXlDbG9zZWQoKSB7XG4gICAgICAgIHRoaXMuX2NvbXBvbmVudE92ZXJsYXlJZCA9IG51bGw7XG4gICAgfVxufVxuIl19