tin-spa 2.1.39 → 2.1.41

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.
Files changed (32) hide show
  1. package/esm2020/lib/classes/Classes.mjs +1 -1
  2. package/esm2020/lib/components/accounts/accounts.component.mjs +1 -1
  3. package/esm2020/lib/components/customers/customers.component.mjs +1 -1
  4. package/esm2020/lib/components/departments/departments.component.mjs +1 -1
  5. package/esm2020/lib/components/employees/employees.component.mjs +1 -1
  6. package/esm2020/lib/components/filter/filter.component.mjs +7 -4
  7. package/esm2020/lib/components/inventory/inventory.component.mjs +1 -1
  8. package/esm2020/lib/components/invitations-table/invitations-table.component.mjs +1 -1
  9. package/esm2020/lib/components/list-dialog/list-dialog.component.mjs +1 -1
  10. package/esm2020/lib/components/logs/logs.component.mjs +1 -1
  11. package/esm2020/lib/components/membership/membership.component.mjs +1 -1
  12. package/esm2020/lib/components/plans/plans.component.mjs +1 -1
  13. package/esm2020/lib/components/suppliers/suppliers.component.mjs +1 -1
  14. package/esm2020/lib/components/table/detailsDialog.component.mjs +19 -14
  15. package/esm2020/lib/components/table/table.component.mjs +52 -3
  16. package/esm2020/lib/components/table-internal/detailsDialog-internal.component.mjs +18 -11
  17. package/esm2020/lib/components/table-internal/table-internal.component.mjs +37 -3
  18. package/esm2020/lib/components/tasks/tasks.component.mjs +1 -1
  19. package/esm2020/lib/components/tenant-settings/tenant-settings.component.mjs +1 -1
  20. package/esm2020/lib/components/tenants/tenants.component.mjs +1 -1
  21. package/esm2020/lib/components/transactions/transactions.component.mjs +1 -1
  22. package/esm2020/lib/components/users/users.component.mjs +1 -1
  23. package/fesm2015/tin-spa.mjs +142 -42
  24. package/fesm2015/tin-spa.mjs.map +1 -1
  25. package/fesm2020/tin-spa.mjs +140 -42
  26. package/fesm2020/tin-spa.mjs.map +1 -1
  27. package/lib/classes/Classes.d.ts +9 -2
  28. package/lib/components/filter/filter.component.d.ts +2 -1
  29. package/lib/components/table/detailsDialog.component.d.ts +1 -0
  30. package/lib/components/table/table.component.d.ts +2 -1
  31. package/lib/components/table-internal/table-internal.component.d.ts +2 -1
  32. package/package.json +1 -1
@@ -31,6 +31,7 @@ export class TableInternalComponent {
31
31
  this.actionsWidth = "50px";
32
32
  this.showFilterButton = true;
33
33
  this.tileReload = new Subject();
34
+ this.hideTitle = false;
34
35
  this.data = [];
35
36
  this.dataLoad = new EventEmitter();
36
37
  this.refreshClick = new EventEmitter();
@@ -329,6 +330,27 @@ export class TableInternalComponent {
329
330
  columnClicked(column, row) {
330
331
  if (column.detailsConfig) {
331
332
  column.detailsConfig.details = row;
333
+ column.detailsConfig.config.mode = "view";
334
+ if (column.detailsConfig.heroField) {
335
+ column.detailsConfig.heroValue = row[column.detailsConfig.heroField];
336
+ if (column.detailsConfig.tableConfig) {
337
+ column.detailsConfig.tableConfig.heroField = column.detailsConfig.heroField;
338
+ column.detailsConfig.tableConfig.heroValue = column.detailsConfig.heroValue;
339
+ }
340
+ if (column.detailsConfig.tableConfigs) {
341
+ column.detailsConfig.tableConfigs.forEach(element => {
342
+ element.heroField = column.detailsConfig.heroField;
343
+ element.heroValue = column.detailsConfig.heroValue;
344
+ });
345
+ }
346
+ }
347
+ if (column.detailsConfig.tableConfig && column.detailsConfig.tableConfig.loadAction && column.detailsConfig.tableConfig.loadCriteria && column.detailsConfig.tableConfig.loadIDField) {
348
+ column.detailsConfig.tableConfig.loadAction.url = column.detailsConfig.tableConfig.loadAction.url.split('/')[0] + "/" + column.detailsConfig.tableConfig.loadCriteria + "/" + column.detailsConfig.details[column.detailsConfig.tableConfig.loadIDField];
349
+ console.log("Transformed");
350
+ }
351
+ else {
352
+ console.log("NOT Transformed");
353
+ }
332
354
  const dialogRef = this.dialog.open(DetailsDialogInternal, {
333
355
  width: "900px",
334
356
  data: column.detailsConfig
@@ -354,6 +376,14 @@ export class TableInternalComponent {
354
376
  else {
355
377
  if (button.detailsConfig) {
356
378
  button.detailsConfig.details = row;
379
+ button.detailsConfig.config.mode = "view";
380
+ if (button.detailsConfig.tableConfig && button.detailsConfig.tableConfig.loadAction && button.detailsConfig.tableConfig.loadCriteria && button.detailsConfig.tableConfig.loadIDField) {
381
+ button.detailsConfig.tableConfig.loadAction.url = button.detailsConfig.tableConfig.loadAction.url.split('/')[0] + "/" + button.detailsConfig.tableConfig.loadCriteria + "/" + button.detailsConfig.details[button.detailsConfig.tableConfig.loadIDField]; // fix data to proper source
382
+ console.log("Transformed");
383
+ }
384
+ else {
385
+ console.log("NOT Transformed");
386
+ }
357
387
  const dialogRef = this.dialog.open(DetailsDialogInternal, {
358
388
  width: "900px",
359
389
  data: button.detailsConfig
@@ -424,6 +454,8 @@ export class TableInternalComponent {
424
454
  config: this.config.formConfig,
425
455
  buttons: this.config.buttons,
426
456
  };
457
+ conf.heroField = this.config?.heroField;
458
+ conf.heroValue = this.config?.heroValue;
427
459
  const dialogRef = this.dialog.open(DetailsDialogInternal, {
428
460
  width: "900px",
429
461
  data: conf,
@@ -522,13 +554,15 @@ export class TableInternalComponent {
522
554
  }
523
555
  }
524
556
  TableInternalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableInternalComponent, deps: [{ token: i1.DataServiceLib }, { token: i2.MessageService }, { token: i3.BreakpointObserver }, { token: i4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
525
- TableInternalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableInternalComponent, selector: "spa-table-internal", inputs: { data: "data", config: "config", reload: "reload" }, outputs: { dataLoad: "dataLoad", refreshClick: "refreshClick", searchClick: "searchClick", createClick: "createClick", actionClick: "actionClick", inputChange: "inputChange" }, viewQueries: [{ propertyName: "tablePaginator", first: true, predicate: ["tablePaginator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\" >\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <!-- <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles> -->\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value"], outputs: ["valueChange", "click", "check", "uncheck"] }, { kind: "component", type: i13.SelectComponent, selector: "spa-select", inputs: ["width", "readonly", "required", "defaultFirstValue", "readonlyMode", "hint", "placeholder", "multiple", "display", "value", "options", "optionValue", "optionDisplay", "optionDisplayExtra"], outputs: ["valueChange"] }, { kind: "component", type: i14.FilterComponent, selector: "spa-filter", inputs: ["showText", "showButton", "data"], outputs: ["refreshClick"] }, { kind: "component", type: i15.TilesComponent, selector: "spa-tiles", inputs: ["config", "data", "reload"], outputs: ["tileClick"] }, { kind: "component", type: i16.SearchComponent, selector: "spa-search", inputs: ["config"], outputs: ["searchClick"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i17.CamelToWordsPipe, name: "camelToWords" }] });
557
+ TableInternalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TableInternalComponent, selector: "spa-table-internal", inputs: { hideTitle: "hideTitle", data: "data", config: "config", reload: "reload" }, outputs: { dataLoad: "dataLoad", refreshClick: "refreshClick", searchClick: "searchClick", createClick: "createClick", actionClick: "actionClick", inputChange: "inputChange" }, viewQueries: [{ propertyName: "tablePaginator", first: true, predicate: ["tablePaginator"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\">\n <button *ngIf=\"createButton && !config.flatButtons\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <button *ngIf=\"createButton && config.flatButtons\" id=\"btnNew\" mat-stroked-button style=\"margin-right: 10px; color: green;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <!-- <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles> -->\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" [flatButtons]=\"config.flatButtons\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title && !hideTitle\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i5.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i10.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.CheckComponent, selector: "spa-check", inputs: ["readonly", "display", "value"], outputs: ["valueChange", "click", "check", "uncheck"] }, { kind: "component", type: i13.SelectComponent, selector: "spa-select", inputs: ["width", "readonly", "required", "defaultFirstValue", "readonlyMode", "hint", "placeholder", "multiple", "display", "value", "options", "optionValue", "optionDisplay", "optionDisplayExtra"], outputs: ["valueChange"] }, { kind: "component", type: i14.FilterComponent, selector: "spa-filter", inputs: ["flatButtons", "showText", "showButton", "data"], outputs: ["refreshClick"] }, { kind: "component", type: i15.TilesComponent, selector: "spa-tiles", inputs: ["config", "data", "reload"], outputs: ["tileClick"] }, { kind: "component", type: i16.SearchComponent, selector: "spa-search", inputs: ["config"], outputs: ["searchClick"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: i17.CamelToWordsPipe, name: "camelToWords" }] });
526
558
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TableInternalComponent, decorators: [{
527
559
  type: Component,
528
- args: [{ selector: 'spa-table-internal', template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\" >\n <button *ngIf=\"createButton\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <!-- <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles> -->\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}\n"] }]
560
+ args: [{ selector: 'spa-table-internal', template: "\n<spa-search *ngIf=\"config.searchConfig\" [config]=\"config.searchConfig\" style=\"margin-bottom: 20px;\" (searchClick)=\"searchClicked($event)\"></spa-search>\n\n<div class=\"top\">\n\n <div class=\"tin-row\">\n <button *ngIf=\"createButton && !config.flatButtons\" id=\"btnNew\" mat-raised-button color=\"primary\" style=\"margin-right: 10px;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <button *ngIf=\"createButton && config.flatButtons\" id=\"btnNew\" mat-stroked-button style=\"margin-right: 10px; color: green;\" (click)=\"newModel()\">{{createButton.display}}</button>\n <!-- <spa-tiles *ngIf=\"config.tileConfig\" [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles> -->\n </div>\n\n <div *ngIf=\"config.tileConfig && !smallScreen\" style=\"min-width: 75%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n </div>\n\n <div *ngIf=\"config.showFilter\" class=\"d-flex justify-content-end\">\n <spa-filter [showButton]=\"showFilterButton\" [data]=\"tableDataSource\" [flatButtons]=\"config.flatButtons\" (refreshClick)=\"refreshClicked()\"></spa-filter>\n </div>\n\n</div>\n\n<div *ngIf=\"config.tileConfig && smallScreen\" style=\"width: 100%;\">\n <spa-tiles [reload]=\"tileReload\" [config]=\"config.tileConfig\"></spa-tiles>\n</div>\n\n<div *ngIf=\"config.title && !hideTitle\" class=\"title\">\n <label style=\"font-size: larger;\">{{config.title | camelToWords}}</label>\n</div>\n\n<div>\n\n <p *ngIf=\"!config\"><em>Configure Table</em></p>\n <p *ngIf=\"!dataSource\"><em>Loading...</em></p>\n\n\n\n <div *ngIf=\"dataSource\">\n\n\n <table mat-table [dataSource]=\"tableDataSource\" [ngClass]=\"elevation\">\n <ng-container *ngFor=\"let column of config.columns\" [matColumnDef]=\"column.name\">\n <th mat-header-cell *matHeaderCellDef >{{ column.alias ?? column.name | camelToWords }}</th>\n <td mat-cell *matCellDef=\"let row;\" class=\"right-padding\" >\n\n <ng-container [ngSwitch]=\"column.type\">\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <spa-check [value]=\"row[column.name]\" [readonly]=\"true\"></spa-check>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'select'\">\n <spa-select [options]=\"column.options\" [optionDisplay]=\"column.optionDisplay\" [optionValue]=\"column.optionValue\" [(value)]=\"row[column.name]\" width=\"90%\" ></spa-select>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip'\">\n <mat-chip-list>\n <mat-chip (click)=\"columnClicked(column, row)\" [ngStyle]=\"{'background-color': testColorCondition(row, column.color) ? column.color.name : getColor(row[column.name], column?.options)}\" style=\"font-size: 12px;\"> {{row[column.name]}} </mat-chip>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n {{row[column.name] | date : 'dd/MM/yyyy'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'datetime'\">\n {{row[column.name] | date : 'dd/MM/yyyy HH:mm'}}\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <!-- <ng-container *ngSwitchCase=\"'spinner'\">\n <mat-spinner [diameter]=\"20\">\n\n </mat-spinner>\n </ng-container> -->\n\n <ng-container *ngSwitchCase=\"'money'\">\n\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name] | currency:'':''}}</label>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'button'\">\n\n <button mat-button [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\" (click)=\"actionClicked(column.name, row)\">{{row[column.name]}}</button>\n\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <label [ngStyle]=\"{'color': testColorCondition(row, column.color) ? column.color.name : ''}\">{{row[column.name]}}</label>\n <mat-icon class=\"col-icon\" *ngIf=\"column.icon && testIconCondition(row, column.icon)\" [matTooltip]=\"row[column.icon.tipField] ?? column.icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[column.icon.tipField])\" (click)=\"showBanner(row[column.icon.tipField])\" [ngStyle]=\"{'color':column.icon?.color}\">{{column.icon.name }}</mat-icon>\n\n <ng-container *ngFor=\"let icon of column.icons\">\n <mat-icon class=\"col-icon\" *ngIf=\"testIconCondition(row, icon)\" [matTooltip]=\"row[icon.tipField] ?? icon?.tip\" matTooltipPosition=\"above\" (click)=\"showBanner(row[icon.tipField])\" [ngStyle]=\"{'color':icon?.color}\">{{icon.name }}</mat-icon>\n </ng-container>\n\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef> Action </th>\n <td mat-cell *matCellDef=\"let row\" [ngStyle]=\"{width:false ? '50px' : actionsWidth}\">\n\n\n <ng-container *ngFor=\"let button of displayedButtons\">\n\n <ng-container *ngIf=\"button.name != 'create' && testVisible(row,button.name)\">\n\n <button *ngIf=\"!config.flatButtons\" mat-mini-fab [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n [ngStyle]=\"{'background-color':getButtonColor(button, row)}\"\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon>{{getIcon(button.name)}}</mat-icon>\n </button>\n\n <button *ngIf=\"config.flatButtons\" mat-icon-button [matTooltip]=\"button.tip ?? button.name \" matTooltipPosition=\"above\" style=\"margin-right:5px\"\n\n [disabled]=\"testDisabled(row,button.name)\" (click)=\"actionClicked(button.name, row)\">\n <mat-icon [ngStyle]=\"{'color':getButtonColor(button, row)}\">{{getIcon(button.name)}}</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-container *ngIf=\"button.name != 'create' && !testVisible(row,button.name)\">\n <label style=\"margin-right: 35px;\"></label>\n </ng-container>\n\n </ng-container>\n\n\n </td>\n </ng-container>\n\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\" [ngClass]=\"{'make-gray': config.greyOut && config.greyOut(row)}\"></tr>\n </table>\n\n </div>\n\n <mat-paginator #tablePaginator [pageSizeOptions]=\"[10, 20, 50]\" showFirstLastButtons></mat-paginator>\n\n</div>\n\n<p *ngIf=\"dataSource?.length == 0\"><em>No Data</em></p>\n\n\n", styles: [".top{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:10px;margin-top:10px}.mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}.mat-icon-button{width:32px;height:32px}.mat-icon-button mat-icon{font-size:20px;margin-top:-7px}.col-icon{margin-left:10px}.title{margin-top:10px;font-size:larger;font-weight:300}.make-gray{background-color:#e5e5e5}.right-padding{padding-right:10px}\n"] }]
529
561
  }], ctorParameters: function () { return [{ type: i1.DataServiceLib }, { type: i2.MessageService }, { type: i3.BreakpointObserver }, { type: i4.MatDialog }]; }, propDecorators: { tablePaginator: [{
530
562
  type: ViewChild,
531
563
  args: ['tablePaginator']
564
+ }], hideTitle: [{
565
+ type: Input
532
566
  }], data: [{
533
567
  type: Input
534
568
  }], config: [{
@@ -548,4 +582,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
548
582
  }], inputChange: [{
549
583
  type: Output
550
584
  }] } });
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaW50ZXJuYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtaW50ZXJuYWwvdGFibGUtaW50ZXJuYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtaW50ZXJuYWwvdGFibGUtaW50ZXJuYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFzRCxVQUFVLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFJMUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8vQixNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQW9CLFdBQTJCLEVBQVUsY0FBOEIsRUFBVSxrQkFBc0MsRUFBUyxNQUFpQjtRQUE3SSxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQWdFakssY0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBQy9CLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRXRCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixlQUFVLEdBQXNCLElBQUksT0FBTyxFQUFFLENBQUM7UUFtQnJDLFNBQUksR0FBTyxF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O2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWN0aW9uLCBCdXR0b24sIENvbG9yLCBDb2x1bW4sIERldGFpbHNEaWFsb2dDb25maWcsIEZvcm1Db25maWcsIEljb24sIFRhYmxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9DbGFzc2VzJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBEZXRhaWxzRGlhbG9nSW50ZXJuYWwgfSBmcm9tICcuL2RldGFpbHNEaWFsb2ctaW50ZXJuYWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50U3RhdGUgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcclxuaW1wb3J0IHsgRGF0YVNlcnZpY2VMaWIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcGlSZXNwb25zZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGluQ29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhLXRhYmxlLWludGVybmFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtaW50ZXJuYWwuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLWludGVybmFsLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVJbnRlcm5hbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlTGliLCBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlciwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nKVxyXG4gIHtcclxuICAgIC8vIGRldGVjdCBzY3JlZW4gc2l6ZSBjaGFuZ2VzXHJcbiAgICB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsgXCIobWF4LXdpZHRoOiA2MDBweClcIl0pLnN1YnNjcmliZSgocmVzdWx0OiBCcmVha3BvaW50U3RhdGUpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXN1bHQubWF0Y2hlcykge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSB0cnVlXHJcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zKClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNtYWxsU2NyZWVuID0gZmFsc2VcclxuICAgICAgICB0aGlzLnNldENvbHVtbnMoKVxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLmVsZXZhdGlvbil7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5lbGV2YXRpb24gPT0gXCJub25lXCIpe1xyXG4gICAgICAgIHRoaXMuZWxldmF0aW9uID0gXCJcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuY29uZmlnLmVsZXZhdGlvbiA9PSBcImxvd1wiKSB7XHJcbiAgICAgICAgdGhpcy5lbGV2YXRpb24gPSBcIm1hdC1lbGV2YXRpb24tejFcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuY29uZmlnLmVsZXZhdGlvbiA9PSBcIm1lZGl1bVwiKSB7XHJcbiAgICAgICAgdGhpcy5lbGV2YXRpb24gPSBcIm1hdC1lbGV2YXRpb24tejVcIlxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuY29uZmlnLmVsZXZhdGlvbiA9PSBcImhpZ2hcIikge1xyXG4gICAgICAgIHRoaXMuZWxldmF0aW9uID0gXCJtYXQtZWxldmF0aW9uLXo5XCJcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Q29sdW1ucygpXHJcblxyXG4gICAgdGhpcy5jcmVhdGVCdXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3JlYXRlJylcclxuXHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKXtcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZvcm1EZWZhdWx0cygpO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcpe1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJCdXR0b24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZWxvYWQgIT0gbnVsbCl7XHJcbiAgICAgIHRoaXMucmVsb2FkLnN1YnNjcmliZSh2ID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHYgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnPy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWc/LmxvYWRBY3Rpb24sIFwiXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGVsZXZhdGlvbiA9IFwibWF0LWVsZXZhdGlvbi16NVwiO1xyXG4gIGFjdGlvbnNXaWR0aCA9IFwiNTBweFwiO1xyXG5cclxuICBzaG93RmlsdGVyQnV0dG9uID0gdHJ1ZTtcclxuICB0aWxlUmVsb2FkIDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRBY3Rpb24pe1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlRhYmxlIGRhdGEgQ2hhbmdlZFwiKVxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55Pih0aGlzLmRhdGFTb3VyY2UpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjsgfSwgNSlcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgQFZpZXdDaGlsZCgndGFibGVQYWdpbmF0b3InKSB0YWJsZVBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG5cclxuXHJcbiAgQElucHV0KCkgZGF0YTogYW55ID1bXTtcclxuICBASW5wdXQoKSBjb25maWc6IFRhYmxlQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHJlbG9hZDogU3ViamVjdDxib29sZWFuPjtcclxuICBAT3V0cHV0KCkgZGF0YUxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHJlZnJlc2hDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgc2VhcmNoQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNyZWF0ZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBhY3Rpb25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGlucHV0Q2hhbmdlZChldmVudCkge1xyXG4gICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHsgZmllbGQ6IGV2ZW50LmZpZWxkLCB2YWx1ZTogZXZlbnQudmFsdWUgfSlcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiQ2hhbmdlZCBcIiArIEpTT04uc3RyaW5naWZ5KGV2ZW50KSlcclxuICB9XHJcblxyXG4gIHNtYWxsU2NyZWVuID0gZmFsc2VcclxuXHJcbiAgY3JlYXRlQnV0dG9uOiBCdXR0b247XHJcblxyXG5cclxuICAvL1RhYmxlXHJcbiAgdGFibGVEYXRhU291cmNlO1xyXG4gIGRhdGFTb3VyY2U6IGFueVtdO1xyXG4gIC8vIGNvbHVtbnM6IENvbHVtbltdID0gW107XHJcbiAgZGlzcGxheWVkQ29sdW1ucyA9IFtdXHJcbiAgLy8gQElucHV0KCkgb3B0aW9uVmFsdWUgPSBcIlwiO1xyXG4gIC8vIEBJbnB1dCgpIG9wdGlvbkRpc3BsYXkgPSBcIlwiO1xyXG4gIGRpc3BsYXllZEJ1dHRvbnMgPSBbXVxyXG5cclxuICBmb3JtRGVmYXVsdHMoKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XHJcbiAgICAgIGxldCBjb25maWcgPSBuZXcgRm9ybUNvbmZpZ1xyXG5cclxuICAgICAgY29uZmlnLmZpZWxkcyA9IFtdXHJcblxyXG4gICAgICB0aGlzLmNvbmZpZy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkID0geyBuYW1lOiBjb2x1bW4ubmFtZSwgdHlwZTogY29sdW1uLnR5cGUgfVxyXG4gICAgICAgIGNvbmZpZy5maWVsZHMucHVzaChmaWVsZClcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5jb25maWcuZm9ybUNvbmZpZyA9IGNvbmZpZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENvbHVtbnMoKSB7XHJcblxyXG4gICAgLy9jb2x1bW5zXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5jb2x1bW5zKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNtYWxsU2NyZWVuKSB7XHJcblxyXG4gICAgICBsZXQgY29scyA9IFtdO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29uZmlnLm1pbkNvbHVtbnMpe1xyXG4gICAgICAgIGNvbHMgPSB0aGlzLmNvbmZpZy5taW5Db2x1bW5zLmZpbHRlcihjb2wgPT5cclxuICAgICAgICAgIHRoaXMuY29uZmlnLmNvbHVtbnMuc29tZSh4ID0+IHgubmFtZSA9PT0gY29sKVxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGlmIChjb2xzLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IGNvbHM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSlcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuY29uZmlnLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy9idXR0b25zXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5idXR0b25zKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGxldCBidXR0b25zQ291bnQgPSB0aGlzLmNvbmZpZy5idXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPSAnY3JlYXRlJykubGVuZ3RoID8/IDBcclxuICAgIGlmIChidXR0b25zQ291bnQgPiAwKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZGlzcGxheWVkQ29sdW1ucy5maW5kKHggPT4geCA9PSAnYWN0aW9uJykgJiYgdGhpcy5jb25maWcuYnV0dG9ucykge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKFwiYWN0aW9uXCIpXHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgaWYgKHRoaXMuc21hbGxTY3JlZW4pIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm1pbkJ1dHRvbnMpe1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB0aGlzLmNvbmZpZy5taW5CdXR0b25zLmluY2x1ZGVzKHgubmFtZSkpXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmNvbmZpZy5idXR0b25zLmZpbHRlcih4ID0+IHgubmFtZSAhPSAnY3JlYXRlJykuc2xpY2UoMCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuY29uZmlnLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lICE9ICdjcmVhdGUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5hY3Rpb25zV2lkdGggPSBgJHt0aGlzLmRpc3BsYXllZEJ1dHRvbnMubGVuZ3RoICogNDAgKzIwfXB4YFxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc2V0QnV0dG9ucygpe1xyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuYnV0dG9ucykgcmV0dXJuXHJcblxyXG4gICAgaWYgKCF0aGlzLnNtYWxsU2NyZWVuKXtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucztcclxuXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucztcclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGdldEJ1dHRvbihuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5jb25maWcuYnV0dG9ucykge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIk5vIGJ1dHRvbnMgZm91bmRcIilcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5idXR0b25zLmZpbmQoeCA9PiB4Lm5hbWUgPT0gbmFtZSlcclxuICB9XHJcblxyXG4gIGdldEljb24oYnV0dG9uTmFtZTogc3RyaW5nKXtcclxuXHJcbiAgICBsZXQgYiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpO1xyXG4gICAgaWYgKGIuaWNvbil7XHJcbiAgICAgIHJldHVybiBiLmljb24ubmFtZVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBpID0gJ29wZW5faW5fbmV3J1xyXG5cclxuICAgIHN3aXRjaCAoYnV0dG9uTmFtZSkge1xyXG5cclxuICAgICAgY2FzZSAndmlldyc6XHJcblxyXG4gICAgICAgIGkgPSB0aGlzLmNvbmZpZy5mbGF0QnV0dG9ucyA/ICdvcGVuX2luX25ldycgOiAncGFnZXZpZXcnO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZWRpdCc6XHJcbiAgICAgICAgaSA9ICdlZGl0J1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkZWxldGUnOlxyXG4gICAgICAgIGkgPSAnZGVsZXRlJ1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbkNvbG9yKGJ1dHRvbjogQnV0dG9uLCByb3cpIHtcclxuXHJcbiAgICBpZiAoYnV0dG9uLmRpc2FibGVkKXtcclxuICAgICAgaWYgKGJ1dHRvbi5kaXNhYmxlZChyb3cpKXtcclxuICAgICAgICByZXR1cm4gJ2xpZ2h0Z3JheSdcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24uY29sb3Ipe1xyXG4gICAgICByZXR1cm4gYnV0dG9uLmNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24ubmFtZSA9PSAnZGVsZXRlJyl7XHJcbiAgICAgIHJldHVybiAnI0Y0NDMzNidcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4nICM0MDUwQjUnXHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0T3B0aW9ucyhjb2x1bW4pe1xyXG4gICAgbGV0IHggPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQob3B0ID0+IG9wdC5uYW1lID09PSBjb2x1bW4pO1xyXG4gICAgcmV0dXJuICB4XHJcbiAgfVxyXG5cclxuICBnZXRDb2xvcih2LCBvcHRpb25zKSB7XHJcblxyXG4gICAgbGV0IGRlZmF1bHRDb2xvciA9ICdsaWdodGdyZXknXHJcblxyXG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gZGVmYXVsdENvbG9yXHJcblxyXG4gICAgbGV0IGMgPSBvcHRpb25zLmZpbmQoeCA9PiB4LnZhbHVlID09IHYpXHJcblxyXG4gICAgaWYgKGMpIHtcclxuICAgICAgcmV0dXJuIGMuY29sb3JcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkZWZhdWx0Q29sb3JcclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHRlc3RJY29uQ29uZGl0aW9uKHZhbHVlOiBhbnksIGljb24gOiBJY29uKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKGljb24uY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiBpY29uLmNvbmRpdGlvbih2YWx1ZSk7XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGVzdENvbG9yQ29uZGl0aW9uKHZhbHVlOiBhbnksIGNvbG9yOiBDb2xvcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghY29sb3IpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY29sb3IuY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiBjb2xvci5jb25kaXRpb24odmFsdWUpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0Jhbm5lcihtZXNzYWdlKXtcclxuXHJcbiAgICBpZiAoIW1lc3NhZ2UpIHJldHVybjtcclxuICAgIGlmIChtZXNzYWdlID09ICcnKSByZXR1cm47XHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmluZm8obWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICB0ZXN0RGlzYWJsZWQocm93LCBidXR0b25OYW1lOiBzdHJpbmcpOiBib29sZWFue1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxyXG5cclxuICAgIGlmIChidXR0b24uZGlzYWJsZWQpe1xyXG5cclxuICAgICAgcmV0dXJuIGJ1dHRvbi5kaXNhYmxlZChyb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICB0ZXN0VmlzaWJsZShyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxyXG5cclxuICAgIGlmIChidXR0b24udmlzaWJsZSkge1xyXG5cclxuICAgICAgcmV0dXJuIGJ1dHRvbi52aXNpYmxlKHJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy9BY3Rpb25zXHJcblxyXG5cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIGRhdGE6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nXCIpXHJcblxyXG4gICAgaWYgKGFjdGlvbikge1xyXG5cclxuICAgICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGFjdGlvbiwgZGF0YSkuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvZ1Jlc3BvbnNlKXtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGFwaVJlc3BvbnNlKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gYXBpUmVzcG9uc2UuZGF0YVxyXG5cclxuICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihhcGlSZXNwb25zZS5kYXRhKTtcclxuICAgICAgICB0aGlzLnRhYmxlRGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnRhYmxlUGFnaW5hdG9yO1xyXG5cclxuICAgICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGFwaVJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjtcclxuXHJcbiAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQoYXBpUmVzcG9uc2UuZGF0YSk7XHJcblxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICAvL0V2ZW50c1xyXG4gIHNlYXJjaENsaWNrZWQoeCl7XHJcbiAgICBjb25zb2xlLmxvZyhcIlNlYXJjaFwiKVxyXG4gICAgdGhpcy5zZWFyY2hDbGljay5lbWl0KHgpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKHgpXHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZy5zZWFyY2hBY3Rpb24pe1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLm1ldGhvZCA9PSAncG9zdCdcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLCB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hDbGlja2VkKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJSZWZyZXNoXCIpXHJcbiAgICB0aGlzLnJlZnJlc2hDbGljay5lbWl0KCk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWcubG9hZEFjdGlvbixcIlwiKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLmRhdGFMb2FkLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRhdGFMb2FkZWQoeCkge1xyXG5cclxuICAgIHRoaXMuZGF0YUxvYWQuZW1pdCh4KVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZGF0YWxvYWRlZFwiKVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy50aWxlQ29uZmlnPy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMudGlsZVJlbG9hZC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBhY3Rpb25DbGlja2VkKG5hbWUsIHJvdykge1xyXG5cclxuICAgIGlmIChuYW1lID09ICd2aWV3Jykge1xyXG4gICAgICB0aGlzLnZpZXdNb2RlbChyb3cpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuYW1lID09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLmVkaXRNb2RlbChyb3cpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGVsKHJvdyk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5jdXN0b21Nb2RlbChuYW1lLHJvdyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGNvbHVtbkNsaWNrZWQoY29sdW1uIDogQ29sdW1uLCByb3cpe1xyXG5cclxuICAgIGlmIChjb2x1bW4uZGV0YWlsc0NvbmZpZyl7XHJcblxyXG4gICAgICBjb2x1bW4uZGV0YWlsc0NvbmZpZy5kZXRhaWxzID0gcm93O1xyXG5cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nSW50ZXJuYWwsIHtcclxuICAgICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICAgIGRhdGE6IGNvbHVtbi5kZXRhaWxzQ29uZmlnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGNvbHVtbi5uYW1lLCByb3cpXHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGNvbHVtbi5uYW1lLCByb3cpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjdXN0b21Nb2RlbChuYW1lLCByb3cpIHtcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24obmFtZSk7XHJcbiAgICBpZiAoYnV0dG9uKSB7XHJcblxyXG4gICAgICBpZiAoIWJ1dHRvbi5kaWFsb2cpe1xyXG4gICAgICAgIHRoaXMuZG9BY3Rpb24oYnV0dG9uLm5hbWUsIHJvdylcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KG5hbWUsIHJvdyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgYnV0dG9uLmRldGFpbHNDb25maWcuZGV0YWlscyA9IHJvdztcclxuXHJcbiAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERldGFpbHNEaWFsb2dJbnRlcm5hbCwge1xyXG4gICAgICAgICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICAgICAgICBkYXRhOiBidXR0b24uZGV0YWlsc0NvbmZpZ1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQubWVzc2FnZSA9PSBcInN1Y2Nlc3NcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoYnV0dG9uLm5hbWUsIHJvdylcclxuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQobmFtZSwgcm93KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBhY3Rpb25DbGlja2VkRW1pdChuYW1lLCByb3cpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiQWN0aW9uIGNsaWNrZWRcIilcclxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdCh7bmFtZTpuYW1lLGRhdGEgOiByb3d9KTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIHZpZXdNb2RlbChyb3cpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInZpZXcgQ2xpY2tlZFwiKVxyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbigndmlldycpO1xyXG5cclxuICAgIGlmICghYnV0dG9uKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCFidXR0b24uZGlhbG9nKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoYnV0dG9uLm5hbWUsIHJvdyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWcuZm9ybUNvbmZpZy5tb2RlID0gXCJ2aWV3XCI7XHJcbiAgICBsZXQgY29uZjogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLFxyXG4gICAgICBidXR0b25zOiB0aGlzLmNvbmZpZy5idXR0b25zLFxyXG4gICAgICBkZXRhaWxzOiByb3csXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nSW50ZXJuYWwsIHtcclxuICAgICAgd2lkdGg6IFwiOTAwcHhcIixcclxuICAgICAgZGF0YTogY29uZlxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuICB9XHJcblxyXG4gIG5ld01vZGVsKCkge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3JlYXRlJyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCBudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGNvbmZpZ3VyZSBmb3JtXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLm1vZGUgPSBcImNyZWF0ZVwiO1xyXG4gICAgbGV0IGNvbmYgOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICBjb25maWcgOiB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLFxyXG4gICAgICBidXR0b25zIDogdGhpcy5jb25maWcuYnV0dG9ucyxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERldGFpbHNEaWFsb2dJbnRlcm5hbCwge1xyXG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICBkYXRhOiBjb25mLFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnY3JlYXRlJyxyZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnY3JlYXRlJyxyZXN1bHQuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBlZGl0TW9kZWwocm93KSB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKCdlZGl0Jyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJQbGVhc2UgY29uZmlndXJlIGZvcm1cIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY29uZmlnLmZvcm1Db25maWcubW9kZSA9IFwiZWRpdFwiO1xyXG4gICAgbGV0IGNvbmY6IERldGFpbHNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcuZm9ybUNvbmZpZyxcclxuICAgICAgYnV0dG9uczogdGhpcy5jb25maWcuYnV0dG9ucyxcclxuICAgICAgZGV0YWlscyA6IHJvdyxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERldGFpbHNEaWFsb2dJbnRlcm5hbCwge1xyXG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICBkYXRhOiBjb25mXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmlucHV0Q2hhbmdlLnN1YnNjcmliZSgoeCkgPT4ge1xyXG4gICAgICB0aGlzLmlucHV0Q2hhbmdlZCh4KVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZWRpdCcscmVzdWx0LmRhdGEpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaENsaWNrZWQoKTtcclxuICAgICAgfSBlbHNlIGlmIChyZXN1bHQubWVzc2FnZSA9PSBcImVtaXRcIikge1xyXG4gICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoJ2VkaXQnLHJlc3VsdC5kYXRhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVNb2RlbChyb3cpIHtcclxuXHJcbiAgICBsZXQgYnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2RlbGV0ZScpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcblxyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5jb25maXJtKGBERUxFVEUgP2ApLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChyZXN1bHQgPT0gXCJ5ZXNcIikge1xyXG4gICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoJ2RlbGV0ZScsIHJvdylcclxuICAgICAgICB0aGlzLmRvQWN0aW9uKGJ1dHRvbi5uYW1lLHJvdyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBkb0FjdGlvbihidXR0b25OYW1lOiBzdHJpbmcsIHJvdykge1xyXG5cclxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSlcclxuXHJcbiAgICBpZiAoIWIpIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWIuYWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGIuY29uZmlybSl7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuY29uZmlybShgJHtiLmNvbmZpcm0ubWVzc2FnZX1gKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgPT0gXCJ5ZXNcIikge1xyXG4gICAgICAgICAgdGhpcy5leGVjQWN0aW9uKGIscm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5leGVjQWN0aW9uKGIsIHJvdylcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgZXhlY0FjdGlvbihiOiBCdXR0b24sIHJvdyl7XHJcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLkNhbGxBcGkoYi5hY3Rpb24sIHJvdykuc3Vic2NyaWJlKChhcGlSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICBpZiAoYi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoYi5hY3Rpb24uc3VjY2Vzc01lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlVwZGF0ZWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIkVycm9yOiBcIiArIGFwaVJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIlxuPHNwYS1zZWFyY2ggKm5nSWY9XCJjb25maWcuc2VhcmNoQ29uZmlnXCIgW2NvbmZpZ109XCJjb25maWcuc2VhcmNoQ29uZmlnXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4O1wiIChzZWFyY2hDbGljayk9XCJzZWFyY2hDbGlja2VkKCRldmVudClcIj48L3NwYS1zZWFyY2g+XG5cbjxkaXYgY2xhc3M9XCJ0b3BcIj5cblxuICA8ZGl2IGNsYXNzPVwidGluLXJvd1wiID5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY3JlYXRlQnV0dG9uXCIgaWQ9XCJidG5OZXdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIiAoY2xpY2spPVwibmV3TW9kZWwoKVwiPnt7Y3JlYXRlQnV0dG9uLmRpc3BsYXl9fTwvYnV0dG9uPlxuICAgIDwhLS0gPHNwYS10aWxlcyAqbmdJZj1cImNvbmZpZy50aWxlQ29uZmlnXCIgW3JlbG9hZF09XCJ0aWxlUmVsb2FkXCIgW2NvbmZpZ109XCJjb25maWcudGlsZUNvbmZpZ1wiPjwvc3BhLXRpbGVzPiAtLT5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImNvbmZpZy50aWxlQ29uZmlnICYmICFzbWFsbFNjcmVlblwiIHN0eWxlPVwibWluLXdpZHRoOiA3NSU7XCI+XG4gICAgPHNwYS10aWxlcyAgW3JlbG9hZF09XCJ0aWxlUmVsb2FkXCIgW2NvbmZpZ109XCJjb25maWcudGlsZUNvbmZpZ1wiPjwvc3BhLXRpbGVzPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnNob3dGaWx0ZXJcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPHNwYS1maWx0ZXIgW3Nob3dCdXR0b25dPVwic2hvd0ZpbHRlckJ1dHRvblwiIFtkYXRhXT1cInRhYmxlRGF0YVNvdXJjZVwiIChyZWZyZXNoQ2xpY2spPVwicmVmcmVzaENsaWNrZWQoKVwiPjwvc3BhLWZpbHRlcj5cbiAgPC9kaXY+XG5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY29uZmlnLnRpbGVDb25maWcgJiYgc21hbGxTY3JlZW5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICA8c3BhLXRpbGVzIFtyZWxvYWRdPVwidGlsZVJlbG9hZFwiIFtjb25maWddPVwiY29uZmlnLnRpbGVDb25maWdcIj48L3NwYS10aWxlcz5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiY29uZmlnLnRpdGxlXCIgY2xhc3M9XCJ0aXRsZVwiPlxuICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IGxhcmdlcjtcIj57e2NvbmZpZy50aXRsZSB8IGNhbWVsVG9Xb3Jkc319PC9sYWJlbD5cbjwvZGl2PlxuXG48ZGl2PlxuXG4gIDxwICpuZ0lmPVwiIWNvbmZpZ1wiPjxlbT5Db25maWd1cmUgVGFibGU8L2VtPjwvcD5cbiAgPHAgKm5nSWY9XCIhZGF0YVNvdXJjZVwiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XG5cblxuXG4gIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlXCI+XG5cblxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgIFtuZ0NsYXNzXT1cImVsZXZhdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbmZpZy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmID57eyBjb2x1bW4uYWxpYXMgPz8gY29sdW1uLm5hbWUgfCBjYW1lbFRvV29yZHMgfX08L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiIGNsYXNzPVwicmlnaHQtcGFkZGluZ1wiID5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPHNwYS1jaGVjayBbdmFsdWVdPVwicm93W2NvbHVtbi5uYW1lXVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9zcGEtY2hlY2s+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgPHNwYS1zZWxlY3QgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbb3B0aW9uRGlzcGxheV09XCJjb2x1bW4ub3B0aW9uRGlzcGxheVwiIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIiBbKHZhbHVlKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgd2lkdGg9XCI5MCVcIiA+PC9zcGEtc2VsZWN0PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGlwJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKGNsaWNrKT1cImNvbHVtbkNsaWNrZWQoY29sdW1uLCByb3cpXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogdGVzdENvbG9yQ29uZGl0aW9uKHJvdywgY29sdW1uLmNvbG9yKSA/IGNvbHVtbi5jb2xvci5uYW1lIDogZ2V0Q29sb3Iocm93W2NvbHVtbi5uYW1lXSwgY29sdW1uPy5vcHRpb25zKX1cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj4ge3tyb3dbY29sdW1uLm5hbWVdfX0gPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSA/PyBjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgZGF0ZSA6ICdkZC9NTS95eXl5J319XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgICB7e3Jvd1tjb2x1bW4ubmFtZV0gfCBkYXRlIDogJ2RkL01NL3l5eXkgSEg6bW0nfX1cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSA/PyBjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzcGlubmVyJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMjBcIj5cblxuICAgICAgICAgICAgICAgIDwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIj5cblxuICAgICAgICAgICAgICA8bGFiZWwgW25nU3R5bGVdPVwieydjb2xvcic6IHRlc3RDb2xvckNvbmRpdGlvbihyb3csIGNvbHVtbi5jb2xvcikgPyBjb2x1bW4uY29sb3IubmFtZSA6ICcnfVwiPnt7cm93W2NvbHVtbi5uYW1lXSB8IGN1cnJlbmN5OicnOicnfX08L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cblxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW25nU3R5bGVdPVwieydjb2xvcic6IHRlc3RDb2xvckNvbmRpdGlvbihyb3csIGNvbHVtbi5jb2xvcikgPyBjb2x1bW4uY29sb3IubmFtZSA6ICcnfVwiIChjbGljayk9XCJhY3Rpb25DbGlja2VkKGNvbHVtbi5uYW1lLCByb3cpXCI+e3tyb3dbY29sdW1uLm5hbWVdfX08L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tpY29uLnRpcEZpZWxkXSA/PyBpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tpY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgPGxhYmVsIFtuZ1N0eWxlXT1cInsnY29sb3InOiB0ZXN0Q29sb3JDb25kaXRpb24ocm93LCBjb2x1bW4uY29sb3IpID8gY29sdW1uLmNvbG9yLm5hbWUgOiAnJ31cIj57e3Jvd1tjb2x1bW4ubmFtZV19fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWN0aW9uIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbbmdTdHlsZV09XCJ7d2lkdGg6ZmFsc2UgPyAnNTBweCcgOiBhY3Rpb25zV2lkdGh9XCI+XG5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBkaXNwbGF5ZWRCdXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidXR0b24ubmFtZSAhPSAnY3JlYXRlJyAmJiB0ZXN0VmlzaWJsZShyb3csYnV0dG9uLm5hbWUpXCI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFjb25maWcuZmxhdEJ1dHRvbnNcIiBtYXQtbWluaS1mYWIgIFttYXRUb29sdGlwXT1cImJ1dHRvbi50aXAgPz8gYnV0dG9uLm5hbWUgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KX1cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdERpc2FibGVkKHJvdyxidXR0b24ubmFtZSlcIiAgKGNsaWNrKT1cImFjdGlvbkNsaWNrZWQoYnV0dG9uLm5hbWUsIHJvdylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKGJ1dHRvbi5uYW1lKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5mbGF0QnV0dG9uc1wiICBtYXQtaWNvbi1idXR0b24gIFttYXRUb29sdGlwXT1cImJ1dHRvbi50aXAgPz8gYnV0dG9uLm5hbWUgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIlxuXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LGJ1dHRvbi5uYW1lKVwiICAoY2xpY2spPVwiYWN0aW9uQ2xpY2tlZChidXR0b24ubmFtZSwgcm93KVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpnZXRCdXR0b25Db2xvcihidXR0b24sIHJvdyl9XCI+e3tnZXRJY29uKGJ1dHRvbi5uYW1lKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnV0dG9uLm5hbWUgIT0gJ2NyZWF0ZScgJiYgIXRlc3RWaXNpYmxlKHJvdyxidXR0b24ubmFtZSlcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAzNXB4O1wiPjwvbGFiZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIiBbbmdDbGFzc109XCJ7J21ha2UtZ3JheSc6IGNvbmZpZy5ncmV5T3V0ICYmIGNvbmZpZy5ncmV5T3V0KHJvdyl9XCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gIDwvZGl2PlxuXG4gIDxtYXQtcGFnaW5hdG9yICN0YWJsZVBhZ2luYXRvciBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zPjwvbWF0LXBhZ2luYXRvcj5cblxuPC9kaXY+XG5cbjxwICpuZ0lmPVwiZGF0YVNvdXJjZT8ubGVuZ3RoID09IDBcIj48ZW0+Tm8gRGF0YTwvZW0+PC9wPlxuXG5cbiJdfQ==
585
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaW50ZXJuYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtaW50ZXJuYWwvdGFibGUtaW50ZXJuYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtaW50ZXJuYWwvdGFibGUtaW50ZXJuYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0QsT0FBTyxFQUFzRCxVQUFVLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFJMUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU8vQixNQUFNLE9BQU8sc0JBQXNCO0lBRWpDLFlBQW9CLFdBQTJCLEVBQVUsY0FBOEIsRUFBVSxrQkFBc0MsRUFBUyxNQUFpQjtRQUE3SSxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQWdFakssY0FBUyxHQUFHLGtCQUFrQixDQUFDO1FBQy9CLGlCQUFZLEdBQUcsTUFBTSxDQUFDO1FBRXRCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixlQUFVLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFrQnBDLGNBQVMsR0FBRyxL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Q0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IERhdGVQaXBlLCBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBBY3Rpb24sIEJ1dHRvbiwgQ29sb3IsIENvbHVtbiwgRGV0YWlsc0RpYWxvZ0NvbmZpZywgRm9ybUNvbmZpZywgSWNvbiwgVGFibGVDb25maWcgfSBmcm9tICcuLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IERldGFpbHNEaWFsb2dJbnRlcm5hbCB9IGZyb20gJy4vZGV0YWlsc0RpYWxvZy1pbnRlcm5hbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRTdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZUxpYiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9UaW5Db3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcGEtdGFibGUtaW50ZXJuYWwnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1pbnRlcm5hbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtaW50ZXJuYWwuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUludGVybmFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2VMaWIsIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyLCBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2cpXHJcbiAge1xyXG4gICAgLy8gZGV0ZWN0IHNjcmVlbiBzaXplIGNoYW5nZXNcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoWyBcIihtYXgtd2lkdGg6IDYwMHB4KVwiXSkuc3Vic2NyaWJlKChyZXN1bHQ6IEJyZWFrcG9pbnRTdGF0ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKHJlc3VsdC5tYXRjaGVzKSB7XHJcbiAgICAgICAgdGhpcy5zbWFsbFNjcmVlbiA9IHRydWVcclxuICAgICAgICB0aGlzLnNldENvbHVtbnMoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc21hbGxTY3JlZW4gPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuc2V0Q29sdW1ucygpXHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuZWxldmF0aW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5lbGV2YXRpb24gPT0gXCJub25lXCIpIHtcclxuICAgICAgICB0aGlzLmVsZXZhdGlvbiA9IFwiXCJcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmNvbmZpZy5lbGV2YXRpb24gPT0gXCJsb3dcIikge1xyXG4gICAgICAgIHRoaXMuZWxldmF0aW9uID0gXCJtYXQtZWxldmF0aW9uLXoxXCJcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmNvbmZpZy5lbGV2YXRpb24gPT0gXCJtZWRpdW1cIikge1xyXG4gICAgICAgIHRoaXMuZWxldmF0aW9uID0gXCJtYXQtZWxldmF0aW9uLXo1XCJcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmNvbmZpZy5lbGV2YXRpb24gPT0gXCJoaWdoXCIpIHtcclxuICAgICAgICB0aGlzLmVsZXZhdGlvbiA9IFwibWF0LWVsZXZhdGlvbi16OVwiXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldENvbHVtbnMoKVxyXG5cclxuICAgIHRoaXMuY3JlYXRlQnV0dG9uID0gdGhpcy5nZXRCdXR0b24oJ2NyZWF0ZScpXHJcblxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcubG9hZEFjdGlvbikge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKHRoaXMuY29uZmlnLmxvYWRBY3Rpb24sIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybURlZmF1bHRzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlYXJjaENvbmZpZykge1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJCdXR0b24gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZWxvYWQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJlbG9hZC5zdWJzY3JpYmUodiA9PiB7XHJcblxyXG4gICAgICAgIGlmICh2ID09IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZz8ubG9hZEFjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWREYXRhKHRoaXMuY29uZmlnPy5sb2FkQWN0aW9uLCBcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBlbGV2YXRpb24gPSBcIm1hdC1lbGV2YXRpb24tejVcIjtcclxuICBhY3Rpb25zV2lkdGggPSBcIjUwcHhcIjtcclxuXHJcbiAgc2hvd0ZpbHRlckJ1dHRvbiA9IHRydWU7XHJcbiAgdGlsZVJlbG9hZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRBY3Rpb24pIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCJUYWJsZSBkYXRhIENoYW5nZWRcIilcclxuICAgICAgdGhpcy5kYXRhU291cmNlID0gdGhpcy5kYXRhO1xyXG5cclxuICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4odGhpcy5kYXRhU291cmNlKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7IH0sIDUpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlUGFnaW5hdG9yJykgdGFibGVQYWdpbmF0b3I6IE1hdFBhZ2luYXRvcjtcclxuXHJcbiAgQElucHV0KCkgaGlkZVRpdGxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGF0YTogYW55ID0gW107XHJcbiAgQElucHV0KCkgY29uZmlnOiBUYWJsZUNvbmZpZztcclxuICBASW5wdXQoKSByZWxvYWQ6IFN1YmplY3Q8Ym9vbGVhbj47XHJcbiAgQE91dHB1dCgpIGRhdGFMb2FkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSByZWZyZXNoQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNlYXJjaENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBjcmVhdGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBpbnB1dENoYW5nZWQoZXZlbnQpIHtcclxuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh7IGZpZWxkOiBldmVudC5maWVsZCwgdmFsdWU6IGV2ZW50LnZhbHVlIH0pXHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNoYW5nZWQgXCIgKyBKU09OLnN0cmluZ2lmeShldmVudCkpXHJcbiAgfVxyXG5cclxuICBzbWFsbFNjcmVlbiA9IGZhbHNlXHJcblxyXG4gIGNyZWF0ZUJ1dHRvbjogQnV0dG9uO1xyXG5cclxuXHJcbiAgLy9UYWJsZVxyXG4gIHRhYmxlRGF0YVNvdXJjZTtcclxuICBkYXRhU291cmNlOiBhbnlbXTtcclxuICAvLyBjb2x1bW5zOiBDb2x1bW5bXSA9IFtdO1xyXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbXVxyXG4gIC8vIEBJbnB1dCgpIG9wdGlvblZhbHVlID0gXCJcIjtcclxuICAvLyBASW5wdXQoKSBvcHRpb25EaXNwbGF5ID0gXCJcIjtcclxuICBkaXNwbGF5ZWRCdXR0b25zID0gW11cclxuXHJcbiAgZm9ybURlZmF1bHRzKCkge1xyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xyXG4gICAgICBsZXQgY29uZmlnID0gbmV3IEZvcm1Db25maWdcclxuXHJcbiAgICAgIGNvbmZpZy5maWVsZHMgPSBbXVxyXG5cclxuICAgICAgdGhpcy5jb25maWcuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcblxyXG4gICAgICAgIGxldCBmaWVsZCA9IHsgbmFtZTogY29sdW1uLm5hbWUsIHR5cGU6IGNvbHVtbi50eXBlIH1cclxuICAgICAgICBjb25maWcuZmllbGRzLnB1c2goZmllbGQpXHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuY29uZmlnLmZvcm1Db25maWcgPSBjb25maWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRDb2x1bW5zKCkge1xyXG5cclxuICAgIC8vY29sdW1uc1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uY29sdW1ucykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFsbFNjcmVlbikge1xyXG5cclxuICAgICAgbGV0IGNvbHMgPSBbXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5taW5Db2x1bW5zKSB7XHJcbiAgICAgICAgY29scyA9IHRoaXMuY29uZmlnLm1pbkNvbHVtbnMuZmlsdGVyKGNvbCA9PlxyXG4gICAgICAgICAgdGhpcy5jb25maWcuY29sdW1ucy5zb21lKHggPT4geC5uYW1lID09PSBjb2wpXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgaWYgKGNvbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IGNvbHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvL2J1dHRvbnNcclxuICAgIGlmICghdGhpcy5jb25maWc/LmJ1dHRvbnMpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJ1dHRvbnNDb3VudCA9IHRoaXMuY29uZmlnLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lICE9ICdjcmVhdGUnKS5sZW5ndGggPz8gMFxyXG4gICAgaWYgKGJ1dHRvbnNDb3VudCA+IDApIHtcclxuXHJcbiAgICAgIGlmICghdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLmZpbmQoeCA9PiB4ID09ICdhY3Rpb24nKSAmJiB0aGlzLmNvbmZpZy5idXR0b25zKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goXCJhY3Rpb25cIilcclxuICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICBpZiAodGhpcy5zbWFsbFNjcmVlbikge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcubWluQnV0dG9ucykge1xyXG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB0aGlzLmNvbmZpZy5taW5CdXR0b25zLmluY2x1ZGVzKHgubmFtZSkpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuY29uZmlnLmJ1dHRvbnMuZmlsdGVyKHggPT4geC5uYW1lICE9ICdjcmVhdGUnKS5zbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRCdXR0b25zID0gdGhpcy5jb25maWcuYnV0dG9ucy5maWx0ZXIoeCA9PiB4Lm5hbWUgIT0gJ2NyZWF0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFjdGlvbnNXaWR0aCA9IGAke3RoaXMuZGlzcGxheWVkQnV0dG9ucy5sZW5ndGggKiA0MCArIDIwfXB4YFxyXG5cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc2V0QnV0dG9ucygpIHtcclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmJ1dHRvbnMpIHJldHVyblxyXG5cclxuICAgIGlmICghdGhpcy5zbWFsbFNjcmVlbikge1xyXG4gICAgICB0aGlzLmRpc3BsYXllZEJ1dHRvbnMgPSB0aGlzLmNvbmZpZy5idXR0b25zO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQnV0dG9ucyA9IHRoaXMuY29uZmlnLmJ1dHRvbnM7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXRCdXR0b24obmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmJ1dHRvbnMpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJObyBidXR0b25zIGZvdW5kXCIpXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYnV0dG9ucy5maW5kKHggPT4geC5uYW1lID09IG5hbWUpXHJcbiAgfVxyXG5cclxuICBnZXRJY29uKGJ1dHRvbk5hbWU6IHN0cmluZykge1xyXG5cclxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSk7XHJcbiAgICBpZiAoYi5pY29uKSB7XHJcbiAgICAgIHJldHVybiBiLmljb24ubmFtZVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBpID0gJ29wZW5faW5fbmV3J1xyXG5cclxuICAgIHN3aXRjaCAoYnV0dG9uTmFtZSkge1xyXG5cclxuICAgICAgY2FzZSAndmlldyc6XHJcblxyXG4gICAgICAgIGkgPSB0aGlzLmNvbmZpZy5mbGF0QnV0dG9ucyA/ICdvcGVuX2luX25ldycgOiAncGFnZXZpZXcnO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZWRpdCc6XHJcbiAgICAgICAgaSA9ICdlZGl0J1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkZWxldGUnOlxyXG4gICAgICAgIGkgPSAnZGVsZXRlJ1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaTtcclxuICB9XHJcblxyXG4gIGdldEJ1dHRvbkNvbG9yKGJ1dHRvbjogQnV0dG9uLCByb3cpIHtcclxuXHJcbiAgICBpZiAoYnV0dG9uLmRpc2FibGVkKSB7XHJcbiAgICAgIGlmIChidXR0b24uZGlzYWJsZWQocm93KSkge1xyXG4gICAgICAgIHJldHVybiAnbGlnaHRncmF5J1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvbi5jb2xvcikge1xyXG4gICAgICByZXR1cm4gYnV0dG9uLmNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChidXR0b24ubmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICByZXR1cm4gJyNGNDQzMzYnXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcgIzQwNTBCNSdcclxuICB9XHJcblxyXG5cclxuICBnZXRPcHRpb25zKGNvbHVtbikge1xyXG4gICAgbGV0IHggPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQob3B0ID0+IG9wdC5uYW1lID09PSBjb2x1bW4pO1xyXG4gICAgcmV0dXJuIHhcclxuICB9XHJcblxyXG4gIGdldENvbG9yKHYsIG9wdGlvbnMpIHtcclxuXHJcbiAgICBsZXQgZGVmYXVsdENvbG9yID0gJ2xpZ2h0Z3JleSdcclxuXHJcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBkZWZhdWx0Q29sb3JcclxuXHJcbiAgICBsZXQgYyA9IG9wdGlvbnMuZmluZCh4ID0+IHgudmFsdWUgPT0gdilcclxuXHJcbiAgICBpZiAoYykge1xyXG4gICAgICByZXR1cm4gYy5jb2xvclxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRlZmF1bHRDb2xvclxyXG4gICAgfVxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgdGVzdEljb25Db25kaXRpb24odmFsdWU6IGFueSwgaWNvbjogSWNvbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChpY29uLmNvbmRpdGlvbikge1xyXG4gICAgICByZXR1cm4gaWNvbi5jb25kaXRpb24odmFsdWUpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGVzdENvbG9yQ29uZGl0aW9uKHZhbHVlOiBhbnksIGNvbG9yOiBDb2xvcik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghY29sb3IpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoY29sb3IuY29uZGl0aW9uKSB7XHJcbiAgICAgIHJldHVybiBjb2xvci5jb25kaXRpb24odmFsdWUpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd0Jhbm5lcihtZXNzYWdlKSB7XHJcblxyXG4gICAgaWYgKCFtZXNzYWdlKSByZXR1cm47XHJcbiAgICBpZiAobWVzc2FnZSA9PSAnJykgcmV0dXJuO1xyXG4gICAgdGhpcy5tZXNzYWdlU2VydmljZS5pbmZvKG1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgdGVzdERpc2FibGVkKHJvdywgYnV0dG9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKGJ1dHRvbk5hbWUpXHJcblxyXG4gICAgaWYgKGJ1dHRvbi5kaXNhYmxlZCkge1xyXG5cclxuICAgICAgcmV0dXJuIGJ1dHRvbi5kaXNhYmxlZChyb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICB0ZXN0VmlzaWJsZShyb3csIGJ1dHRvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbihidXR0b25OYW1lKVxyXG5cclxuICAgIGlmIChidXR0b24udmlzaWJsZSkge1xyXG5cclxuICAgICAgcmV0dXJuIGJ1dHRvbi52aXNpYmxlKHJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy9BY3Rpb25zXHJcblxyXG5cclxuXHJcbiAgbG9hZERhdGEoYWN0aW9uOiBBY3Rpb24sIGRhdGE6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJsb2FkaW5nXCIpXHJcblxyXG4gICAgaWYgKGFjdGlvbikge1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgdGhpcy5kYXRhU2VydmljZS5DYWxsQXBpKGFjdGlvbiwgZGF0YSkuc3Vic2NyaWJlKChhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvZ1Jlc3BvbnNlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhhcGlSZXNwb25zZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGFwaVJlc3BvbnNlLmRhdGFcclxuXHJcbiAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oYXBpUmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgdGhpcy50YWJsZURhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy50YWJsZVBhZ2luYXRvcjtcclxuXHJcbiAgICAgICAgaWYgKGFwaVJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShhcGlSZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgIHRoaXMudGFibGVEYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMudGFibGVQYWdpbmF0b3I7XHJcblxyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkKGFwaVJlc3BvbnNlLmRhdGEpO1xyXG5cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBhcGlSZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLy9FdmVudHNcclxuICBzZWFyY2hDbGlja2VkKHgpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiU2VhcmNoXCIpXHJcbiAgICB0aGlzLnNlYXJjaENsaWNrLmVtaXQoeCk7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coeClcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuc2VhcmNoQ29uZmlnLnNlYXJjaEFjdGlvbikge1xyXG4gICAgICB0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLm1ldGhvZCA9PSAncG9zdCdcclxuICAgICAgdGhpcy5sb2FkRGF0YSh0aGlzLmNvbmZpZy5zZWFyY2hDb25maWcuc2VhcmNoQWN0aW9uLCB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2hDbGlja2VkKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJSZWZyZXNoXCIpXHJcbiAgICB0aGlzLnJlZnJlc2hDbGljay5lbWl0KCk7XHJcblxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMubG9hZERhdGEodGhpcy5jb25maWcubG9hZEFjdGlvbiwgXCJcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGFMb2FkLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRhdGFMb2FkZWQoeCkge1xyXG5cclxuICAgIHRoaXMuZGF0YUxvYWQuZW1pdCh4KVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZGF0YWxvYWRlZFwiKVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy50aWxlQ29uZmlnPy5sb2FkQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMudGlsZVJlbG9hZC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBhY3Rpb25DbGlja2VkKG5hbWUsIHJvdykge1xyXG5cclxuICAgIGlmIChuYW1lID09ICd2aWV3Jykge1xyXG4gICAgICB0aGlzLnZpZXdNb2RlbChyb3cpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuYW1lID09ICdlZGl0Jykge1xyXG4gICAgICB0aGlzLmVkaXRNb2RlbChyb3cpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnZGVsZXRlJykge1xyXG4gICAgICB0aGlzLmRlbGV0ZU1vZGVsKHJvdyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1c3RvbU1vZGVsKG5hbWUsIHJvdyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGNvbHVtbkNsaWNrZWQoY29sdW1uOiBDb2x1bW4sIHJvdykge1xyXG5cclxuICAgIGlmIChjb2x1bW4uZGV0YWlsc0NvbmZpZykge1xyXG5cclxuICAgICAgY29sdW1uLmRldGFpbHNDb25maWcuZGV0YWlscyA9IHJvdztcclxuICAgICAgY29sdW1uLmRldGFpbHNDb25maWcuY29uZmlnLm1vZGUgPSBcInZpZXdcIjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW4uZGV0YWlsc0NvbmZpZy5oZXJvRmllbGQpIHtcclxuICAgICAgICBjb2x1bW4uZGV0YWlsc0NvbmZpZy5oZXJvVmFsdWUgPSByb3dbY29sdW1uLmRldGFpbHNDb25maWcuaGVyb0ZpZWxkXVxyXG5cclxuICAgICAgICBpZiAoY29sdW1uLmRldGFpbHNDb25maWcudGFibGVDb25maWcpIHtcclxuICAgICAgICAgIGNvbHVtbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmhlcm9GaWVsZCA9IGNvbHVtbi5kZXRhaWxzQ29uZmlnLmhlcm9GaWVsZFxyXG4gICAgICAgICAgY29sdW1uLmRldGFpbHNDb25maWcudGFibGVDb25maWcuaGVyb1ZhbHVlID0gY29sdW1uLmRldGFpbHNDb25maWcuaGVyb1ZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb2x1bW4uZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZ3MpIHtcclxuICAgICAgICAgIGNvbHVtbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlncy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50Lmhlcm9GaWVsZCA9IGNvbHVtbi5kZXRhaWxzQ29uZmlnLmhlcm9GaWVsZFxyXG4gICAgICAgICAgICBlbGVtZW50Lmhlcm9WYWx1ZSA9IGNvbHVtbi5kZXRhaWxzQ29uZmlnLmhlcm9WYWx1ZVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbHVtbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnICYmIGNvbHVtbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRBY3Rpb24gJiYgY29sdW1uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZENyaXRlcmlhICYmIGNvbHVtbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRJREZpZWxkKSB7XHJcbiAgICAgICAgY29sdW1uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZEFjdGlvbi51cmwgPSBjb2x1bW4uZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZy5sb2FkQWN0aW9uLnVybC5zcGxpdCgnLycpWzBdICsgXCIvXCIgKyBjb2x1bW4uZGV0YWlsc0NvbmZpZy50YWJsZUNvbmZpZy5sb2FkQ3JpdGVyaWEgKyBcIi9cIiArIGNvbHVtbi5kZXRhaWxzQ29uZmlnLmRldGFpbHNbY29sdW1uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZElERmllbGRdXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJUcmFuc2Zvcm1lZFwiKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiTk9UIFRyYW5zZm9ybWVkXCIpXHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nSW50ZXJuYWwsIHtcclxuICAgICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICAgIGRhdGE6IGNvbHVtbi5kZXRhaWxzQ29uZmlnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGNvbHVtbi5uYW1lLCByb3cpXHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChjb2x1bW4ubmFtZSwgcm93KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3VzdG9tTW9kZWwobmFtZSwgcm93KSB7XHJcblxyXG4gICAgbGV0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uKG5hbWUpO1xyXG4gICAgaWYgKGJ1dHRvbikge1xyXG5cclxuICAgICAgaWYgKCFidXR0b24uZGlhbG9nKSB7XHJcbiAgICAgICAgdGhpcy5kb0FjdGlvbihidXR0b24ubmFtZSwgcm93KVxyXG4gICAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQobmFtZSwgcm93KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgaWYgKGJ1dHRvbi5kZXRhaWxzQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgYnV0dG9uLmRldGFpbHNDb25maWcuZGV0YWlscyA9IHJvdztcclxuICAgICAgICAgIGJ1dHRvbi5kZXRhaWxzQ29uZmlnLmNvbmZpZy5tb2RlID0gXCJ2aWV3XCI7XHJcblxyXG4gICAgICAgICAgaWYgKGJ1dHRvbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnICYmIGJ1dHRvbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRBY3Rpb24gJiYgYnV0dG9uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZENyaXRlcmlhICYmIGJ1dHRvbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRJREZpZWxkKSB7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRBY3Rpb24udXJsID0gYnV0dG9uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZEFjdGlvbi51cmwuc3BsaXQoJy8nKVswXSArIFwiL1wiICsgYnV0dG9uLmRldGFpbHNDb25maWcudGFibGVDb25maWcubG9hZENyaXRlcmlhICsgXCIvXCIgKyBidXR0b24uZGV0YWlsc0NvbmZpZy5kZXRhaWxzW2J1dHRvbi5kZXRhaWxzQ29uZmlnLnRhYmxlQ29uZmlnLmxvYWRJREZpZWxkXSAvLyBmaXggZGF0YSB0byBwcm9wZXIgc291cmNlXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVHJhbnNmb3JtZWRcIilcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiTk9UIFRyYW5zZm9ybWVkXCIpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nSW50ZXJuYWwsIHtcclxuICAgICAgICAgICAgd2lkdGg6IFwiOTAwcHhcIixcclxuICAgICAgICAgICAgZGF0YTogYnV0dG9uLmRldGFpbHNDb25maWdcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCByb3cpXHJcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChidXR0b24ubmFtZSwgcm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQobmFtZSwgcm93KTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBhY3Rpb25DbGlja2VkRW1pdChuYW1lLCByb3cpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiQWN0aW9uIGNsaWNrZWRcIilcclxuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdCh7IG5hbWU6IG5hbWUsIGRhdGE6IHJvdyB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIHZpZXdNb2RlbChyb3cpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInZpZXcgQ2xpY2tlZFwiKVxyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbigndmlldycpO1xyXG5cclxuICAgIGlmICghYnV0dG9uKSByZXR1cm47XHJcblxyXG4gICAgaWYgKCFidXR0b24uZGlhbG9nKSB7XHJcbiAgICAgIHRoaXMuYWN0aW9uQ2xpY2tlZEVtaXQoYnV0dG9uLm5hbWUsIHJvdyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1Db25maWcpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChcIlBsZWFzZSBjb25maWd1cmUgZm9ybVwiKVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb25maWcuZm9ybUNvbmZpZy5tb2RlID0gXCJ2aWV3XCI7XHJcbiAgICBsZXQgY29uZjogRGV0YWlsc0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLFxyXG4gICAgICBidXR0b25zOiB0aGlzLmNvbmZpZy5idXR0b25zLFxyXG4gICAgICBkZXRhaWxzOiByb3csXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZXRhaWxzRGlhbG9nSW50ZXJuYWwsIHtcclxuICAgICAgd2lkdGg6IFwiOTAwcHhcIixcclxuICAgICAgZGF0YTogY29uZlxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuICB9XHJcblxyXG4gIG5ld01vZGVsKCkge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignY3JlYXRlJyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuICAgIGlmICghYnV0dG9uLmRpYWxvZykge1xyXG4gICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KGJ1dHRvbi5uYW1lLCBudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGNvbmZpZ3VyZSBmb3JtXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLm1vZGUgPSBcImNyZWF0ZVwiO1xyXG5cclxuICAgIGxldCBjb25mOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLmZvcm1Db25maWcsXHJcbiAgICAgIGJ1dHRvbnM6IHRoaXMuY29uZmlnLmJ1dHRvbnMsXHJcbiAgICB9XHJcblxyXG4gICAgY29uZi5oZXJvRmllbGQgPSB0aGlzLmNvbmZpZz8uaGVyb0ZpZWxkO1xyXG4gICAgY29uZi5oZXJvVmFsdWUgPSB0aGlzLmNvbmZpZz8uaGVyb1ZhbHVlO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGV0YWlsc0RpYWxvZ0ludGVybmFsLCB7XHJcbiAgICAgIHdpZHRoOiBcIjkwMHB4XCIsXHJcbiAgICAgIGRhdGE6IGNvbmYsXHJcbiAgICB9KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJzdWNjZXNzXCIpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KCdjcmVhdGUnLCByZXN1bHQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2xpY2tlZCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwiZW1pdFwiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnY3JlYXRlJywgcmVzdWx0LmRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZWRpdE1vZGVsKHJvdykge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignZWRpdCcpO1xyXG4gICAgaWYgKCFidXR0b24pIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWJ1dHRvbi5kaWFsb2cpIHtcclxuICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdChidXR0b24ubmFtZSwgcm93KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5jb25maWcuZm9ybUNvbmZpZykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiUGxlYXNlIGNvbmZpZ3VyZSBmb3JtXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbmZpZy5mb3JtQ29uZmlnLm1vZGUgPSBcImVkaXRcIjtcclxuICAgIGxldCBjb25mOiBEZXRhaWxzRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLmZvcm1Db25maWcsXHJcbiAgICAgIGJ1dHRvbnM6IHRoaXMuY29uZmlnLmJ1dHRvbnMsXHJcbiAgICAgIGRldGFpbHM6IHJvdyxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERldGFpbHNEaWFsb2dJbnRlcm5hbCwge1xyXG4gICAgICB3aWR0aDogXCI5MDBweFwiLFxyXG4gICAgICBkYXRhOiBjb25mXHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmlucHV0Q2hhbmdlLnN1YnNjcmliZSgoeCkgPT4ge1xyXG4gICAgICB0aGlzLmlucHV0Q2hhbmdlZCh4KVxyXG4gICAgfSk7XHJcblxyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlID09IFwic3VjY2Vzc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZWRpdCcsIHJlc3VsdC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDbGlja2VkKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0Lm1lc3NhZ2UgPT0gXCJlbWl0XCIpIHtcclxuICAgICAgICB0aGlzLmFjdGlvbkNsaWNrZWRFbWl0KCdlZGl0JywgcmVzdWx0LmRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZU1vZGVsKHJvdykge1xyXG5cclxuICAgIGxldCBidXR0b24gPSB0aGlzLmdldEJ1dHRvbignZGVsZXRlJyk7XHJcbiAgICBpZiAoIWJ1dHRvbikgcmV0dXJuO1xyXG5cclxuXHJcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYERFTEVURSA/YCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PSBcInllc1wiKSB7XHJcbiAgICAgICAgdGhpcy5hY3Rpb25DbGlja2VkRW1pdCgnZGVsZXRlJywgcm93KVxyXG4gICAgICAgIHRoaXMuZG9BY3Rpb24oYnV0dG9uLm5hbWUsIHJvdyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBkb0FjdGlvbihidXR0b25OYW1lOiBzdHJpbmcsIHJvdykge1xyXG5cclxuICAgIGxldCBiID0gdGhpcy5nZXRCdXR0b24oYnV0dG9uTmFtZSlcclxuXHJcbiAgICBpZiAoIWIpIHJldHVybjtcclxuXHJcbiAgICBpZiAoIWIuYWN0aW9uKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGIuY29uZmlybSkge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmNvbmZpcm0oYCR7Yi5jb25maXJtLm1lc3NhZ2V9YCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ID09IFwieWVzXCIpIHtcclxuICAgICAgICAgIHRoaXMuZXhlY0FjdGlvbihiLCByb3cpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhlY0FjdGlvbihiLCByb3cpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGV4ZWNBY3Rpb24oYjogQnV0dG9uLCByb3cpIHtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2UuQ2FsbEFwaShiLmFjdGlvbiwgcm93KS5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XHJcblxyXG4gICAgICBpZiAoYXBpUmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgIGlmIChiLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSkge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS50b2FzdChiLmFjdGlvbi5zdWNjZXNzTWVzc2FnZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiVXBkYXRlZFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaENsaWNrZWQoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnRvYXN0KFwiRXJyb3I6IFwiICsgYXBpUmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UudG9hc3QoXCJFcnJvcjogXCIgKyBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiXG48c3BhLXNlYXJjaCAqbmdJZj1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBbY29uZmlnXT1cImNvbmZpZy5zZWFyY2hDb25maWdcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDIwcHg7XCIgKHNlYXJjaENsaWNrKT1cInNlYXJjaENsaWNrZWQoJGV2ZW50KVwiPjwvc3BhLXNlYXJjaD5cblxuPGRpdiBjbGFzcz1cInRvcFwiPlxuXG4gIDxkaXYgY2xhc3M9XCJ0aW4tcm93XCI+XG4gICAgPGJ1dHRvbiAqbmdJZj1cImNyZWF0ZUJ1dHRvbiAmJiAhY29uZmlnLmZsYXRCdXR0b25zXCIgaWQ9XCJidG5OZXdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweDtcIiAoY2xpY2spPVwibmV3TW9kZWwoKVwiPnt7Y3JlYXRlQnV0dG9uLmRpc3BsYXl9fTwvYnV0dG9uPlxuICAgIDxidXR0b24gKm5nSWY9XCJjcmVhdGVCdXR0b24gJiYgY29uZmlnLmZsYXRCdXR0b25zXCIgaWQ9XCJidG5OZXdcIiBtYXQtc3Ryb2tlZC1idXR0b24gIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4OyBjb2xvcjogZ3JlZW47XCIgKGNsaWNrKT1cIm5ld01vZGVsKClcIj57e2NyZWF0ZUJ1dHRvbi5kaXNwbGF5fX08L2J1dHRvbj5cbiAgICA8IS0tIDxzcGEtdGlsZXMgKm5nSWY9XCJjb25maWcudGlsZUNvbmZpZ1wiIFtyZWxvYWRdPVwidGlsZVJlbG9hZFwiIFtjb25maWddPVwiY29uZmlnLnRpbGVDb25maWdcIj48L3NwYS10aWxlcz4gLS0+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJjb25maWcudGlsZUNvbmZpZyAmJiAhc21hbGxTY3JlZW5cIiBzdHlsZT1cIm1pbi13aWR0aDogNzUlO1wiPlxuICAgIDxzcGEtdGlsZXMgW3JlbG9hZF09XCJ0aWxlUmVsb2FkXCIgW2NvbmZpZ109XCJjb25maWcudGlsZUNvbmZpZ1wiPjwvc3BhLXRpbGVzPlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnNob3dGaWx0ZXJcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgPHNwYS1maWx0ZXIgW3Nob3dCdXR0b25dPVwic2hvd0ZpbHRlckJ1dHRvblwiIFtkYXRhXT1cInRhYmxlRGF0YVNvdXJjZVwiIFtmbGF0QnV0dG9uc109XCJjb25maWcuZmxhdEJ1dHRvbnNcIiAocmVmcmVzaENsaWNrKT1cInJlZnJlc2hDbGlja2VkKClcIj48L3NwYS1maWx0ZXI+XG4gIDwvZGl2PlxuXG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNvbmZpZy50aWxlQ29uZmlnICYmIHNtYWxsU2NyZWVuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgPHNwYS10aWxlcyBbcmVsb2FkXT1cInRpbGVSZWxvYWRcIiBbY29uZmlnXT1cImNvbmZpZy50aWxlQ29uZmlnXCI+PC9zcGEtdGlsZXM+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImNvbmZpZy50aXRsZSAmJiAhaGlkZVRpdGxlXCIgY2xhc3M9XCJ0aXRsZVwiPlxuICA8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6IGxhcmdlcjtcIj57e2NvbmZpZy50aXRsZSB8IGNhbWVsVG9Xb3Jkc319PC9sYWJlbD5cbjwvZGl2PlxuXG48ZGl2PlxuXG4gIDxwICpuZ0lmPVwiIWNvbmZpZ1wiPjxlbT5Db25maWd1cmUgVGFibGU8L2VtPjwvcD5cbiAgPHAgKm5nSWY9XCIhZGF0YVNvdXJjZVwiPjxlbT5Mb2FkaW5nLi4uPC9lbT48L3A+XG5cblxuXG4gIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlXCI+XG5cblxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwidGFibGVEYXRhU291cmNlXCIgIFtuZ0NsYXNzXT1cImVsZXZhdGlvblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbmZpZy5jb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmID57eyBjb2x1bW4uYWxpYXMgPz8gY29sdW1uLm5hbWUgfCBjYW1lbFRvV29yZHMgfX08L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiIGNsYXNzPVwicmlnaHQtcGFkZGluZ1wiID5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgPHNwYS1jaGVjayBbdmFsdWVdPVwicm93W2NvbHVtbi5uYW1lXVwiIFtyZWFkb25seV09XCJ0cnVlXCI+PC9zcGEtY2hlY2s+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlbGVjdCdcIj5cbiAgICAgICAgICAgICAgPHNwYS1zZWxlY3QgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbb3B0aW9uRGlzcGxheV09XCJjb2x1bW4ub3B0aW9uRGlzcGxheVwiIFtvcHRpb25WYWx1ZV09XCJjb2x1bW4ub3B0aW9uVmFsdWVcIiBbKHZhbHVlKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgd2lkdGg9XCI5MCVcIiA+PC9zcGEtc2VsZWN0PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGlwJ1wiPlxuICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKGNsaWNrKT1cImNvbHVtbkNsaWNrZWQoY29sdW1uLCByb3cpXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogdGVzdENvbG9yQ29uZGl0aW9uKHJvdywgY29sdW1uLmNvbG9yKSA/IGNvbHVtbi5jb2xvci5uYW1lIDogZ2V0Q29sb3Iocm93W2NvbHVtbi5uYW1lXSwgY29sdW1uPy5vcHRpb25zKX1cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcIj4ge3tyb3dbY29sdW1uLm5hbWVdfX0gPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWNvbidcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSA/PyBjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICAgICAge3tyb3dbY29sdW1uLm5hbWVdIHwgZGF0ZSA6ICdkZC9NTS95eXl5J319XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiPlxuICAgICAgICAgICAgICB7e3Jvd1tjb2x1bW4ubmFtZV0gfCBkYXRlIDogJ2RkL01NL3l5eXkgSEg6bW0nfX1cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cImNvbHVtbi5pY29uICYmIHRlc3RJY29uQ29uZGl0aW9uKHJvdywgY29sdW1uLmljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSA/PyBjb2x1bW4uaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzcGlubmVyJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMjBcIj5cblxuICAgICAgICAgICAgICAgIDwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb25leSdcIj5cblxuICAgICAgICAgICAgICA8bGFiZWwgW25nU3R5bGVdPVwieydjb2xvcic6IHRlc3RDb2xvckNvbmRpdGlvbihyb3csIGNvbHVtbi5jb2xvcikgPyBjb2x1bW4uY29sb3IubmFtZSA6ICcnfVwiPnt7cm93W2NvbHVtbi5uYW1lXSB8IGN1cnJlbmN5OicnOicnfX08L2xhYmVsPlxuXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpjb2x1bW4uaWNvbj8uY29sb3J9XCI+e3tjb2x1bW4uaWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpY29uIG9mIGNvbHVtbi5pY29uc1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJ0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGljb24pXCIgW21hdFRvb2x0aXBdPVwicm93W2ljb24udGlwRmllbGRdID8/IGljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2ljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmljb24/LmNvbG9yfVwiPnt7aWNvbi5uYW1lIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2J1dHRvbidcIj5cblxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW25nU3R5bGVdPVwieydjb2xvcic6IHRlc3RDb2xvckNvbmRpdGlvbihyb3csIGNvbHVtbi5jb2xvcikgPyBjb2x1bW4uY29sb3IubmFtZSA6ICcnfVwiIChjbGljayk9XCJhY3Rpb25DbGlja2VkKGNvbHVtbi5uYW1lLCByb3cpXCI+e3tyb3dbY29sdW1uLm5hbWVdfX08L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwiY29sdW1uLmljb24gJiYgdGVzdEljb25Db25kaXRpb24ocm93LCBjb2x1bW4uaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbY29sdW1uLmljb24udGlwRmllbGRdID8/IGNvbHVtbi5pY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6Y29sdW1uLmljb24/LmNvbG9yfVwiPnt7Y29sdW1uLmljb24ubmFtZSB9fTwvbWF0LWljb24+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaWNvbiBvZiBjb2x1bW4uaWNvbnNcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjb2wtaWNvblwiICpuZ0lmPVwidGVzdEljb25Db25kaXRpb24ocm93LCBpY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tpY29uLnRpcEZpZWxkXSA/PyBpY29uPy50aXBcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIChjbGljayk9XCJzaG93QmFubmVyKHJvd1tpY29uLnRpcEZpZWxkXSlcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzppY29uPy5jb2xvcn1cIj57e2ljb24ubmFtZSB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgICAgPGxhYmVsIFtuZ1N0eWxlXT1cInsnY29sb3InOiB0ZXN0Q29sb3JDb25kaXRpb24ocm93LCBjb2x1bW4uY29sb3IpID8gY29sdW1uLmNvbG9yLm5hbWUgOiAnJ31cIj57e3Jvd1tjb2x1bW4ubmFtZV19fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNvbC1pY29uXCIgKm5nSWY9XCJjb2x1bW4uaWNvbiAmJiB0ZXN0SWNvbkNvbmRpdGlvbihyb3csIGNvbHVtbi5pY29uKVwiIFttYXRUb29sdGlwXT1cInJvd1tjb2x1bW4uaWNvbi50aXBGaWVsZF0gPz8gY29sdW1uLmljb24/LnRpcFwiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCIgKGNsaWNrKT1cInNob3dCYW5uZXIocm93W2NvbHVtbi5pY29uLnRpcEZpZWxkXSlcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbY29sdW1uLmljb24udGlwRmllbGRdKVwiIFtuZ1N0eWxlXT1cInsnY29sb3InOmNvbHVtbi5pY29uPy5jb2xvcn1cIj57e2NvbHVtbi5pY29uLm5hbWUgfX08L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGljb24gb2YgY29sdW1uLmljb25zXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY29sLWljb25cIiAqbmdJZj1cInRlc3RJY29uQ29uZGl0aW9uKHJvdywgaWNvbilcIiBbbWF0VG9vbHRpcF09XCJyb3dbaWNvbi50aXBGaWVsZF0gPz8gaWNvbj8udGlwXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiAoY2xpY2spPVwic2hvd0Jhbm5lcihyb3dbaWNvbi50aXBGaWVsZF0pXCIgW25nU3R5bGVdPVwieydjb2xvcic6aWNvbj8uY29sb3J9XCI+e3tpY29uLm5hbWUgfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWN0aW9uIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbbmdTdHlsZV09XCJ7d2lkdGg6ZmFsc2UgPyAnNTBweCcgOiBhY3Rpb25zV2lkdGh9XCI+XG5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBkaXNwbGF5ZWRCdXR0b25zXCI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJidXR0b24ubmFtZSAhPSAnY3JlYXRlJyAmJiB0ZXN0VmlzaWJsZShyb3csYnV0dG9uLm5hbWUpXCI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFjb25maWcuZmxhdEJ1dHRvbnNcIiBtYXQtbWluaS1mYWIgIFttYXRUb29sdGlwXT1cImJ1dHRvbi50aXAgPz8gYnV0dG9uLm5hbWUgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOmdldEJ1dHRvbkNvbG9yKGJ1dHRvbiwgcm93KX1cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGVzdERpc2FibGVkKHJvdyxidXR0b24ubmFtZSlcIiAgKGNsaWNrKT1cImFjdGlvbkNsaWNrZWQoYnV0dG9uLm5hbWUsIHJvdylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+e3tnZXRJY29uKGJ1dHRvbi5uYW1lKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5mbGF0QnV0dG9uc1wiICBtYXQtaWNvbi1idXR0b24gIFttYXRUb29sdGlwXT1cImJ1dHRvbi50aXAgPz8gYnV0dG9uLm5hbWUgXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo1cHhcIlxuXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0ZXN0RGlzYWJsZWQocm93LGJ1dHRvbi5uYW1lKVwiICAoY2xpY2spPVwiYWN0aW9uQ2xpY2tlZChidXR0b24ubmFtZSwgcm93KVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbbmdTdHlsZV09XCJ7J2NvbG9yJzpnZXRCdXR0b25Db2xvcihidXR0b24sIHJvdyl9XCI+e3tnZXRJY29uKGJ1dHRvbi5uYW1lKX19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYnV0dG9uLm5hbWUgIT0gJ2NyZWF0ZScgJiYgIXRlc3RWaXNpYmxlKHJvdyxidXR0b24ubmFtZSlcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAzNXB4O1wiPjwvbGFiZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIiBbbmdDbGFzc109XCJ7J21ha2UtZ3JheSc6IGNvbmZpZy5ncmV5T3V0ICYmIGNvbmZpZy5ncmV5T3V0KHJvdyl9XCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gIDwvZGl2PlxuXG4gIDxtYXQtcGFnaW5hdG9yICN0YWJsZVBhZ2luYXRvciBbcGFnZVNpemVPcHRpb25zXT1cIlsxMCwgMjAsIDUwXVwiIHNob3dGaXJzdExhc3RCdXR0b25zPjwvbWF0LXBhZ2luYXRvcj5cblxuPC9kaXY+XG5cbjxwICpuZ0lmPVwiZGF0YVNvdXJjZT8ubGVuZ3RoID09IDBcIj48ZW0+Tm8gRGF0YTwvZW0+PC9wPlxuXG5cbiJdfQ==
@@ -78,7 +78,7 @@ export class TasksComponent {
78
78
  }
79
79
  }
80
80
  TasksComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TasksComponent, deps: [{ token: i1.DataServiceLib }, { token: i2.MessageService }, { token: i3.AuthService }, { token: i4.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
81
- TasksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TasksComponent, selector: "spa-tasks", ngImport: i0, template: "<div class=\"d-flex align-items-center justify-content-between mt-0\" style=\"margin-left: 10px\">\n\n <label style=\"font-size: 16px;\">Tasks</label>\n\n <div>\n <button mat-mini-fab color=\"primary\" style=\"margin-right:1em;\" (click)=\"cats()\" matTooltip=\"Categories\" matTooltipPosition=\"above\"><mat-icon>category</mat-icon></button>\n </div>\n\n</div>\n<hr>\n\n<div class=\"mt-3\" style=\" font-size: 14px;\">\n <spa-table [config]=\"config\" [reload]=\"reload\"></spa-table>\n</div>\n", styles: [".mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"], dependencies: [{ kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i8.TableComponent, selector: "spa-table", inputs: ["data", "config", "reload"], outputs: ["dataLoad", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange"] }] });
81
+ TasksComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TasksComponent, selector: "spa-tasks", ngImport: i0, template: "<div class=\"d-flex align-items-center justify-content-between mt-0\" style=\"margin-left: 10px\">\n\n <label style=\"font-size: 16px;\">Tasks</label>\n\n <div>\n <button mat-mini-fab color=\"primary\" style=\"margin-right:1em;\" (click)=\"cats()\" matTooltip=\"Categories\" matTooltipPosition=\"above\"><mat-icon>category</mat-icon></button>\n </div>\n\n</div>\n<hr>\n\n<div class=\"mt-3\" style=\" font-size: 14px;\">\n <spa-table [config]=\"config\" [reload]=\"reload\"></spa-table>\n</div>\n", styles: [".mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"], dependencies: [{ kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i8.TableComponent, selector: "spa-table", inputs: ["hideTitle", "data", "config", "reload"], outputs: ["dataLoad", "refreshClick", "searchClick", "createClick", "actionClick", "inputChange"] }] });
82
82
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TasksComponent, decorators: [{
83
83
  type: Component,
84
84
  args: [{ selector: 'spa-tasks', template: "<div class=\"d-flex align-items-center justify-content-between mt-0\" style=\"margin-left: 10px\">\n\n <label style=\"font-size: 16px;\">Tasks</label>\n\n <div>\n <button mat-mini-fab color=\"primary\" style=\"margin-right:1em;\" (click)=\"cats()\" matTooltip=\"Categories\" matTooltipPosition=\"above\"><mat-icon>category</mat-icon></button>\n </div>\n\n</div>\n<hr>\n\n<div class=\"mt-3\" style=\" font-size: 14px;\">\n <spa-table [config]=\"config\" [reload]=\"reload\"></spa-table>\n</div>\n", styles: [".mat-mini-fab{width:32px;height:32px}.mat-mini-fab mat-icon{font-size:16px;margin-top:-3px}\n"] }]