@porscheinformatik/material-addons 14.1.0 → 14.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@ Material addons requires an already set-up Angular Material project. To do a fre
17
17
  2. Add the stylesheet at the top of your projects from the folder **themes**, for example:
18
18
 
19
19
  ```
20
- @import '~@porscheinformatik/material-addons/themes/pvb';
20
+ @import '@porscheinformatik/material-addons/themes/poa';
21
21
  ```
22
22
 
23
23
  3. To use a component, you need to import the Module of the component in your app.module.ts:
@@ -41,6 +41,7 @@ export class DataTableComponent {
41
41
  this.actions = [];
42
42
  this.deleteDefinitionAllowed = false;
43
43
  this.useAsync = false;
44
+ this.translateLabels = true;
44
45
  this.sortEvent = new EventEmitter();
45
46
  this.actionEvent = new EventEmitter();
46
47
  this.pageEvent = new EventEmitter();
@@ -192,8 +193,10 @@ export class DataTableComponent {
192
193
  }
193
194
  }
194
195
  ngAfterViewInit() {
195
- this.dataSource.paginator = this.paginator;
196
- this.dataSource.sort = this.sort;
196
+ if (!this.useAsync) {
197
+ this.dataSource.paginator = this.paginator;
198
+ this.dataSource.sort = this.sort;
199
+ }
197
200
  }
198
201
  onColumnSettings(definition) {
199
202
  this.showColumnModal = true;
@@ -416,10 +419,10 @@ export class DataTableComponent {
416
419
  }
417
420
  }
418
421
  DataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
419
- DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: DataTableComponent, selector: "mad-data-table", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", pageSizeOptions: "pageSizeOptions", externalFilter: "externalFilter", actions: "actions", idGenerator: "idGenerator", deleteDefinitionAllowed: "deleteDefinitionAllowed", useAsync: "useAsync", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", tableData: "tableData", page: "page", columnDefinitions: "columnDefinitions", loading: "loading", defaultPageSize: "defaultPageSize", externalPaginator: "externalPaginator", paginationEnabled: "paginationEnabled", allColumns: "allColumns", filterEnabled: "filterEnabled", forceMode: "forceMode" }, outputs: { sortEvent: "sortEvent", actionEvent: "actionEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label | translate }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label | translate }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] });
422
+ DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: DataTableComponent, selector: "mad-data-table", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", pageSizeOptions: "pageSizeOptions", externalFilter: "externalFilter", actions: "actions", idGenerator: "idGenerator", deleteDefinitionAllowed: "deleteDefinitionAllowed", useAsync: "useAsync", translateLabels: "translateLabels", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", tableData: "tableData", page: "page", columnDefinitions: "columnDefinitions", loading: "loading", defaultPageSize: "defaultPageSize", externalPaginator: "externalPaginator", paginationEnabled: "paginationEnabled", allColumns: "allColumns", filterEnabled: "filterEnabled", forceMode: "forceMode" }, outputs: { sortEvent: "sortEvent", actionEvent: "actionEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\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.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i12.IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }] });
420
423
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: DataTableComponent, decorators: [{
421
424
  type: Component,
422
- args: [{ selector: 'mad-data-table', template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label | translate }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label | translate }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"] }]
425
+ args: [{ selector: 'mad-data-table', template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"] }]
423
426
  }], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { filterLabel: [{
424
427
  type: Input
425
428
  }], filterPlaceholder: [{
@@ -458,6 +461,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImpor
458
461
  type: Input
459
462
  }], useAsync: [{
460
463
  type: Input
464
+ }], translateLabels: [{
465
+ type: Input
461
466
  }], displayedColumns: [{
462
467
  type: Input
463
468
  }], displayedColumnDefinition: [{
@@ -501,4 +506,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImpor
501
506
  type: ViewChild,
502
507
  args: [MatSort, { static: true }]
503
508
  }] } });
504
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVEvRyxNQUFNLE9BQU8sa0JBQWtCO0lBdUo3QixZQUFvQixTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBdEp4QyxlQUFlO1FBQ04sZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUM5Qiw2QkFBd0IsR0FBRywwQkFBMEIsQ0FBQztRQUN0RCxlQUFVLEdBQUcsd0JBQXdCLENBQUM7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U0FBUztzQkFBcEQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNKLElBQUk7c0JBQXpDLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCwgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb24gfSBmcm9tICcuL2RhdGEtdGFibGUtYWN0aW9uJztcbmltcG9ydCB7IERhdGFUYWJsZUFjdGlvblR5cGUgfSBmcm9tICcuL2RhdGEtdGFibGUtYWN0aW9uLXR5cGUnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZFY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uc01vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbnMtbW9kYWwvZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uLCBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uQ2hhbmdlLCBEYXRhVGFibGVEaWFsb2dEYXRhIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbHVtbi1kZWZpbml0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWFkLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gVHJhbnNsYXRpb25zXG4gIEBJbnB1dCgpIGZpbHRlckxhYmVsID0gJ0ZpbHRlcic7XG4gIEBJbnB1dCgpIGZpbHRlclBsYWNlaG9sZGVyID0gJyc7XG4gIEBJbnB1dCgpIGZpbHRlckNvbHVtbnNMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zUGxhY2VIb2xkZXIgPSAnRmlsdGVyIGF2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgbm9EYXRhVGV4dCA9ICdObyBtYXRjaGluZyBkYXRhIGZvdW5kJztcbiAgQElucHV0KCkgY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwgPSAnQ29sdW1uIHNldHRpbmdzJztcbiAgQElucHV0KCkgc2VsZWN0ZWRMYWJlbCA9ICdTZWxlY3RlZCBjb2x1bW5zJztcbiAgQElucHV0KCkgYXZhaWxhYmxlTGFiZWwgPSAnQXZhaWxhYmxlIGNvbHVtbnMnO1xuICBASW5wdXQoKSBzYXZlTGFiZWwgPSAnU2F2ZSc7XG4gIEBJbnB1dCgpIGRlbGV0ZUxhYmVsID0gJ0RlbGV0ZSc7XG4gIEBJbnB1dCgpIGNhbmNlbExhYmVsID0gJ0NhbmNlbCc7XG4gIEBJbnB1dCgpIGluZm9UZXh0TGFiZWwgPSAnRHJhZyBhbmQgZHJvcCBhIGNvbHVtbiB0byBzZWxlY3Qgb3IgcmVvcmRlciBpdC4nO1xuICBASW5wdXQoKSB0YWJsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGFnZVNpemVPcHRpb25zID0gWzUsIDEwLCAxNV07XG4gIEBJbnB1dCgpIGV4dGVybmFsRmlsdGVyOiBhbnk7XG5cbiAgQElucHV0KCkgYWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgaWRHZW5lcmF0b3I6IGFueTtcbiAgQElucHV0KCkgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSB1c2VBc3luYyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5zKGNvbHM6IERhdGFUYWJsZUNvbHVtbltdKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXllZENvbHVtbkRlZmluaXRpb24pIHtcbiAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHMgPyBbLi4uY29sc10gOiBbXTtcbiAgICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLmlkKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKGRlZjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbikge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5EZWZpbmlvbiA9IGRlZjtcbiAgICB0aGlzLmNvbHVtbnMgPSBkZWYuZGlzcGxheWVkQ29sdW1ucztcbiAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5pZCk7XG4gICAgdGhpcy5jb2x1bW5JZHMudW5zaGlmdCh0aGlzLkFDVElPTl9DT0xVTU5fTkFNRSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFibGVEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihkYXRhKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGEpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2UocGFnZTogUGFnZUV2ZW50KSB7XG4gICAgdGhpcy5wYWdpbmF0b3JQYWdlSW5kZXggPSBwYWdlLnBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2luYXRvclBhZ2VTaXplID0gcGFnZS5wYWdlU2l6ZTtcbiAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IHBhZ2UubGVuZ3RoO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNvbHVtbkRlZmluaXRpb25zKGRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW10pIHtcbiAgICB0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFsbENvbHVtbkRlZmluaXRpb25zID0gWy4uLmRlZmluaXRpb25zXTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgZGVmaW5pdGlvbnMpIHtcbiAgICAgIGlmIChkZWZpbml0aW9uLmVkaXRhYmxlKSB7XG4gICAgICAgIHRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucy5wdXNoKGRlZmluaXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmluaXRpb24uZGlzcGxheWVkQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgbG9hZGluZyhpc0xvYWRpbmc6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGlzTG9hZGluZztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkZWZhdWx0UGFnZVNpemUoZGVmYXVsdFNpemU6IG51bWJlcikge1xuICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkZWZhdWx0U2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBleHRlcm5hbFBhZ2luYXRvcihwYWdpbmF0b3I6IGFueSkge1xuICAgIHRoaXMuZXh0UGFnaW5hdG9yID0gcGFnaW5hdG9yO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHBhZ2luYXRpb25FbmFibGVkKGlzUGFnaW5hdGlvbkVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQgPSBpc1BhZ2luYXRpb25FbmFibGVkO1xuICAgIHRoaXMudW5zZXRQYWdlU2l6ZUlmTmVjZXNzYXJ5KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWxsQ29sdW1ucyhhbGxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgaWYgKGFsbENvbHVtbnMgJiYgdGhpcy5zaG93Q29sdW1uTW9kYWwpIHtcbiAgICAgIHRoaXMub3BlbkNvbHVtbk1vZGFsKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGZpbHRlckVuYWJsZWQoaXNGaWx0ZXJFbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0ZpbHRlckVuYWJsZWQgPSAhdGhpcy51c2VBc3luYyA/IGlzRmlsdGVyRW5hYmxlZCA6IGZhbHNlO1xuICAgIHRoaXMuc2V0RmlsdGVyVmFsdWUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmb3JjZU1vZGUobW9kZTogc3RyaW5nKSB7XG4gICAgaWYgKG1vZGUgPT09IHRoaXMuU0lOR0xFIHx8IG1vZGUgPT09IHRoaXMuQkFUQ0ggfHwgbW9kZSA9PT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLl9mb3JjZU1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIEBPdXRwdXQoKSBzb3J0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XG4gIEBPdXRwdXQoKSBhY3Rpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgcGFnZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhbGxDb2x1bW5zRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5EZWZpbml0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25DaGFuZ2U+KCk7XG4gIEBPdXRwdXQoKSB2aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uPigpO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yLCB7IHN0YXRpYzogZmFsc2UgfSkgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSkgc29ydDogTWF0U29ydDtcblxuICByZWFkb25seSBBQ1RJT05fQ09MVU1OX05BTUUgPSAnX19hY3Rpb25fXyc7XG4gIHJlYWRvbmx5IFNJTkdMRSA9IERhdGFUYWJsZUFjdGlvblR5cGUuU0lOR0xFO1xuICByZWFkb25seSBCQVRDSCA9IERhdGFUYWJsZUFjdGlvblR5cGUuQkFUQ0g7XG4gIHJlYWRvbmx5IE5PTkUgPSBEYXRhVGFibGVBY3Rpb25UeXBlLk5PTkU7XG5cbiAgdGFibGVBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICByb3dBY3Rpb25zOiBEYXRhVGFibGVBY3Rpb25bXSA9IFtdO1xuICBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICBhbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBzZWxlY3RlZDogW107XG4gIF9mb3JjZU1vZGU6IHN0cmluZztcbiAgZGlzcGxheWVkRGF0YU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIGFjdHVhbERhdGFNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55W10+O1xuICBzZWxlY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxzdHJpbmc+KHRydWUpO1xuICBjb2x1bW5JZHM6IHN0cmluZ1tdO1xuICBhbGxDb2x1bW5EZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdID0gW107XG4gIGVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgdmlld2FibGVDb2x1bW5EZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdO1xuICBzZWxlY3RlZENvbHVtbkRlZmluaW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uO1xuICBhbGxBdmFpbGFibGVDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXTtcbiAgc2VsZWN0ZWREZWZpbml0aW9uOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uO1xuICBkZWZhdWx0QWN0aW9uOiBEYXRhVGFibGVBY3Rpb247XG4gIGlzRmlsdGVyRW5hYmxlZCA9IGZhbHNlO1xuICBpc1BhZ2luYXRpb25FbmFibGVkID0gZmFsc2U7XG4gIG1vZGUgPSB0aGlzLk5PTkU7XG4gIGlzUm93Q2xpY2thYmxlID0gZmFsc2U7XG4gIHNob3dDb2x1bW5Nb2RhbCA9IGZhbHNlO1xuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgZXh0UGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XG5cbiAgcGFnaW5hdG9yTGVuZ3RoID0gMDtcbiAgcGFnaW5hdG9yUGFnZUluZGV4ID0gMDtcbiAgcGFnaW5hdG9yUGFnZVNpemUgPSA1MDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nKSB7fVxuXG4gIHN0YXRpYyBjb21wYXJlKGE6IFJlY29yZDxzdHJpbmcsIGFueT4sIGI6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvcnQ6IFNvcnQpOiBudW1iZXIge1xuICAgIGNvbnN0IHggPSBhW3NvcnQuYWN0aXZlXTtcbiAgICBjb25zdCB5ID0gYltzb3J0LmFjdGl2ZV07XG4gICAgY29uc3QgYXNjZW5kaW5nID0gc29ydC5kaXJlY3Rpb24gPT09ICdhc2MnO1xuICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZU51bWJlcih4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlU3RyaW5nKHgsIHksIGFzY2VuZGluZyk7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuIERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlQm9vbGVhbih4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gY2Fubm90IGNvbXBhcmUgLT4gcmV0dXJuIGVxdWFsXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlTnVtYmVyKHg6IG51bWJlciwgeTogbnVtYmVyLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBhc2NlbmRpbmcgPyB4IC0geSA6IHkgLSB4O1xuICB9XG5cbiAgc3RhdGljIGNvbXBhcmVTdHJpbmcoeDogc3RyaW5nLCB5OiBzdHJpbmcsIGFzY2VuZGluZzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGFzY2VuZGluZyA/IHgubG9jYWxlQ29tcGFyZSh5KSA6IHkubG9jYWxlQ29tcGFyZSh4KTtcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlQm9vbGVhbih4OiBib29sZWFuLCB5OiBib29sZWFuLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGFzY2VuZGluZykge1xuICAgICAgLy8gdHJ1ZSBmaXJzdFxuICAgICAgcmV0dXJuIHggPyAtMSA6IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbHNlIGZpcnN0XG4gICAgICByZXR1cm4geCA/IDEgOiAtMTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdHJhbnNmb3JtRGF0YSh2YWx1ZTogYW55LCB0cmFuc2Zvcm1lcjogYW55LCB0cmFuc2Zvcm1lclBhcmFtczogYW55KTogYW55IHtcbiAgICBpZiAoIXRyYW5zZm9ybWVyIHx8ICEodHJhbnNmb3JtZXIgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVyKHZhbHVlLCB0cmFuc2Zvcm1lclBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVSb3dJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dWlkVjQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0NsaWNrT25Sb3dNZW51SWNvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsYXNzTGlzdC5jb250YWlucygnbWF0LWljb24nKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IHRoaXMuZ2V0VGFibGVNb2RlKCk7XG4gICAgdGhpcy5zZXRBY3Rpb25zKCk7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gdGhpcy5OT05FKSB7XG4gICAgICB0aGlzLmlzUm93Q2xpY2thYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVmYXVsdEFjdGlvbiA9IHRoaXMucm93QWN0aW9uc1swXTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICB9XG5cbiAgb25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uPzogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb24gPyBkZWZpbml0aW9uIDogdGhpcy5hbGxDb2x1bW5EZWZpbml0aW9uc1swXTtcbiAgICBpZiAodGhpcy5hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy52aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50LmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERlZmluaXRpb24gJiYgdGhpcy5zZWxlY3RlZERlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCA/IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEFsbERhdGFTb3VyY2VSb3dzT2ZDdXJyZW50UGFnZSgpID8gdGhpcy5nZXRBbGxEYXRhU291cmNlUm93c09mQ3VycmVudFBhZ2UoKS5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSB0aGlzLkJBVENIIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyAoJyArIGNvdW50ICsgJyknO1xuICB9XG5cbiAgaXNEaXNhYmxlZChhY3Rpb25UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgdGhpcy5TSU5HTEU6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgIT09IDE7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgPCAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCkuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCgnJyArIHJvdy5yb3dJZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkKHJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgb25Sb3dDaGVja2JveChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gbm8gY2xpY2sgZXZlbnQgb24gcm93XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC50b2dnbGUocm93LnJvd0lkKTtcbiAgfVxuXG4gIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSB0aGlzLkJBVENIOlxuICAgICAgICB0aGlzLm9uUm93Q2hlY2tib3goZXZlbnQsIHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgLy8gZW1pdCB0aGUgZGVmYXVsdCBhY3Rpb24gaWYgdGhlIHJvdyAobm90IHRoZSBpY29uISkgd2FzIGNsaWNrZWRcbiAgICAgICAgaWYgKCEhYWN0aW9uICYmICFEYXRhVGFibGVDb21wb25lbnQuaXNDbGlja09uUm93TWVudUljb24oZXZlbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgICAvLyBpZiBJRC1nZW5lcmF0b3IgaXMgcHJvdmlkZWQsIHJldHVybiB0aGUgSUQsIGVsc2UgcmV0dXJuIHRoZSBBQ1RVQUwgZGF0YVxuICAgICAgICAgIHNlbGVjdGVkLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHJvdy5yb3dJZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQocm93LnJvd0lkKSk7XG4gICAgICAgICAgdGhpcy5lbWl0VGFibGVBY3Rpb24oYWN0aW9uLCBzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIG1vZGUgaXMgTk9ORSAob3IgbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG9uU29ydGluZ0V2ZW50KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VBc3luYykge1xuICAgICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5hbFNvcnQoc29ydCk7XG4gICAgfVxuICB9XG5cbiAgb25QYWdlRXZlbnQoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZUFzeW5jKSB7XG4gICAgICB0aGlzLnBhZ2VFdmVudC5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBvblRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uOiBEYXRhVGFibGVBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISF0YWJsZUFjdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RlZCBvZiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgPyBzZWxlY3RlZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQoc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICAgIHRhYmxlQWN0aW9uLnNlbGVjdGVkID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5hY3Rpb25FdmVudC5lbWl0KHRhYmxlQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJsZUFjdGlvbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEFjdGlvbiA9IHsgLi4uYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSB0aGlzLk5PTkUpIHtcbiAgICAgIGVtaXRBY3Rpb24uc2VsZWN0ZWQgPSBbLi4uc2VsZWN0ZWRdO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQ6IHN0cmluZywgYWN0dWFsRGF0YUVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBkaXNwbGF5ZWREYXRhRWxlbWVudC5yb3dJZCA9IHJvd0lkO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxEYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV07XG4gICAgICBkaXNwbGF5ZWREYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV0gPSBEYXRhVGFibGVDb21wb25lbnQudHJhbnNmb3JtRGF0YShcbiAgICAgICAgYWN0dWFsVmFsdWUsXG4gICAgICAgIGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgY29sdW1uLnRyYW5zZm9ybWVyUGFyYW1zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXllZERhdGFFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNvcnQoc29ydDogU29ydCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGFdLnNvcnQoKGEsIGIpID0+IERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlKGEsIGIsIHNvcnQpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi5zb3J0ZWREYXRhXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubW9kZSAhPT0gYWN0aW9uLmhpZGRlbkluTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuU0lOR0xFKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLlNJTkdMRSkge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy50YWJsZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUxpc3QgPSBbXTtcbiAgICB0aGlzLmFjdHVhbERhdGFNYXAuY2xlYXIoKTtcbiAgICB0aGlzLmRpc3BsYXllZERhdGFNYXAuY2xlYXIoKTtcbiAgICBpZiAoZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBkYXRhRW50cnkgb2YgZGF0YSkge1xuICAgICAgICBjb25zdCByb3dJZCA9IHRoaXMuaWRHZW5lcmF0b3IgPyB0aGlzLmlkR2VuZXJhdG9yKGRhdGFFbnRyeSkgOiBEYXRhVGFibGVDb21wb25lbnQuZ2VuZXJhdGVSb3dJZCgpO1xuICAgICAgICB0aGlzLmFjdHVhbERhdGFNYXAuc2V0KHJvd0lkLCBkYXRhRW50cnkpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ZWREYXRhRWxlbWVudCA9IHRoaXMuZ2VuZXJhdGVEaXNwbGF5ZWREYXRhRWxlbWVudChyb3dJZCwgZGF0YUVudHJ5KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhTWFwLnNldChyb3dJZCwgZGlzcGxheWVkRGF0YUVsZW1lbnQpO1xuICAgICAgICBkaXNwbGF5ZWREYXRhTGlzdC5wdXNoKGRpc3BsYXllZERhdGFFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkaXNwbGF5ZWREYXRhTGlzdDtcbiAgICB0aGlzLnVuc2V0UGFnZVNpemVJZk5lY2Vzc2FyeSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nRGF0YTogRGF0YVRhYmxlRGlhbG9nRGF0YSA9IHtcbiAgICAgIGFsbENvbHVtbnM6IHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuc2VsZWN0ZWREZWZpbml0aW9uLFxuICAgICAgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQ6IHRoaXMuZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQsXG4gICAgICBmaWx0ZXJDb2x1bW5zTGFiZWw6IHRoaXMuZmlsdGVyQ29sdW1uc0xhYmVsLFxuICAgICAgZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyOiB0aGlzLmZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcixcbiAgICAgIG5vRGF0YVRleHQ6IHRoaXMubm9EYXRhVGV4dCxcbiAgICAgIHRpdGxlTGFiZWw6IHRoaXMuY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwsXG4gICAgICBzZWxlY3RlZExhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwsXG4gICAgICBhdmFpbGFibGVMYWJlbDogdGhpcy5hdmFpbGFibGVMYWJlbCxcbiAgICAgIHNhdmVMYWJlbDogdGhpcy5zYXZlTGFiZWwsXG4gICAgICBkZWxldGVMYWJlbDogdGhpcy5kZWxldGVMYWJlbCxcbiAgICAgIGNhbmNlbExhYmVsOiB0aGlzLmNhbmNlbExhYmVsLFxuICAgICAgaW5mb1RleHRMYWJlbDogdGhpcy5pbmZvVGV4dExhYmVsLFxuICAgIH07XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5tYXREaWFsb2cub3BlbihEYXRhVGFibGVDb2x1bW5zTW9kYWxDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlTW9kZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9mb3JjZU1vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JjZU1vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFjdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLk5PTkU7XG4gICAgfVxuICAgIGNvbnN0IGRpc3RpbmN0QWN0aW9uVHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHJvd0FjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgIGRpc3RpbmN0QWN0aW9uVHlwZXMuYWRkKHJvd0FjdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuQkFUQ0gpKSB7XG4gICAgICByZXR1cm4gdGhpcy5CQVRDSDtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuU0lOR0xFKSkge1xuICAgICAgcmV0dXJuIHRoaXMuU0lOR0xFO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5OT05FO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnNldFBhZ2VTaXplSWZOZWNlc3NhcnkoKSB7XG4gICAgaWYgKCF0aGlzLnVzZUFzeW5jICYmICF0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRhdGFDb3VudCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhID8gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIDogMDtcbiAgICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkYXRhQ291bnQ7XG4gICAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IGRhdGFDb3VudDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWFjdGlvbi1iYXJcIj5cbiAgPCEtLSBUYWJsZSBhY3Rpb25zOiBkaXNwbGF5ZWQgYmVmb3JlIHRoZSB0YWJsZSAtLT5cbiAgPGRpdiAqbmdJZj1cInRhYmxlQWN0aW9ucz8ubGVuZ3RoXCI+XG4gICAgPG1hZC1vdXRsaW5lLWJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24udHlwZSlcIlxuICAgICAgY2xhc3M9XCJ0YWJsZS1hY3Rpb25cIlxuICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIHRhYmxlQWN0aW9uc1wiXG4gICAgICAoY2xpY2spPVwib25UYWJsZUFjdGlvbih0YWJsZUFjdGlvbilcIj5cbiAgICAgIHt7IHRhYmxlQWN0aW9uLmxhYmVsIHwgdHJhbnNsYXRlIH19IHt7IGdldFNlbGVjdGVkQ291bnQodGFibGVBY3Rpb24udHlwZSkgfX1cbiAgICA8L21hZC1vdXRsaW5lLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIDwhLS0gVGFibGUgZmlsdGVyIC0tPlxuICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpc0ZpbHRlckVuYWJsZWRcIj5cbiAgICA8bWF0LWxhYmVsPnt7IGZpbHRlckxhYmVsIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0IG1hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIChrZXl1cCk9XCJzZXRGaWx0ZXJWYWx1ZSgkZXZlbnQ/LnRhcmdldD8udmFsdWUpXCJcbiAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBmaWx0ZXJQbGFjZWhvbGRlciB9fVwiIC8+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cblxuXG48IS0tIFJvdyBhY3Rpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjcm93QWN0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC1lbGVtZW50PVwiZWxlbWVudFwiPlxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHJvd0FjdGlvbiBvZiByb3dBY3Rpb25zXCIgbWF0LW1lbnUtaXRlbSBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCBlbGVtZW50LCByb3dBY3Rpb24pXCI+XG4gICAgICB7eyByb3dBY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gZWRpdGFibGUgZGVmaW5pdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNlZGl0YWJsZURlZmluaXRpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQ+XG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zXCJcbiAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS1jb2x1bW4tZGVmaW5pdGlvbic6IGlzQ3VycmVudERlZmluaXRpb24oZGVmaW5pdGlvbil9XCJcbiAgICA+XG4gICAgICB7eyBkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIHZpZXdhYmxlIGRlZmluaXRpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjdmlld2FibGVEZWZpbml0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2Ygdmlld2FibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlld0RlZmluaXRpb24oZGVmaW5pdGlvbilcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pfVwiXG4gICAgPlxuICAgICAge3sgZGVmaW5pdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBUYWJsZSAtLT5cbjxkaXYgKm5nSWY9XCJyb3dDb3VudCA+IDA7IGVsc2Ugbm9EYXRhXCIgY2xhc3M9XCJkYXRhdGFibGVcIiBbY2xhc3NdPVwidGFibGVDbGFzc1wiPlxuICA8ZGl2IGNsYXNzPVwibWFkLWRhdGF0YWJsZS1zcGlubmVyLXdyYXBwZXJcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiNTBcIiBbc3Ryb2tlV2lkdGhdPVwiM1wiPjwvbWF0LXNwaW5uZXI+XG4gIDwvZGl2PlxuXG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIG1hdFNvcnQgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0aW5nRXZlbnQoJGV2ZW50KVwiPlxuICAgIDwhLS0gUm93IGFjdGlvbnMgY29sdW1uLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbWF0Q29sdW1uRGVmXT1cIkFDVElPTl9DT0xVTU5fTkFNRVwiPlxuICAgICAgPHRoIHNjb3BlPVwiY29sXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwicm93LWFjdGlvbi1idXR0b25cIj5cbiAgICAgICAgPCEtLSBCQVRDSDogbWFzdGVyIGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gQkFUQ0hcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRSAvIE5PTkU6IG5vdGhpbmcgaW4gaGVhZGVyIHJvdyAtLT5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwicm93LWFjdGlvbi1idXR0b25cIj5cbiAgICAgICAgPCEtLSBCQVRDSDogcm93IGNoZWNrYm94IC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gQkFUQ0hcIiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUm93Q2hlY2tib3goJGV2ZW50LCBlbGVtZW50LnJvd0lkKVwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKGVsZW1lbnQucm93SWQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNJTkdMRTogcm93IGFjdGlvbiBtZW51IGljb24gLS0+XG4gICAgICAgIDxtYWQtaWNvbi1idXR0b25cbiAgICAgICAgICAqbmdJZj1cIm1vZGUgPT09IFNJTkdMRVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IGVsZW1lbnQ6IGVsZW1lbnQgfVwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJyb3dBY3Rpb25NZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICAgICAgPCEtLSBOT05FOiBub3RoaW5nIC0tPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIENvbHVtbnMgd2l0aCBkYXRhIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4uaWRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uaXNTb3J0YWJsZTsgZWxzZSBub1NvcnRcIj5cbiAgICAgICAgPHRoXG4gICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICptYXRIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgbWF0LXNvcnQtaGVhZGVyPVwie3sgY29sdW1uLm9yZGVyQnlOYW1lPyBjb2x1bW4ub3JkZXJCeU5hbWUgOiBjb2x1bW4uZGF0YVByb3BlcnR5TmFtZSB9fVwiXG4gICAgICAgICAgW2Fycm93UG9zaXRpb25dPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkID8gJ2JlZm9yZScgOiAnYWZ0ZXInXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Tb3J0PlxuICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCI+XG4gICAgICAgICAge3sgY29sdW1uLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbY2xhc3MudGV4dC1yaWdodF09XCJjb2x1bW4uaXNSaWdodEFsaWduZWRcIiBbbmdTd2l0Y2hdPVwiY29sdW1uLnRyYW5zZm9ybWVyXCI+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIHt7IGVsZW1lbnRbY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWVdIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHNcIj48L3RyPlxuICAgIDx0clxuICAgICAgbWF0LXJvd1xuICAgICAgW2NsYXNzLmNsaWNrYWJsZS10YWJsZS1yb3ddPVwiaXNSb3dDbGlja2FibGVcIlxuICAgICAgKGNsaWNrKT1cIm9uUm93RXZlbnQoJGV2ZW50LCByb3cpXCJcbiAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHNcIlxuICAgID48L3RyPlxuICA8L3RhYmxlPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibWFkLWRhdGEtdGFibGUtYm90dG9tLWFyZWFcIj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhLXRhYmxlLWJvdHRvbS1pbmZvLWFyZWFcIj5cbiAgICA8IS0tIGNvbHVtbiBzZXR0aW5nczogMSBkZWZpbml0aW9uIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b25cbiAgICAgICpuZ0lmPVwidGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zPy5sZW5ndGggPT0gMVwiXG4gICAgICAoY2xpY2spPVwib25Db2x1bW5TZXR0aW5ncygpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPnZpZXdfY29sdW1uPC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICA8IS0tIGNvbHVtbiBzZXR0aW5nczogbXVsdGlwbGUgZGVmaW5pdGlvbnMgLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJ0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA+IDBcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZWRpdGFibGVEZWZpbml0aW9uTWVudVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPnZpZXdfY29sdW1uPC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgICA8IS0tIGNvbHVtbiB2aWV3OiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAqbmdJZj1cInRoaXMudmlld2FibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJ2aWV3YWJsZURlZmluaXRpb25NZW51XCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XG4gICAgPC9tYWQtaWNvbi1idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgPG1hdC1wYWdpbmF0b3JcbiAgICBbc3R5bGUuZGlzcGxheV09XCJpc1BhZ2luYXRpb25FbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJ1wiXG4gICAgW2xlbmd0aF09XCJwYWdpbmF0b3JMZW5ndGhcIlxuICAgIFtwYWdlSW5kZXhdPVwicGFnaW5hdG9yUGFnZUluZGV4XCJcbiAgICBbcGFnZVNpemVdPVwicGFnaW5hdG9yUGFnZVNpemVcIlxuICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcbiAgICAocGFnZSk9XCJvblBhZ2VFdmVudCgkZXZlbnQpXCJcbiAgICBzaG93Rmlyc3RMYXN0QnV0dG9uc1xuICA+XG4gIDwvbWF0LXBhZ2luYXRvcj5cbjwvZGl2PlxuXG48IS0tIE5vIGRhdGEgYWxlcnQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YT5cbiAgPGRpdiBjbGFzcz1cIm5vRGF0YVRleHRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWFkLWRhdGF0YWJsZS1zcGlubmVyLXdyYXBwZXJcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiIFtzdHJva2VXaWR0aF09XCIzXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICA8L2Rpdj5cbiAgICB7eyBub0RhdGFUZXh0IH19XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
509
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC1hZGRvbnMvc3JjL2xpYi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtYWRkb25zL3NyYy9saWIvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLHdCQUF3QixDQUFDO0FBR3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVEvRyxNQUFNLE9BQU8sa0JBQWtCO0lBd0o3QixZQUFvQixTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBdkp4QyxlQUFlO1FBQ04sZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUM5Qiw2QkFBd0IsR0FBRywwQkFBMEIsQ0FBQztRQUN0RCxlQUFVLEdBQUcsd0JBQXdCLENBQUM7UUFDdEMsa0NBQTZCLEdBQUcsaUJBQWlCLENBQUM7UUFDbEQsa0JBQWEsR0FBRyxrQkFBa0IsQ0FBQztRQUNuQyxtQkFBYyxHQUFHLG1CQUFtQixDQUFDO1FBQ3JDLGNBQVMsR0FBRyxNQUFNLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxRQUFRLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxpREFBaUQsQ0FBQztRQUdsRSxvQkFBZSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUc5QixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUVoQyw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFaEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixvQkFBZSxHQUFHLElBQUksQ0FBQztRQW1GdEIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNsRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUMxQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0MsZ0NBQTJCLEdBQUcsSUFBSSxZQUFZLEVBQW1DLENBQUM7UUFDbEYsOEJBQXlCLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFLM0UsdUJBQWtCLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLFdBQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7UUFDcEMsVUFBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQztRQUNsQyxTQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1FBRXpDLGlCQUFZLEdBQXNCLEVBQUUsQ0FBQztRQUNyQyxlQUFVLEdBQXNCLEVBQUUsQ0FBQztRQUNuQyxZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUdwQixxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBQzFDLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUV2QyxtQkFBYyxHQUFHLElBQUksY0FBYyxDQUFTLElBQUksQ0FBQyxDQUFDO1FBRWxELHlCQUFvQixHQUFnQyxFQUFFLENBQUM7UUFPdkQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLFNBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2pCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFHbEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsdUJBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUVvQixDQUFDO0lBOUg1QyxJQUFhLGdCQUFnQixDQUFDLElBQXVCO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0lBRUQsSUFBYSx5QkFBeUIsQ0FBQyxHQUE4QjtRQUNuRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLGdCQUFnQixDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQWEsU0FBUyxDQUFDLElBQVc7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGtCQUFrQixDQUFNLElBQUksQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFhLElBQUksQ0FBQyxJQUFlO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBYSxpQkFBaUIsQ0FBQyxXQUF3QztRQUNyRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUM3QyxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtZQUNwQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDakQ7WUFDRCxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsU0FBa0I7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQWEsZUFBZSxDQUFDLFdBQW1CO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxXQUFXLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsU0FBYztRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBYSxpQkFBaUIsQ0FBQyxtQkFBNEI7UUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFhLFVBQVUsQ0FBQyxVQUE2QjtRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsVUFBVSxDQUFDO1FBQ3RDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVELElBQ0ksYUFBYSxDQUFDLGVBQXdCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUNJLFNBQVMsQ0FBQyxJQUFZO1FBQ3hCLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQWlERCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQXNCLEVBQUUsQ0FBc0IsRUFBRSxJQUFVO1FBQ3ZFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQztRQUMzQyxRQUFRLE9BQU8sQ0FBQyxFQUFFO1lBQ2hCLEtBQUssUUFBUTtnQkFDWCxPQUFPLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELEtBQUssUUFBUTtnQkFDWCxPQUFPLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELEtBQUssU0FBUztnQkFDWixPQUFPLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVEO2dCQUNFLGlDQUFpQztnQkFDakMsT0FBTyxDQUFDLENBQUM7U0FDWjtJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsU0FBa0I7UUFDM0QsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxTQUFrQjtRQUMzRCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFVLEVBQUUsQ0FBVSxFQUFFLFNBQWtCO1FBQzlELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxJQUFJLFNBQVMsRUFBRTtZQUNiLGFBQWE7WUFDYixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsY0FBYztZQUNkLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBVSxFQUFFLFdBQWdCLEVBQUUsaUJBQXNCO1FBQ3ZFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSxRQUFRLENBQUMsRUFBRTtZQUN0RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhO1FBQ2xCLE9BQU8sTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFpQjtRQUMzQyxPQUFRLEtBQUssRUFBRSxNQUFzQixFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBc0M7UUFDckQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDTCx1RkFBdUY7WUFDdkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUM3QjtJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFxQztRQUNwRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFDO1FBQ3JDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQXFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxpQ0FBaUM7UUFDL0IsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2pDLElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUMxQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxJQUFJLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUM1QixDQUFDO0lBRUQsVUFBVSxDQUFDLFVBQWtCO1FBQzNCLFFBQVEsVUFBVSxFQUFFO1lBQ2xCLEtBQUssSUFBSSxDQUFDLE1BQU07Z0JBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQztZQUNsQyxLQUFLLElBQUksQ0FBQyxLQUFLO2dCQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFDaEM7Z0JBQ0UsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixzQ0FBc0M7WUFDdEMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWE7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFRCxhQUFhLENBQUMsS0FBaUIsRUFBRSxHQUFRO1FBQ3ZDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFpQixFQUFFLEdBQVEsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWE7UUFDakUsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssSUFBSSxDQUFDLEtBQUs7Z0JBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLElBQUksQ0FBQyxNQUFNO2dCQUNkLGlFQUFpRTtnQkFDakUsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQy9ELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztvQkFDcEIsMEVBQTBFO29CQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNoRixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztpQkFDeEM7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLHVDQUF1QztnQkFDdkMsT0FBTztTQUNWO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFVO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsS0FBZ0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxXQUE0QjtRQUN4QyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDakIsTUFBTSxTQUFTLEdBQVUsRUFBRSxDQUFDO1lBQzVCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ25ELFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ2hGO1lBQ0QsV0FBVyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQXVCLEVBQUUsUUFBZTtRQUM5RCxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDakMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDN0IsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7U0FDckM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sNEJBQTRCLENBQUMsS0FBYSxFQUFFLGlCQUFzQjtRQUN4RSxNQUFNLG9CQUFvQixHQUEyQixFQUFFLENBQUM7UUFDeEQsb0JBQW9CLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakMsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDL0Qsb0JBQW9CLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxDQUM5RSxXQUFXLEVBQ1gsTUFBTSxDQUFDLFdBQVcsRUFDbEIsTUFBTSxDQUFDLGlCQUFpQixDQUN6QixDQUFDO1NBQ0g7UUFDRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JDLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtvQkFDbkIsS0FBSyxJQUFJLENBQUMsTUFBTTt3QkFDZCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTs0QkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQzlCOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNoQzt3QkFDRCxNQUFNO29CQUNSLEtBQUssSUFBSSxDQUFDLEtBQUs7d0JBQ2IsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUU7NEJBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNoQzt3QkFDRCxNQUFNO29CQUNSO3dCQUNFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNsQzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sMkNBQTJDLENBQUMsSUFBVztRQUM3RCxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3BCLEtBQUssTUFBTSxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3ZELGlCQUFpQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQzlDO1NBQ0Y7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUN6QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLFVBQVUsR0FBd0I7WUFDdEMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDbkMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QjtZQUNyRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO1lBQzNDLHdCQUF3QixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDdkQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFVBQVUsRUFBRSxJQUFJLENBQUMsNkJBQTZCO1lBQzlDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ2xDLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDdEMscUJBQXFCO1lBQ3JCLElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDbEI7UUFDRCxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDOUMsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3BDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7UUFDRCxJQUFJLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNwQjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQzs7K0dBbGRVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGs1Q0FrSGxCLFlBQVksdUVBQ1osT0FBTyw4RENySXBCLDBxTkFnTEE7MkZEOUphLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7Z0dBTWpCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBUU8seUJBQXlCO3NCQUFyQyxLQUFLO2dCQU9PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBT08sSUFBSTtzQkFBaEIsS0FBSztnQkFNTyxpQkFBaUI7c0JBQTdCLEtBQUs7Z0JBY08sT0FBTztzQkFBbkIsS0FBSztnQkFJTyxlQUFlO3NCQUEzQixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxpQkFBaUI7c0JBQTdCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSztnQkFRRixhQUFhO3NCQURoQixLQUFLO2dCQU9GLFNBQVM7c0JBRFosS0FBSztnQkFTSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLDJCQUEyQjtzQkFBcEMsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBRXFDLFNBQVM7c0JBQXBELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDSixJQUFJO3NCQUF6QyxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbiB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQWN0aW9uIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjdGlvbic7XG5pbXBvcnQgeyBEYXRhVGFibGVBY3Rpb25UeXBlIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjdGlvbi10eXBlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IHY0IGFzIHV1aWRWNCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbnNNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW5zLW1vZGFsL2RhdGEtdGFibGUtY29sdW1ucy1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbiwgRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbkNoYW5nZSwgRGF0YVRhYmxlRGlhbG9nRGF0YSB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4tZGVmaW5pdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hZC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vIFRyYW5zbGF0aW9uc1xuICBASW5wdXQoKSBmaWx0ZXJMYWJlbCA9ICdGaWx0ZXInO1xuICBASW5wdXQoKSBmaWx0ZXJQbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBmaWx0ZXJDb2x1bW5zTGFiZWwgPSAnRmlsdGVyJztcbiAgQElucHV0KCkgZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyID0gJ0ZpbHRlciBhdmFpbGFibGUgY29sdW1ucyc7XG4gIEBJbnB1dCgpIG5vRGF0YVRleHQgPSAnTm8gbWF0Y2hpbmcgZGF0YSBmb3VuZCc7XG4gIEBJbnB1dCgpIGNvbHVtblNldHRpbmdzTW9kYWxUaXRsZUxhYmVsID0gJ0NvbHVtbiBzZXR0aW5ncyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkTGFiZWwgPSAnU2VsZWN0ZWQgY29sdW1ucyc7XG4gIEBJbnB1dCgpIGF2YWlsYWJsZUxhYmVsID0gJ0F2YWlsYWJsZSBjb2x1bW5zJztcbiAgQElucHV0KCkgc2F2ZUxhYmVsID0gJ1NhdmUnO1xuICBASW5wdXQoKSBkZWxldGVMYWJlbCA9ICdEZWxldGUnO1xuICBASW5wdXQoKSBjYW5jZWxMYWJlbCA9ICdDYW5jZWwnO1xuICBASW5wdXQoKSBpbmZvVGV4dExhYmVsID0gJ0RyYWcgYW5kIGRyb3AgYSBjb2x1bW4gdG8gc2VsZWN0IG9yIHJlb3JkZXIgaXQuJztcbiAgQElucHV0KCkgdGFibGVDbGFzczogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHBhZ2VTaXplT3B0aW9ucyA9IFs1LCAxMCwgMTVdO1xuICBASW5wdXQoKSBleHRlcm5hbEZpbHRlcjogYW55O1xuXG4gIEBJbnB1dCgpIGFjdGlvbnM6IERhdGFUYWJsZUFjdGlvbltdID0gW107XG4gIEBJbnB1dCgpIGlkR2VuZXJhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIGRlbGV0ZURlZmluaXRpb25BbGxvd2VkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgdXNlQXN5bmMgPSBmYWxzZTtcbiAgQElucHV0KCkgdHJhbnNsYXRlTGFiZWxzID0gdHJ1ZTtcblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1ucyhjb2xzOiBEYXRhVGFibGVDb2x1bW5bXSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSBjb2xzID8gWy4uLmNvbHNdIDogW107XG4gICAgICB0aGlzLmNvbHVtbklkcyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5pZCk7XG4gICAgICB0aGlzLmNvbHVtbklkcy51bnNoaWZ0KHRoaXMuQUNUSU9OX0NPTFVNTl9OQU1FKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzcGxheWVkQ29sdW1uRGVmaW5pdGlvbihkZWY6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uRGVmaW5pb24gPSBkZWY7XG4gICAgdGhpcy5jb2x1bW5zID0gZGVmLmRpc3BsYXllZENvbHVtbnM7XG4gICAgdGhpcy5jb2x1bW5JZHMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiBjb2x1bW4uaWQpO1xuICAgIHRoaXMuY29sdW1uSWRzLnVuc2hpZnQodGhpcy5BQ1RJT05fQ09MVU1OX05BTUUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRhYmxlRGF0YShkYXRhOiBhbnlbXSkge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oZGF0YSk7XG4gICAgfVxuICAgIHRoaXMuY3JlYXRlRGF0YU1hcHNBbmRTZXREaXNwbGF5ZWREYXRhU291cmNlRGF0YShkYXRhKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdlKHBhZ2U6IFBhZ2VFdmVudCkge1xuICAgIHRoaXMucGFnaW5hdG9yUGFnZUluZGV4ID0gcGFnZS5wYWdlSW5kZXg7XG4gICAgdGhpcy5wYWdpbmF0b3JQYWdlU2l6ZSA9IHBhZ2UucGFnZVNpemU7XG4gICAgdGhpcy5wYWdpbmF0b3JMZW5ndGggPSBwYWdlLmxlbmd0aDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5EZWZpbml0aW9ucyhkZWZpbml0aW9uczogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbltdKSB7XG4gICAgdGhpcy5lZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zID0gW107XG4gICAgdGhpcy5hbGxDb2x1bW5EZWZpbml0aW9ucyA9IFsuLi5kZWZpbml0aW9uc107XG4gICAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIGRlZmluaXRpb25zKSB7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5lZGl0YWJsZSkge1xuICAgICAgICB0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnMucHVzaChkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZpbml0aW9uLmRpc3BsYXllZENvbHVtbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zLnB1c2goZGVmaW5pdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCkgc2V0IGxvYWRpbmcoaXNMb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBpc0xvYWRpbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGVmYXVsdFBhZ2VTaXplKGRlZmF1bHRTaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2luYXRvclBhZ2VTaXplID0gZGVmYXVsdFNpemU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZXh0ZXJuYWxQYWdpbmF0b3IocGFnaW5hdG9yOiBhbnkpIHtcbiAgICB0aGlzLmV4dFBhZ2luYXRvciA9IHBhZ2luYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmF0aW9uRW5hYmxlZChpc1BhZ2luYXRpb25FbmFibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1BhZ2luYXRpb25FbmFibGVkID0gaXNQYWdpbmF0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnVuc2V0UGFnZVNpemVJZk5lY2Vzc2FyeSgpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGFsbENvbHVtbnMoYWxsQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW10pIHtcbiAgICB0aGlzLmFsbEF2YWlsYWJsZUNvbHVtbnMgPSBhbGxDb2x1bW5zO1xuICAgIGlmIChhbGxDb2x1bW5zICYmIHRoaXMuc2hvd0NvbHVtbk1vZGFsKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBmaWx0ZXJFbmFibGVkKGlzRmlsdGVyRW5hYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNGaWx0ZXJFbmFibGVkID0gIXRoaXMudXNlQXN5bmMgPyBpc0ZpbHRlckVuYWJsZWQgOiBmYWxzZTtcbiAgICB0aGlzLnNldEZpbHRlclZhbHVlKHVuZGVmaW5lZCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgZm9yY2VNb2RlKG1vZGU6IHN0cmluZykge1xuICAgIGlmIChtb2RlID09PSB0aGlzLlNJTkdMRSB8fCBtb2RlID09PSB0aGlzLkJBVENIIHx8IG1vZGUgPT09IHRoaXMuTk9ORSkge1xuICAgICAgdGhpcy5fZm9yY2VNb2RlID0gbW9kZTtcbiAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLnNldEFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCkgc29ydEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0PigpO1xuICBAT3V0cHV0KCkgYWN0aW9uRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGFUYWJsZUFjdGlvbj4oKTtcbiAgQE91dHB1dCgpIHBhZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgYWxsQ29sdW1uc0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY29sdW1uRGVmaW5pdGlvbkNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uQ2hhbmdlPigpO1xuICBAT3V0cHV0KCkgdmlld0RlZmluaXRpb25DaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbj4oKTtcblxuICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvciwgeyBzdGF0aWM6IGZhbHNlIH0pIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuICBAVmlld0NoaWxkKE1hdFNvcnQsIHsgc3RhdGljOiB0cnVlIH0pIHNvcnQ6IE1hdFNvcnQ7XG5cbiAgcmVhZG9ubHkgQUNUSU9OX0NPTFVNTl9OQU1FID0gJ19fYWN0aW9uX18nO1xuICByZWFkb25seSBTSU5HTEUgPSBEYXRhVGFibGVBY3Rpb25UeXBlLlNJTkdMRTtcbiAgcmVhZG9ubHkgQkFUQ0ggPSBEYXRhVGFibGVBY3Rpb25UeXBlLkJBVENIO1xuICByZWFkb25seSBOT05FID0gRGF0YVRhYmxlQWN0aW9uVHlwZS5OT05FO1xuXG4gIHRhYmxlQWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgcm93QWN0aW9uczogRGF0YVRhYmxlQWN0aW9uW10gPSBbXTtcbiAgY29sdW1uczogRGF0YVRhYmxlQ29sdW1uW10gPSBbXTtcbiAgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgc2VsZWN0ZWQ6IFtdO1xuICBfZm9yY2VNb2RlOiBzdHJpbmc7XG4gIGRpc3BsYXllZERhdGFNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBhY3R1YWxEYXRhTWFwID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueVtdPjtcbiAgc2VsZWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0cnVlKTtcbiAgY29sdW1uSWRzOiBzdHJpbmdbXTtcbiAgYWxsQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXSA9IFtdO1xuICBlZGl0YWJsZUNvbHVtbkRlZmluaXRpb25zOiBEYXRhVGFibGVDb2x1bW5EZWZpbml0aW9uW107XG4gIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnM6IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb25bXTtcbiAgc2VsZWN0ZWRDb2x1bW5EZWZpbmlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgYWxsQXZhaWxhYmxlQ29sdW1uczogRGF0YVRhYmxlQ29sdW1uW107XG4gIHNlbGVjdGVkRGVmaW5pdGlvbjogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbjtcbiAgZGVmYXVsdEFjdGlvbjogRGF0YVRhYmxlQWN0aW9uO1xuICBpc0ZpbHRlckVuYWJsZWQgPSBmYWxzZTtcbiAgaXNQYWdpbmF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICBtb2RlID0gdGhpcy5OT05FO1xuICBpc1Jvd0NsaWNrYWJsZSA9IGZhbHNlO1xuICBzaG93Q29sdW1uTW9kYWwgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGV4dFBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xuXG4gIHBhZ2luYXRvckxlbmd0aCA9IDA7XG4gIHBhZ2luYXRvclBhZ2VJbmRleCA9IDA7XG4gIHBhZ2luYXRvclBhZ2VTaXplID0gNTA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXREaWFsb2c6IE1hdERpYWxvZykge31cblxuICBzdGF0aWMgY29tcGFyZShhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBiOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3J0OiBTb3J0KTogbnVtYmVyIHtcbiAgICBjb25zdCB4ID0gYVtzb3J0LmFjdGl2ZV07XG4gICAgY29uc3QgeSA9IGJbc29ydC5hY3RpdmVdO1xuICAgIGNvbnN0IGFzY2VuZGluZyA9IHNvcnQuZGlyZWN0aW9uID09PSAnYXNjJztcbiAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gRGF0YVRhYmxlQ29tcG9uZW50LmNvbXBhcmVOdW1iZXIoeCwgeSwgYXNjZW5kaW5nKTtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZVN0cmluZyh4LCB5LCBhc2NlbmRpbmcpO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiBEYXRhVGFibGVDb21wb25lbnQuY29tcGFyZUJvb2xlYW4oeCwgeSwgYXNjZW5kaW5nKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGNhbm5vdCBjb21wYXJlIC0+IHJldHVybiBlcXVhbFxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY29tcGFyZU51bWJlcih4OiBudW1iZXIsIHk6IG51bWJlciwgYXNjZW5kaW5nOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYXNjZW5kaW5nID8geCAtIHkgOiB5IC0geDtcbiAgfVxuXG4gIHN0YXRpYyBjb21wYXJlU3RyaW5nKHg6IHN0cmluZywgeTogc3RyaW5nLCBhc2NlbmRpbmc6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBhc2NlbmRpbmcgPyB4LmxvY2FsZUNvbXBhcmUoeSkgOiB5LmxvY2FsZUNvbXBhcmUoeCk7XG4gIH1cblxuICBzdGF0aWMgY29tcGFyZUJvb2xlYW4oeDogYm9vbGVhbiwgeTogYm9vbGVhbiwgYXNjZW5kaW5nOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmIChhc2NlbmRpbmcpIHtcbiAgICAgIC8vIHRydWUgZmlyc3RcbiAgICAgIHJldHVybiB4ID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmYWxzZSBmaXJzdFxuICAgICAgcmV0dXJuIHggPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRyYW5zZm9ybURhdGEodmFsdWU6IGFueSwgdHJhbnNmb3JtZXI6IGFueSwgdHJhbnNmb3JtZXJQYXJhbXM6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0cmFuc2Zvcm1lciB8fCAhKHRyYW5zZm9ybWVyIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lcih2YWx1ZSwgdHJhbnNmb3JtZXJQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIGdlbmVyYXRlUm93SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXVpZFY0KCk7XG4gIH1cblxuICBzdGF0aWMgaXNDbGlja09uUm93TWVudUljb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGV2ZW50Py50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1pY29uJyk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGUgPSB0aGlzLmdldFRhYmxlTW9kZSgpO1xuICAgIHRoaXMuc2V0QWN0aW9ucygpO1xuICAgIGlmICh0aGlzLm1vZGUgIT09IHRoaXMuTk9ORSkge1xuICAgICAgdGhpcy5pc1Jvd0NsaWNrYWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmRlZmF1bHRBY3Rpb24gPSB0aGlzLnJvd0FjdGlvbnNbMF07XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VBc3luYykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgfVxuICB9XG5cbiAgb25Db2x1bW5TZXR0aW5ncyhkZWZpbml0aW9uPzogRGF0YVRhYmxlQ29sdW1uRGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbHVtbk1vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb24gPyBkZWZpbml0aW9uIDogdGhpcy5hbGxDb2x1bW5EZWZpbml0aW9uc1swXTtcbiAgICBpZiAodGhpcy5hbGxBdmFpbGFibGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9wZW5Db2x1bW5Nb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBubyBjb21wbGV0ZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gbG9hZGVkIHlldCBzZW5kIGFuIGV2ZW50IHNvIHRoZSBhcHAgY2FuIGxvYWQgaXRcbiAgICAgIHRoaXMuYWxsQ29sdW1uc0V2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkRGVmaW5pdGlvbiA9IGRlZmluaXRpb247XG4gICAgdGhpcy52aWV3RGVmaW5pdGlvbkNoYW5nZUV2ZW50LmVtaXQoZGVmaW5pdGlvbik7XG4gIH1cblxuICBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb246IERhdGFUYWJsZUNvbHVtbkRlZmluaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZERlZmluaXRpb24gJiYgdGhpcy5zZWxlY3RlZERlZmluaXRpb24uaWQgPT09IGRlZmluaXRpb24uaWQ7XG4gIH1cblxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZCA/IHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubGVuZ3RoIDogMDtcbiAgfVxuXG4gIGdldCByb3dDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEFsbERhdGFTb3VyY2VSb3dzT2ZDdXJyZW50UGFnZSgpID8gdGhpcy5nZXRBbGxEYXRhU291cmNlUm93c09mQ3VycmVudFBhZ2UoKS5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlPy5fcGFnZURhdGEodGhpcy5kYXRhU291cmNlLmRhdGEpO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb3VudChhY3Rpb25UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5zZWxlY3RlZENvdW50O1xuICAgIGlmIChhY3Rpb25UeXBlICE9PSB0aGlzLkJBVENIIHx8IGNvdW50IDwgMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyAoJyArIGNvdW50ICsgJyknO1xuICB9XG5cbiAgaXNEaXNhYmxlZChhY3Rpb25UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgdGhpcy5TSU5HTEU6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgIT09IDE7XG4gICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnQgPCAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uVG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIC8vIGNsZWFyIGFsbCBzZWxlY3Rpb24gZmlyc3RcbiAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLmNsZWFyKCk7XG4gICAgLy8gdG9nZ2xlIGFsbCBjaGVja2JveFxuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSAhdGhpcy5hbGxTZWxlY3RlZDtcbiAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCkge1xuICAgICAgLy8gc2VsZWN0IGFsbCByb3dzIG9mIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAgIHRoaXMuZ2V0QWxsRGF0YVNvdXJjZVJvd3NPZkN1cnJlbnRQYWdlKCkuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdCgnJyArIHJvdy5yb3dJZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1NlbGVjdGVkKHJvd0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvd0lkKTtcbiAgfVxuXG4gIHNldEZpbHRlclZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gdmFsdWU/LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgb25Sb3dDaGVja2JveChldmVudDogTW91c2VFdmVudCwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gbm8gY2xpY2sgZXZlbnQgb24gcm93XG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlbC50b2dnbGUocm93LnJvd0lkKTtcbiAgfVxuXG4gIG9uUm93RXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBhY3Rpb24gPSB0aGlzLmRlZmF1bHRBY3Rpb24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSB0aGlzLkJBVENIOlxuICAgICAgICB0aGlzLm9uUm93Q2hlY2tib3goZXZlbnQsIHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgLy8gZW1pdCB0aGUgZGVmYXVsdCBhY3Rpb24gaWYgdGhlIHJvdyAobm90IHRoZSBpY29uISkgd2FzIGNsaWNrZWRcbiAgICAgICAgaWYgKCEhYWN0aW9uICYmICFEYXRhVGFibGVDb21wb25lbnQuaXNDbGlja09uUm93TWVudUljb24oZXZlbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgICAvLyBpZiBJRC1nZW5lcmF0b3IgaXMgcHJvdmlkZWQsIHJldHVybiB0aGUgSUQsIGVsc2UgcmV0dXJuIHRoZSBBQ1RVQUwgZGF0YVxuICAgICAgICAgIHNlbGVjdGVkLnB1c2godGhpcy5pZEdlbmVyYXRvciA/IHJvdy5yb3dJZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQocm93LnJvd0lkKSk7XG4gICAgICAgICAgdGhpcy5lbWl0VGFibGVBY3Rpb24oYWN0aW9uLCBzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIG1vZGUgaXMgTk9ORSAob3IgbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIG9uU29ydGluZ0V2ZW50KHNvcnQ6IFNvcnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51c2VBc3luYykge1xuICAgICAgdGhpcy5zb3J0RXZlbnQuZW1pdChzb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnRlcm5hbFNvcnQoc29ydCk7XG4gICAgfVxuICB9XG5cbiAgb25QYWdlRXZlbnQoZXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVzZUFzeW5jKSB7XG4gICAgICB0aGlzLnBhZ2VFdmVudC5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBvblRhYmxlQWN0aW9uKHRhYmxlQWN0aW9uOiBEYXRhVGFibGVBY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISF0YWJsZUFjdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RlZCBvZiB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkKSB7XG4gICAgICAgIHNlbGVjdGlvbi5wdXNoKHRoaXMuaWRHZW5lcmF0b3IgPyBzZWxlY3RlZCA6IHRoaXMuYWN0dWFsRGF0YU1hcC5nZXQoc2VsZWN0ZWQpKTtcbiAgICAgIH1cbiAgICAgIHRhYmxlQWN0aW9uLnNlbGVjdGVkID0gc2VsZWN0aW9uO1xuICAgICAgdGhpcy5hY3Rpb25FdmVudC5lbWl0KHRhYmxlQWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRUYWJsZUFjdGlvbihhY3Rpb246IERhdGFUYWJsZUFjdGlvbiwgc2VsZWN0ZWQ6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEFjdGlvbiA9IHsgLi4uYWN0aW9uIH07XG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSB0aGlzLk5PTkUpIHtcbiAgICAgIGVtaXRBY3Rpb24uc2VsZWN0ZWQgPSBbLi4uc2VsZWN0ZWRdO1xuICAgIH1cbiAgICB0aGlzLmFjdGlvbkV2ZW50LmVtaXQoZW1pdEFjdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRGlzcGxheWVkRGF0YUVsZW1lbnQocm93SWQ6IHN0cmluZywgYWN0dWFsRGF0YUVsZW1lbnQ6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUVsZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBkaXNwbGF5ZWREYXRhRWxlbWVudC5yb3dJZCA9IHJvd0lkO1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xuICAgICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhY3R1YWxEYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV07XG4gICAgICBkaXNwbGF5ZWREYXRhRWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV0gPSBEYXRhVGFibGVDb21wb25lbnQudHJhbnNmb3JtRGF0YShcbiAgICAgICAgYWN0dWFsVmFsdWUsXG4gICAgICAgIGNvbHVtbi50cmFuc2Zvcm1lcixcbiAgICAgICAgY29sdW1uLnRyYW5zZm9ybWVyUGFyYW1zLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXllZERhdGFFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcm5hbFNvcnQoc29ydDogU29ydCkge1xuICAgIGNvbnN0IHNvcnRlZERhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGFdLnNvcnQoKGEsIGIpID0+IERhdGFUYWJsZUNvbXBvbmVudC5jb21wYXJlKGEsIGIsIHNvcnQpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi5zb3J0ZWREYXRhXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRhYmxlQWN0aW9ucyA9IFtdO1xuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMubW9kZSAhPT0gYWN0aW9uLmhpZGRlbkluTW9kZSkge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSB0aGlzLlNJTkdMRTpcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IHRoaXMuU0lOR0xFKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIHRoaXMuQkFUQ0g6XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlICE9PSB0aGlzLlNJTkdMRSkge1xuICAgICAgICAgICAgICB0aGlzLnRhYmxlQWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy50YWJsZUFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhTWFwc0FuZFNldERpc3BsYXllZERhdGFTb3VyY2VEYXRhKGRhdGE6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YUxpc3QgPSBbXTtcbiAgICB0aGlzLmFjdHVhbERhdGFNYXAuY2xlYXIoKTtcbiAgICB0aGlzLmRpc3BsYXllZERhdGFNYXAuY2xlYXIoKTtcbiAgICBpZiAoZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBkYXRhRW50cnkgb2YgZGF0YSkge1xuICAgICAgICBjb25zdCByb3dJZCA9IHRoaXMuaWRHZW5lcmF0b3IgPyB0aGlzLmlkR2VuZXJhdG9yKGRhdGFFbnRyeSkgOiBEYXRhVGFibGVDb21wb25lbnQuZ2VuZXJhdGVSb3dJZCgpO1xuICAgICAgICB0aGlzLmFjdHVhbERhdGFNYXAuc2V0KHJvd0lkLCBkYXRhRW50cnkpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ZWREYXRhRWxlbWVudCA9IHRoaXMuZ2VuZXJhdGVEaXNwbGF5ZWREYXRhRWxlbWVudChyb3dJZCwgZGF0YUVudHJ5KTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhTWFwLnNldChyb3dJZCwgZGlzcGxheWVkRGF0YUVsZW1lbnQpO1xuICAgICAgICBkaXNwbGF5ZWREYXRhTGlzdC5wdXNoKGRpc3BsYXllZERhdGFFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkaXNwbGF5ZWREYXRhTGlzdDtcbiAgICB0aGlzLnVuc2V0UGFnZVNpemVJZk5lY2Vzc2FyeSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nRGF0YTogRGF0YVRhYmxlRGlhbG9nRGF0YSA9IHtcbiAgICAgIGFsbENvbHVtbnM6IHRoaXMuYWxsQXZhaWxhYmxlQ29sdW1ucyxcbiAgICAgIGRlZmluaXRpb246IHRoaXMuc2VsZWN0ZWREZWZpbml0aW9uLFxuICAgICAgZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQ6IHRoaXMuZGVsZXRlRGVmaW5pdGlvbkFsbG93ZWQsXG4gICAgICBmaWx0ZXJDb2x1bW5zTGFiZWw6IHRoaXMuZmlsdGVyQ29sdW1uc0xhYmVsLFxuICAgICAgZmlsdGVyQ29sdW1uc1BsYWNlSG9sZGVyOiB0aGlzLmZpbHRlckNvbHVtbnNQbGFjZUhvbGRlcixcbiAgICAgIG5vRGF0YVRleHQ6IHRoaXMubm9EYXRhVGV4dCxcbiAgICAgIHRpdGxlTGFiZWw6IHRoaXMuY29sdW1uU2V0dGluZ3NNb2RhbFRpdGxlTGFiZWwsXG4gICAgICBzZWxlY3RlZExhYmVsOiB0aGlzLnNlbGVjdGVkTGFiZWwsXG4gICAgICBhdmFpbGFibGVMYWJlbDogdGhpcy5hdmFpbGFibGVMYWJlbCxcbiAgICAgIHNhdmVMYWJlbDogdGhpcy5zYXZlTGFiZWwsXG4gICAgICBkZWxldGVMYWJlbDogdGhpcy5kZWxldGVMYWJlbCxcbiAgICAgIGNhbmNlbExhYmVsOiB0aGlzLmNhbmNlbExhYmVsLFxuICAgICAgaW5mb1RleHRMYWJlbDogdGhpcy5pbmZvVGV4dExhYmVsLFxuICAgIH07XG4gICAgY29uc3QgZGlhbG9nID0gdGhpcy5tYXREaWFsb2cub3BlbihEYXRhVGFibGVDb2x1bW5zTW9kYWxDb21wb25lbnQsIHsgZGF0YTogZGlhbG9nRGF0YSB9KTtcbiAgICBkaWFsb2cuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgIC8vIG5vIGV2ZW50IG9uIENBTkNFTFxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLmNvbHVtbkRlZmluaXRpb25DaGFuZ2VFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRhYmxlTW9kZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9mb3JjZU1vZGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mb3JjZU1vZGU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFjdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLk5PTkU7XG4gICAgfVxuICAgIGNvbnN0IGRpc3RpbmN0QWN0aW9uVHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHJvd0FjdGlvbiBvZiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgIGRpc3RpbmN0QWN0aW9uVHlwZXMuYWRkKHJvd0FjdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuQkFUQ0gpKSB7XG4gICAgICByZXR1cm4gdGhpcy5CQVRDSDtcbiAgICB9XG4gICAgaWYgKGRpc3RpbmN0QWN0aW9uVHlwZXMuaGFzKHRoaXMuU0lOR0xFKSkge1xuICAgICAgcmV0dXJuIHRoaXMuU0lOR0xFO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5OT05FO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnNldFBhZ2VTaXplSWZOZWNlc3NhcnkoKSB7XG4gICAgaWYgKCF0aGlzLnVzZUFzeW5jICYmICF0aGlzLmlzUGFnaW5hdGlvbkVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRhdGFDb3VudCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhID8gdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoIDogMDtcbiAgICAgIHRoaXMucGFnaW5hdG9yUGFnZVNpemUgPSBkYXRhQ291bnQ7XG4gICAgICB0aGlzLnBhZ2luYXRvckxlbmd0aCA9IGRhdGFDb3VudDtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWFjdGlvbi1iYXJcIj5cbiAgPCEtLSBUYWJsZSBhY3Rpb25zOiBkaXNwbGF5ZWQgYmVmb3JlIHRoZSB0YWJsZSAtLT5cbiAgPGRpdiAqbmdJZj1cInRhYmxlQWN0aW9ucz8ubGVuZ3RoXCI+XG4gICAgPG1hZC1vdXRsaW5lLWJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQodGFibGVBY3Rpb24udHlwZSlcIlxuICAgICAgY2xhc3M9XCJ0YWJsZS1hY3Rpb25cIlxuICAgICAgKm5nRm9yPVwibGV0IHRhYmxlQWN0aW9uIG9mIHRhYmxlQWN0aW9uc1wiXG4gICAgICAoY2xpY2spPVwib25UYWJsZUFjdGlvbih0YWJsZUFjdGlvbilcIj5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/ICh0YWJsZUFjdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiB0YWJsZUFjdGlvbi5sYWJlbCB9fSB7eyBnZXRTZWxlY3RlZENvdW50KHRhYmxlQWN0aW9uLnR5cGUpIH19XG4gICAgPC9tYWQtb3V0bGluZS1idXR0b24+XG4gIDwvZGl2PlxuICA8IS0tIFRhYmxlIGZpbHRlciAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwiaXNGaWx0ZXJFbmFibGVkXCI+XG4gICAgPG1hdC1sYWJlbD57eyB0cmFuc2xhdGVMYWJlbHMgPyAoZmlsdGVyTGFiZWwgfCB0cmFuc2xhdGUpIDogZmlsdGVyTGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGtleXVwKT1cInNldEZpbHRlclZhbHVlKCRldmVudD8udGFyZ2V0Py52YWx1ZSlcIlxuICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGZpbHRlclBsYWNlaG9sZGVyIH19XCIgLz5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuXG5cbjwhLS0gUm93IGFjdGlvbiBtZW51IC0tPlxuPG1hdC1tZW51ICNyb3dBY3Rpb25NZW51PVwibWF0TWVudVwiPlxuICA8bmctdGVtcGxhdGUgbWF0TWVudUNvbnRlbnQgbGV0LWVsZW1lbnQ9XCJlbGVtZW50XCI+XG4gICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgcm93QWN0aW9uIG9mIHJvd0FjdGlvbnNcIiBtYXQtbWVudS1pdGVtIGNsYXNzPVwicm93LWFjdGlvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIGVsZW1lbnQsIHJvd0FjdGlvbilcIj5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChyb3dBY3Rpb24ubGFiZWwgfCB0cmFuc2xhdGUpIDogcm93QWN0aW9uLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L21hdC1tZW51PlxuXG48IS0tIGVkaXRhYmxlIGRlZmluaXRpb24gbWVudSAtLT5cbjxtYXQtbWVudSAjZWRpdGFibGVEZWZpbml0aW9uTWVudT1cIm1hdE1lbnVcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50PlxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IGRlZmluaXRpb24gb2YgZWRpdGFibGVDb2x1bW5EZWZpbml0aW9uc1wiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICBjbGFzcz1cInJvdy1hY3Rpb25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ29sdW1uU2V0dGluZ3MoZGVmaW5pdGlvbilcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydhY3RpdmUtY29sdW1uLWRlZmluaXRpb24nOiBpc0N1cnJlbnREZWZpbml0aW9uKGRlZmluaXRpb24pfVwiXG4gICAgPlxuICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGRlZmluaXRpb24ubGFiZWwgfCB0cmFuc2xhdGUpIDogZGVmaW5pdGlvbi5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSB2aWV3YWJsZSBkZWZpbml0aW9uIG1lbnUgLS0+XG48bWF0LW1lbnUgI3ZpZXdhYmxlRGVmaW5pdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gIDxuZy10ZW1wbGF0ZSBtYXRNZW51Q29udGVudD5cbiAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBkZWZpbml0aW9uIG9mIHZpZXdhYmxlQ29sdW1uRGVmaW5pdGlvbnNcIlxuICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgY2xhc3M9XCJyb3ctYWN0aW9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblZpZXdEZWZpbml0aW9uKGRlZmluaXRpb24pXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnYWN0aXZlLWNvbHVtbi1kZWZpbml0aW9uJzogaXNDdXJyZW50RGVmaW5pdGlvbihkZWZpbml0aW9uKX1cIlxuICAgID5cbiAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChkZWZpbml0aW9uLmxhYmVsIHwgdHJhbnNsYXRlKSA6IGRlZmluaXRpb24ubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gVGFibGUgLS0+XG48ZGl2ICpuZ0lmPVwicm93Q291bnQgPiAwOyBlbHNlIG5vRGF0YVwiIGNsYXNzPVwiZGF0YXRhYmxlXCIgW2NsYXNzXT1cInRhYmxlQ2xhc3NcIj5cbiAgPGRpdiBjbGFzcz1cIm1hZC1kYXRhdGFibGUtc3Bpbm5lci13cmFwcGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICA8L2Rpdj5cblxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIiBtYXRTb3J0IChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydGluZ0V2ZW50KCRldmVudClcIj5cbiAgICA8IS0tIFJvdyBhY3Rpb25zIGNvbHVtbi0tPlxuICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJBQ1RJT05fQ09MVU1OX05BTUVcIj5cbiAgICAgIDx0aCBzY29wZT1cImNvbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cInJvdy1hY3Rpb24tYnV0dG9uXCI+XG4gICAgICAgIDwhLS0gQkFUQ0g6IG1hc3RlciBjaGVja2JveCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09IEJBVENIXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEUgLyBOT05FOiBub3RoaW5nIGluIGhlYWRlciByb3cgLS0+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBjbGFzcz1cInJvdy1hY3Rpb24tYnV0dG9uXCI+XG4gICAgICAgIDwhLS0gQkFUQ0g6IHJvdyBjaGVja2JveCAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09IEJBVENIXCIgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NoZWNrYm94KCRldmVudCwgZWxlbWVudC5yb3dJZClcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChlbGVtZW50LnJvd0lkKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBTSU5HTEU6IHJvdyBhY3Rpb24gbWVudSBpY29uIC0tPlxuICAgICAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJtb2RlID09PSBTSU5HTEVcIlxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckRhdGFdPVwieyBlbGVtZW50OiBlbGVtZW50IH1cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwicm93QWN0aW9uTWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICAgICAgPC9tYWQtaWNvbi1idXR0b24+XG4gICAgICAgIDwhLS0gTk9ORTogbm90aGluZyAtLT5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBDb2x1bW5zIHdpdGggZGF0YSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLmlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmlzU29ydGFibGU7IGVsc2Ugbm9Tb3J0XCI+XG4gICAgICAgIDx0aFxuICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxuICAgICAgICAgIG1hdC1zb3J0LWhlYWRlcj1cInt7IGNvbHVtbi5vcmRlckJ5TmFtZT8gY29sdW1uLm9yZGVyQnlOYW1lIDogY29sdW1uLmRhdGFQcm9wZXJ0eU5hbWUgfX1cIlxuICAgICAgICAgIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZCA/ICdiZWZvcmUnIDogJ2FmdGVyJ1wiXG4gICAgICAgICAgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRyYW5zbGF0ZUxhYmVscyA/IChjb2x1bW4ubGFiZWwgfCB0cmFuc2xhdGUpIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgIDwvdGg+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Tb3J0PlxuICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLnRleHQtcmlnaHRdPVwiY29sdW1uLmlzUmlnaHRBbGlnbmVkXCI+XG4gICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzID8gKGNvbHVtbi5sYWJlbCB8IHRyYW5zbGF0ZSkgOiBjb2x1bW4ubGFiZWwgfX1cbiAgICAgICAgPC90aD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIFtjbGFzcy50ZXh0LXJpZ2h0XT1cImNvbHVtbi5pc1JpZ2h0QWxpZ25lZFwiIFtuZ1N3aXRjaF09XCJjb2x1bW4udHJhbnNmb3JtZXJcIj5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3sgZWxlbWVudFtjb2x1bW4uZGF0YVByb3BlcnR5TmFtZV0gfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkc1wiPjwvdHI+XG4gICAgPHRyXG4gICAgICBtYXQtcm93XG4gICAgICBbY2xhc3MuY2xpY2thYmxlLXRhYmxlLXJvd109XCJpc1Jvd0NsaWNrYWJsZVwiXG4gICAgICAoY2xpY2spPVwib25Sb3dFdmVudCgkZXZlbnQsIHJvdylcIlxuICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkc1wiXG4gICAgPjwvdHI+XG4gIDwvdGFibGU+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtYWQtZGF0YS10YWJsZS1ib3R0b20tYXJlYVwiPlxuICA8ZGl2IGNsYXNzPVwibWFkLWRhdGEtdGFibGUtYm90dG9tLWluZm8tYXJlYVwiPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiAxIGRlZmluaXRpb24gLS0+XG4gICAgPG1hZC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJ0aGlzLmVkaXRhYmxlQ29sdW1uRGVmaW5pdGlvbnM/Lmxlbmd0aCA9PSAxXCJcbiAgICAgIChjbGljayk9XCJvbkNvbHVtblNldHRpbmdzKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHNldHRpbmdzOiBtdWx0aXBsZSBkZWZpbml0aW9ucyAtLT5cbiAgICA8bWFkLWljb24tYnV0dG9uXG4gICAgICAqbmdJZj1cInRoaXMuZWRpdGFibGVDb2x1bW5EZWZpbml0aW9ucz8ubGVuZ3RoID4gMFwiIFttYXRNZW51VHJpZ2dlckZvcl09XCJlZGl0YWJsZURlZmluaXRpb25NZW51XCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgIDwvbWFkLWljb24tYnV0dG9uPlxuICAgIDwhLS0gY29sdW1uIHZpZXc6IG11bHRpcGxlIGRlZmluaXRpb25zIC0tPlxuICAgIDxtYWQtaWNvbi1idXR0b25cbiAgICAgICpuZ0lmPVwidGhpcy52aWV3YWJsZUNvbHVtbkRlZmluaXRpb25zPy5sZW5ndGggPiAwXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInZpZXdhYmxlRGVmaW5pdGlvbk1lbnVcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5wcmV2aWV3PC9tYXQtaWNvbj5cbiAgICA8L21hZC1pY29uLWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICA8bWF0LXBhZ2luYXRvclxuICAgIFtzdHlsZS5kaXNwbGF5XT1cImlzUGFnaW5hdGlvbkVuYWJsZWQgPyAnYmxvY2snIDogJ25vbmUnXCJcbiAgICBbbGVuZ3RoXT1cInBhZ2luYXRvckxlbmd0aFwiXG4gICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0b3JQYWdlSW5kZXhcIlxuICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0b3JQYWdlU2l6ZVwiXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIlxuICAgIChwYWdlKT1cIm9uUGFnZUV2ZW50KCRldmVudClcIlxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zXG4gID5cbiAgPC9tYXQtcGFnaW5hdG9yPlxuPC9kaXY+XG5cbjwhLS0gTm8gZGF0YSBhbGVydCAtLT5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8ZGl2IGNsYXNzPVwibm9EYXRhVGV4dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYWQtZGF0YXRhYmxlLXNwaW5uZXItd3JhcHBlclwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0cm9rZVdpZHRoXT1cIjNcIj48L21hdC1zcGlubmVyPlxuICAgIDwvZGl2PlxuICAgIHt7IG5vRGF0YVRleHQgfX1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -1879,6 +1879,7 @@ class DataTableComponent {
1879
1879
  this.actions = [];
1880
1880
  this.deleteDefinitionAllowed = false;
1881
1881
  this.useAsync = false;
1882
+ this.translateLabels = true;
1882
1883
  this.sortEvent = new EventEmitter();
1883
1884
  this.actionEvent = new EventEmitter();
1884
1885
  this.pageEvent = new EventEmitter();
@@ -2032,8 +2033,10 @@ class DataTableComponent {
2032
2033
  }
2033
2034
  }
2034
2035
  ngAfterViewInit() {
2035
- this.dataSource.paginator = this.paginator;
2036
- this.dataSource.sort = this.sort;
2036
+ if (!this.useAsync) {
2037
+ this.dataSource.paginator = this.paginator;
2038
+ this.dataSource.sort = this.sort;
2039
+ }
2037
2040
  }
2038
2041
  onColumnSettings(definition) {
2039
2042
  this.showColumnModal = true;
@@ -2258,10 +2261,10 @@ class DataTableComponent {
2258
2261
  }
2259
2262
  }
2260
2263
  DataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: DataTableComponent, deps: [{ token: i1$4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
2261
- DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: DataTableComponent, selector: "mad-data-table", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", pageSizeOptions: "pageSizeOptions", externalFilter: "externalFilter", actions: "actions", idGenerator: "idGenerator", deleteDefinitionAllowed: "deleteDefinitionAllowed", useAsync: "useAsync", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", tableData: "tableData", page: "page", columnDefinitions: "columnDefinitions", loading: "loading", defaultPageSize: "defaultPageSize", externalPaginator: "externalPaginator", paginationEnabled: "paginationEnabled", allColumns: "allColumns", filterEnabled: "filterEnabled", forceMode: "forceMode" }, outputs: { sortEvent: "sortEvent", actionEvent: "actionEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label | translate }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label | translate }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i6$1.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2264
+ DataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.2", type: DataTableComponent, selector: "mad-data-table", inputs: { filterLabel: "filterLabel", filterPlaceholder: "filterPlaceholder", filterColumnsLabel: "filterColumnsLabel", filterColumnsPlaceHolder: "filterColumnsPlaceHolder", noDataText: "noDataText", columnSettingsModalTitleLabel: "columnSettingsModalTitleLabel", selectedLabel: "selectedLabel", availableLabel: "availableLabel", saveLabel: "saveLabel", deleteLabel: "deleteLabel", cancelLabel: "cancelLabel", infoTextLabel: "infoTextLabel", tableClass: "tableClass", pageSizeOptions: "pageSizeOptions", externalFilter: "externalFilter", actions: "actions", idGenerator: "idGenerator", deleteDefinitionAllowed: "deleteDefinitionAllowed", useAsync: "useAsync", translateLabels: "translateLabels", displayedColumns: "displayedColumns", displayedColumnDefinition: "displayedColumnDefinition", tableData: "tableData", page: "page", columnDefinitions: "columnDefinitions", loading: "loading", defaultPageSize: "defaultPageSize", externalPaginator: "externalPaginator", paginationEnabled: "paginationEnabled", allColumns: "allColumns", filterEnabled: "filterEnabled", forceMode: "forceMode" }, outputs: { sortEvent: "sortEvent", actionEvent: "actionEvent", pageEvent: "pageEvent", allColumnsEvent: "allColumnsEvent", columnDefinitionChangeEvent: "columnDefinitionChangeEvent", viewDefinitionChangeEvent: "viewDefinitionChangeEvent" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }], ngImport: i0, template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i6.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: i6$1.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8$1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: OutlineButtonComponent, selector: "mad-outline-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: IconButtonComponent, selector: "mad-icon-button", inputs: ["type", "disabled", "title"] }, { kind: "component", type: i13.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
2262
2265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImport: i0, type: DataTableComponent, decorators: [{
2263
2266
  type: Component,
2264
- args: [{ selector: 'mad-data-table', template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ tableAction.label | translate }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ filterLabel | translate }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ rowAction.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ definition.label | translate }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ column.label | translate }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ column.label | translate }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"] }]
2267
+ args: [{ selector: 'mad-data-table', template: "<div class=\"mad-datatable-action-bar\">\n <!-- Table actions: displayed before the table -->\n <div *ngIf=\"tableActions?.length\">\n <mad-outline-button\n [disabled]=\"isDisabled(tableAction.type)\"\n class=\"table-action\"\n *ngFor=\"let tableAction of tableActions\"\n (click)=\"onTableAction(tableAction)\">\n {{ translateLabels ? (tableAction.label | translate) : tableAction.label }} {{ getSelectedCount(tableAction.type) }}\n </mad-outline-button>\n </div>\n <!-- Table filter -->\n <mat-form-field *ngIf=\"isFilterEnabled\">\n <mat-label>{{ translateLabels ? (filterLabel | translate) : filterLabel }}</mat-label>\n <input matInput autocomplete=\"off\" (keyup)=\"setFilterValue($event?.target?.value)\"\n placeholder=\"{{ filterPlaceholder }}\" />\n </mat-form-field>\n</div>\n\n\n<!-- Row action menu -->\n<mat-menu #rowActionMenu=\"matMenu\">\n <ng-template matMenuContent let-element=\"element\">\n <button *ngFor=\"let rowAction of rowActions\" mat-menu-item class=\"row-action\"\n (click)=\"onRowEvent($event, element, rowAction)\">\n {{ translateLabels ? (rowAction.label | translate) : rowAction.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- editable definition menu -->\n<mat-menu #editableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of editableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onColumnSettings(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- viewable definition menu -->\n<mat-menu #viewableDefinitionMenu=\"matMenu\">\n <ng-template matMenuContent>\n <button *ngFor=\"let definition of viewableColumnDefinitions\"\n mat-menu-item\n class=\"row-action\"\n (click)=\"onViewDefinition(definition)\"\n [ngClass]=\"{'active-column-definition': isCurrentDefinition(definition)}\"\n >\n {{ translateLabels ? (definition.label | translate) : definition.label }}\n </button>\n </ng-template>\n</mat-menu>\n\n<!-- Table -->\n<div *ngIf=\"rowCount > 0; else noData\" class=\"datatable\" [class]=\"tableClass\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n\n <table mat-table [dataSource]=\"dataSource\" matSort (matSortChange)=\"onSortingEvent($event)\">\n <!-- Row actions column-->\n <ng-container [matColumnDef]=\"ACTION_COLUMN_NAME\">\n <th scope=\"col\" mat-header-cell *matHeaderCellDef class=\"row-action-button\">\n <!-- BATCH: master checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (change)=\"onToggleSelectAll()\"\n [checked]=\"allSelected\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE / NONE: nothing in header row -->\n </th>\n <td mat-cell *matCellDef=\"let element\" class=\"row-action-button\">\n <!-- BATCH: row checkbox -->\n <div *ngIf=\"mode === BATCH\" class=\"mad-datatable-checkbox-container\">\n <mat-checkbox\n (click)=\"onRowCheckbox($event, element.rowId)\"\n [checked]=\"isSelected(element.rowId)\"\n >\n </mat-checkbox>\n </div>\n <!-- SINGLE: row action menu icon -->\n <mad-icon-button\n *ngIf=\"mode === SINGLE\"\n [matMenuTriggerData]=\"{ element: element }\" [matMenuTriggerFor]=\"rowActionMenu\"\n >\n <mat-icon>more_vert</mat-icon>\n </mad-icon-button>\n <!-- NONE: nothing -->\n </td>\n </ng-container>\n <!-- Columns with data -->\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"column.id\">\n <ng-container *ngIf=\"column.isSortable; else noSort\">\n <th\n scope=\"col\"\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header=\"{{ column.orderByName? column.orderByName : column.dataPropertyName }}\"\n [arrowPosition]=\"column.isRightAligned ? 'before' : 'after'\"\n [class.text-right]=\"column.isRightAligned\"\n >\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-container>\n <ng-template #noSort>\n <th scope=\"col\" mat-header-cell *matHeaderCellDef [class.text-right]=\"column.isRightAligned\">\n {{ translateLabels ? (column.label | translate) : column.label }}\n </th>\n </ng-template>\n <td mat-cell *matCellDef=\"let element\" [class.text-right]=\"column.isRightAligned\" [ngSwitch]=\"column.transformer\">\n <span>\n {{ element[column.dataPropertyName] }}\n </span>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"columnIds\"></tr>\n <tr\n mat-row\n [class.clickable-table-row]=\"isRowClickable\"\n (click)=\"onRowEvent($event, row)\"\n *matRowDef=\"let row; columns: columnIds\"\n ></tr>\n </table>\n</div>\n<div class=\"mad-data-table-bottom-area\">\n <div class=\"mad-data-table-bottom-info-area\">\n <!-- column settings: 1 definition -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length == 1\"\n (click)=\"onColumnSettings()\"\n >\n <mat-icon class=\"material-icons-outlined\">view_column</mat-icon>\n </mad-icon-button>\n <!-- column settings: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.editableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"editableDefinitionMenu\"\n >\n <mat-icon>view_column</mat-icon>\n </mad-icon-button>\n <!-- column view: multiple definitions -->\n <mad-icon-button\n *ngIf=\"this.viewableColumnDefinitions?.length > 0\" [matMenuTriggerFor]=\"viewableDefinitionMenu\"\n >\n <mat-icon>preview</mat-icon>\n </mad-icon-button>\n </div>\n\n <!-- Pagination -->\n <mat-paginator\n [style.display]=\"isPaginationEnabled ? 'block' : 'none'\"\n [length]=\"paginatorLength\"\n [pageIndex]=\"paginatorPageIndex\"\n [pageSize]=\"paginatorPageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n (page)=\"onPageEvent($event)\"\n showFirstLastButtons\n >\n </mat-paginator>\n</div>\n\n<!-- No data alert -->\n<ng-template #noData>\n <div class=\"noDataText\">\n <div class=\"mad-datatable-spinner-wrapper\" *ngIf=\"isLoading\">\n <mat-spinner [diameter]=\"50\" [strokeWidth]=\"3\"></mat-spinner>\n </div>\n {{ noDataText }}\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;min-height:112px;flex:1 1 auto;background-color:#fff}.datatable-vertical-stretch-to-parent{flex:1;max-height:100%;width:100%;display:flex;flex-direction:column}.datatable-max-height-500{max-height:500px}.datatable-max-height-300{max-height:300px}.datatable-max-height,.datatable-max-height-500,.datatable-max-height-300{flex:1;width:100%;display:flex;flex-direction:column}.datatable{overflow:auto;flex:1 1 auto;height:100%;position:relative;width:100%}.datatable table{max-height:100%;width:100%}.datatable th,.datatable td{overflow:hidden;width:auto;text-overflow:ellipsis;white-space:nowrap}.text-right{text-align:right!important;padding-right:24px!important}.table-action{margin-right:.5em;margin-bottom:.5em}.row-action-button{width:10px}.noDataText{width:100%;text-align:center;position:relative}.mad-datatable-action-bar{display:flex;justify-content:space-between;align-items:baseline}.mad-datatable-checkbox-container{margin-right:16px}.mad-datatable-spinner-wrapper{background-color:#fff;opacity:.8;position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:99999;pointer-events:unset}.mad-data-table-bottom-area{display:flex;flex-direction:row}.mad-data-table-bottom-area .mad-data-table-bottom-info-area{display:flex;flex:1}.mat-header-row th{position:sticky;top:0;background-color:#fff;z-index:1}.active-column-definition{color:#000;background-color:#f5f5f5}\n"] }]
2265
2268
  }], ctorParameters: function () { return [{ type: i1$4.MatDialog }]; }, propDecorators: { filterLabel: [{
2266
2269
  type: Input
2267
2270
  }], filterPlaceholder: [{
@@ -2300,6 +2303,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.2", ngImpor
2300
2303
  type: Input
2301
2304
  }], useAsync: [{
2302
2305
  type: Input
2306
+ }], translateLabels: [{
2307
+ type: Input
2303
2308
  }], displayedColumns: [{
2304
2309
  type: Input
2305
2310
  }], displayedColumnDefinition: [{