@paddls/ngx-easy-table
Version:
Angular easy table
150 lines • 48.6 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
import { Event } from '../..';
import { StyleService } from '../../services/style.service';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import * as i0 from "@angular/core";
import * as i1 from "../../services/style.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/drag-drop";
import * as i4 from "../header/header.component";
export class TableTHeadComponent {
constructor(styleService) {
this.styleService = styleService;
this.filter = new EventEmitter();
this.order = new EventEmitter();
this.selectAll = new EventEmitter();
this.event = new EventEmitter();
this.menuActive = false;
this.openedHeaderActionTemplate = null;
this.onSelectAllBinded = this.onSelectAll.bind(this);
}
get arrowDefinition() {
return this.config.showDetailsArrow || typeof this.config.showDetailsArrow === 'undefined';
}
onClick(targetElement) {
if (this.additionalActionMenu &&
!this.additionalActionMenu.nativeElement.contains(targetElement)) {
this.menuActive = false;
}
// if click outside the header then close opened Header Action Template
if (this.openedHeaderActionTemplate &&
// if no header have the clicked point
!this.headerDropdown.toArray().some((ref) => ref.nativeElement.contains(targetElement))) {
this.openedHeaderActionTemplate = null;
}
}
getColumnDefinition(column) {
return column.searchEnabled || typeof column.searchEnabled === 'undefined';
}
orderBy(column) {
this.order.emit(column);
}
isOrderEnabled(column) {
const columnOrderEnabled = column.orderEnabled === undefined ? true : column.orderEnabled;
return this.config.orderEnabled && columnOrderEnabled;
}
columnDrop(event) {
moveItemInArray(this.columns, event.previousIndex, event.currentIndex);
}
onSearch($event) {
this.filter.emit($event);
}
getColumnWidth(column) {
if (column.width) {
return column.width;
}
return this.config.fixedColumnWidth ? 100 / this.columns.length + '%' : null;
}
onSelectAll() {
this.selectAll.emit();
}
onMouseDown(event, th) {
if (!this.config.resizeColumn) {
return;
}
this.th = th;
this.startOffset = th.offsetWidth - event.pageX;
this.event.emit({
event: Event.onColumnResizeMouseDown,
value: event,
});
}
onMouseMove(event) {
if (!this.config.resizeColumn) {
return;
}
if (this.th && this.th.style) {
this.th.style.width = this.startOffset + event.pageX + 'px';
this.th.style.cursor = 'col-resize';
this.th.style['user-select'] = 'none';
}
}
onMouseUp(event) {
if (!this.config.resizeColumn) {
return;
}
this.event.emit({
event: Event.onColumnResizeMouseUp,
value: event,
});
this.th.style.cursor = 'default';
this.th = undefined;
}
showHeaderActionTemplateMenu(column) {
if (!column.headerActionTemplate) {
console.error('Column [headerActionTemplate] property not defined');
}
if (this.openedHeaderActionTemplate === column.key) {
this.openedHeaderActionTemplate = null;
return;
}
this.openedHeaderActionTemplate = column.key;
}
showMenu() {
if (!this.additionalActionsTemplate) {
console.error('[additionalActionsTemplate] property not defined');
}
this.menuActive = !this.menuActive;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableTHeadComponent, deps: [{ token: i1.StyleService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TableTHeadComponent, selector: "[lib-thead]", inputs: { config: "config", columns: "columns", sortKey: "sortKey", sortState: "sortState", selectAllTemplate: "selectAllTemplate", filtersTemplate: "filtersTemplate", additionalActionsTemplate: "additionalActionsTemplate" }, outputs: { filter: "filter", order: "order", selectAll: "selectAll", event: "event" }, host: { listeners: { "document:click": "onClick($event.target)" } }, providers: [StyleService], viewQueries: [{ propertyName: "th", first: true, predicate: ["th"], descendants: true }, { propertyName: "additionalActionMenu", first: true, predicate: ["additionalActionMenu"], descendants: true }, { propertyName: "headerDropdown", predicate: ["headerDropdown"], descendants: true }], ngImport: i0, template: "<tr *ngIf=\"config.headerEnabled && !config.columnReorder\"\n class=\"ngx-table__header\">\n <th *ngIf=\"config.checkboxes || config.radio\"\n [style.width]=\"'3%'\">\n <ng-container *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n [ngTemplateOutlet]=\"selectAllTemplate\">\n </ng-container>\n <label *ngIf=\"!selectAllTemplate && config.checkboxes\"\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\">\n <input (change)=\"onSelectAll()\"\n id=\"selectAllCheckboxes\"\n type=\"checkbox\"/>\n <em class=\"ngx-form-icon\"\n id=\"selectAllCheckbox\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th #th\n (mousedown)=\"onMouseDown($event, th)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n [style.width]=\"getColumnWidth(column)\"\n class=\"ngx-table__header-cell\">\n <div (click)=\"orderBy(column)\"\n [class.pointer]=\"isOrderEnabled(column)\"\n style=\"display: inline\">\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em *ngIf=\"column.pinned\"\n class=\"ngx-icon ngx-icon-pin\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div #headerDropdown\n *ngIf=\"!!column.headerActionTemplate\"\n class=\"ngx-dropdown\">\n <a (click)=\"showHeaderActionTemplateMenu(column)\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div *ngIf=\"column.key === openedHeaderActionTemplate\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"config.resizeColumn && !last\"\n class=\"ngx-table__column-resizer\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"\n config.additionalActions ||\n (config.detailsTemplate && arrowDefinition) ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\">\n <div #additionalActionMenu\n *ngIf=\"config.additionalActions\"\n class=\"ngx-dropdown\">\n <a (click)=\"showMenu()\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul *ngIf=\"menuActive\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr (cdkDropListDropped)=\"columnDrop($event)\"\n *ngIf=\"config.headerEnabled && config.columnReorder\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n class=\"ngx-table__header ngx-table__header--draggable\">\n <th *ngIf=\"config.checkboxes || config.radio\"\n [style.width]=\"'3%'\">\n <ng-container *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n [ngTemplateOutlet]=\"selectAllTemplate\">\n </ng-container>\n <label *ngIf=\"!selectAllTemplate && config.checkboxes\"\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\">\n <input (change)=\"onSelectAll()\"\n id=\"selectAllCheckboxesDrag\"\n type=\"checkbox\"/>\n <em class=\"ngx-form-icon\"\n id=\"selectAllCheckboxDrag\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th #th\n (mousedown)=\"onMouseDown($event, th)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n [style.width]=\"getColumnWidth(column)\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\">\n <div (click)=\"orderBy(column)\"\n [class.pointer]=\"isOrderEnabled(column)\"\n cdkDragHandle\n style=\"display: inline\">\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em *ngIf=\"column.pinned\"\n class=\"ngx-icon ngx-icon-pin\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div #headerDropdown\n *ngIf=\"!!column.headerActionTemplate\"\n class=\"ngx-dropdown\">\n <a (click)=\"showHeaderActionTemplateMenu(column)\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div *ngIf=\"column.key === openedHeaderActionTemplate\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"config.resizeColumn && !last\"\n class=\"ngx-table__column-resizer\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"\n config.additionalActions ||\n (config.detailsTemplate && arrowDefinition) ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\">\n <div #additionalActionMenu\n *ngIf=\"config.additionalActions\"\n class=\"ngx-dropdown\">\n <a (click)=\"showMenu()\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul *ngIf=\"menuActive\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr *ngIf=\"config.searchEnabled && !filtersTemplate\"\n class=\"ngx-table__sort-header\">\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\n <th [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\">\n <lib-header (update)=\"onSearch($event)\"\n *ngIf=\"getColumnDefinition(column)\"\n [column]=\"column\">\n </lib-header>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || (config.detailsTemplate && arrowDefinition)\"></th>\n</tr>\n<ng-container *ngIf=\"filtersTemplate\">\n <tr>\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"></ng-container>\n </tr>\n</ng-container>\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i4.HeaderComponent, selector: "lib-header", inputs: ["column"], outputs: ["update"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TableTHeadComponent, decorators: [{
type: Component,
args: [{ selector: '[lib-thead]', changeDetection: ChangeDetectionStrategy.OnPush, providers: [StyleService], template: "<tr *ngIf=\"config.headerEnabled && !config.columnReorder\"\n class=\"ngx-table__header\">\n <th *ngIf=\"config.checkboxes || config.radio\"\n [style.width]=\"'3%'\">\n <ng-container *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n [ngTemplateOutlet]=\"selectAllTemplate\">\n </ng-container>\n <label *ngIf=\"!selectAllTemplate && config.checkboxes\"\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\">\n <input (change)=\"onSelectAll()\"\n id=\"selectAllCheckboxes\"\n type=\"checkbox\"/>\n <em class=\"ngx-form-icon\"\n id=\"selectAllCheckbox\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th #th\n (mousedown)=\"onMouseDown($event, th)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n [style.width]=\"getColumnWidth(column)\"\n class=\"ngx-table__header-cell\">\n <div (click)=\"orderBy(column)\"\n [class.pointer]=\"isOrderEnabled(column)\"\n style=\"display: inline\">\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em *ngIf=\"column.pinned\"\n class=\"ngx-icon ngx-icon-pin\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div #headerDropdown\n *ngIf=\"!!column.headerActionTemplate\"\n class=\"ngx-dropdown\">\n <a (click)=\"showHeaderActionTemplateMenu(column)\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div *ngIf=\"column.key === openedHeaderActionTemplate\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"config.resizeColumn && !last\"\n class=\"ngx-table__column-resizer\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"\n config.additionalActions ||\n (config.detailsTemplate && arrowDefinition) ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\">\n <div #additionalActionMenu\n *ngIf=\"config.additionalActions\"\n class=\"ngx-dropdown\">\n <a (click)=\"showMenu()\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul *ngIf=\"menuActive\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr (cdkDropListDropped)=\"columnDrop($event)\"\n *ngIf=\"config.headerEnabled && config.columnReorder\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n class=\"ngx-table__header ngx-table__header--draggable\">\n <th *ngIf=\"config.checkboxes || config.radio\"\n [style.width]=\"'3%'\">\n <ng-container *ngIf=\"selectAllTemplate && config.checkboxes\"\n [ngTemplateOutletContext]=\"{ $implicit: onSelectAllBinded }\"\n [ngTemplateOutlet]=\"selectAllTemplate\">\n </ng-container>\n <label *ngIf=\"!selectAllTemplate && config.checkboxes\"\n class=\"ngx-form-checkbox\"\n for=\"selectAllCheckboxes\">\n <input (change)=\"onSelectAll()\"\n id=\"selectAllCheckboxesDrag\"\n type=\"checkbox\"/>\n <em class=\"ngx-form-icon\"\n id=\"selectAllCheckboxDrag\"></em>\n </label>\n </th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index; let last = last\">\n <th #th\n (mousedown)=\"onMouseDown($event, th)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n [cdkDragStartDelay]=\"config.reorderDelay || 0\"\n [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\"\n [style.width]=\"getColumnWidth(column)\"\n cdkDrag\n cdkDragLockAxis=\"x\"\n class=\"ngx-table__header-cell ngx-table__header-cell--draggable\">\n <div (click)=\"orderBy(column)\"\n [class.pointer]=\"isOrderEnabled(column)\"\n cdkDragHandle\n style=\"display: inline\">\n <div class=\"ngx-table__header-title\">\n {{ column.title }}<span> </span>\n <em *ngIf=\"column.pinned\"\n class=\"ngx-icon ngx-icon-pin\"></em>\n <div [style.display]=\"config.orderEnabled ? 'inline' : 'none'\">\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'asc'\"\n class=\"ngx-icon ngx-icon-arrow-up\">\n </em>\n <em *ngIf=\"sortKey === column.key && this.sortState.get(sortKey) === 'desc'\"\n class=\"ngx-icon ngx-icon-arrow-down\">\n </em>\n </div>\n </div>\n </div>\n <div #headerDropdown\n *ngIf=\"!!column.headerActionTemplate\"\n class=\"ngx-dropdown\">\n <a (click)=\"showHeaderActionTemplateMenu(column)\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-more\"></span>\n </a>\n <div *ngIf=\"column.key === openedHeaderActionTemplate\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container [ngTemplateOutlet]=\"column.headerActionTemplate\"></ng-container>\n </div>\n </div>\n <div *ngIf=\"config.resizeColumn && !last\"\n class=\"ngx-table__column-resizer\"></div>\n </th>\n </ng-container>\n <th *ngIf=\"\n config.additionalActions ||\n (config.detailsTemplate && arrowDefinition) ||\n config.collapseAllRows ||\n config.groupRows\n \"\n class=\"ngx-table__header-cell-additional-actions\">\n <div #additionalActionMenu\n *ngIf=\"config.additionalActions\"\n class=\"ngx-dropdown\">\n <a (click)=\"showMenu()\"\n class=\"ngx-btn ngx-btn-link\">\n <span class=\"ngx-icon ngx-icon-menu\"></span>\n </a>\n <ul *ngIf=\"menuActive\"\n class=\"ngx-menu ngx-table__table-menu\">\n <ng-container *ngIf=\"additionalActionsTemplate\"\n [ngTemplateOutlet]=\"additionalActionsTemplate\">\n </ng-container>\n </ul>\n </div>\n </th>\n</tr>\n<tr *ngIf=\"config.searchEnabled && !filtersTemplate\"\n class=\"ngx-table__sort-header\">\n <th *ngIf=\"config.checkboxes || config.radio\"></th>\n <ng-container *ngFor=\"let column of columns; let colIndex = index\">\n <th [class.pinned-left]=\"column.pinned\"\n [ngClass]=\"column.cssClass && column.cssClass.includeHeader ? column.cssClass.name : ''\"\n [style.left]=\"styleService.pinnedWidth(column.pinned, colIndex)\">\n <lib-header (update)=\"onSearch($event)\"\n *ngIf=\"getColumnDefinition(column)\"\n [column]=\"column\">\n </lib-header>\n </th>\n </ng-container>\n <th *ngIf=\"config.additionalActions || (config.detailsTemplate && arrowDefinition)\"></th>\n</tr>\n<ng-container *ngIf=\"filtersTemplate\">\n <tr>\n <ng-container [ngTemplateOutlet]=\"filtersTemplate\"></ng-container>\n </tr>\n</ng-container>\n", styles: [".cdk-drag-preview{text-align:left;padding-top:9px;padding-left:4px;color:#50596c;border:1px solid #e7e9ed}\n"] }]
}], ctorParameters: function () { return [{ type: i1.StyleService }]; }, propDecorators: { config: [{
type: Input
}], columns: [{
type: Input
}], sortKey: [{
type: Input
}], sortState: [{
type: Input
}], selectAllTemplate: [{
type: Input
}], filtersTemplate: [{
type: Input
}], additionalActionsTemplate: [{
type: Input
}], filter: [{
type: Output
}], order: [{
type: Output
}], selectAll: [{
type: Output
}], event: [{
type: Output
}], th: [{
type: ViewChild,
args: ['th']
}], headerDropdown: [{
type: ViewChildren,
args: ['headerDropdown']
}], additionalActionMenu: [{
type: ViewChild,
args: ['additionalActionMenu']
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVhc3ktdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RoZWFkL3RoZWFkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy90aGVhZC90aGVhZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW1CLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFvQnRFLE1BQU0sT0FBTyxtQkFBbUI7SUFvRDlCLFlBQW1DLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBNUI3QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXlDLENBQUM7UUFHbkUsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFHcEMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFHckMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBRW5FLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsK0JBQTBCLEdBQWtCLElBQUksQ0FBQztRQUlqRCxzQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQVl2RCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1B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QVUsQ0FBQztJQUNyQyxDQUFDOzhHQWpLVSxtQkFBbUI7a0dBQW5CLG1CQUFtQixvYUFGbkIsQ0FBQyxZQUFZLENBQUMseVRDL0IzQiwwbVFBbU1BOzsyRkRsS2EsbUJBQW1CO2tCQWxCL0IsU0FBUzsrQkFFRSxhQUFhLG1CQWFOLHVCQUF1QixDQUFDLE1BQU0sYUFDcEMsQ0FBQyxZQUFZLENBQUM7bUdBS2xCLE1BQU07c0JBRFosS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLFNBQVM7c0JBRGYsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsZUFBZTtzQkFEckIsS0FBSztnQkFJQyx5QkFBeUI7c0JBRC9CLEtBQUs7Z0JBSVUsTUFBTTtzQkFEckIsTUFBTTtnQkFJUyxLQUFLO3NCQURwQixNQUFNO2dCQUlTLFNBQVM7c0JBRHhCLE1BQU07Z0JBSVMsS0FBSztzQkFEcEIsTUFBTTtnQkFZQyxFQUFFO3NCQURULFNBQVM7dUJBQUMsSUFBSTtnQkFJUCxjQUFjO3NCQURyQixZQUFZO3VCQUFDLGdCQUFnQjtnQkFJdEIsb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQjtnQkFXMUIsT0FBTztzQkFEYixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2x1bW5zLCBDb25maWcsIEV2ZW50IH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgU3R5bGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3R5bGUuc2VydmljZSc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tsaWItdGhlYWRdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RoZWFkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgICAuY2RrLWRyYWctcHJldmlldyB7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IDlweDtcbiAgICAgICAgICAgIHBhZGRpbmctbGVmdDogNHB4O1xuICAgICAgICAgICAgY29sb3I6ICM1MDU5NmM7XG4gICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlOWVkO1xuICAgICAgICB9XG4gICAgYCxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1N0eWxlU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlVEhlYWRDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maWc6IENvbmZpZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29sdW1uczogQ29sdW1uc1tdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0S2V5OiBzdHJpbmcgfCBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzb3J0U3RhdGU6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNlbGVjdEFsbFRlbXBsYXRlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmaWx0ZXJzVGVtcGxhdGU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+PigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgb3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbnM+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RBbGwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogc3RyaW5nOyB2YWx1ZTogYW55IH0+KCk7XG5cbiAgcHVibGljIG1lbnVBY3RpdmUgPSBmYWxzZTtcblxuICBwdWJsaWMgb3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBzdGFydE9mZnNldDtcblxuICBwdWJsaWMgb25TZWxlY3RBbGxCaW5kZWQgPSB0aGlzLm9uU2VsZWN0QWxsLmJpbmQodGhpcyk7XG5cbiAgQFZpZXdDaGlsZCgndGgnKVxuICBwcml2YXRlIHRoOiBhbnk7XG5cbiAgQFZpZXdDaGlsZHJlbignaGVhZGVyRHJvcGRvd24nKVxuICBwcml2YXRlIGhlYWRlckRyb3Bkb3duOiBhbnk7XG5cbiAgQFZpZXdDaGlsZCgnYWRkaXRpb25hbEFjdGlvbk1lbnUnKVxuICBwcml2YXRlIGFkZGl0aW9uYWxBY3Rpb25NZW51OiBhbnk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzdHlsZVNlcnZpY2U6IFN0eWxlU2VydmljZSkge1xuICB9XG5cbiAgcHVibGljIGdldCBhcnJvd0RlZmluaXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNob3dEZXRhaWxzQXJyb3cgfHwgdHlwZW9mIHRoaXMuY29uZmlnLnNob3dEZXRhaWxzQXJyb3cgPT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudC50YXJnZXQnXSlcbiAgcHVibGljIG9uQ2xpY2sodGFyZ2V0RWxlbWVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5hZGRpdGlvbmFsQWN0aW9uTWVudSAmJlxuICAgICAgIXRoaXMuYWRkaXRpb25hbEFjdGlvbk1lbnUubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KVxuICAgICkge1xuICAgICAgdGhpcy5tZW51QWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgY2xpY2sgb3V0c2lkZSB0aGUgaGVhZGVyIHRoZW4gY2xvc2Ugb3BlbmVkIEhlYWRlciBBY3Rpb24gVGVtcGxhdGVcbiAgICBpZiAoXG4gICAgICB0aGlzLm9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlICYmXG4gICAgICAvLyBpZiBubyBoZWFkZXIgaGF2ZSB0aGUgY2xpY2tlZCBwb2ludFxuICAgICAgIXRoaXMuaGVhZGVyRHJvcGRvd24udG9BcnJheSgpLnNvbWUoKHJlZikgPT4gcmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudCkpXG4gICAgKSB7XG4gICAgICB0aGlzLm9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbjogQ29sdW1ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW4uc2VhcmNoRW5hYmxlZCB8fCB0eXBlb2YgY29sdW1uLnNlYXJjaEVuYWJsZWQgPT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgb3JkZXJCeShjb2x1bW46IENvbHVtbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9yZGVyLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIGlzT3JkZXJFbmFibGVkKGNvbHVtbjogQ29sdW1ucyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbHVtbk9yZGVyRW5hYmxlZCA9IGNvbHVtbi5vcmRlckVuYWJsZWQgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBjb2x1bW4ub3JkZXJFbmFibGVkO1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5vcmRlckVuYWJsZWQgJiYgY29sdW1uT3JkZXJFbmFibGVkO1xuICB9XG5cbiAgY29sdW1uRHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8c3RyaW5nW10+KTogdm9pZCB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuY29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgfVxuXG4gIG9uU2VhcmNoKCRldmVudDogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9Pik6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyLmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIGdldENvbHVtbldpZHRoKGNvbHVtbjogYW55KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKGNvbHVtbi53aWR0aCkge1xuICAgICAgcmV0dXJuIGNvbHVtbi53aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmZpeGVkQ29sdW1uV2lkdGggPyAxMDAgLyB0aGlzLmNvbHVtbnMubGVuZ3RoICsgJyUnIDogbnVsbDtcbiAgfVxuXG4gIG9uU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0QWxsLmVtaXQoKTtcbiAgfVxuXG4gIG9uTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCB0aDogSFRNTFRhYmxlQ2VsbEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnJlc2l6ZUNvbHVtbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRoID0gdGg7XG4gICAgdGhpcy5zdGFydE9mZnNldCA9IHRoLm9mZnNldFdpZHRoIC0gZXZlbnQucGFnZVg7XG4gICAgdGhpcy5ldmVudC5lbWl0KHtcbiAgICAgIGV2ZW50OiBFdmVudC5vbkNvbHVtblJlc2l6ZU1vdXNlRG93bixcbiAgICAgIHZhbHVlOiBldmVudCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5yZXNpemVDb2x1bW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudGggJiYgdGhpcy50aC5zdHlsZSkge1xuICAgICAgdGhpcy50aC5zdHlsZS53aWR0aCA9IHRoaXMuc3RhcnRPZmZzZXQgKyBldmVudC5wYWdlWCArICdweCc7XG4gICAgICB0aGlzLnRoLnN0eWxlLmN1cnNvciA9ICdjb2wtcmVzaXplJztcbiAgICAgIHRoaXMudGguc3R5bGVbJ3VzZXItc2VsZWN0J10gPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5yZXNpemVDb2x1bW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudC5lbWl0KHtcbiAgICAgIGV2ZW50OiBFdmVudC5vbkNvbHVtblJlc2l6ZU1vdXNlVXAsXG4gICAgICB2YWx1ZTogZXZlbnQsXG4gICAgfSk7XG4gICAgdGhpcy50aC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy50aCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uOiBDb2x1bW5zKTogdm9pZCB7XG4gICAgaWYgKCFjb2x1bW4uaGVhZGVyQWN0aW9uVGVtcGxhdGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvbHVtbiBbaGVhZGVyQWN0aW9uVGVtcGxhdGVdIHByb3BlcnR5IG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlID09PSBjb2x1bW4ua2V5KSB7XG4gICAgICB0aGlzLm9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vcGVuZWRIZWFkZXJBY3Rpb25UZW1wbGF0ZSA9IGNvbHVtbi5rZXk7XG4gIH1cblxuICBzaG93TWVudSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWRkaXRpb25hbEFjdGlvbnNUZW1wbGF0ZSkge1xuICAgICAgY29uc29sZS5lcnJvcignW2FkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGVdIHByb3BlcnR5IG5vdCBkZWZpbmVkJyk7XG4gICAgfVxuICAgIHRoaXMubWVudUFjdGl2ZSA9ICF0aGlzLm1lbnVBY3RpdmU7XG4gIH1cbn1cbiIsIjx0ciAqbmdJZj1cImNvbmZpZy5oZWFkZXJFbmFibGVkICYmICFjb25maWcuY29sdW1uUmVvcmRlclwiXG4gICAgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlclwiPlxuICA8dGggKm5nSWY9XCJjb25maWcuY2hlY2tib3hlcyB8fCBjb25maWcucmFkaW9cIlxuICAgICAgW3N0eWxlLndpZHRoXT1cIiczJSdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0QWxsVGVtcGxhdGUgJiYgY29uZmlnLmNoZWNrYm94ZXNcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBvblNlbGVjdEFsbEJpbmRlZCB9XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdEFsbFRlbXBsYXRlXCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGxhYmVsICpuZ0lmPVwiIXNlbGVjdEFsbFRlbXBsYXRlICYmIGNvbmZpZy5jaGVja2JveGVzXCJcbiAgICAgICAgICAgY2xhc3M9XCJuZ3gtZm9ybS1jaGVja2JveFwiXG4gICAgICAgICAgIGZvcj1cInNlbGVjdEFsbENoZWNrYm94ZXNcIj5cbiAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uU2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgIGlkPVwic2VsZWN0QWxsQ2hlY2tib3hlc1wiXG4gICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIvPlxuICAgICAgPGVtIGNsYXNzPVwibmd4LWZvcm0taWNvblwiXG4gICAgICAgICAgaWQ9XCJzZWxlY3RBbGxDaGVja2JveFwiPjwvZW0+XG4gICAgPC9sYWJlbD5cbiAgPC90aD5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIj5cbiAgICA8dGggI3RoXG4gICAgICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50LCB0aClcIlxuICAgICAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICAgICAgICAobW91c2V1cCk9XCJvbk1vdXNlVXAoJGV2ZW50KVwiXG4gICAgICAgIFtjbGFzcy5waW5uZWQtbGVmdF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNzc0NsYXNzICYmIGNvbHVtbi5jc3NDbGFzcy5pbmNsdWRlSGVhZGVyID8gY29sdW1uLmNzc0NsYXNzLm5hbWUgOiAnJ1wiXG4gICAgICAgIFtzdHlsZS5sZWZ0XT1cInN0eWxlU2VydmljZS5waW5uZWRXaWR0aChjb2x1bW4ucGlubmVkLCBjb2xJbmRleClcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwiZ2V0Q29sdW1uV2lkdGgoY29sdW1uKVwiXG4gICAgICAgIGNsYXNzPVwibmd4LXRhYmxlX19oZWFkZXItY2VsbFwiPlxuICAgICAgPGRpdiAoY2xpY2spPVwib3JkZXJCeShjb2x1bW4pXCJcbiAgICAgICAgICAgW2NsYXNzLnBvaW50ZXJdPVwiaXNPcmRlckVuYWJsZWQoY29sdW1uKVwiXG4gICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogaW5saW5lXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlci10aXRsZVwiPlxuICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fTxzcGFuPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICA8ZW0gKm5nSWY9XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1waW5cIj48L2VtPlxuICAgICAgICAgIDxkaXYgW3N0eWxlLmRpc3BsYXldPVwiY29uZmlnLm9yZGVyRW5hYmxlZCA/ICdpbmxpbmUnIDogJ25vbmUnXCI+XG4gICAgICAgICAgICA8ZW0gKm5nSWY9XCJzb3J0S2V5ID09PSBjb2x1bW4ua2V5ICYmIHRoaXMuc29ydFN0YXRlLmdldChzb3J0S2V5KSA9PT0gJ2FzYydcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tYXJyb3ctdXBcIj5cbiAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICA8ZW0gKm5nSWY9XCJzb3J0S2V5ID09PSBjb2x1bW4ua2V5ICYmIHRoaXMuc29ydFN0YXRlLmdldChzb3J0S2V5KSA9PT0gJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLWFycm93LWRvd25cIj5cbiAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICNoZWFkZXJEcm9wZG93blxuICAgICAgICAgICAqbmdJZj1cIiEhY29sdW1uLmhlYWRlckFjdGlvblRlbXBsYXRlXCJcbiAgICAgICAgICAgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIj5cbiAgICAgICAgPGEgKGNsaWNrKT1cInNob3dIZWFkZXJBY3Rpb25UZW1wbGF0ZU1lbnUoY29sdW1uKVwiXG4gICAgICAgICAgIGNsYXNzPVwibmd4LWJ0biBuZ3gtYnRuLWxpbmtcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLW1vcmVcIj48L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5rZXkgPT09IG9wZW5lZEhlYWRlckFjdGlvblRlbXBsYXRlXCJcbiAgICAgICAgICAgICBjbGFzcz1cIm5neC1tZW51IG5neC10YWJsZV9fdGFibGUtbWVudVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlckFjdGlvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnJlc2l6ZUNvbHVtbiAmJiAhbGFzdFwiXG4gICAgICAgICAgIGNsYXNzPVwibmd4LXRhYmxlX19jb2x1bW4tcmVzaXplclwiPjwvZGl2PlxuICAgIDwvdGg+XG4gIDwvbmctY29udGFpbmVyPlxuICA8dGggKm5nSWY9XCJcbiAgICAgIGNvbmZpZy5hZGRpdGlvbmFsQWN0aW9ucyB8fFxuICAgICAgKGNvbmZpZy5kZXRhaWxzVGVtcGxhdGUgJiYgYXJyb3dEZWZpbml0aW9uKSB8fFxuICAgICAgY29uZmlnLmNvbGxhcHNlQWxsUm93cyB8fFxuICAgICAgY29uZmlnLmdyb3VwUm93c1xuICAgXCJcbiAgICAgIGNsYXNzPVwibmd4LXRhYmxlX19oZWFkZXItY2VsbC1hZGRpdGlvbmFsLWFjdGlvbnNcIj5cbiAgICA8ZGl2ICNhZGRpdGlvbmFsQWN0aW9uTWVudVxuICAgICAgICAgKm5nSWY9XCJjb25maWcuYWRkaXRpb25hbEFjdGlvbnNcIlxuICAgICAgICAgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIj5cbiAgICAgIDxhIChjbGljayk9XCJzaG93TWVudSgpXCJcbiAgICAgICAgIGNsYXNzPVwibmd4LWJ0biBuZ3gtYnRuLWxpbmtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1tZW51XCI+PC9zcGFuPlxuICAgICAgPC9hPlxuICAgICAgPHVsICpuZ0lmPVwibWVudUFjdGl2ZVwiXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGVcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3RoPlxuPC90cj5cbjx0ciAoY2RrRHJvcExpc3REcm9wcGVkKT1cImNvbHVtbkRyb3AoJGV2ZW50KVwiXG4gICAgKm5nSWY9XCJjb25maWcuaGVhZGVyRW5hYmxlZCAmJiBjb25maWcuY29sdW1uUmVvcmRlclwiXG4gICAgY2RrRHJvcExpc3RcbiAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlciBuZ3gtdGFibGVfX2hlYWRlci0tZHJhZ2dhYmxlXCI+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5jaGVja2JveGVzIHx8IGNvbmZpZy5yYWRpb1wiXG4gICAgICBbc3R5bGUud2lkdGhdPVwiJzMlJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RBbGxUZW1wbGF0ZSAmJiBjb25maWcuY2hlY2tib3hlc1wiXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG9uU2VsZWN0QWxsQmluZGVkIH1cIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0QWxsVGVtcGxhdGVcIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bGFiZWwgKm5nSWY9XCIhc2VsZWN0QWxsVGVtcGxhdGUgJiYgY29uZmlnLmNoZWNrYm94ZXNcIlxuICAgICAgICAgICBjbGFzcz1cIm5neC1mb3JtLWNoZWNrYm94XCJcbiAgICAgICAgICAgZm9yPVwic2VsZWN0QWxsQ2hlY2tib3hlc1wiPlxuICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25TZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgaWQ9XCJzZWxlY3RBbGxDaGVja2JveGVzRHJhZ1wiXG4gICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIvPlxuICAgICAgPGVtIGNsYXNzPVwibmd4LWZvcm0taWNvblwiXG4gICAgICAgICAgaWQ9XCJzZWxlY3RBbGxDaGVja2JveERyYWdcIj48L2VtPlxuICAgIDwvbGFiZWw+XG4gIDwvdGg+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgY29sSW5kZXggPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgPHRoICN0aFxuICAgICAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudCwgdGgpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNldXApPVwib25Nb3VzZVVwKCRldmVudClcIlxuICAgICAgICBbY2RrRHJhZ1N0YXJ0RGVsYXldPVwiY29uZmlnLnJlb3JkZXJEZWxheSB8fCAwXCJcbiAgICAgICAgW2NsYXNzLnBpbm5lZC1sZWZ0XT1cImNvbHVtbi5waW5uZWRcIlxuICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY3NzQ2xhc3MgJiYgY29sdW1uLmNzc0NsYXNzLmluY2x1ZGVIZWFkZXIgPyBjb2x1bW4uY3NzQ2xhc3MubmFtZSA6ICcnXCJcbiAgICAgICAgW3N0eWxlLmxlZnRdPVwic3R5bGVTZXJ2aWNlLnBpbm5lZFdpZHRoKGNvbHVtbi5waW5uZWQsIGNvbEluZGV4KVwiXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJnZXRDb2x1bW5XaWR0aChjb2x1bW4pXCJcbiAgICAgICAgY2RrRHJhZ1xuICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgY2xhc3M9XCJuZ3gtdGFibGVfX2hlYWRlci1jZWxsIG5neC10YWJsZV9faGVhZGVyLWNlbGwtLWRyYWdnYWJsZVwiPlxuICAgICAgPGRpdiAoY2xpY2spPVwib3JkZXJCeShjb2x1bW4pXCJcbiAgICAgICAgICAgW2NsYXNzLnBvaW50ZXJdPVwiaXNPcmRlckVuYWJsZWQoY29sdW1uKVwiXG4gICAgICAgICAgIGNka0RyYWdIYW5kbGVcbiAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm5neC10YWJsZV9faGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19PHNwYW4+Jm5ic3A7PC9zcGFuPlxuICAgICAgICAgIDxlbSAqbmdJZj1cImNvbHVtbi5waW5uZWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLXBpblwiPjwvZW0+XG4gICAgICAgICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJjb25maWcub3JkZXJFbmFibGVkID8gJ2lubGluZScgOiAnbm9uZSdcIj5cbiAgICAgICAgICAgIDxlbSAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnYXNjJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1hcnJvdy11cFwiPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgIDxlbSAqbmdJZj1cInNvcnRLZXkgPT09IGNvbHVtbi5rZXkgJiYgdGhpcy5zb3J0U3RhdGUuZ2V0KHNvcnRLZXkpID09PSAnZGVzYydcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tYXJyb3ctZG93blwiPlxuICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgI2hlYWRlckRyb3Bkb3duXG4gICAgICAgICAgICpuZ0lmPVwiISFjb2x1bW4uaGVhZGVyQWN0aW9uVGVtcGxhdGVcIlxuICAgICAgICAgICBjbGFzcz1cIm5neC1kcm9wZG93blwiPlxuICAgICAgICA8YSAoY2xpY2spPVwic2hvd0hlYWRlckFjdGlvblRlbXBsYXRlTWVudShjb2x1bW4pXCJcbiAgICAgICAgICAgY2xhc3M9XCJuZ3gtYnRuIG5neC1idG4tbGlua1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmd4LWljb24gbmd4LWljb24tbW9yZVwiPjwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLmtleSA9PT0gb3BlbmVkSGVhZGVyQWN0aW9uVGVtcGxhdGVcIlxuICAgICAgICAgICAgIGNsYXNzPVwibmd4LW1lbnUgbmd4LXRhYmxlX190YWJsZS1tZW51XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uaGVhZGVyQWN0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcucmVzaXplQ29sdW1uICYmICFsYXN0XCJcbiAgICAgICAgICAgY2xhc3M9XCJuZ3gtdGFibGVfX2NvbHVtbi1yZXNpemVyXCI+PC9kaXY+XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDx0aCAqbmdJZj1cIlxuICAgICAgY29uZmlnLmFkZGl0aW9uYWxBY3Rpb25zIHx8XG4gICAgICAoY29uZmlnLmRldGFpbHNUZW1wbGF0ZSAmJiBhcnJvd0RlZmluaXRpb24pIHx8XG4gICAgICBjb25maWcuY29sbGFwc2VBbGxSb3dzIHx8XG4gICAgICBjb25maWcuZ3JvdXBSb3dzXG4gICAgXCJcbiAgICAgIGNsYXNzPVwibmd4LXRhYmxlX19oZWFkZXItY2VsbC1hZGRpdGlvbmFsLWFjdGlvbnNcIj5cbiAgICA8ZGl2ICNhZGRpdGlvbmFsQWN0aW9uTWVudVxuICAgICAgICAgKm5nSWY9XCJjb25maWcuYWRkaXRpb25hbEFjdGlvbnNcIlxuICAgICAgICAgY2xhc3M9XCJuZ3gtZHJvcGRvd25cIj5cbiAgICAgIDxhIChjbGljayk9XCJzaG93TWVudSgpXCJcbiAgICAgICAgIGNsYXNzPVwibmd4LWJ0biBuZ3gtYnRuLWxpbmtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuZ3gtaWNvbiBuZ3gtaWNvbi1tZW51XCI+PC9zcGFuPlxuICAgICAgPC9hPlxuICAgICAgPHVsICpuZ0lmPVwibWVudUFjdGl2ZVwiXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtbWVudSBuZ3gtdGFibGVfX3RhYmxlLW1lbnVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxBY3Rpb25zVGVtcGxhdGVcIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L3RoPlxuPC90cj5cbjx0ciAqbmdJZj1cImNvbmZpZy5zZWFyY2hFbmFibGVkICYmICFmaWx0ZXJzVGVtcGxhdGVcIlxuICAgIGNsYXNzPVwibmd4LXRhYmxlX19zb3J0LWhlYWRlclwiPlxuICA8dGggKm5nSWY9XCJjb25maWcuY2hlY2tib3hlcyB8fCBjb25maWcucmFkaW9cIj48L3RoPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXhcIj5cbiAgICA8dGggW2NsYXNzLnBpbm5lZC1sZWZ0XT1cImNvbHVtbi5waW5uZWRcIlxuICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY3NzQ2xhc3MgJiYgY29sdW1uLmNzc0NsYXNzLmluY2x1ZGVIZWFkZXIgPyBjb2x1bW4uY3NzQ2xhc3MubmFtZSA6ICcnXCJcbiAgICAgICAgW3N0eWxlLmxlZnRdPVwic3R5bGVTZXJ2aWNlLnBpbm5lZFdpZHRoKGNvbHVtbi5waW5uZWQsIGNvbEluZGV4KVwiPlxuICAgICAgPGxpYi1oZWFkZXIgKHVwZGF0ZSk9XCJvblNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCI+XG4gICAgICA8L2xpYi1oZWFkZXI+XG4gICAgPC90aD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDx0aCAqbmdJZj1cImNvbmZpZy5hZGRpdGlvbmFsQWN0aW9ucyB8fCAoY29uZmlnLmRldGFpbHNUZW1wbGF0ZSAmJiBhcnJvd0RlZmluaXRpb24pXCI+PC90aD5cbjwvdHI+XG48bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyc1RlbXBsYXRlXCI+XG4gIDx0cj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbHRlcnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L3RyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=