UNPKG

ontimize-web-ngx

Version:
159 lines 43.9 kB
import { moveItemInArray } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Injector, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { DialogService } from '../../../../../services/dialog.service'; import { OTranslateService } from '../../../../../services/translate/o-translate.service'; import { Codes } from '../../../../../util/codes'; import { Util } from '../../../../../util/util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@angular/common"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/flex-layout/extended"; import * as i5 from "@angular/material/button"; import * as i6 from "@angular/material/icon"; import * as i7 from "@angular/material/list"; import * as i8 from "@angular/material/divider"; import * as i9 from "@angular/cdk/drag-drop"; import * as i10 from "../../../../../pipes/o-translate.pipe"; export class OTableVisibleColumnsDialogComponent { constructor(injector, dialogRef, data) { this.injector = injector; this.dialogRef = dialogRef; this.columns = []; this.rowHeight = Codes.DEFAULT_ROW_HEIGHT; this.activeColumnValueFilters = []; this.activeSortColumns = []; this.activeGroupByColumns = []; this.dialogService = this.injector.get(DialogService); this.cd = this.injector.get(ChangeDetectorRef); this.translateService = this.injector.get(OTranslateService); if (Util.isDefined(data.table)) { this.table = data.table; const visibleColumns = Util.parseArray(this.table.visibleColumns, true); const nonHidableColumns = Util.parseArray(this.table.nonHidableColumns, true); this.table.oTableOptions.columns.filter(oCol => (visibleColumns.indexOf(oCol.attr) !== -1 || oCol.definition !== undefined) && nonHidableColumns.indexOf(oCol.attr) === -1).forEach((oCol) => { this.columns.push({ attr: oCol.attr, title: oCol.title, visible: oCol.visible }); }); this.rowHeight = this.table.rowHeight; this.activeColumnValueFilters = this.table.dataSource.getColumnValueFilters().map(colValueFilter => colValueFilter.attr); this.activeSortColumns = this.table.sortColArray.map(col => col.columnName); this.activeGroupByColumns = this.table.groupedColumnsArray; } } onClickColumn(col) { const activeColFilter = this.activeColumnValueFilters.includes(col.attr); const activeSorting = this.activeSortColumns.includes(col.attr); const activeGrouping = this.activeGroupByColumns.includes(col.attr); if (col.visible && (activeColFilter || activeSorting || activeGrouping)) { const warnArgs = []; if (activeColFilter) { warnArgs.push(this.translateService.get('TABLE.VISIBLE_COLUMNS_DIALOG.VALUE_FILTER_WARN')); } if (activeSorting) { warnArgs.push(this.translateService.get('TABLE.VISIBLE_COLUMNS_DIALOG.SORT_WARN')); } if (activeGrouping) { warnArgs.push(this.translateService.get('TABLE.VISIBLE_COLUMNS_DIALOG.GROUPING_WARN')); } const dialogText = this.translateService.get('TABLE.VISIBLE_COLUMNS_DIALOG.HIDE_COLUMN_WARNING', warnArgs); this.dialogService.confirm('CONFIRM', dialogText).then(res => { if (res) { col.deleteValueFilter = activeColFilter; col.deleteSortColummn = activeSorting; col.deleteGrupingColumn = activeGrouping; col.visible = !col.visible; this.cd.detectChanges(); } }); } else { col.visible = !col.visible; if (col.visible) { col.deleteValueFilter = false; col.deleteSortColummn = false; col.deleteGrupingColumn = false; } } } drop(event) { moveItemInArray(this.columns, event.previousIndex, event.currentIndex); } closeDialog() { const columnSortingToRemove = this.getColumnSortingToRemove(); const newSortColumns = columnSortingToRemove.length > 0 ? this.table.sortColArray.filter(col => !columnSortingToRemove.includes(col.columnName)) : undefined; const columnGroupingToRemove = this.getColumnGroupingToRemove(); const newGroupColumns = columnGroupingToRemove.length > 0 ? this.table.groupedColumnsArray.filter(col => !columnGroupingToRemove.includes(col)) : undefined; const columnsOrder = this.getColumnsOrder(); this.dialogRef.close({ visibleColArray: this.getVisibleColumns().sort((a, b) => columnsOrder.indexOf(a) - columnsOrder.indexOf(b)), columnsOrder: columnsOrder, sortColumns: newSortColumns, columnValueFiltersToRemove: this.getColumnValueFiltersToRemove(), groupColumns: newGroupColumns }); } getVisibleColumns() { const nonHidableColumns = Util.parseArray(this.table.nonHidableColumns, true); const visibleFromDialog = this.columns .filter(col => col.visible) .map(col => col.attr); const allVisibleAttrs = new Set([...visibleFromDialog, ...nonHidableColumns]); return this.table.oTableOptions.columns .filter(oCol => allVisibleAttrs.has(oCol.attr)) .map(oCol => oCol.attr); } getColumnsOrder() { const originalOrder = this.table.oTableOptions.columns.map(col => col.attr); const dialogColumnsOrder = this.columns.map(col => col.attr); const columnsNotInDialog = originalOrder.filter(attr => !dialogColumnsOrder.includes(attr)); const newOrder = []; for (const dialogAttr of dialogColumnsOrder) { const dialogOriginalPos = originalOrder.indexOf(dialogAttr); for (const notInDialogAttr of columnsNotInDialog) { const notInDialogOriginalPos = originalOrder.indexOf(notInDialogAttr); if (notInDialogOriginalPos < dialogOriginalPos && !newOrder.includes(notInDialogAttr)) { newOrder.push(notInDialogAttr); } } newOrder.push(dialogAttr); } for (const notInDialogAttr of columnsNotInDialog) { if (!newOrder.includes(notInDialogAttr)) { newOrder.push(notInDialogAttr); } } return newOrder; } getColumnValueFiltersToRemove() { return this.columns.filter(col => col.deleteValueFilter).map(col => col.attr); } getColumnSortingToRemove() { return this.columns.filter(col => col.deleteSortColummn).map(col => col.attr); } getColumnGroupingToRemove() { return this.columns.filter(col => col.deleteGrupingColumn).map(col => col.attr); } } OTableVisibleColumnsDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableVisibleColumnsDialogComponent, deps: [{ token: i0.Injector }, { token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); OTableVisibleColumnsDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OTableVisibleColumnsDialogComponent, selector: "o-table-visible-columns-dialog", host: { properties: { "class.o-table-visible-columns-dialog": "true" } }, ngImport: i0, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.COLVIS' | oTranslate }}</span>\n\n\n<mat-dialog-content>\n <div mat-subheader>{{'TABLE.VISIBLE_COLUMNS.DESCRIPTION' | oTranslate}}</div>\n\n <div [ngClass]=\"rowHeight\">\n <mat-list cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item *ngFor=\"let column of columns\" cdkDrag (click)=\"onClickColumn(column)\" [ngClass]=\"{'column-hidden':!column.visible}\"\n class=\"o-drag-list-item-box\">\n <div fxLayout=\"row\" fxFlex fxLayoutAlign=\"stretch center\">\n <mat-icon matListItemIcon svgIcon=\"ontimize:drag_handle\"></mat-icon>\n <span matListItemLine fxFlex>{{ (column.title || column.attr) | oTranslate }}</span>\n <mat-icon *ngIf=\"column.visible\" svgIcon=\"ontimize:visibility\" color=\"primary\"></mat-icon>\n <mat-icon *ngIf=\"!column.visible\" svgIcon=\"ontimize:visibility_off\"></mat-icon>\n </div>\n <mat-divider></mat-divider>\n </mat-list-item>\n </mat-list>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayoutAlign=\"end center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"null\" class=\"o-button-default cancel\" cancel>{{ 'CANCEL' | oTranslate }}</button>\n <button type=\"button\" mat-stroked-button (click)=\"closeDialog()\" class=\"o-button-primary\">{{ 'ACCEPT' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content{padding-top:0;margin-top:24px;overflow:hidden}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-subheader{display:block}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .title_list{font-weight:600;margin-bottom:6px;margin-top:12px}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .cdk-drop-list{padding:0}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list{max-height:calc(80vh - 150px);overflow-y:auto}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item{padding-left:0;flex-direction:column;cursor:pointer;height:auto}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item.column-hidden{opacity:.4}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content{padding:0;cursor:move}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__secondary-text,.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__primary-text{padding:0 8px}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__start{margin-top:0}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mat-mdc-list-item-icon{display:flex}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:drag_handle\"],.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list-item{cursor:move}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:visibility\"],.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:visibility_off\"]{width:32px}\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: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i7.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i7.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i7.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i7.MatListItemLine, selector: "[matListItemLine]" }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "pipe", type: i10.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OTableVisibleColumnsDialogComponent, decorators: [{ type: Component, args: [{ selector: 'o-table-visible-columns-dialog', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class.o-table-visible-columns-dialog]': 'true' }, template: "<span mat-dialog-title>{{ 'TABLE.BUTTONS.COLVIS' | oTranslate }}</span>\n\n\n<mat-dialog-content>\n <div mat-subheader>{{'TABLE.VISIBLE_COLUMNS.DESCRIPTION' | oTranslate}}</div>\n\n <div [ngClass]=\"rowHeight\">\n <mat-list cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item *ngFor=\"let column of columns\" cdkDrag (click)=\"onClickColumn(column)\" [ngClass]=\"{'column-hidden':!column.visible}\"\n class=\"o-drag-list-item-box\">\n <div fxLayout=\"row\" fxFlex fxLayoutAlign=\"stretch center\">\n <mat-icon matListItemIcon svgIcon=\"ontimize:drag_handle\"></mat-icon>\n <span matListItemLine fxFlex>{{ (column.title || column.attr) | oTranslate }}</span>\n <mat-icon *ngIf=\"column.visible\" svgIcon=\"ontimize:visibility\" color=\"primary\"></mat-icon>\n <mat-icon *ngIf=\"!column.visible\" svgIcon=\"ontimize:visibility_off\"></mat-icon>\n </div>\n <mat-divider></mat-divider>\n </mat-list-item>\n </mat-list>\n </div>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayoutAlign=\"end center\">\n <button type=\"button\" mat-stroked-button [mat-dialog-close]=\"null\" class=\"o-button-default cancel\" cancel>{{ 'CANCEL' | oTranslate }}</button>\n <button type=\"button\" mat-stroked-button (click)=\"closeDialog()\" class=\"o-button-primary\">{{ 'ACCEPT' | oTranslate }}</button>\n</mat-dialog-actions>\n", styles: [".o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content{padding-top:0;margin-top:24px;overflow:hidden}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-subheader{display:block}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .title_list{font-weight:600;margin-bottom:6px;margin-top:12px}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .cdk-drop-list{padding:0}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list{max-height:calc(80vh - 150px);overflow-y:auto}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item{padding-left:0;flex-direction:column;cursor:pointer;height:auto}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item.column-hidden{opacity:.4}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content{padding:0;cursor:move}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__secondary-text,.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__primary-text{padding:0 8px}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mdc-list-item__start{margin-top:0}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list .mat-mdc-list-item .mdc-list-item__content .mat-mdc-list-item-icon{display:flex}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:drag_handle\"],.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-mdc-list-item{cursor:move}.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:visibility\"],.o-table-visible-columns-dialog .mat-mdc-dialog-content.mat-mdc-dialog-content .mat-icon[svgicon=\"ontimize:visibility_off\"]{width:32px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby10YWJsZS12aXNpYmxlLWNvbHVtbnMtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL2V4dGVuc2lvbnMvZGlhbG9nL3Zpc2libGUtY29sdW1ucy9vLXRhYmxlLXZpc2libGUtY29sdW1ucy1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvZXh0ZW5zaW9ucy9kaWFsb2cvdmlzaWJsZS1jb2x1bW5zL28tdGFibGUtdmlzaWJsZS1jb2x1bW5zLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBRVIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7OztBQXVCaEQsTUFBTSxPQUFPLG1DQUFtQztJQVk5QyxZQUNZLFFBQWtCLEVBQ3JCLFNBQTRELEVBQzFDLElBQVM7UUFGeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtR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LElBQUksQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEYsQ0FBQzs7aUlBN0xVLG1DQUFtQyxzRUFlcEMsZUFBZTtxSEFmZCxtQ0FBbUMsZ0pDdENoRCxxNENBMEJBOzRGRFlhLG1DQUFtQztrQkFWL0MsU0FBUzsrQkFDRSxnQ0FBZ0MsaUJBRzNCLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sUUFDekM7d0JBQ0osd0NBQXdDLEVBQUUsTUFBTTtxQkFDakQ7OzBCQWlCRSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgVHlwZSxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBPVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS9vLXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbC91dGlsJztcbmltcG9ydCB0eXBlIHsgT0NvbHVtbiB9IGZyb20gJy4uLy4uLy4uL2NvbHVtbi9vLWNvbHVtbi5jbGFzcyc7XG5pbXBvcnQgeyBPVGFibGVCYXNlIH0gZnJvbSAnLi4vLi4vLi4vby10YWJsZS1iYXNlLmNsYXNzJztcblxuZXhwb3J0IHR5cGUgQ29sdW1uVmlzaWJpbGl0eUNvbmZpZ3VyYXRpb24gPSB7XG4gIGF0dHI6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgZGVsZXRlVmFsdWVGaWx0ZXI/OiBib29sZWFuO1xuICBkZWxldGVTb3J0Q29sdW1tbj86IGJvb2xlYW47XG4gIGRlbGV0ZUdydXBpbmdDb2x1bW4/OiBib29sZWFuO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby10YWJsZS12aXNpYmxlLWNvbHVtbnMtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICdvLXRhYmxlLXZpc2libGUtY29sdW1ucy1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnby10YWJsZS12aXNpYmxlLWNvbHVtbnMtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLXRhYmxlLXZpc2libGUtY29sdW1ucy1kaWFsb2ddJzogJ3RydWUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgT1RhYmxlVmlzaWJsZUNvbHVtbnNEaWFsb2dDb21wb25lbnQge1xuXG4gIGNvbHVtbnM6IENvbHVtblZpc2liaWxpdHlDb25maWd1cmF0aW9uW10gPSBbXTtcbiAgcm93SGVpZ2h0OiBzdHJpbmcgPSBDb2Rlcy5ERUZBVUxUX1JPV19IRUlHSFQ7XG4gIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmO1xuICBwcm90ZWN0ZWQgdHJhbnNsYXRlU2VydmljZTogT1RyYW5zbGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBhY3RpdmVDb2x1bW5WYWx1ZUZpbHRlcnM6IHN0cmluZ1tdID0gW107XG4gIHByb3RlY3RlZCBhY3RpdmVTb3J0Q29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIGFjdGl2ZUdyb3VwQnlDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICBwcm90ZWN0ZWQgdGFibGU6IE9UYWJsZUJhc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8T1RhYmxlVmlzaWJsZUNvbHVtbnNEaWFsb2dDb21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBkYXRhOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5kaWFsb2dTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8RGlhbG9nU2VydmljZT4oRGlhbG9nU2VydmljZSBhcyBUeXBlPERpYWxvZ1NlcnZpY2U+KTtcbiAgICB0aGlzLmNkID0gdGhpcy5pbmplY3Rvci5nZXQ8Q2hhbmdlRGV0ZWN0b3JSZWY+KENoYW5nZURldGVjdG9yUmVmIGFzIFR5cGU8Q2hhbmdlRGV0ZWN0b3JSZWY+KTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldDxPVHJhbnNsYXRlU2VydmljZT4oT1RyYW5zbGF0ZVNlcnZpY2UgYXMgVHlwZTxPVHJhbnNsYXRlU2VydmljZT4pO1xuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGRhdGEudGFibGUpKSB7XG4gICAgICB0aGlzLnRhYmxlID0gZGF0YS50YWJsZTtcblxuICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy50YWJsZS52aXNpYmxlQ29sdW1ucywgdHJ1ZSk7XG4gICAgICBjb25zdCBub25IaWRhYmxlQ29sdW1ucyA9IFV0aWwucGFyc2VBcnJheSh0aGlzLnRhYmxlLm5vbkhpZGFibGVDb2x1bW5zLCB0cnVlKTtcblxuICAgICAgLy9pZiBpdCBoYXMgbm8gZGVmaW5pdGlvbiBhbmQgaXMgbm90IGluIHZpc2libGUgY29sdW1ucywgaXQgaXMgbm90IHNob3duXG4gICAgICB0aGlzLnRhYmxlLm9UYWJsZU9wdGlvbnMuY29sdW1ucy5maWx0ZXIob0NvbCA9PiAodmlzaWJsZUNvbHVtbnMuaW5kZXhPZihvQ29sLmF0dHIpICE9PSAtMSB8fCBvQ29sLmRlZmluaXRpb24gIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgbm9uSGlkYWJsZUNvbHVtbnMuaW5kZXhPZihvQ29sLmF0dHIpID09PSAtMVxuICAgICAgKS5mb3JFYWNoKChvQ29sOiBPQ29sdW1uKSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBhdHRyOiBvQ29sLmF0dHIsXG4gICAgICAgICAgdGl0bGU6IG9Db2wudGl0bGUsXG4gICAgICAgICAgdmlzaWJsZTogb0NvbC52aXNpYmxlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucm93SGVpZ2h0ID0gdGhpcy50YWJsZS5yb3dIZWlnaHQ7XG4gICAgICB0aGlzLmFjdGl2ZUNvbHVtblZhbHVlRmlsdGVycyA9IHRoaXMudGFibGUuZGF0YVNvdXJjZS5nZXRDb2x1bW5WYWx1ZUZpbHRlcnMoKS5tYXAoY29sVmFsdWVGaWx0ZXIgPT4gY29sVmFsdWVGaWx0ZXIuYXR0cik7XG4gICAgICB0aGlzLmFjdGl2ZVNvcnRDb2x1bW5zID0gdGhpcy50YWJsZS5zb3J0Q29sQXJyYXkubWFwKGNvbCA9PiBjb2wuY29sdW1uTmFtZSk7XG4gICAgICB0aGlzLmFjdGl2ZUdyb3VwQnlDb2x1bW5zID0gdGhpcy50YWJsZS5ncm91cGVkQ29sdW1uc0FycmF5O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tDb2x1bW4oY29sOiBDb2x1bW5WaXNpYmlsaXR5Q29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUNvbEZpbHRlciA9IHRoaXMuYWN0aXZlQ29sdW1uVmFsdWVGaWx0ZXJzLmluY2x1ZGVzKGNvbC5hdHRyKTtcbiAgICBjb25zdCBhY3RpdmVTb3J0aW5nID0gdGhpcy5hY3RpdmVTb3J0Q29sdW1ucy5pbmNsdWRlcyhjb2wuYXR0cik7XG4gICAgY29uc3QgYWN0aXZlR3JvdXBpbmcgPSB0aGlzLmFjdGl2ZUdyb3VwQnlDb2x1bW5zLmluY2x1ZGVzKGNvbC5hdHRyKTtcblxuICAgIGlmIChjb2wudmlzaWJsZSAmJiAoYWN0aXZlQ29sRmlsdGVyIHx8IGFjdGl2ZVNvcnRpbmcgfHwgYWN0aXZlR3JvdXBpbmcpKSB7XG4gICAgICBjb25zdCB3YXJuQXJncyA9IFtdO1xuICAgICAgaWYgKGFjdGl2ZUNvbEZpbHRlcikge1xuICAgICAgICB3YXJuQXJncy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ1RBQkxFLlZJU0lCTEVfQ09MVU1OU19ESUFMT0cuVkFMVUVfRklMVEVSX1dBUk4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoYWN0aXZlU29ydGluZykge1xuICAgICAgICB3YXJuQXJncy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ1RBQkxFLlZJU0lCTEVfQ09MVU1OU19ESUFMT0cuU09SVF9XQVJOJykpO1xuICAgICAgfVxuICAgICAgaWYgKGFjdGl2ZUdyb3VwaW5nKSB7XG4gICAgICAgIHdhcm5BcmdzLnB1c2godGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgnVEFCTEUuVklTSUJMRV9DT0xVTU5TX0RJQUxPRy5HUk9VUElOR19XQVJOJykpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGlhbG9nVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ1RBQkxFLlZJU0lCTEVfQ09MVU1OU19ESUFMT0cuSElERV9DT0xVTU5fV0FSTklORycsIHdhcm5BcmdzKTtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jb25maXJtKCdDT05GSVJNJywgZGlhbG9nVGV4dCkudGhlbihyZXMgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgY29sLmRlbGV0ZVZhbHVlRmlsdGVyID0gYWN0aXZlQ29sRmlsdGVyO1xuICAgICAgICAgIGNvbC5kZWxldGVTb3J0Q29sdW1tbiA9IGFjdGl2ZVNvcnRpbmc7XG4gICAgICAgICAgY29sLmRlbGV0ZUdydXBpbmdDb2x1bW4gPSBhY3RpdmVHcm91cGluZztcbiAgICAgICAgICBjb2wudmlzaWJsZSA9ICFjb2wudmlzaWJsZTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbC52aXNpYmxlID0gIWNvbC52aXNpYmxlO1xuICAgICAgaWYgKGNvbC52aXNpYmxlKSB7XG4gICAgICAgIGNvbC5kZWxldGVWYWx1ZUZpbHRlciA9IGZhbHNlO1xuICAgICAgICBjb2wuZGVsZXRlU29ydENvbHVtbW4gPSBmYWxzZTtcbiAgICAgICAgY29sLmRlbGV0ZUdydXBpbmdDb2x1bW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcbiAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5jb2x1bW5zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG5cbiAgICBjb25zdCBjb2x1bW5Tb3J0aW5nVG9SZW1vdmUgPSB0aGlzLmdldENvbHVtblNvcnRpbmdUb1JlbW92ZSgpO1xuICAgIGNvbnN0IG5ld1NvcnRDb2x1bW5zID0gY29sdW1uU29ydGluZ1RvUmVtb3ZlLmxlbmd0aCA+IDAgP1xuICAgICAgdGhpcy50YWJsZS5zb3J0Q29sQXJyYXkuZmlsdGVyKGNvbCA9PiAhY29sdW1uU29ydGluZ1RvUmVtb3ZlLmluY2x1ZGVzKGNvbC5jb2x1bW5OYW1lKSkgOlxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29sdW1uR3JvdXBpbmdUb1JlbW92ZSA9IHRoaXMuZ2V0Q29sdW1uR3JvdXBpbmdUb1JlbW92ZSgpO1xuICAgIGNvbnN0IG5ld0dyb3VwQ29sdW1ucyA9IGNvbHVtbkdyb3VwaW5nVG9SZW1vdmUubGVuZ3RoID4gMCA/XG4gICAgICB0aGlzLnRhYmxlLmdyb3VwZWRDb2x1bW5zQXJyYXkuZmlsdGVyKGNvbCA9PiAhY29sdW1uR3JvdXBpbmdUb1JlbW92ZS5pbmNsdWRlcyhjb2wpKSA6XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjb2x1bW5zT3JkZXIgPSB0aGlzLmdldENvbHVtbnNPcmRlcigpO1xuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2Uoe1xuICAgICAgdmlzaWJsZUNvbEFycmF5OiB0aGlzLmdldFZpc2libGVDb2x1bW5zKCkuc29ydCgoYSwgYikgPT4gY29sdW1uc09yZGVyLmluZGV4T2YoYSkgLSBjb2x1bW5zT3JkZXIuaW5kZXhPZihiKSksXG4gICAgICBjb2x1bW5zT3JkZXI6IGNvbHVtbnNPcmRlcixcbiAgICAgIHNvcnRDb2x1bW5zOiBuZXdTb3J0Q29sdW1ucyxcbiAgICAgIGNvbHVtblZhbHVlRmlsdGVyc1RvUmVtb3ZlOiB0aGlzLmdldENvbHVtblZhbHVlRmlsdGVyc1RvUmVtb3ZlKCksXG4gICAgICBncm91cENvbHVtbnM6IG5ld0dyb3VwQ29sdW1uc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpc2libGUgY29sdW1ucywgaW5jbHVkaW5nIG5vbi1oaWRhYmxlIG9uZXMsXG4gICAqIHByZXNlcnZpbmcgdGhlIG9yZGVyIGRlZmluZWQgaW4gb1RhYmxlT3B0aW9ucy5jb2x1bW5zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRWaXNpYmxlQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9uSGlkYWJsZUNvbHVtbnMgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy50YWJsZS5ub25IaWRhYmxlQ29sdW1ucywgdHJ1ZSk7XG5cbiAgICAvLyBWaXNpYmxlIGNvbHVtbnMgc2VsZWN0ZWQgaW4gdGhlIGRpYWxvZ1xuICAgIGNvbnN0IHZpc2libGVGcm9tRGlhbG9nID0gdGhpcy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKGNvbCA9PiBjb2wudmlzaWJsZSlcbiAgICAgIC5tYXAoY29sID0+IGNvbC5hdHRyKTtcblxuICAgIC8vIE1lcmdlOiB2aXNpYmxlIGNvbHVtbnMgZnJvbSB0aGUgZGlhbG9nICsgbm9uLWhpZGFibGUgKGFsd2F5cyB2aXNpYmxlKVxuICAgIGNvbnN0IGFsbFZpc2libGVBdHRycyA9IG5ldyBTZXQoWy4uLnZpc2libGVGcm9tRGlhbG9nLCAuLi5ub25IaWRhYmxlQ29sdW1uc10pO1xuXG4gICAgLy8gU29ydCBhY2NvcmRpbmcgdG8gdGhlIHVwZGF0ZWQgb3JkZXIgaW4gb1RhYmxlT3B0aW9ucy5jb2x1bW5zXG4gICAgcmV0dXJuIHRoaXMudGFibGUub1RhYmxlT3B0aW9ucy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKG9Db2wgPT4gYWxsVmlzaWJsZUF0dHJzLmhhcyhvQ29sLmF0dHIpKVxuICAgICAgLm1hcChvQ29sID0+IG9Db2wuYXR0cik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmluYWwgY29sdW1ucyBvcmRlciwgcHJlc2VydmluZyB0aGUgb3JkZXIgZGVmaW5lZCBpbiB0aGUgZGlhbG9nXG4gICAqIGFuZCBrZWVwaW5nIG5vbi1oaWRhYmxlIGFuZCBoaWRkZW4gY29sdW1ucyBpbiB0aGVpciBvcmlnaW5hbCBwb3NpdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGdldENvbHVtbnNPcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgb3JpZ2luYWxPcmRlciA9IHRoaXMudGFibGUub1RhYmxlT3B0aW9ucy5jb2x1bW5zLm1hcChjb2wgPT4gY29sLmF0dHIpO1xuXG4gICAgLy8gQ29sdW1ucyBmcm9tIHRoZSBkaWFsb2cgaW4gdGhlaXIgbmV3IG9yZGVyXG4gICAgY29uc3QgZGlhbG9nQ29sdW1uc09yZGVyID0gdGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gY29sLmF0dHIpO1xuXG4gICAgLy8gQ29sdW1ucyBub3QgcHJlc2VudCBpbiB0aGUgZGlhbG9nIChub24taGlkYWJsZSArIGhpZGRlbiBvbmVzKVxuICAgIGNvbnN0IGNvbHVtbnNOb3RJbkRpYWxvZyA9IG9yaWdpbmFsT3JkZXIuZmlsdGVyKGF0dHIgPT5cbiAgICAgICFkaWFsb2dDb2x1bW5zT3JkZXIuaW5jbHVkZXMoYXR0cilcbiAgICApO1xuXG4gICAgLy8gQnVpbGQgdGhlIG5ldyBvcmRlclxuICAgIGNvbnN0IG5ld09yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBkaWFsb2dBdHRyIG9mIGRpYWxvZ0NvbHVtbnNPcmRlcikge1xuICAgICAgLy8gQmVmb3JlIGFkZGluZyB0aGlzIGRpYWxvZyBjb2x1bW4sXG4gICAgICAvLyBhZGQgdGhlIGNvbHVtbnMgKG5vbi1oaWRhYmxlIG9yIGhpZGRlbikgdGhhdCB3ZXJlIHBsYWNlZCBiZWZvcmUgaXRcbiAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgY29uc3QgZGlhbG9nT3JpZ2luYWxQb3MgPSBvcmlnaW5hbE9yZGVyLmluZGV4T2YoZGlhbG9nQXR0cik7XG5cbiAgICAgIGZvciAoY29uc3Qgbm90SW5EaWFsb2dBdHRyIG9mIGNvbHVtbnNOb3RJbkRpYWxvZykge1xuICAgICAgICBjb25zdCBub3RJbkRpYWxvZ09yaWdpbmFsUG9zID0gb3JpZ2luYWxPcmRlci5pbmRleE9mKG5vdEluRGlhbG9nQXR0cik7XG5cbiAgICAgICAgLy8gSWYgaXQgd2FzIGJlZm9yZSBhbmQgaGFzIG5vdCBiZWVuIGFkZGVkIHlldFxuICAgICAgICBpZiAoXG4gICAgICAgICAgbm90SW5EaWFsb2dPcmlnaW5hbFBvcyA8IGRpYWxvZ09yaWdpbmFsUG9zICYmXG4gICAgICAgICAgIW5ld09yZGVyLmluY2x1ZGVzKG5vdEluRGlhbG9nQXR0cilcbiAgICAgICAgKSB7XG4gICAgICAgICAgbmV3T3JkZXIucHVzaChub3RJbkRpYWxvZ0F0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0aGUgZGlhbG9nIGNvbHVtblxuICAgICAgbmV3T3JkZXIucHVzaChkaWFsb2dBdHRyKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVtYWluaW5nIGNvbHVtbnMgdGhhdCB3ZXJlIHBsYWNlZCBhZnRlciBhbGwgZGlhbG9nIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IG5vdEluRGlhbG9nQXR0ciBvZiBjb2x1bW5zTm90SW5EaWFsb2cpIHtcbiAgICAgIGlmICghbmV3T3JkZXIuaW5jbHVkZXMobm90SW5EaWFsb2dBdHRyKSkge1xuICAgICAgICBuZXdPcmRlci5wdXNoKG5vdEluRGlhbG9nQXR0cik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld09yZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5WYWx1ZUZpbHRlcnNUb1JlbW92ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5kZWxldGVWYWx1ZUZpbHRlcikubWFwKGNvbCA9PiBjb2wuYXR0cik7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblNvcnRpbmdUb1JlbW92ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5kZWxldGVTb3J0Q29sdW1tbikubWFwKGNvbCA9PiBjb2wuYXR0cik7XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtbkdyb3VwaW5nVG9SZW1vdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZGVsZXRlR3J1cGluZ0NvbHVtbikubWFwKGNvbCA9PiBjb2wuYXR0cik7XG4gIH1cbn0iLCI8c3BhbiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdUQUJMRS5CVVRUT05TLkNPTFZJUycgfCBvVHJhbnNsYXRlIH19PC9zcGFuPlxuXG5cbjxtYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxkaXYgbWF0LXN1YmhlYWRlcj57eydUQUJMRS5WSVNJQkxFX0NPTFVNTlMuREVTQ1JJUFRJT04nIHwgb1RyYW5zbGF0ZX19PC9kaXY+XG5cbiAgPGRpdiBbbmdDbGFzc109XCJyb3dIZWlnaHRcIj5cbiAgICA8bWF0LWxpc3QgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgIDxtYXQtbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiIGNka0RyYWcgKGNsaWNrKT1cIm9uQ2xpY2tDb2x1bW4oY29sdW1uKVwiIFtuZ0NsYXNzXT1cInsnY29sdW1uLWhpZGRlbic6IWNvbHVtbi52aXNpYmxlfVwiXG4gICAgICAgIGNsYXNzPVwiby1kcmFnLWxpc3QtaXRlbS1ib3hcIj5cbiAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4RmxleCBmeExheW91dEFsaWduPVwic3RyZXRjaCBjZW50ZXJcIj5cbiAgICAgICAgICA8bWF0LWljb24gbWF0TGlzdEl0ZW1JY29uIHN2Z0ljb249XCJvbnRpbWl6ZTpkcmFnX2hhbmRsZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1MaW5lIGZ4RmxleD57eyAoY29sdW1uLnRpdGxlIHx8IGNvbHVtbi5hdHRyKSB8IG9UcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLnZpc2libGVcIiBzdmdJY29uPVwib250aW1pemU6dmlzaWJpbGl0eVwiIGNvbG9yPVwicHJpbWFyeVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWNvbHVtbi52aXNpYmxlXCIgc3ZnSWNvbj1cIm9udGltaXplOnZpc2liaWxpdHlfb2ZmXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICAgICAgPC9tYXQtbGlzdC1pdGVtPlxuICAgIDwvbWF0LWxpc3Q+XG4gIDwvZGl2PlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXN0cm9rZWQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cIm51bGxcIiBjbGFzcz1cIm8tYnV0dG9uLWRlZmF1bHQgY2FuY2VsXCIgY2FuY2VsPnt7ICdDQU5DRUwnIHwgb1RyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIiBjbGFzcz1cIm8tYnV0dG9uLXByaW1hcnlcIj57eyAnQUNDRVBUJyB8IG9UcmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuIl19