@onecx/angular-accelerator 5.51.0 → 5.52.0

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 (44) hide show
  1. package/assets/i18n/de.json +6 -6
  2. package/assets/i18n/en.json +6 -6
  3. package/assets/i18n/storybook-translations/page-header/de.json +13 -0
  4. package/assets/i18n/storybook-translations/page-header/en.json +13 -0
  5. package/esm2022/index.mjs +2 -1
  6. package/esm2022/lib/angular-accelerator-primeng.module.mjs +4 -4
  7. package/esm2022/lib/angular-accelerator.module.mjs +6 -6
  8. package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +3 -3
  9. package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +3 -3
  10. package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +3 -3
  11. package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +3 -3
  12. package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +10 -6
  13. package/esm2022/lib/components/data-loading-error/data-loading-error.component.mjs +3 -3
  14. package/esm2022/lib/components/data-table/data-table.component.mjs +6 -8
  15. package/esm2022/lib/components/data-view/data-view.component.mjs +3 -3
  16. package/esm2022/lib/components/diagram/diagram.component.mjs +3 -3
  17. package/esm2022/lib/components/filter-view/filter-view.component.mjs +3 -3
  18. package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +3 -3
  19. package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +3 -3
  20. package/esm2022/lib/components/page-header/page-header.component.mjs +25 -5
  21. package/esm2022/lib/components/search-header/search-header.component.mjs +5 -5
  22. package/esm2022/lib/directives/advanced.directive.mjs +3 -3
  23. package/esm2022/lib/directives/if-breakpoint.directive.mjs +3 -3
  24. package/esm2022/lib/directives/if-permission.directive.mjs +3 -3
  25. package/esm2022/lib/directives/src.directive.mjs +3 -3
  26. package/esm2022/lib/directives/tooltipOnOverflow.directive.mjs +3 -3
  27. package/esm2022/lib/model/translation.model.mjs +2 -0
  28. package/esm2022/lib/pipes/dynamic.pipe.mjs +3 -3
  29. package/esm2022/lib/pipes/ocxtimeago.pipe.mjs +3 -3
  30. package/esm2022/lib/services/breadcrumb.service.mjs +18 -6
  31. package/esm2022/lib/services/translation-cache.service.mjs +12 -6
  32. package/esm2022/lib/utils/dateutils.mjs +3 -3
  33. package/esm2022/testing/page-header.harness.mjs +26 -2
  34. package/fesm2022/onecx-angular-accelerator-testing.mjs +25 -1
  35. package/fesm2022/onecx-angular-accelerator-testing.mjs.map +1 -1
  36. package/fesm2022/onecx-angular-accelerator.mjs +133 -93
  37. package/fesm2022/onecx-angular-accelerator.mjs.map +1 -1
  38. package/index.d.ts +1 -0
  39. package/lib/components/page-header/page-header.component.d.ts +21 -2
  40. package/lib/model/translation.model.d.ts +31 -0
  41. package/lib/services/breadcrumb.service.d.ts +9 -4
  42. package/lib/services/translation-cache.service.d.ts +8 -1
  43. package/package.json +11 -7
  44. package/testing/page-header.harness.d.ts +5 -1
@@ -493,10 +493,10 @@ export class InteractiveDataViewComponent {
493
493
  this.pageSize = event;
494
494
  this.pageSizeChanged.emit(event);
495
495
  }
496
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveDataViewComponent, deps: [{ token: i1.SlotService }], target: i0.ɵɵFactoryTarget.Component }); }
497
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveDataViewComponent, selector: "ocx-interactive-data-view", inputs: { searchConfigPermission: "searchConfigPermission", deletePermission: "deletePermission", editPermission: "editPermission", viewPermission: "viewPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", tableSelectionEnabledField: "tableSelectionEnabledField", tableAllowSelectAll: "tableAllowSelectAll", name: "name", titleLineId: "titleLineId", subtitleLineIds: "subtitleLineIds", supportedViewLayouts: "supportedViewLayouts", columns: "columns", emptyResultsMessage: "emptyResultsMessage", clientSideSorting: "clientSideSorting", clientSideFiltering: "clientSideFiltering", fallbackImage: "fallbackImage", filters: "filters", sortDirection: "sortDirection", sortField: "sortField", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", showAllOption: "showAllOption", totalRecordsOnServer: "totalRecordsOnServer", layout: "layout", defaultGroupKey: "defaultGroupKey", customGroupKey: "customGroupKey", groupSelectionNoGroupSelectedKey: "groupSelectionNoGroupSelectedKey", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", additionalActions: "additionalActions", listGridPaginator: "listGridPaginator", tablePaginator: "tablePaginator", disableFilterView: "disableFilterView", filterViewDisplayMode: "filterViewDisplayMode", filterViewChipStyleClass: "filterViewChipStyleClass", filterViewTableStyle: "filterViewTableStyle", filterViewPanelStyle: "filterViewPanelStyle", selectDisplayedChips: "selectDisplayedChips", page: "page", selectedRows: "selectedRows", displayedColumnKeys: "displayedColumnKeys", displayedColumns: "displayedColumns", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", paginator: "paginator", data: "data" }, outputs: { filtered: "filtered", sorted: "sorted", deleteItem: "deleteItem", viewItem: "viewItem", editItem: "editItem", dataViewLayoutChange: "dataViewLayoutChange", displayedColumnsChange: "displayedColumnsChange", displayedColumnKeysChange: "displayedColumnKeysChange", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, providers: [{ provide: 'InteractiveDataViewComponent', useExisting: InteractiveDataViewComponent }], queries: [{ propertyName: "tableCell", first: true, predicate: ["tableCell"], descendants: true }, { propertyName: "tableDateCell", first: true, predicate: ["tableDateCell"], descendants: true }, { propertyName: "dateTableCell", first: true, predicate: ["dateTableCell"], descendants: true }, { propertyName: "tableRelativeDateCell", first: true, predicate: ["tableRelativeDateCell"], descendants: true }, { propertyName: "relativeDateTableCell", first: true, predicate: ["relativeDateTableCell"], descendants: true }, { propertyName: "tableTranslationKeyCell", first: true, predicate: ["tableTranslationKeyCell"], descendants: true }, { propertyName: "translationKeyTableCell", first: true, predicate: ["translationKeyTableCell"], descendants: true }, { propertyName: "gridItemSubtitleLines", first: true, predicate: ["gridItemSubtitleLines"], descendants: true }, { propertyName: "listItemSubtitleLines", first: true, predicate: ["listItemSubtitleLines"], descendants: true }, { propertyName: "stringTableCell", first: true, predicate: ["stringTableCell"], descendants: true }, { propertyName: "numberTableCell", first: true, predicate: ["numberTableCell"], descendants: true }, { propertyName: "customTableCell", first: true, predicate: ["customTableCell"], descendants: true }, { propertyName: "gridItem", first: true, predicate: ["gridItem"], descendants: true }, { propertyName: "listItem", first: true, predicate: ["listItem"], descendants: true }, { propertyName: "topCenter", first: true, predicate: ["topCenter"], descendants: true }, { propertyName: "listValue", first: true, predicate: ["listValue"], descendants: true }, { propertyName: "translationKeyListValue", first: true, predicate: ["translationKeyListValue"], descendants: true }, { propertyName: "numberListValue", first: true, predicate: ["numberListValue"], descendants: true }, { propertyName: "relativeDateListValue", first: true, predicate: ["relativeDateListValue"], descendants: true }, { propertyName: "customListValue", first: true, predicate: ["customListValue"], descendants: true }, { propertyName: "stringListValue", first: true, predicate: ["stringListValue"], descendants: true }, { propertyName: "dateListValue", first: true, predicate: ["dateListValue"], descendants: true }, { propertyName: "tableFilterCell", first: true, predicate: ["tableFilterCell"], descendants: true }, { propertyName: "dateTableFilterCell", first: true, predicate: ["dateTableFilterCell"], descendants: true }, { propertyName: "relativeDateTableFilterCell", first: true, predicate: ["relativeDateTableFilterCell"], descendants: true }, { propertyName: "translationKeyTableFilterCell", first: true, predicate: ["translationKeyTableFilterCell"], descendants: true }, { propertyName: "stringTableFilterCell", first: true, predicate: ["stringTableFilterCell"], descendants: true }, { propertyName: "numberTableFilterCell", first: true, predicate: ["numberTableFilterCell"], descendants: true }, { propertyName: "customTableFilterCell", first: true, predicate: ["customTableFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "dataView", first: true, predicate: DataViewComponent, descendants: true }], ngImport: i0, template: "<div class=\"p-3 border-bottom-1 surface-border\">\n <div class=\"flex flex-wrap justify-content-between align-items-center py-1 gap-2\">\n <div class=\"flex flex-wrap justify-content-start align-items-center gap-2\">\n <ocx-data-layout-selection\n [supportedViewLayouts]=\"supportedViewLayouts\"\n [layout]=\"layout\"\n (dataViewLayoutChange)=\"onDataViewLayoutChange($event)\"\n (componentStateChanged)=\"dataLayoutComponentState$.next($event)\"\n ></ocx-data-layout-selection>\n <ocx-filter-view\n *ngIf=\"!disableFilterView\"\n [filters]=\"filters\"\n [columns]=\"columns\"\n [templates]=\"templates$ | async\"\n [displayMode]=\"filterViewDisplayMode\"\n [selectDisplayedChips]=\"selectDisplayedChips\"\n [chipStyleClass]=\"filterViewChipStyleClass\"\n [tableStyle]=\"filterViewTableStyle\"\n (filtered)=\"filtering($event)\"\n (componentStateChanged)=\"filterViewComponentState$.next($event)\"\n ></ocx-filter-view>\n </div>\n\n <div *ngIf=\"topCenter\">\n <ng-container [ngTemplateOutlet]=\"topCenter\"> </ng-container>\n </div>\n\n <div *ngIf=\"layout !== 'table'\" class=\"flex align-items-center gap-2\">\n <ocx-data-list-grid-sorting\n [sortDirection]=\"sortDirection\"\n [sortField]=\"sortField\"\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n (sortChange)=\"onSortChange($event)\"\n (sortDirectionChange)=\"onSortDirectionChange($event)\"\n (componentStateChanged)=\"dataListGridSortingComponentState$.next($event)\"\n ></ocx-data-list-grid-sorting>\n </div>\n\n <div\n [ngStyle]=\"layout !== 'table' ? {\n 'position': 'absolute'\n } : {}\"\n class=\"flex flex-wrap justify-content-between align-items-center gap-2\"\n >\n <ng-container *ngIf=\"isColumnGroupSelectionComponentDefined$ | async; else defaultColumnGroupSelectionComponent\">\n <ng-container *ngIf=\"displayedColumnKeys$ | async as displayedColumnKeys\">\n <ocx-slot\n [ngStyle]=\"layout !== 'table' ? {'display' : 'none'} : {}\"\n *ocxIfPermission=\"searchConfigPermission; elseTemplate: defaultColumnGroupSelectionComponent\"\n name=\"{{columnGroupSlotName}}\"\n [inputs]=\"{ placeholderKey: groupSelectionNoGroupSelectedKey, defaultGroupKey: defaultGroupKey, customGroupKey: customGroupKey, columns: columns, selectedGroupKey: selectedGroupKey, layout: layout, displayedColumnsIds: displayedColumnKeys }\"\n [outputs]=\"{ groupSelectionChanged: groupSelectionChangedSlotEmitter }\"\n >\n <ng-template #skeleton>\n <div class=\"flex\">\n <p-skeleton width=\"18rem\" height=\"3rem\"></p-skeleton>\n </div>\n </ng-template>\n </ocx-slot>\n </ng-container>\n </ng-container>\n\n <ocx-custom-group-column-selector\n *ngIf=\"layout === 'table'\"\n [columns]=\"columns\"\n [displayedColumns]=\"(displayedColumns$ | async) ?? []\"\n [customGroupKey]=\"customGroupKey\"\n (columnSelectionChanged)=\"onColumnSelectionChange($event)\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n (actionColumnConfigChanged)=\"onActionColumnConfigChange($event)\"\n (componentStateChanged)=\"customGroupColumnSelectorComponentState$.next($event)\"\n ></ocx-custom-group-column-selector>\n </div>\n </div>\n</div>\n<div class=\"p-3\">\n <ocx-data-view\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n [sortField]=\"sortField\"\n [filters]=\"filters\"\n [data]=\"data\"\n [sortDirection]=\"sortDirection\"\n [titleLineId]=\"titleLineId\"\n [subtitleLineIds]=\"subtitleLineIds\"\n [clientSideSorting]=\"clientSideSorting\"\n [clientSideFiltering]=\"clientSideFiltering\"\n [pageSizes]=\"pageSizes\"\n [pageSize]=\"pageSize\"\n [showAllOption]=\"showAllOption\"\n [emptyResultsMessage]=\"emptyResultsMessage\"\n [layout]=\"layout\"\n [name]=\"name\"\n [deletePermission]=\"deletePermission\"\n [editPermission]=\"editPermission\"\n [viewPermission]=\"viewPermission\"\n [deleteActionEnabledField]=\"deleteActionEnabledField\"\n [deleteActionVisibleField]=\"deleteActionVisibleField\"\n [editActionEnabledField]=\"editActionEnabledField\"\n [editActionVisibleField]=\"editActionVisibleField\"\n [viewActionEnabledField]=\"viewActionEnabledField\"\n [viewActionVisibleField]=\"viewActionVisibleField\"\n [additionalActions]=\"additionalActions\"\n [listGridPaginator]=\"listGridPaginator\"\n [tablePaginator]=\"tablePaginator\"\n [page]=\"page\"\n (pageChanged)=\"onPageChange($event)\"\n (pageSizeChanged)=\"onPageSizeChange($event)\"\n [selectedRows]=\"selectedRows\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n [stringTableCellTemplate]=\"primeNgStringTableCell ?? _stringTableCell\"\n [numberTableCellTemplate]=\"primeNgNumberTableCell ?? _numberTableCell\"\n [customTableCellTemplate]=\"primeNgCustomTableCell ?? _customTableCell\"\n [dateTableCellTemplate]=\"primeNgDateTableCell ?? _dateTableCell ?? primeNgTableDateCell ?? _tableDateCell\"\n [relativeDateTableCellTemplate]=\"primeNgRelativeDateTableCell ?? _relativeDateTableCell ?? primeNgTableRelativeDateCell ?? _tableRelativeDateCell\"\n [tableCellTemplate]=\"primeNgTableCell ?? _tableCell\"\n [translationKeyTableCellTemplate]=\"primeNgTranslationKeyTableCell ?? _translationKeyTableCell ?? primeNgTableTranslationKeyCell ?? _tableTranslationKeyCell\"\n [gridItemSubtitleLinesTemplate]=\"primeNgGridItemSubtitleLines ?? _gridItemSubtitleLines\"\n [listItemSubtitleLinesTemplate]=\"primeNgListItemSubtitleLines ?? _listItemSubtitleLines\"\n [listItemTemplate]=\"primeNgListItem ?? _listItem\"\n [listValueTemplate]=\"primeNgListValue ?? _listValue\"\n [translationKeyListValueTemplate]=\"primeNgTranslationKeyListValue ?? _translationKeyListValue\"\n [numberListValueTemplate]=\"primeNgNumberListValue ?? _numberListValue\"\n [relativeDateListValueTemplate]=\"primeNgRelativeDateListValue ?? _relativeDateListValue\"\n [customListValueTemplate]=\"primeNgCustomListValue ?? _customListValue\"\n [stringListValueTemplate]=\"primeNgStringListValue ?? _stringListValue\"\n [dateListValueTemplate]=\"primeNgDateListValue ?? _dateListValue\"\n [gridItemTemplate]=\"primeNgGridItem ?? _gridItem\"\n [tableFilterCellTemplate]=\"primeNgTableFilterCell ?? _tableFilterCell\"\n [dateTableFilterCellTemplate]=\"primeNgDateTableFilterCell ?? _dateTableFilterCell\"\n [customTableFilterCellTemplate]=\"primeNgCustomTableFilterCell ?? _customTableFilterCell\"\n [numberTableFilterCellTemplate]=\"primeNgNumberTableFilterCell ?? _numberTableFilterCell\"\n [stringTableFilterCellTemplate]=\"primeNgStringTableFilterCell ?? _stringTableFilterCell\"\n [relativeDateTableFilterCellTemplate]=\"primeNgRelativeDateTableFilterCell ?? _relativeDateTableFilterCell\"\n [translationKeyTableFilterCellTemplate]=\"primeNgTranslationKeyTableFilterCell ?? _translationKeyTableFilterCell\"\n (sorted)=\"sorting($event)\"\n (filtered)=\"filtering($event)\"\n [totalRecordsOnServer]=\"totalRecordsOnServer\"\n [currentPageShowingKey]=\"currentPageShowingKey\"\n [currentPageShowingWithTotalOnServerKey]=\"currentPageShowingWithTotalOnServerKey\"\n (componentStateChanged)=\"dataViewComponentState$.next($event)\"\n [parentTemplates]=\"templates$ | async\"\n [tableAllowSelectAll]=\"tableAllowSelectAll\"\n [tableSelectionEnabledField]=\"tableSelectionEnabledField\"\n >\n </ocx-data-view>\n</div>\n\n<ng-template #defaultColumnGroupSelectionComponent>\n <ocx-column-group-selection\n *ngIf=\"layout === 'table'\"\n [selectedGroupKey]=\"selectedGroupKey ?? defaultGroupKey\"\n [columns]=\"columns\"\n [defaultGroupKey]=\"defaultGroupKey !== customGroupKey ? defaultGroupKey : ''\"\n [customGroupKey]=\"customGroupKey\"\n [placeholderKey]=\"groupSelectionNoGroupSelectedKey\"\n (groupSelectionChanged)=\"onColumnGroupSelectionChange($event)\"\n (componentStateChanged)=\"columnGroupSelectionComponentState$.next($event)\"\n ></ocx-column-group-selection>\n</ng-template>\n\n<ng-template #stringTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableCell\"\n [ngTemplateOutlet]=\"_stringTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n <ng-template #numberTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableCell\"\n [ngTemplateOutlet]=\"_numberTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n </ng-template>\n</ng-template>\n<ng-template #tableDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableDateCell\"\n [ngTemplateOutlet]=\"_tableDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableCell\"\n [ngTemplateOutlet]=\"_dateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableRelativeDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableRelativeDateCell\"\n [ngTemplateOutlet]=\"_tableRelativeDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableCell\"\n [ngTemplateOutlet]=\"_relativeDateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableCell\"\n [ngTemplateOutlet]=\"_tableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableTranslationKeyCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableTranslationKeyCell\"\n [ngTemplateOutlet]=\"_tableTranslationKeyCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableCell\"\n [ngTemplateOutlet]=\"_translationKeyTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_gridItemSubtitleLines\"\n [ngTemplateOutlet]=\"_gridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container>\n</ng-template>\n<ng-template #listItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_listItemSubtitleLines\"\n [ngTemplateOutlet]=\"_listItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItem let-item>\n <ng-container *ngIf=\"_gridItem\" [ngTemplateOutlet]=\"_gridItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listItem let-item>\n <ng-container *ngIf=\"_listItem\" [ngTemplateOutlet]=\"_listItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_listValue\"\n [ngTemplateOutlet]=\"_listValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyListValue\"\n [ngTemplateOutlet]=\"_translationKeyListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberListValue\"\n [ngTemplateOutlet]=\"_numberListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateListValue\"\n [ngTemplateOutlet]=\"_relativeDateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customListValue\"\n [ngTemplateOutlet]=\"_customListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #stringListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringListValue\"\n [ngTemplateOutlet]=\"_stringListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateListValue\"\n [ngTemplateOutlet]=\"_dateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n\n<ng-template #stringTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableFilterCell\"\n [ngTemplateOutlet]=\"_stringTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableFilterCell\"\n [ngTemplateOutlet]=\"_numberTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customTableFilterCell\"\n [ngTemplateOutlet]=\"_customTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableFilterCell\"\n [ngTemplateOutlet]=\"_dateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableFilterCell\"\n [ngTemplateOutlet]=\"_relativeDateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableFilterCell\"\n [ngTemplateOutlet]=\"_translationKeyTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i1.SlotComponent, selector: "ocx-slot[name]", inputs: ["name", "inputs", "outputs"] }, { kind: "component", type: i4.ColumnGroupSelectionComponent, selector: "ocx-column-group-selection", inputs: ["selectedGroupKey", "columns", "placeholderKey", "defaultGroupKey", "customGroupKey"], outputs: ["groupSelectionChanged", "componentStateChanged"] }, { kind: "component", type: i5.CustomGroupColumnSelectorComponent, selector: "ocx-custom-group-column-selector", inputs: ["columns", "displayedColumns", "customGroupKey", "dialogTitle", "dialogTitleKey", "openButtonTitle", "openButtonTitleKey", "openButtonAriaLabel", "openButtonAriaLabelKey", "saveButtonLabel", "saveButtonLabelKey", "saveButtonAriaLabel", "saveButtonAriaLabelKey", "cancelButtonLabel", "cancelButtonLabelKey", "cancelButtonAriaLabel", "cancelButtonAriaLabelKey", "activeColumnsLabel", "activeColumnsLabelKey", "inactiveColumnsLabel", "inactiveColumnsLabelKey", "frozenActionColumn", "actionColumnPosition"], outputs: ["columnSelectionChanged", "actionColumnConfigChanged", "componentStateChanged"] }, { kind: "component", type: i6.DataLayoutSelectionComponent, selector: "ocx-data-layout-selection", inputs: ["supportedViewLayouts", "layout"], outputs: ["dataViewLayoutChange", "componentStateChanged"] }, { kind: "component", type: i7.DataListGridSortingComponent, selector: "ocx-data-list-grid-sorting", inputs: ["columns", "sortStates", "sortDirection", "sortField"], outputs: ["sortChange", "sortDirectionChange", "componentStateChanged", "columnsChange"] }, { kind: "component", type: i8.DataViewComponent, selector: "ocx-data-view", inputs: ["deletePermission", "editPermission", "viewPermission", "deleteActionVisibleField", "deleteActionEnabledField", "viewActionVisibleField", "viewActionEnabledField", "editActionVisibleField", "editActionEnabledField", "tableSelectionEnabledField", "tableAllowSelectAll", "data", "name", "titleLineId", "subtitleLineIds", "layout", "columns", "emptyResultsMessage", "clientSideSorting", "clientSideFiltering", "fallbackImage", "filters", "sortField", "sortDirection", "listGridPaginator", "tablePaginator", "page", "totalRecordsOnServer", "currentPageShowingKey", "currentPageShowingWithTotalOnServerKey", "selectedRows", "frozenActionColumn", "actionColumnPosition", "paginator", "sortStates", "pageSizes", "pageSize", "showAllOption", "stringTableCellTemplate", "numberTableCellTemplate", "customTableCellTemplate", "dateTableCellTemplate", "tableDateCellTemplate", "tableCellTemplate", "translationKeyTableCellTemplate", "tableTranslationKeyCellTemplate", "gridItemSubtitleLinesTemplate", "listItemSubtitleLinesTemplate", "gridItemTemplate", "listItemTemplate", "relativeDateTableCellTemplate", "tableRelativeDateCellTemplate", "listValueTemplate", "translationKeyListValueTemplate", "numberListValueTemplate", "relativeDateListValueTemplate", "customListValueTemplate", "stringListValueTemplate", "dateListValueTemplate", "tableFilterCellTemplate", "dateTableFilterCellTemplate", "relativeDateTableFilterCellTemplate", "translationKeyTableFilterCellTemplate", "stringTableFilterCellTemplate", "numberTableFilterCellTemplate", "customTableFilterCellTemplate", "additionalActions", "parentTemplates"], outputs: ["filtered", "sorted", "deleteItem", "viewItem", "editItem", "selectionChanged", "pageChanged", "pageSizeChanged", "componentStateChanged"] }, { kind: "directive", type: i9.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "ocxIfPermissionOnMissingPermission", "ocxIfNotPermissionOnMissingPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "component", type: i10.FilterViewComponent, selector: "ocx-filter-view", inputs: ["filters", "columns", "displayMode", "selectDisplayedChips", "chipStyleClass", "tableStyle", "panelStyle", "templates"], outputs: ["filtered", "componentStateChanged"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
496
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InteractiveDataViewComponent, deps: [{ token: i1.SlotService }], target: i0.ɵɵFactoryTarget.Component }); }
497
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: InteractiveDataViewComponent, selector: "ocx-interactive-data-view", inputs: { searchConfigPermission: "searchConfigPermission", deletePermission: "deletePermission", editPermission: "editPermission", viewPermission: "viewPermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", tableSelectionEnabledField: "tableSelectionEnabledField", tableAllowSelectAll: "tableAllowSelectAll", name: "name", titleLineId: "titleLineId", subtitleLineIds: "subtitleLineIds", supportedViewLayouts: "supportedViewLayouts", columns: "columns", emptyResultsMessage: "emptyResultsMessage", clientSideSorting: "clientSideSorting", clientSideFiltering: "clientSideFiltering", fallbackImage: "fallbackImage", filters: "filters", sortDirection: "sortDirection", sortField: "sortField", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", showAllOption: "showAllOption", totalRecordsOnServer: "totalRecordsOnServer", layout: "layout", defaultGroupKey: "defaultGroupKey", customGroupKey: "customGroupKey", groupSelectionNoGroupSelectedKey: "groupSelectionNoGroupSelectedKey", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", additionalActions: "additionalActions", listGridPaginator: "listGridPaginator", tablePaginator: "tablePaginator", disableFilterView: "disableFilterView", filterViewDisplayMode: "filterViewDisplayMode", filterViewChipStyleClass: "filterViewChipStyleClass", filterViewTableStyle: "filterViewTableStyle", filterViewPanelStyle: "filterViewPanelStyle", selectDisplayedChips: "selectDisplayedChips", page: "page", selectedRows: "selectedRows", displayedColumnKeys: "displayedColumnKeys", displayedColumns: "displayedColumns", frozenActionColumn: "frozenActionColumn", actionColumnPosition: "actionColumnPosition", paginator: "paginator", data: "data" }, outputs: { filtered: "filtered", sorted: "sorted", deleteItem: "deleteItem", viewItem: "viewItem", editItem: "editItem", dataViewLayoutChange: "dataViewLayoutChange", displayedColumnsChange: "displayedColumnsChange", displayedColumnKeysChange: "displayedColumnKeysChange", selectionChanged: "selectionChanged", pageChanged: "pageChanged", pageSizeChanged: "pageSizeChanged", componentStateChanged: "componentStateChanged" }, providers: [{ provide: 'InteractiveDataViewComponent', useExisting: InteractiveDataViewComponent }], queries: [{ propertyName: "tableCell", first: true, predicate: ["tableCell"], descendants: true }, { propertyName: "tableDateCell", first: true, predicate: ["tableDateCell"], descendants: true }, { propertyName: "dateTableCell", first: true, predicate: ["dateTableCell"], descendants: true }, { propertyName: "tableRelativeDateCell", first: true, predicate: ["tableRelativeDateCell"], descendants: true }, { propertyName: "relativeDateTableCell", first: true, predicate: ["relativeDateTableCell"], descendants: true }, { propertyName: "tableTranslationKeyCell", first: true, predicate: ["tableTranslationKeyCell"], descendants: true }, { propertyName: "translationKeyTableCell", first: true, predicate: ["translationKeyTableCell"], descendants: true }, { propertyName: "gridItemSubtitleLines", first: true, predicate: ["gridItemSubtitleLines"], descendants: true }, { propertyName: "listItemSubtitleLines", first: true, predicate: ["listItemSubtitleLines"], descendants: true }, { propertyName: "stringTableCell", first: true, predicate: ["stringTableCell"], descendants: true }, { propertyName: "numberTableCell", first: true, predicate: ["numberTableCell"], descendants: true }, { propertyName: "customTableCell", first: true, predicate: ["customTableCell"], descendants: true }, { propertyName: "gridItem", first: true, predicate: ["gridItem"], descendants: true }, { propertyName: "listItem", first: true, predicate: ["listItem"], descendants: true }, { propertyName: "topCenter", first: true, predicate: ["topCenter"], descendants: true }, { propertyName: "listValue", first: true, predicate: ["listValue"], descendants: true }, { propertyName: "translationKeyListValue", first: true, predicate: ["translationKeyListValue"], descendants: true }, { propertyName: "numberListValue", first: true, predicate: ["numberListValue"], descendants: true }, { propertyName: "relativeDateListValue", first: true, predicate: ["relativeDateListValue"], descendants: true }, { propertyName: "customListValue", first: true, predicate: ["customListValue"], descendants: true }, { propertyName: "stringListValue", first: true, predicate: ["stringListValue"], descendants: true }, { propertyName: "dateListValue", first: true, predicate: ["dateListValue"], descendants: true }, { propertyName: "tableFilterCell", first: true, predicate: ["tableFilterCell"], descendants: true }, { propertyName: "dateTableFilterCell", first: true, predicate: ["dateTableFilterCell"], descendants: true }, { propertyName: "relativeDateTableFilterCell", first: true, predicate: ["relativeDateTableFilterCell"], descendants: true }, { propertyName: "translationKeyTableFilterCell", first: true, predicate: ["translationKeyTableFilterCell"], descendants: true }, { propertyName: "stringTableFilterCell", first: true, predicate: ["stringTableFilterCell"], descendants: true }, { propertyName: "numberTableFilterCell", first: true, predicate: ["numberTableFilterCell"], descendants: true }, { propertyName: "customTableFilterCell", first: true, predicate: ["customTableFilterCell"], descendants: true }, { propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "dataView", first: true, predicate: DataViewComponent, descendants: true }], ngImport: i0, template: "<div class=\"p-3 border-bottom-1 surface-border\">\n <div class=\"flex flex-wrap justify-content-between align-items-center py-1 gap-2\">\n <div class=\"flex flex-wrap justify-content-start align-items-center gap-2\">\n <ocx-data-layout-selection\n [supportedViewLayouts]=\"supportedViewLayouts\"\n [layout]=\"layout\"\n (dataViewLayoutChange)=\"onDataViewLayoutChange($event)\"\n (componentStateChanged)=\"dataLayoutComponentState$.next($event)\"\n ></ocx-data-layout-selection>\n <ocx-filter-view\n *ngIf=\"!disableFilterView\"\n [filters]=\"filters\"\n [columns]=\"columns\"\n [templates]=\"templates$ | async\"\n [displayMode]=\"filterViewDisplayMode\"\n [selectDisplayedChips]=\"selectDisplayedChips\"\n [chipStyleClass]=\"filterViewChipStyleClass\"\n [tableStyle]=\"filterViewTableStyle\"\n (filtered)=\"filtering($event)\"\n (componentStateChanged)=\"filterViewComponentState$.next($event)\"\n ></ocx-filter-view>\n </div>\n\n <div *ngIf=\"topCenter\">\n <ng-container [ngTemplateOutlet]=\"topCenter\"> </ng-container>\n </div>\n\n <div *ngIf=\"layout !== 'table'\" class=\"flex align-items-center gap-2\">\n <ocx-data-list-grid-sorting\n [sortDirection]=\"sortDirection\"\n [sortField]=\"sortField\"\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n (sortChange)=\"onSortChange($event)\"\n (sortDirectionChange)=\"onSortDirectionChange($event)\"\n (componentStateChanged)=\"dataListGridSortingComponentState$.next($event)\"\n ></ocx-data-list-grid-sorting>\n </div>\n\n <div\n [ngStyle]=\"layout !== 'table' ? {\n 'position': 'absolute'\n } : {}\"\n class=\"flex flex-wrap justify-content-between align-items-center gap-2\"\n >\n <ng-container *ngIf=\"isColumnGroupSelectionComponentDefined$ | async; else defaultColumnGroupSelectionComponent\">\n <ng-container *ngIf=\"displayedColumnKeys$ | async as displayedColumnKeys\">\n <ocx-slot\n [ngStyle]=\"layout !== 'table' ? {'display' : 'none'} : {}\"\n *ocxIfPermission=\"searchConfigPermission; elseTemplate: defaultColumnGroupSelectionComponent\"\n name=\"{{columnGroupSlotName}}\"\n [inputs]=\"{ placeholderKey: groupSelectionNoGroupSelectedKey, defaultGroupKey: defaultGroupKey, customGroupKey: customGroupKey, columns: columns, selectedGroupKey: selectedGroupKey, layout: layout, displayedColumnsIds: displayedColumnKeys }\"\n [outputs]=\"{ groupSelectionChanged: groupSelectionChangedSlotEmitter }\"\n >\n <ng-template #skeleton>\n <div class=\"flex\">\n <p-skeleton width=\"18rem\" height=\"3rem\"></p-skeleton>\n </div>\n </ng-template>\n </ocx-slot>\n </ng-container>\n </ng-container>\n\n <ocx-custom-group-column-selector\n *ngIf=\"layout === 'table'\"\n [columns]=\"columns\"\n [displayedColumns]=\"(displayedColumns$ | async) ?? []\"\n [customGroupKey]=\"customGroupKey\"\n (columnSelectionChanged)=\"onColumnSelectionChange($event)\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n (actionColumnConfigChanged)=\"onActionColumnConfigChange($event)\"\n (componentStateChanged)=\"customGroupColumnSelectorComponentState$.next($event)\"\n ></ocx-custom-group-column-selector>\n </div>\n </div>\n</div>\n<div class=\"p-3\">\n <ocx-data-view\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n [sortField]=\"sortField\"\n [filters]=\"filters\"\n [data]=\"data\"\n [sortDirection]=\"sortDirection\"\n [titleLineId]=\"titleLineId\"\n [subtitleLineIds]=\"subtitleLineIds\"\n [clientSideSorting]=\"clientSideSorting\"\n [clientSideFiltering]=\"clientSideFiltering\"\n [pageSizes]=\"pageSizes\"\n [pageSize]=\"pageSize\"\n [showAllOption]=\"showAllOption\"\n [emptyResultsMessage]=\"emptyResultsMessage\"\n [layout]=\"layout\"\n [name]=\"name\"\n [deletePermission]=\"deletePermission\"\n [editPermission]=\"editPermission\"\n [viewPermission]=\"viewPermission\"\n [deleteActionEnabledField]=\"deleteActionEnabledField\"\n [deleteActionVisibleField]=\"deleteActionVisibleField\"\n [editActionEnabledField]=\"editActionEnabledField\"\n [editActionVisibleField]=\"editActionVisibleField\"\n [viewActionEnabledField]=\"viewActionEnabledField\"\n [viewActionVisibleField]=\"viewActionVisibleField\"\n [additionalActions]=\"additionalActions\"\n [listGridPaginator]=\"listGridPaginator\"\n [tablePaginator]=\"tablePaginator\"\n [page]=\"page\"\n (pageChanged)=\"onPageChange($event)\"\n (pageSizeChanged)=\"onPageSizeChange($event)\"\n [selectedRows]=\"selectedRows\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n [stringTableCellTemplate]=\"primeNgStringTableCell ?? _stringTableCell\"\n [numberTableCellTemplate]=\"primeNgNumberTableCell ?? _numberTableCell\"\n [customTableCellTemplate]=\"primeNgCustomTableCell ?? _customTableCell\"\n [dateTableCellTemplate]=\"primeNgDateTableCell ?? _dateTableCell ?? primeNgTableDateCell ?? _tableDateCell\"\n [relativeDateTableCellTemplate]=\"primeNgRelativeDateTableCell ?? _relativeDateTableCell ?? primeNgTableRelativeDateCell ?? _tableRelativeDateCell\"\n [tableCellTemplate]=\"primeNgTableCell ?? _tableCell\"\n [translationKeyTableCellTemplate]=\"primeNgTranslationKeyTableCell ?? _translationKeyTableCell ?? primeNgTableTranslationKeyCell ?? _tableTranslationKeyCell\"\n [gridItemSubtitleLinesTemplate]=\"primeNgGridItemSubtitleLines ?? _gridItemSubtitleLines\"\n [listItemSubtitleLinesTemplate]=\"primeNgListItemSubtitleLines ?? _listItemSubtitleLines\"\n [listItemTemplate]=\"primeNgListItem ?? _listItem\"\n [listValueTemplate]=\"primeNgListValue ?? _listValue\"\n [translationKeyListValueTemplate]=\"primeNgTranslationKeyListValue ?? _translationKeyListValue\"\n [numberListValueTemplate]=\"primeNgNumberListValue ?? _numberListValue\"\n [relativeDateListValueTemplate]=\"primeNgRelativeDateListValue ?? _relativeDateListValue\"\n [customListValueTemplate]=\"primeNgCustomListValue ?? _customListValue\"\n [stringListValueTemplate]=\"primeNgStringListValue ?? _stringListValue\"\n [dateListValueTemplate]=\"primeNgDateListValue ?? _dateListValue\"\n [gridItemTemplate]=\"primeNgGridItem ?? _gridItem\"\n [tableFilterCellTemplate]=\"primeNgTableFilterCell ?? _tableFilterCell\"\n [dateTableFilterCellTemplate]=\"primeNgDateTableFilterCell ?? _dateTableFilterCell\"\n [customTableFilterCellTemplate]=\"primeNgCustomTableFilterCell ?? _customTableFilterCell\"\n [numberTableFilterCellTemplate]=\"primeNgNumberTableFilterCell ?? _numberTableFilterCell\"\n [stringTableFilterCellTemplate]=\"primeNgStringTableFilterCell ?? _stringTableFilterCell\"\n [relativeDateTableFilterCellTemplate]=\"primeNgRelativeDateTableFilterCell ?? _relativeDateTableFilterCell\"\n [translationKeyTableFilterCellTemplate]=\"primeNgTranslationKeyTableFilterCell ?? _translationKeyTableFilterCell\"\n (sorted)=\"sorting($event)\"\n (filtered)=\"filtering($event)\"\n [totalRecordsOnServer]=\"totalRecordsOnServer\"\n [currentPageShowingKey]=\"currentPageShowingKey\"\n [currentPageShowingWithTotalOnServerKey]=\"currentPageShowingWithTotalOnServerKey\"\n (componentStateChanged)=\"dataViewComponentState$.next($event)\"\n [parentTemplates]=\"templates$ | async\"\n [tableAllowSelectAll]=\"tableAllowSelectAll\"\n [tableSelectionEnabledField]=\"tableSelectionEnabledField\"\n >\n </ocx-data-view>\n</div>\n\n<ng-template #defaultColumnGroupSelectionComponent>\n <ocx-column-group-selection\n *ngIf=\"layout === 'table'\"\n [selectedGroupKey]=\"selectedGroupKey ?? defaultGroupKey\"\n [columns]=\"columns\"\n [defaultGroupKey]=\"defaultGroupKey !== customGroupKey ? defaultGroupKey : ''\"\n [customGroupKey]=\"customGroupKey\"\n [placeholderKey]=\"groupSelectionNoGroupSelectedKey\"\n (groupSelectionChanged)=\"onColumnGroupSelectionChange($event)\"\n (componentStateChanged)=\"columnGroupSelectionComponentState$.next($event)\"\n ></ocx-column-group-selection>\n</ng-template>\n\n<ng-template #stringTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableCell\"\n [ngTemplateOutlet]=\"_stringTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n <ng-template #numberTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableCell\"\n [ngTemplateOutlet]=\"_numberTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n </ng-template>\n</ng-template>\n<ng-template #tableDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableDateCell\"\n [ngTemplateOutlet]=\"_tableDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableCell\"\n [ngTemplateOutlet]=\"_dateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableRelativeDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableRelativeDateCell\"\n [ngTemplateOutlet]=\"_tableRelativeDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableCell\"\n [ngTemplateOutlet]=\"_relativeDateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableCell\"\n [ngTemplateOutlet]=\"_tableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableTranslationKeyCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableTranslationKeyCell\"\n [ngTemplateOutlet]=\"_tableTranslationKeyCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableCell\"\n [ngTemplateOutlet]=\"_translationKeyTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_gridItemSubtitleLines\"\n [ngTemplateOutlet]=\"_gridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container>\n</ng-template>\n<ng-template #listItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_listItemSubtitleLines\"\n [ngTemplateOutlet]=\"_listItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItem let-item>\n <ng-container *ngIf=\"_gridItem\" [ngTemplateOutlet]=\"_gridItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listItem let-item>\n <ng-container *ngIf=\"_listItem\" [ngTemplateOutlet]=\"_listItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_listValue\"\n [ngTemplateOutlet]=\"_listValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyListValue\"\n [ngTemplateOutlet]=\"_translationKeyListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberListValue\"\n [ngTemplateOutlet]=\"_numberListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateListValue\"\n [ngTemplateOutlet]=\"_relativeDateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customListValue\"\n [ngTemplateOutlet]=\"_customListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #stringListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringListValue\"\n [ngTemplateOutlet]=\"_stringListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateListValue\"\n [ngTemplateOutlet]=\"_dateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n\n<ng-template #stringTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableFilterCell\"\n [ngTemplateOutlet]=\"_stringTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableFilterCell\"\n [ngTemplateOutlet]=\"_numberTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customTableFilterCell\"\n [ngTemplateOutlet]=\"_customTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableFilterCell\"\n [ngTemplateOutlet]=\"_dateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableFilterCell\"\n [ngTemplateOutlet]=\"_relativeDateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableFilterCell\"\n [ngTemplateOutlet]=\"_translationKeyTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i1.SlotComponent, selector: "ocx-slot[name]", inputs: ["name", "inputs", "outputs"] }, { kind: "component", type: i4.ColumnGroupSelectionComponent, selector: "ocx-column-group-selection", inputs: ["selectedGroupKey", "columns", "placeholderKey", "defaultGroupKey", "customGroupKey"], outputs: ["groupSelectionChanged", "componentStateChanged"] }, { kind: "component", type: i5.CustomGroupColumnSelectorComponent, selector: "ocx-custom-group-column-selector", inputs: ["columns", "displayedColumns", "customGroupKey", "dialogTitle", "dialogTitleKey", "openButtonTitle", "openButtonTitleKey", "openButtonAriaLabel", "openButtonAriaLabelKey", "saveButtonLabel", "saveButtonLabelKey", "saveButtonAriaLabel", "saveButtonAriaLabelKey", "cancelButtonLabel", "cancelButtonLabelKey", "cancelButtonAriaLabel", "cancelButtonAriaLabelKey", "activeColumnsLabel", "activeColumnsLabelKey", "inactiveColumnsLabel", "inactiveColumnsLabelKey", "frozenActionColumn", "actionColumnPosition"], outputs: ["columnSelectionChanged", "actionColumnConfigChanged", "componentStateChanged"] }, { kind: "component", type: i6.DataLayoutSelectionComponent, selector: "ocx-data-layout-selection", inputs: ["supportedViewLayouts", "layout"], outputs: ["dataViewLayoutChange", "componentStateChanged"] }, { kind: "component", type: i7.DataListGridSortingComponent, selector: "ocx-data-list-grid-sorting", inputs: ["columns", "sortStates", "sortDirection", "sortField"], outputs: ["sortChange", "sortDirectionChange", "componentStateChanged", "columnsChange"] }, { kind: "component", type: i8.DataViewComponent, selector: "ocx-data-view", inputs: ["deletePermission", "editPermission", "viewPermission", "deleteActionVisibleField", "deleteActionEnabledField", "viewActionVisibleField", "viewActionEnabledField", "editActionVisibleField", "editActionEnabledField", "tableSelectionEnabledField", "tableAllowSelectAll", "data", "name", "titleLineId", "subtitleLineIds", "layout", "columns", "emptyResultsMessage", "clientSideSorting", "clientSideFiltering", "fallbackImage", "filters", "sortField", "sortDirection", "listGridPaginator", "tablePaginator", "page", "totalRecordsOnServer", "currentPageShowingKey", "currentPageShowingWithTotalOnServerKey", "selectedRows", "frozenActionColumn", "actionColumnPosition", "paginator", "sortStates", "pageSizes", "pageSize", "showAllOption", "stringTableCellTemplate", "numberTableCellTemplate", "customTableCellTemplate", "dateTableCellTemplate", "tableDateCellTemplate", "tableCellTemplate", "translationKeyTableCellTemplate", "tableTranslationKeyCellTemplate", "gridItemSubtitleLinesTemplate", "listItemSubtitleLinesTemplate", "gridItemTemplate", "listItemTemplate", "relativeDateTableCellTemplate", "tableRelativeDateCellTemplate", "listValueTemplate", "translationKeyListValueTemplate", "numberListValueTemplate", "relativeDateListValueTemplate", "customListValueTemplate", "stringListValueTemplate", "dateListValueTemplate", "tableFilterCellTemplate", "dateTableFilterCellTemplate", "relativeDateTableFilterCellTemplate", "translationKeyTableFilterCellTemplate", "stringTableFilterCellTemplate", "numberTableFilterCellTemplate", "customTableFilterCellTemplate", "additionalActions", "parentTemplates"], outputs: ["filtered", "sorted", "deleteItem", "viewItem", "editItem", "selectionChanged", "pageChanged", "pageSizeChanged", "componentStateChanged"] }, { kind: "directive", type: i9.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "ocxIfPermissionOnMissingPermission", "ocxIfNotPermissionOnMissingPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions", "ocxIfPermissionElseTemplate", "ocxIfNotPermissionElseTemplate"] }, { kind: "component", type: i10.FilterViewComponent, selector: "ocx-filter-view", inputs: ["filters", "columns", "displayMode", "selectDisplayedChips", "chipStyleClass", "tableStyle", "panelStyle", "templates"], outputs: ["filtered", "componentStateChanged"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
498
498
  }
499
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveDataViewComponent, decorators: [{
499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InteractiveDataViewComponent, decorators: [{
500
500
  type: Component,
501
501
  args: [{ selector: 'ocx-interactive-data-view', providers: [{ provide: 'InteractiveDataViewComponent', useExisting: InteractiveDataViewComponent }], template: "<div class=\"p-3 border-bottom-1 surface-border\">\n <div class=\"flex flex-wrap justify-content-between align-items-center py-1 gap-2\">\n <div class=\"flex flex-wrap justify-content-start align-items-center gap-2\">\n <ocx-data-layout-selection\n [supportedViewLayouts]=\"supportedViewLayouts\"\n [layout]=\"layout\"\n (dataViewLayoutChange)=\"onDataViewLayoutChange($event)\"\n (componentStateChanged)=\"dataLayoutComponentState$.next($event)\"\n ></ocx-data-layout-selection>\n <ocx-filter-view\n *ngIf=\"!disableFilterView\"\n [filters]=\"filters\"\n [columns]=\"columns\"\n [templates]=\"templates$ | async\"\n [displayMode]=\"filterViewDisplayMode\"\n [selectDisplayedChips]=\"selectDisplayedChips\"\n [chipStyleClass]=\"filterViewChipStyleClass\"\n [tableStyle]=\"filterViewTableStyle\"\n (filtered)=\"filtering($event)\"\n (componentStateChanged)=\"filterViewComponentState$.next($event)\"\n ></ocx-filter-view>\n </div>\n\n <div *ngIf=\"topCenter\">\n <ng-container [ngTemplateOutlet]=\"topCenter\"> </ng-container>\n </div>\n\n <div *ngIf=\"layout !== 'table'\" class=\"flex align-items-center gap-2\">\n <ocx-data-list-grid-sorting\n [sortDirection]=\"sortDirection\"\n [sortField]=\"sortField\"\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n (sortChange)=\"onSortChange($event)\"\n (sortDirectionChange)=\"onSortDirectionChange($event)\"\n (componentStateChanged)=\"dataListGridSortingComponentState$.next($event)\"\n ></ocx-data-list-grid-sorting>\n </div>\n\n <div\n [ngStyle]=\"layout !== 'table' ? {\n 'position': 'absolute'\n } : {}\"\n class=\"flex flex-wrap justify-content-between align-items-center gap-2\"\n >\n <ng-container *ngIf=\"isColumnGroupSelectionComponentDefined$ | async; else defaultColumnGroupSelectionComponent\">\n <ng-container *ngIf=\"displayedColumnKeys$ | async as displayedColumnKeys\">\n <ocx-slot\n [ngStyle]=\"layout !== 'table' ? {'display' : 'none'} : {}\"\n *ocxIfPermission=\"searchConfigPermission; elseTemplate: defaultColumnGroupSelectionComponent\"\n name=\"{{columnGroupSlotName}}\"\n [inputs]=\"{ placeholderKey: groupSelectionNoGroupSelectedKey, defaultGroupKey: defaultGroupKey, customGroupKey: customGroupKey, columns: columns, selectedGroupKey: selectedGroupKey, layout: layout, displayedColumnsIds: displayedColumnKeys }\"\n [outputs]=\"{ groupSelectionChanged: groupSelectionChangedSlotEmitter }\"\n >\n <ng-template #skeleton>\n <div class=\"flex\">\n <p-skeleton width=\"18rem\" height=\"3rem\"></p-skeleton>\n </div>\n </ng-template>\n </ocx-slot>\n </ng-container>\n </ng-container>\n\n <ocx-custom-group-column-selector\n *ngIf=\"layout === 'table'\"\n [columns]=\"columns\"\n [displayedColumns]=\"(displayedColumns$ | async) ?? []\"\n [customGroupKey]=\"customGroupKey\"\n (columnSelectionChanged)=\"onColumnSelectionChange($event)\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n (actionColumnConfigChanged)=\"onActionColumnConfigChange($event)\"\n (componentStateChanged)=\"customGroupColumnSelectorComponentState$.next($event)\"\n ></ocx-custom-group-column-selector>\n </div>\n </div>\n</div>\n<div class=\"p-3\">\n <ocx-data-view\n [columns]=\"(displayedColumns$ | async) ?? []\"\n [sortStates]=\"sortStates\"\n [sortField]=\"sortField\"\n [filters]=\"filters\"\n [data]=\"data\"\n [sortDirection]=\"sortDirection\"\n [titleLineId]=\"titleLineId\"\n [subtitleLineIds]=\"subtitleLineIds\"\n [clientSideSorting]=\"clientSideSorting\"\n [clientSideFiltering]=\"clientSideFiltering\"\n [pageSizes]=\"pageSizes\"\n [pageSize]=\"pageSize\"\n [showAllOption]=\"showAllOption\"\n [emptyResultsMessage]=\"emptyResultsMessage\"\n [layout]=\"layout\"\n [name]=\"name\"\n [deletePermission]=\"deletePermission\"\n [editPermission]=\"editPermission\"\n [viewPermission]=\"viewPermission\"\n [deleteActionEnabledField]=\"deleteActionEnabledField\"\n [deleteActionVisibleField]=\"deleteActionVisibleField\"\n [editActionEnabledField]=\"editActionEnabledField\"\n [editActionVisibleField]=\"editActionVisibleField\"\n [viewActionEnabledField]=\"viewActionEnabledField\"\n [viewActionVisibleField]=\"viewActionVisibleField\"\n [additionalActions]=\"additionalActions\"\n [listGridPaginator]=\"listGridPaginator\"\n [tablePaginator]=\"tablePaginator\"\n [page]=\"page\"\n (pageChanged)=\"onPageChange($event)\"\n (pageSizeChanged)=\"onPageSizeChange($event)\"\n [selectedRows]=\"selectedRows\"\n [frozenActionColumn]=\"frozenActionColumn\"\n [actionColumnPosition]=\"actionColumnPosition\"\n [stringTableCellTemplate]=\"primeNgStringTableCell ?? _stringTableCell\"\n [numberTableCellTemplate]=\"primeNgNumberTableCell ?? _numberTableCell\"\n [customTableCellTemplate]=\"primeNgCustomTableCell ?? _customTableCell\"\n [dateTableCellTemplate]=\"primeNgDateTableCell ?? _dateTableCell ?? primeNgTableDateCell ?? _tableDateCell\"\n [relativeDateTableCellTemplate]=\"primeNgRelativeDateTableCell ?? _relativeDateTableCell ?? primeNgTableRelativeDateCell ?? _tableRelativeDateCell\"\n [tableCellTemplate]=\"primeNgTableCell ?? _tableCell\"\n [translationKeyTableCellTemplate]=\"primeNgTranslationKeyTableCell ?? _translationKeyTableCell ?? primeNgTableTranslationKeyCell ?? _tableTranslationKeyCell\"\n [gridItemSubtitleLinesTemplate]=\"primeNgGridItemSubtitleLines ?? _gridItemSubtitleLines\"\n [listItemSubtitleLinesTemplate]=\"primeNgListItemSubtitleLines ?? _listItemSubtitleLines\"\n [listItemTemplate]=\"primeNgListItem ?? _listItem\"\n [listValueTemplate]=\"primeNgListValue ?? _listValue\"\n [translationKeyListValueTemplate]=\"primeNgTranslationKeyListValue ?? _translationKeyListValue\"\n [numberListValueTemplate]=\"primeNgNumberListValue ?? _numberListValue\"\n [relativeDateListValueTemplate]=\"primeNgRelativeDateListValue ?? _relativeDateListValue\"\n [customListValueTemplate]=\"primeNgCustomListValue ?? _customListValue\"\n [stringListValueTemplate]=\"primeNgStringListValue ?? _stringListValue\"\n [dateListValueTemplate]=\"primeNgDateListValue ?? _dateListValue\"\n [gridItemTemplate]=\"primeNgGridItem ?? _gridItem\"\n [tableFilterCellTemplate]=\"primeNgTableFilterCell ?? _tableFilterCell\"\n [dateTableFilterCellTemplate]=\"primeNgDateTableFilterCell ?? _dateTableFilterCell\"\n [customTableFilterCellTemplate]=\"primeNgCustomTableFilterCell ?? _customTableFilterCell\"\n [numberTableFilterCellTemplate]=\"primeNgNumberTableFilterCell ?? _numberTableFilterCell\"\n [stringTableFilterCellTemplate]=\"primeNgStringTableFilterCell ?? _stringTableFilterCell\"\n [relativeDateTableFilterCellTemplate]=\"primeNgRelativeDateTableFilterCell ?? _relativeDateTableFilterCell\"\n [translationKeyTableFilterCellTemplate]=\"primeNgTranslationKeyTableFilterCell ?? _translationKeyTableFilterCell\"\n (sorted)=\"sorting($event)\"\n (filtered)=\"filtering($event)\"\n [totalRecordsOnServer]=\"totalRecordsOnServer\"\n [currentPageShowingKey]=\"currentPageShowingKey\"\n [currentPageShowingWithTotalOnServerKey]=\"currentPageShowingWithTotalOnServerKey\"\n (componentStateChanged)=\"dataViewComponentState$.next($event)\"\n [parentTemplates]=\"templates$ | async\"\n [tableAllowSelectAll]=\"tableAllowSelectAll\"\n [tableSelectionEnabledField]=\"tableSelectionEnabledField\"\n >\n </ocx-data-view>\n</div>\n\n<ng-template #defaultColumnGroupSelectionComponent>\n <ocx-column-group-selection\n *ngIf=\"layout === 'table'\"\n [selectedGroupKey]=\"selectedGroupKey ?? defaultGroupKey\"\n [columns]=\"columns\"\n [defaultGroupKey]=\"defaultGroupKey !== customGroupKey ? defaultGroupKey : ''\"\n [customGroupKey]=\"customGroupKey\"\n [placeholderKey]=\"groupSelectionNoGroupSelectedKey\"\n (groupSelectionChanged)=\"onColumnGroupSelectionChange($event)\"\n (componentStateChanged)=\"columnGroupSelectionComponentState$.next($event)\"\n ></ocx-column-group-selection>\n</ng-template>\n\n<ng-template #stringTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableCell\"\n [ngTemplateOutlet]=\"_stringTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n <ng-template #numberTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableCell\"\n [ngTemplateOutlet]=\"_numberTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container>\n </ng-template>\n</ng-template>\n<ng-template #tableDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableDateCell\"\n [ngTemplateOutlet]=\"_tableDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableCell\"\n [ngTemplateOutlet]=\"_dateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableRelativeDateCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableRelativeDateCell\"\n [ngTemplateOutlet]=\"_tableRelativeDateCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableCell\"\n [ngTemplateOutlet]=\"_relativeDateTableCell\"\n [ngTemplateOutletContext]=\"{rowObject:rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableCell\"\n [ngTemplateOutlet]=\"_tableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #tableTranslationKeyCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_tableTranslationKeyCell\"\n [ngTemplateOutlet]=\"_tableTranslationKeyCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableCell\"\n [ngTemplateOutlet]=\"_translationKeyTableCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_gridItemSubtitleLines\"\n [ngTemplateOutlet]=\"_gridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container>\n</ng-template>\n<ng-template #listItemSubtitleLines let-item>\n <ng-container\n *ngIf=\"_listItemSubtitleLines\"\n [ngTemplateOutlet]=\"_listItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n >\n </ng-container\n></ng-template>\n<ng-template #gridItem let-item>\n <ng-container *ngIf=\"_gridItem\" [ngTemplateOutlet]=\"_gridItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listItem let-item>\n <ng-container *ngIf=\"_listItem\" [ngTemplateOutlet]=\"_listItem\" [ngTemplateOutletContext]=\"{$implicit:item}\">\n </ng-container\n></ng-template>\n<ng-template #listValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_listValue\"\n [ngTemplateOutlet]=\"_listValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyListValue\"\n [ngTemplateOutlet]=\"_translationKeyListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberListValue\"\n [ngTemplateOutlet]=\"_numberListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateListValue\"\n [ngTemplateOutlet]=\"_relativeDateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customListValue\"\n [ngTemplateOutlet]=\"_customListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #stringListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringListValue\"\n [ngTemplateOutlet]=\"_stringListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateListValue let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateListValue\"\n [ngTemplateOutlet]=\"_dateListValue\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n\n<ng-template #stringTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_stringTableFilterCell\"\n [ngTemplateOutlet]=\"_stringTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #numberTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_numberTableFilterCell\"\n [ngTemplateOutlet]=\"_numberTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #customTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_customTableFilterCell\"\n [ngTemplateOutlet]=\"_customTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #dateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_dateTableFilterCell\"\n [ngTemplateOutlet]=\"_dateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #relativeDateTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_relativeDateTableFilterCell\"\n [ngTemplateOutlet]=\"_relativeDateTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n<ng-template #translationKeyTableFilterCell let-rowObject=\"rowObject\" let-column=\"column\">\n <ng-container\n *ngIf=\"_translationKeyTableFilterCell\"\n [ngTemplateOutlet]=\"_translationKeyTableFilterCell\"\n [ngTemplateOutletContext]=\"{rowObject: rowObject, column:column}\"\n >\n </ng-container\n></ng-template>\n" }]
502
502
  }], ctorParameters: () => [{ type: i1.SlotService }], propDecorators: { dataView: [{
@@ -167,12 +167,32 @@ export class PageHeaderComponent {
167
167
  disabled: a.disabled,
168
168
  }));
169
169
  }
170
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageHeaderComponent, deps: [{ token: i1.BreadcrumbService }, { token: i2.TranslateService }, { token: i3.AppStateService }, { token: i3.UserService }, { token: HAS_PERMISSION_CHECKER }], target: i0.ɵɵFactoryTarget.Component }); }
171
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs", enableGridView: "enableGridView", gridLayoutDesktopColumns: "gridLayoutDesktopColumns" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], ngImport: i0, template: "<div class=\"onecx-page-header mb-4\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n *ngIf=\"breadcrumbs$ | async as items\"\n [model]=\"items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n >\n <ng-template pTemplate=\"separator\"> <span class=\"pi pi-chevron-right\" aria-hidden=\"true\"></span> </ng-template\n ></p-breadcrumb>\n </ng-container>\n\n <div class=\"p-3 title-bar flex flex-row flex-wrap justify-content-between align-items-center gap-2\">\n <div class=\"title-wrap\">\n <div class=\"mr-2 figure relative flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n [alt]=\"'OCX_PAGE_HEADER.IMAGE' | translate\"\n class=\"w-full border-round-sm\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <section class=\"header\" *ngIf=\"!loading; else skeletonBar\" [attr.aria-label]=\"'Page Header'\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <div id=\"page-subheader\" *ngIf=\"!!subheader\" role=\"note\">{{ subheader }}</div>\n </section>\n </div>\n\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <ng-container *ngIf=\"inlineActions$ | async as inlineActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <span\n [pTooltip]=\"action.disabled ? (action.disabledTooltipKey ? (action.disabledTooltipKey | translate) : action.disabledTooltip) : (action.titleKey ? (action.titleKey | translate) : action.title)\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n >\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n [iconPos]=\"action.iconPos ?? 'left'\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\" (action.ariaLabelKey ? (action.ariaLabelKey | translate) : action.ariaLabel) || (action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <ng-container *ngIf=\"overflowActions$ | async as overflowActions\">\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [attr.aria-label]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n [pTooltip]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div class=\"object-panel\" [ngClass]=\"getObjectPanelLayoutClasses()\">\n <ng-container *ngIf=\"objectDetails\">\n <div class=\"object-info\" [ngClass]=\"getObjectInfoLayoutClasses()\" *ngFor=\"let item of objectDetails\">\n <span\n class=\"flex font-medium text-600 object-info-grid-label\"\n name=\"object-detail-label\"\n [pTooltip]=\"item.labelTooltip || ''\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</span\n >\n <span *ngIf=\"item.icon || item.value\" class=\"object-info-grid-value\">\n <span\n class=\"flex text-900 align-items-center gap-2 w-max\"\n [ngClass]=\"generateItemStyle(item)\"\n name=\"object-detail-value\"\n >\n <span\n class=\"flex align-items-center gap-2\"\n [pTooltip]=\"item.valueTooltip || item.tooltip || ''\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >\n <i\n *ngIf=\"item.icon\"\n class='{{item.icon + \" \" + (item.iconStyleClass || \"\")}}'\n name=\"object-detail-icon\"\n ></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}\n </span>\n <p-button\n *ngIf=\"item.actionItemIcon && item.actionItemCallback\"\n [icon]=\"item.actionItemIcon\"\n styleClass=\"p-button-text p-0 w-full\"\n [pTooltip]=\"item.actionItemTooltip || ''\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n [ariaLabel]=\"(item.actionItemAriaLabelKey ? (item.actionItemAriaLabelKey | translate) : item.actionItemAriaLabel) || item.actionItemTooltip || ''\"\n (onClick)=\"item.actionItemCallback()\"\n ></p-button>\n </span>\n </span>\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.1);box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color, var(--primary-color-default));position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem}.onecx-page-header .object-panel:empty{display:none!important}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}.object-info-grid-label{flex:1}.object-info-grid-value{flex:3}.min-w-120{min-width:120px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i9.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i10.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i11.SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"], outputs: ["error"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: i12.DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None }); }
170
+ /**
171
+ * Helper to extract translation key and parameters from a string or object.
172
+ * @param input - Can be a string or an object with 'key' and 'parameters'.
173
+ * @returns An object with { key, params } for use in translation pipes or services. The returned key is always a string (never undefined).
174
+ *
175
+ * Example usage in template:
176
+ * let result = extractKeyAndParams(item.labelTooltipKey);
177
+ * result.key | translate : result.params
178
+ *
179
+ * .key will always be a string, so you do not need to use `?? ''` in the template.
180
+ */
181
+ extractKeyAndParams(input) {
182
+ if (typeof input === 'string') {
183
+ return { key: input, params: undefined };
184
+ }
185
+ if (input && typeof input === 'object') {
186
+ return { key: input.key ?? '', params: input.parameters };
187
+ }
188
+ return { key: '', params: undefined };
189
+ }
190
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PageHeaderComponent, deps: [{ token: i1.BreadcrumbService }, { token: i2.TranslateService }, { token: i3.AppStateService }, { token: i3.UserService }, { token: HAS_PERMISSION_CHECKER }], target: i0.ɵɵFactoryTarget.Component }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: PageHeaderComponent, selector: "ocx-page-header", inputs: { header: "header", loading: "loading", figureBackground: "figureBackground", showFigure: "showFigure", figureImage: "figureImage", disableDefaultActions: "disableDefaultActions", subheader: "subheader", actions: "actions", objectDetails: "objectDetails", showBreadcrumbs: "showBreadcrumbs", manualBreadcrumbs: "manualBreadcrumbs", enableGridView: "enableGridView", gridLayoutDesktopColumns: "gridLayoutDesktopColumns" }, outputs: { save: "save" }, queries: [{ propertyName: "additionalToolbarContent", first: true, predicate: ["additionalToolbarContent"], descendants: true }, { propertyName: "additionalToolbarContentLeft", first: true, predicate: ["additionalToolbarContentLeft"], descendants: true }], ngImport: i0, template: "<div class=\"onecx-page-header mb-4\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n *ngIf=\"breadcrumbs$ | async as items\"\n [model]=\"items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n >\n <ng-template pTemplate=\"separator\"> <span class=\"pi pi-chevron-right\" aria-hidden=\"true\"></span> </ng-template\n ></p-breadcrumb>\n </ng-container>\n\n <div class=\"p-3 title-bar flex flex-row flex-wrap justify-content-between align-items-center gap-2\">\n <div class=\"title-wrap\">\n <div class=\"mr-2 figure relative flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n [alt]=\"'OCX_PAGE_HEADER.IMAGE' | translate\"\n class=\"w-full border-round-sm\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <section class=\"header\" *ngIf=\"!loading; else skeletonBar\" [attr.aria-label]=\"'Page Header'\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <div id=\"page-subheader\" *ngIf=\"!!subheader\" role=\"note\">{{ subheader }}</div>\n </section>\n </div>\n\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <ng-container *ngIf=\"inlineActions$ | async as inlineActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <span\n [pTooltip]=\"action.disabled ? (action.disabledTooltipKey ? (action.disabledTooltipKey | translate) : action.disabledTooltip) : (action.titleKey ? (action.titleKey | translate) : action.title)\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n >\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n [iconPos]=\"action.iconPos ?? 'left'\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\" (action.ariaLabelKey ? (action.ariaLabelKey | translate) : action.ariaLabel) || (action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <ng-container *ngIf=\"overflowActions$ | async as overflowActions\">\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [attr.aria-label]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n [pTooltip]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div class=\"object-panel\" [ngClass]=\"getObjectPanelLayoutClasses()\">\n <ng-container *ngIf=\"objectDetails\">\n <div class=\"object-info\" [ngClass]=\"getObjectInfoLayoutClasses()\" *ngFor=\"let item of objectDetails\">\n <span\n class=\"flex font-medium text-600 object-info-grid-label\"\n name=\"object-detail-label\"\n [pTooltip]=\"item.labelTooltipKey ? ((extractKeyAndParams(item.labelTooltipKey).key ?? '') | translate : extractKeyAndParams(item.labelTooltipKey).params) : (item.labelTooltip ?? '')\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</span>\n <span *ngIf=\"item.icon || item.value\" class=\"object-info-grid-value\">\n <span\n class=\"flex text-900 align-items-center gap-2 w-max\"\n [ngClass]=\"generateItemStyle(item)\"\n name=\"object-detail-value\"\n >\n <span\n class=\"flex align-items-center gap-2\"\n [pTooltip]=\"item.valueTooltipKey ? ((extractKeyAndParams(item.valueTooltipKey).key ?? '') | translate : extractKeyAndParams(item.valueTooltipKey).params) : (item.valueTooltip || item.tooltip || '')\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >\n <i\n *ngIf=\"item.icon\"\n class='{{item.icon + \" \" + (item.iconStyleClass || \"\")}}'\n name=\"object-detail-icon\"\n ></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}\n </span>\n <p-button\n *ngIf=\"item.actionItemIcon && item.actionItemCallback\"\n [icon]=\"item.actionItemIcon\"\n styleClass=\"p-button-text p-0 w-full\"\n [pTooltip]=\"item.actionItemTooltipKey ? ((extractKeyAndParams(item.actionItemTooltipKey).key ?? '') | translate : extractKeyAndParams(item.actionItemTooltipKey).params) : (item.actionItemTooltip || '')\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n [ariaLabel]=\"item.actionItemAriaLabelKey ? ((extractKeyAndParams(item.actionItemAriaLabelKey).key ?? '') | translate : extractKeyAndParams(item.actionItemAriaLabelKey).params) : (item.actionItemAriaLabel ?? (item.actionItemTooltipKey ? ((extractKeyAndParams(item.actionItemTooltipKey).key ?? '') | translate : extractKeyAndParams(item.actionItemTooltipKey).params) : (item.actionItemTooltip ?? item?.label ?? ('Tooltip for ' + item.actionItemIcon))))\"\n (onClick)=\"item.actionItemCallback()\"\n ></p-button>\n </span>\n </span>\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.1);box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color, var(--primary-color-default));position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem}.onecx-page-header .object-panel:empty{display:none!important}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}.object-info-grid-label{flex:1}.object-info-grid-value{flex:3}.min-w-120{min-width:120px!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.Breadcrumb, selector: "p-breadcrumb", inputs: ["model", "style", "styleClass", "home", "homeAriaLabel"], outputs: ["onItemClick"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i8.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i9.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i10.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i11.SrcDirective, selector: "[ocxSrc]", inputs: ["ocxSrc"], outputs: ["error"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: i12.DynamicPipe, name: "dynamicPipe" }], encapsulation: i0.ViewEncapsulation.None }); }
172
192
  }
173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PageHeaderComponent, decorators: [{
193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PageHeaderComponent, decorators: [{
174
194
  type: Component,
175
- args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header mb-4\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n *ngIf=\"breadcrumbs$ | async as items\"\n [model]=\"items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n >\n <ng-template pTemplate=\"separator\"> <span class=\"pi pi-chevron-right\" aria-hidden=\"true\"></span> </ng-template\n ></p-breadcrumb>\n </ng-container>\n\n <div class=\"p-3 title-bar flex flex-row flex-wrap justify-content-between align-items-center gap-2\">\n <div class=\"title-wrap\">\n <div class=\"mr-2 figure relative flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n [alt]=\"'OCX_PAGE_HEADER.IMAGE' | translate\"\n class=\"w-full border-round-sm\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <section class=\"header\" *ngIf=\"!loading; else skeletonBar\" [attr.aria-label]=\"'Page Header'\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <div id=\"page-subheader\" *ngIf=\"!!subheader\" role=\"note\">{{ subheader }}</div>\n </section>\n </div>\n\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <ng-container *ngIf=\"inlineActions$ | async as inlineActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <span\n [pTooltip]=\"action.disabled ? (action.disabledTooltipKey ? (action.disabledTooltipKey | translate) : action.disabledTooltip) : (action.titleKey ? (action.titleKey | translate) : action.title)\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n >\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n [iconPos]=\"action.iconPos ?? 'left'\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\" (action.ariaLabelKey ? (action.ariaLabelKey | translate) : action.ariaLabel) || (action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <ng-container *ngIf=\"overflowActions$ | async as overflowActions\">\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [attr.aria-label]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n [pTooltip]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div class=\"object-panel\" [ngClass]=\"getObjectPanelLayoutClasses()\">\n <ng-container *ngIf=\"objectDetails\">\n <div class=\"object-info\" [ngClass]=\"getObjectInfoLayoutClasses()\" *ngFor=\"let item of objectDetails\">\n <span\n class=\"flex font-medium text-600 object-info-grid-label\"\n name=\"object-detail-label\"\n [pTooltip]=\"item.labelTooltip || ''\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</span\n >\n <span *ngIf=\"item.icon || item.value\" class=\"object-info-grid-value\">\n <span\n class=\"flex text-900 align-items-center gap-2 w-max\"\n [ngClass]=\"generateItemStyle(item)\"\n name=\"object-detail-value\"\n >\n <span\n class=\"flex align-items-center gap-2\"\n [pTooltip]=\"item.valueTooltip || item.tooltip || ''\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >\n <i\n *ngIf=\"item.icon\"\n class='{{item.icon + \" \" + (item.iconStyleClass || \"\")}}'\n name=\"object-detail-icon\"\n ></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}\n </span>\n <p-button\n *ngIf=\"item.actionItemIcon && item.actionItemCallback\"\n [icon]=\"item.actionItemIcon\"\n styleClass=\"p-button-text p-0 w-full\"\n [pTooltip]=\"item.actionItemTooltip || ''\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n [ariaLabel]=\"(item.actionItemAriaLabelKey ? (item.actionItemAriaLabelKey | translate) : item.actionItemAriaLabel) || item.actionItemTooltip || ''\"\n (onClick)=\"item.actionItemCallback()\"\n ></p-button>\n </span>\n </span>\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.1);box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color, var(--primary-color-default));position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem}.onecx-page-header .object-panel:empty{display:none!important}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}.object-info-grid-label{flex:1}.object-info-grid-value{flex:3}.min-w-120{min-width:120px!important}\n"] }]
195
+ args: [{ selector: 'ocx-page-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"onecx-page-header mb-4\" name=\"ocx-page-header-wrapper\">\n <ng-container *ngIf=\"showBreadcrumbs\">\n <p-breadcrumb\n *ngIf=\"breadcrumbs$ | async as items\"\n [model]=\"items\"\n [home]=\"(home$ | async)?.menuItem ?? {}\"\n [homeAriaLabel]=\"(home$ | async)?.page ? ('OCX_PAGE_HEADER.HOME_ARIA_LABEL' | translate: { page: (home$ | async)?.page}) : ('OCX_PAGE_HEADER.HOME_DEFAULT_ARIA_LABEL' | translate)\"\n [attr.manual]=\"manualBreadcrumbs\"\n >\n <ng-template pTemplate=\"separator\"> <span class=\"pi pi-chevron-right\" aria-hidden=\"true\"></span> </ng-template\n ></p-breadcrumb>\n </ng-container>\n\n <div class=\"p-3 title-bar flex flex-row flex-wrap justify-content-between align-items-center gap-2\">\n <div class=\"title-wrap\">\n <div class=\"mr-2 figure relative flex h-2rem w-2rem md:h-3rem md:w-3rem\" *ngIf=\"showFigure\">\n <div #previewImage class=\"figure-image absolute top-0 left-0 right-0 bottom-0\">\n <ng-content select=\"[figureImage]\"></ng-content>\n <img\n *ngIf=\"figureImage && !figureImageLoadError\"\n [ocxSrc]=\"figureImage\"\n [alt]=\"'OCX_PAGE_HEADER.IMAGE' | translate\"\n class=\"w-full border-round-sm\"\n (error)=\"handleImageError()\"\n />\n </div>\n <div\n class=\"colorblob flex-1 border-round\"\n *ngIf=\"previewImage.children.length === 0 || figureImageLoadError\"\n ></div>\n </div>\n <ng-template #skeletonBar>\n <div class=\"header justify-content-evenly\">\n <p-skeleton width=\"10rem\"></p-skeleton>\n <p-skeleton width=\"10rem\"></p-skeleton>\n </div>\n </ng-template>\n <section class=\"header\" *ngIf=\"!loading; else skeletonBar\" [attr.aria-label]=\"'Page Header'\">\n <h1 id=\"page-header\" *ngIf=\"!!header\">{{ header }}</h1>\n <div id=\"page-subheader\" *ngIf=\"!!subheader\" role=\"note\">{{ subheader }}</div>\n </section>\n </div>\n\n <div class=\"action-items-wrap mt-2 md:mt-0\">\n <ng-container *ngIf=\"additionalToolbarContentLeft\" [ngTemplateOutlet]=\"additionalToolbarContentLeft\">\n </ng-container>\n\n <ng-container *ngIf=\"!disableDefaultActions\"> </ng-container>\n <ng-template #skeletonActions>\n <div class=\"flex\">\n <p-skeleton width=\"5rem\" height=\"2rem\" styleClass=\"mr-2\"></p-skeleton>\n <p-skeleton width=\"2rem\" height=\"2rem\" styleClass=\"mb-2\"></p-skeleton>\n </div>\n </ng-template>\n <ng-container *ngIf=\"!loading; else skeletonActions\">\n <ng-container *ngIf=\"inlineActions$ | async as inlineActions\">\n <div *ngIf=\"inlineActions && inlineActions.length > 0\" class=\"toolbar flex flex-wrap gap-1 sm:gap-2\">\n <ng-container *ngFor=\"let action of inlineActions\">\n <span\n [pTooltip]=\"action.disabled ? (action.disabledTooltipKey ? (action.disabledTooltipKey | translate) : action.disabledTooltip) : (action.titleKey ? (action.titleKey | translate) : action.title)\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n >\n <p-button\n id=\"{{ action.id }}\"\n [icon]=\"action.icon ?? ''\"\n [iconPos]=\"action.iconPos ?? 'left'\"\n type=\"button\"\n class=\"action-button\"\n [label]=\"action.labelKey ? (action.labelKey | translate) : action.label\"\n (onClick)=\"action.actionCallback()\"\n [disabled]=\"action.disabled ? action.disabled : false\"\n [attr.name]=\"action.icon ? 'ocx-page-header-inline-action-icon-button' : 'ocx-page-header-inline-action-button'\"\n [ariaLabel]=\" (action.ariaLabelKey ? (action.ariaLabelKey | translate) : action.ariaLabel) || (action.titleKey ? (action.titleKey | translate) : action.title) || (action.labelKey ? (action.labelKey | translate) : action.label)\"\n ></p-button>\n </span>\n </ng-container>\n </div>\n </ng-container>\n <ng-content select=\"[toolbarItems]\"></ng-content>\n <ng-container>\n <ng-container *ngIf=\"overflowActions$ | async as overflowActions\">\n <div *ngIf=\"overflowActions.length !== 0\">\n <button\n id=\"pageHeaderMenuButton\"\n type=\"button\"\n pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"more-actions-menu-button action-button ml-2\"\n (click)=\"menu.toggle($event)\"\n name=\"ocx-page-header-overflow-action-button\"\n [attr.aria-label]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n [pTooltip]=\"'OCX_PAGE_HEADER.MORE_ACTIONS' | translate\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n ></button>\n <p-menu #menu [popup]=\"true\" [model]=\"overflowActions\" appendTo=\"body\"></p-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"additionalToolbarContent\" [ngTemplateOutlet]=\"additionalToolbarContent\"> </ng-container>\n </div>\n </div>\n\n <div class=\"object-panel\" [ngClass]=\"getObjectPanelLayoutClasses()\">\n <ng-container *ngIf=\"objectDetails\">\n <div class=\"object-info\" [ngClass]=\"getObjectInfoLayoutClasses()\" *ngFor=\"let item of objectDetails\">\n <span\n class=\"flex font-medium text-600 object-info-grid-label\"\n name=\"object-detail-label\"\n [pTooltip]=\"item.labelTooltipKey ? ((extractKeyAndParams(item.labelTooltipKey).key ?? '') | translate : extractKeyAndParams(item.labelTooltipKey).params) : (item.labelTooltip ?? '')\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >{{ item.label | dynamicPipe:item.labelPipe }}</span>\n <span *ngIf=\"item.icon || item.value\" class=\"object-info-grid-value\">\n <span\n class=\"flex text-900 align-items-center gap-2 w-max\"\n [ngClass]=\"generateItemStyle(item)\"\n name=\"object-detail-value\"\n >\n <span\n class=\"flex align-items-center gap-2\"\n [pTooltip]=\"item.valueTooltipKey ? ((extractKeyAndParams(item.valueTooltipKey).key ?? '') | translate : extractKeyAndParams(item.valueTooltipKey).params) : (item.valueTooltip || item.tooltip || '')\"\n tooltipEvent=\"hover\"\n tooltipPosition=\"top\"\n >\n <i\n *ngIf=\"item.icon\"\n class='{{item.icon + \" \" + (item.iconStyleClass || \"\")}}'\n name=\"object-detail-icon\"\n ></i>\n {{ item.value | dynamicPipe:item.valuePipe:item.valuePipeArgs}}\n </span>\n <p-button\n *ngIf=\"item.actionItemIcon && item.actionItemCallback\"\n [icon]=\"item.actionItemIcon\"\n styleClass=\"p-button-text p-0 w-full\"\n [pTooltip]=\"item.actionItemTooltipKey ? ((extractKeyAndParams(item.actionItemTooltipKey).key ?? '') | translate : extractKeyAndParams(item.actionItemTooltipKey).params) : (item.actionItemTooltip || '')\"\n tooltipPosition=\"top\"\n tooltipEvent=\"hover\"\n [ariaLabel]=\"item.actionItemAriaLabelKey ? ((extractKeyAndParams(item.actionItemAriaLabelKey).key ?? '') | translate : extractKeyAndParams(item.actionItemAriaLabelKey).params) : (item.actionItemAriaLabel ?? (item.actionItemTooltipKey ? ((extractKeyAndParams(item.actionItemTooltipKey).key ?? '') | translate : extractKeyAndParams(item.actionItemTooltipKey).params) : (item.actionItemTooltip ?? item?.label ?? ('Tooltip for ' + item.actionItemIcon))))\"\n (onClick)=\"item.actionItemCallback()\"\n ></p-button>\n </span>\n </span>\n </div>\n </ng-container>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [":host(.p-button-label){font-weight:400}.onecx-page-header{display:flex;flex-flow:column;border-radius:.25rem;overflow:hidden;background:#fff;-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,.1);box-shadow:0 2px 2px #0000001a;border:1px solid #cdd0d3}.onecx-page-header .title-bar{background-color:#f8f9fa;border-top-right-radius:inherit;border-top-left-radius:inherit}.onecx-page-header .title-bar .figure .figure-image img{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.onecx-page-header .title-bar .figure .colorblob{background-color:var(--primary-color, var(--primary-color-default));position:absolute;inset:0}.onecx-page-header .title-bar .title-wrap{display:flex;flex-flow:row;align-items:center;gap:.25rem}.onecx-page-header .title-bar .title-wrap .header{display:flex;align-items:flex-start;justify-content:center;flex-direction:column}.onecx-page-header .title-bar .title-wrap h1{font-size:1em;font-weight:700;margin:0;padding:0}.onecx-page-header .title-bar .title-wrap h2{font-size:1em;font-weight:400;margin:0;padding:0}.onecx-page-header .title-bar .action-items-wrap{display:flex;height:fit-content;gap:.5rem;align-items:center;justify-content:space-between}.onecx-page-header .object-panel{border-top:1px solid #cdd0d3;padding:1rem}.onecx-page-header .object-panel:empty{display:none!important}.badge-container{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.scale{transform:scale(2)}.object-info-grid-label{flex:1}.object-info-grid-value{flex:3}.min-w-120{min-width:120px!important}\n"] }]
176
196
  }], ctorParameters: () => [{ type: i1.BreadcrumbService }, { type: i2.TranslateService }, { type: i3.AppStateService }, { type: i3.UserService }, { type: undefined, decorators: [{
177
197
  type: Inject,
178
198
  args: [HAS_PERMISSION_CHECKER]
@@ -211,4 +231,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
211
231
  type: ContentChild,
212
232
  args: ['additionalToolbarContentLeft']
213
233
  }] } });
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9wYWdlLWhlYWRlci9wYWdlLWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFZLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBd0IsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7QUFrRW5GLE1BQU0sT0FBTyxtQkFBbUI7SUF3QjlCLElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNqQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNmLElBQUks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QUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsaUJBR1osaUJBQWlCLENBQUMsSUFBSTs7MEJBb0ZsQyxNQUFNOzJCQUFDLHNCQUFzQjt5Q0FoRnpCLE1BQU07c0JBRFosS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUtOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUtGLE9BQU87c0JBRFYsS0FBSztnQkFTTixhQUFhO3NCQURaLEtBQUs7Z0JBSU4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFJTixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUlOLElBQUk7c0JBREgsTUFBTTtnQkFJUCx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsMEJBQTBCO2dCQUl4Qyw0QkFBNEI7c0JBRDNCLFlBQVk7dUJBQUMsOEJBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lSWNvbnMgfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29uY2F0LCBtYXAsIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBCcmVhZGNydW1iU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2JyZWFkY3J1bWIuc2VydmljZSdcbmltcG9ydCB7IFByaW1lSWNvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3ByaW1laWNvbi51dGlscydcbmltcG9ydCB7IEhBU19QRVJNSVNTSU9OX0NIRUNLRVIsIEhhc1Blcm1pc3Npb25DaGVja2VyIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItdXRpbHMnXG5cbi8qKlxuICogQWN0aW9uIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uIHtcbiAgaWQ/OiBzdHJpbmdcbiAgbGFiZWw/OiBzdHJpbmdcbiAgbGFiZWxLZXk/OiBzdHJpbmdcbiAgaWNvbj86IHN0cmluZ1xuICBpY29uUG9zPzogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbSdcbiAgLyoqXG4gICAqIFBlcm1pc3Npb24gZm9yIHRoaXMgYWN0aW9uLiBJZiB0aGUgY3VycmVudCB1c2VyIGRvZXMgbm90IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCB0aGUgYWN0aW9uIHdpbGwgbm90IGJlIHNob3duLlxuICAgKi9cbiAgcGVybWlzc2lvbj86IHN0cmluZ1xuICB0aXRsZT86IHN0cmluZ1xuICB0aXRsZUtleT86IHN0cmluZ1xuICBhcmlhTGFiZWw/OiBzdHJpbmdcbiAgYXJpYUxhYmVsS2V5Pzogc3RyaW5nXG4gIGJ0bkNsYXNzPzogc3RyaW5nXG4gIGFjdGlvbkNhbGxiYWNrKCk6IHZvaWRcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIGRpc2FibGVkVG9vbHRpcD86IHN0cmluZ1xuICBkaXNhYmxlZFRvb2x0aXBLZXk/OiBzdHJpbmdcbiAgc2hvdz86ICdhbHdheXMnIHwgJ2FzT3ZlcmZsb3cnXG4gIGNvbmRpdGlvbmFsPzogYm9vbGVhblxuICAvLyBOb3RlOiBUaGlzIGN1cnJlbnRseSBkb2Vzbid0IHdvcmsgd2l0aCBkeW5hbWljIHZhbHVlcywgc2luY2UgYSBwYXNzZWQgaW4gQWN0aW9uIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gIC8vIEFzIGEgd29ya2Fyb3VuZCwgeW91IGNhbiBtYW51YWxseSB1cGRhdGUvcmVwbGFjZSB0aGUgcGFzc2VkIGluIEFjdGlvbiBpZiB5b3Ugd2lzaCB0byB1cGRhdGUgYSBzaG93Q29uZGl0aW9uXG4gIHNob3dDb25kaXRpb24/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0RGV0YWlsSXRlbSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgdmFsdWVUb29sdGlwYCBpbnN0ZWFkXG4gICAqL1xuICB0b29sdGlwPzogc3RyaW5nXG4gIGxhYmVsVG9vbHRpcD86IHN0cmluZ1xuICB2YWx1ZVRvb2x0aXA/OiBzdHJpbmdcbiAgaWNvbj86IFByaW1lSWNvblxuICBpY29uU3R5bGVDbGFzcz86IHN0cmluZ1xuICBsYWJlbFBpcGU/OiBUeXBlPGFueT5cbiAgdmFsdWVQaXBlPzogVHlwZTxhbnk+XG4gIHZhbHVlUGlwZUFyZ3M/OiBzdHJpbmdcbiAgdmFsdWVDc3NDbGFzcz86IHN0cmluZ1xuICBhY3Rpb25JdGVtSWNvbj86IFByaW1lSWNvblxuICBhY3Rpb25JdGVtQ2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gIGFjdGlvbkl0ZW1Ub29sdGlwPzogc3RyaW5nXG4gIGFjdGlvbkl0ZW1BcmlhTGFiZWxLZXk/OiBzdHJpbmdcbiAgYWN0aW9uSXRlbUFyaWFMYWJlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvbWVJdGVtIHtcbiAgbWVudUl0ZW06IE1lbnVJdGVtXG4gIHBhZ2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgR3JpZENvbHVtbk9wdGlvbnMgPSAxIHwgMiB8IDMgfCA0IHwgNiB8IDEyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1wYWdlLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2VIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVhZGVyOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBsb2FkaW5nID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBmaWd1cmVCYWNrZ3JvdW5kID0gdHJ1ZVxuXG4gIEBJbnB1dCgpXG4gIHNob3dGaWd1cmUgPSB0cnVlXG5cbiAgLy9pbWFnZSBmb3QgcHJldmlldyBpbiB0b3AtaGVhZGVyIGxlZnQgc2lkZVxuICBASW5wdXQoKVxuICBmaWd1cmVJbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgQElucHV0KClcbiAgZGlzYWJsZURlZmF1bHRBY3Rpb25zID0gZmFsc2VcblxuICBASW5wdXQoKVxuICBzdWJoZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIF9hY3Rpb25zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb25bXT4oW10pXG4gIEBJbnB1dCgpXG4gIGdldCBhY3Rpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3Rpb25zLmdldFZhbHVlKClcbiAgfVxuICBzZXQgYWN0aW9ucyh2YWx1ZSkge1xuICAgIHRoaXMuX2FjdGlvbnMubmV4dCh2YWx1ZSlcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIG9iamVjdERldGFpbHM6IE9iamVjdERldGFpbEl0ZW1bXSB8IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCgpXG4gIHNob3dCcmVhZGNydW1icyA9IHRydWVcblxuICBASW5wdXQoKVxuICBtYW51YWxCcmVhZGNydW1icyA9IGZhbHNlXG5cbiAgQElucHV0KClcbiAgZW5hYmxlR3JpZFZpZXc6IHVuZGVmaW5lZCB8IGJvb2xlYW5cblxuICBASW5wdXQoKVxuICBncmlkTGF5b3V0RGVza3RvcENvbHVtbnM6IHVuZGVmaW5lZCB8IEdyaWRDb2x1bW5PcHRpb25zXG5cbiAgQE91dHB1dCgpXG4gIHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBAQ29udGVudENoaWxkKCdhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnQnKVxuICBhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnQ6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICBAQ29udGVudENoaWxkKCdhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnRMZWZ0JylcbiAgYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuXG4gIG92ZXJmbG93QWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+KFtdKVxuICBpbmxpbmVBY3Rpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWN0aW9uW10+KFtdKVxuICBkZCA9IG5ldyBEYXRlKClcbiAgYnJlYWRjcnVtYnMkITogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPlxuXG4gIGhvbWUkITogT2JzZXJ2YWJsZTxIb21lSXRlbT5cblxuICBmaWd1cmVJbWFnZUxvYWRFcnJvciA9IGZhbHNlXG5cbiAgb2JqZWN0UGFuZWxHcmlkTGF5b3V0Q2xhc3NlcyA9ICdncmlkIHJvdy1nYXAtMiBtLTAnXG4gIG9iamVjdFBhbmVsQ29sdW1uTGF5b3V0Q2xhc3NlcyA9ICdmbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG92ZXJmbG93LXgtYXV0bydcblxuICBvYmplY3RQYW5lbERlZmF1bHRMYXlvdXRDbGFzc2VzID0gJ2ZsZXggZmxleC1jb2x1bW4gcm93LWdhcC0yIG1kOmZsZXgtcm93IG1kOmp1c3RpZnktY29udGVudC1iZXR3ZWVuJ1xuXG4gIG9iamVjdEluZm9HcmlkTGF5b3V0Q2xhc3NlcyA9ICdjb2wtMTIgZmxleCBnYXAtNCBtZDpjb2wtNiBhbGlnbi1pdGVtcy1jZW50ZXIgcC0wJ1xuICBvYmplY3RJbmZvQ29sdW1uTGF5b3V0Q2xhc3NlcyA9ICdmbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtaW4tdy0xMjAnXG5cbiAgb2JqZWN0SW5mb0RlZmF1bHRMYXlvdXRDbGFzc2VzID0gJ2ZsZXggZmxleC1yb3cgbWQ6ZmxleC1jb2x1bW4gbWQ6YWxpZ24taXRlbXMtY2VudGVyIG1kOmdhcC0yJ1xuXG4gIHByb3RlY3RlZCBicmVhZGNydW1iczogQnJlYWRjcnVtYlNlcnZpY2VcblxuICBjb25zdHJ1Y3RvcihcbiAgICBicmVhZGNydW1iczogQnJlYWRjcnVtYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGVTZXJ2aWNlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgQEluamVjdChIQVNfUEVSTUlTU0lPTl9DSEVDS0VSKVxuICAgIHByaXZhdGUgaGFzUGVybWlzc2lvbkNoZWNrZXI/OiBIYXNQZXJtaXNzaW9uQ2hlY2tlclxuICApIHtcbiAgICB0aGlzLmJyZWFkY3J1bWJzID0gYnJlYWRjcnVtYnNcbiAgICB0aGlzLmhvbWUkID0gY29uY2F0KFxuICAgICAgb2YoeyBtZW51SXRlbTogeyBpY29uOiBQcmltZUljb25zLkhPTUUsIHJvdXRlckxpbms6ICcvJyB9IH0pLFxuICAgICAgdGhpcy5hcHBTdGF0ZVNlcnZpY2UuY3VycmVudFBvcnRhbCQucGlwZShcbiAgICAgICAgbWFwKChwb3J0YWwpID0+ICh7XG4gICAgICAgICAgbWVudUl0ZW06IHtcbiAgICAgICAgICAgIGljb246IFByaW1lSWNvbnMuSE9NRSxcbiAgICAgICAgICAgIHJvdXRlckxpbms6IHBvcnRhbC5iYXNlVXJsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFnZTogcG9ydGFsLnBvcnRhbE5hbWUsXG4gICAgICAgIH0pKVxuICAgICAgKVxuICAgIClcblxuICAgIHRoaXMuX2FjdGlvbnNcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAodGhpcy5maWx0ZXJJbmxpbmVBY3Rpb25zKSxcbiAgICAgICAgc3dpdGNoTWFwKChhY3Rpb25zKSA9PiB0aGlzLmZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9ucykpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaW5saW5lQWN0aW9ucyQpXG5cbiAgICB0aGlzLl9hY3Rpb25zXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHRoaXMuZmlsdGVyT3ZlcmZsb3dBY3Rpb25zKSxcbiAgICAgICAgc3dpdGNoTWFwKChhY3Rpb25zKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uVHJhbnNsYXRpb25LZXlzKGFjdGlvbnMpLnBpcGUobWFwKCh0cmFuc2xhdGlvbnMpID0+ICh7IGFjdGlvbnMsIHRyYW5zbGF0aW9ucyB9KSkpXG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgYWN0aW9ucywgdHJhbnNsYXRpb25zIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJBY3Rpb25zQmFzZWRPblBlcm1pc3Npb25zKGFjdGlvbnMpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGZpbHRlcmVkQWN0aW9ucykgPT4gKHsgZmlsdGVyZWRBY3Rpb25zLCB0cmFuc2xhdGlvbnMgfSkpXG4gICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwKCh7IGZpbHRlcmVkQWN0aW9ucywgdHJhbnNsYXRpb25zIH0pID0+IHRoaXMubWFwT3ZlcmZsb3dBY3Rpb25zVG9NZW51SXRlbXMoZmlsdGVyZWRBY3Rpb25zLCB0cmFuc2xhdGlvbnMpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLm92ZXJmbG93QWN0aW9ucyQpXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWFudWFsQnJlYWRjcnVtYnMpIHtcbiAgICAgIHRoaXMuYnJlYWRjcnVtYnMkID0gdGhpcy5icmVhZGNydW1icy5nZW5lcmF0ZWRJdGVtc1NvdXJjZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJyZWFkY3J1bWJzJCA9IHRoaXMuYnJlYWRjcnVtYnMuaXRlbXNIYW5kbGVyXG4gICAgfVxuICB9XG5cbiAgb25BY3Rpb24oYWN0aW9uOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSAnc2F2ZSc6XG4gICAgICAgIHRoaXMuc2F2ZS5lbWl0KClcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSW1hZ2VFcnJvcigpIHtcbiAgICB0aGlzLmZpZ3VyZUltYWdlTG9hZEVycm9yID0gdHJ1ZVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlSXRlbVN0eWxlKGl0ZW06IE9iamVjdERldGFpbEl0ZW0pOiBzdHJpbmcge1xuICAgIGxldCBzdHlsZSA9ICcnXG4gICAgaWYgKGl0ZW0uaWNvbikgc3R5bGUgPSBzdHlsZS5jb25jYXQoc3R5bGUsICcgJywgJ2dhcC0xIGFsaWduLWl0ZW1zLWNlbnRlcicpXG4gICAgaWYgKGl0ZW0udmFsdWVDc3NDbGFzcykgc3R5bGUgPSBzdHlsZS5jb25jYXQoc3R5bGUsICcgJywgaXRlbS52YWx1ZUNzc0NsYXNzKVxuICAgIHJldHVybiBzdHlsZVxuICB9XG5cbiAgcHVibGljIGdldE9iamVjdFBhbmVsTGF5b3V0Q2xhc3NlcygpIHtcbiAgICBpZiAodGhpcy5lbmFibGVHcmlkVmlldykge1xuICAgICAgcmV0dXJuIHRoaXMub2JqZWN0UGFuZWxHcmlkTGF5b3V0Q2xhc3Nlc1xuICAgIH1cbiAgICBpZiAodGhpcy5lbmFibGVHcmlkVmlldyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdFBhbmVsQ29sdW1uTGF5b3V0Q2xhc3Nlc1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vYmplY3RQYW5lbERlZmF1bHRMYXlvdXRDbGFzc2VzXG4gIH1cblxuICBwdWJsaWMgZ2V0T2JqZWN0SW5mb0xheW91dENsYXNzZXMoKSB7XG4gICAgaWYgKHRoaXMuZW5hYmxlR3JpZFZpZXcpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm9iamVjdEluZm9HcmlkTGF5b3V0Q2xhc3Nlc30gbGc6Y29sLSR7XG4gICAgICAgIHRoaXMuZ3JpZExheW91dERlc2t0b3BDb2x1bW5zID8gMTIgLyB0aGlzLmdyaWRMYXlvdXREZXNrdG9wQ29sdW1ucyA6IDRcbiAgICAgIH1gXG4gICAgfVxuICAgIGlmICh0aGlzLmVuYWJsZUdyaWRWaWV3ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRoaXMub2JqZWN0SW5mb0NvbHVtbkxheW91dENsYXNzZXNcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0SW5mb0RlZmF1bHRMYXlvdXRDbGFzc2VzXG4gIH1cblxuICBwcml2YXRlIGZpbHRlcklubGluZUFjdGlvbnMoYWN0aW9uczogQWN0aW9uW10pOiBBY3Rpb25bXSB7XG4gICAgcmV0dXJuIGFjdGlvbnNcbiAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2Fsd2F5cycpXG4gICAgICAuZmlsdGVyKChhKSA9PiB7XG4gICAgICAgIGlmIChhLmNvbmRpdGlvbmFsKSB7XG4gICAgICAgICAgcmV0dXJuIGEuc2hvd0NvbmRpdGlvblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJPdmVyZmxvd0FjdGlvbnMoYWN0aW9uczogQWN0aW9uW10pOiBBY3Rpb25bXSB7XG4gICAgcmV0dXJuIGFjdGlvbnNcbiAgICAgIC5maWx0ZXIoKGEpID0+IGEuc2hvdyA9PT0gJ2FzT3ZlcmZsb3cnKVxuICAgICAgLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgIHJldHVybiBhLnNob3dDb25kaXRpb25cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyQWN0aW9uc0Jhc2VkT25QZXJtaXNzaW9ucyhhY3Rpb25zOiBBY3Rpb25bXSk6IE9ic2VydmFibGU8QWN0aW9uW10+IHtcbiAgICBjb25zdCBnZXRQZXJtaXNzaW9ucyA9XG4gICAgICB0aGlzLmhhc1Blcm1pc3Npb25DaGVja2VyPy5nZXRQZXJtaXNzaW9ucz8uYmluZCh0aGlzLmhhc1Blcm1pc3Npb25DaGVja2VyKSB8fFxuICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRQZXJtaXNzaW9ucy5iaW5kKHRoaXMudXNlclNlcnZpY2UpXG4gICAgcmV0dXJuIGdldFBlcm1pc3Npb25zKCkucGlwZShcbiAgICAgIG1hcCgocGVybWlzc2lvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5pbmNsdWRlcyhhY3Rpb24ucGVybWlzc2lvbiEpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWN0aW9uVHJhbnNsYXRpb25LZXlzKGFjdGlvbnM6IEFjdGlvbltdKTogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25LZXlzID0gW1xuICAgICAgLi4uYWN0aW9ucy5tYXAoKGEpID0+IGEubGFiZWxLZXkgfHwgJycpLmZpbHRlcigoYSkgPT4gISFhKSxcbiAgICAgIC4uLmFjdGlvbnMubWFwKChhKSA9PiBhLnRpdGxlS2V5IHx8ICcnKS5maWx0ZXIoKGEpID0+ICEhYSksXG4gICAgXVxuICAgIHJldHVybiB0cmFuc2xhdGlvbktleXMubGVuZ3RoID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCh0cmFuc2xhdGlvbktleXMpIDogb2Yoe30pXG4gIH1cblxuICBwcml2YXRlIG1hcE92ZXJmbG93QWN0aW9uc1RvTWVudUl0ZW1zKGFjdGlvbnM6IEFjdGlvbltdLCB0cmFuc2xhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gYWN0aW9ucy5tYXA8TWVudUl0ZW0+KChhKSA9PiAoe1xuICAgICAgaWQ6IGEuaWQsXG4gICAgICBsYWJlbDogYS5sYWJlbEtleSA/IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5XSA6IGEubGFiZWwsXG4gICAgICBpY29uOiBhLmljb24sXG4gICAgICB0b29sdGlwT3B0aW9uczoge1xuICAgICAgICB0b29sdGlwTGFiZWw6IGEudGl0bGVLZXkgPyB0cmFuc2xhdGlvbnNbYS50aXRsZUtleV0gOiBhLnRpdGxlLFxuICAgICAgICB0b29sdGlwRXZlbnQ6ICdob3ZlcicsXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9LFxuICAgICAgY29tbWFuZDogYS5hY3Rpb25DYWxsYmFjayxcbiAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkLFxuICAgIH0pKVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwib25lY3gtcGFnZS1oZWFkZXIgbWItNFwiIG5hbWU9XCJvY3gtcGFnZS1oZWFkZXItd3JhcHBlclwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0JyZWFkY3J1bWJzXCI+XG4gICAgPHAtYnJlYWRjcnVtYlxuICAgICAgKm5nSWY9XCJicmVhZGNydW1icyQgfCBhc3luYyBhcyBpdGVtc1wiXG4gICAgICBbbW9kZWxdPVwiaXRlbXNcIlxuICAgICAgW2hvbWVdPVwiKGhvbWUkIHwgYXN5bmMpPy5tZW51SXRlbSA/PyB7fVwiXG4gICAgICBbaG9tZUFyaWFMYWJlbF09XCIoaG9tZSQgfCBhc3luYyk/LnBhZ2UgPyAoJ09DWF9QQUdFX0hFQURFUi5IT01FX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlOiB7IHBhZ2U6IChob21lJCB8IGFzeW5jKT8ucGFnZX0pIDogKCdPQ1hfUEFHRV9IRUFERVIuSE9NRV9ERUZBVUxUX0FSSUFfTEFCRUwnIHwgdHJhbnNsYXRlKVwiXG4gICAgICBbYXR0ci5tYW51YWxdPVwibWFudWFsQnJlYWRjcnVtYnNcIlxuICAgID5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJzZXBhcmF0b3JcIj4gPHNwYW4gY2xhc3M9XCJwaSBwaS1jaGV2cm9uLXJpZ2h0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiA8L25nLXRlbXBsYXRlXG4gICAgPjwvcC1icmVhZGNydW1iPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2IGNsYXNzPVwicC0zIHRpdGxlLWJhciBmbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGl0bGUtd3JhcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1yLTIgZmlndXJlIHJlbGF0aXZlIGZsZXggaC0ycmVtIHctMnJlbSBtZDpoLTNyZW0gbWQ6dy0zcmVtXCIgKm5nSWY9XCJzaG93RmlndXJlXCI+XG4gICAgICAgIDxkaXYgI3ByZXZpZXdJbWFnZSBjbGFzcz1cImZpZ3VyZS1pbWFnZSBhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgcmlnaHQtMCBib3R0b20tMFwiPlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltmaWd1cmVJbWFnZV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPGltZ1xuICAgICAgICAgICAgKm5nSWY9XCJmaWd1cmVJbWFnZSAmJiAhZmlndXJlSW1hZ2VMb2FkRXJyb3JcIlxuICAgICAgICAgICAgW29jeFNyY109XCJmaWd1cmVJbWFnZVwiXG4gICAgICAgICAgICBbYWx0XT1cIidPQ1hfUEFHRV9IRUFERVIuSU1BR0UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGJvcmRlci1yb3VuZC1zbVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcigpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiY29sb3JibG9iIGZsZXgtMSBib3JkZXItcm91bmRcIlxuICAgICAgICAgICpuZ0lmPVwicHJldmlld0ltYWdlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBmaWd1cmVJbWFnZUxvYWRFcnJvclwiXG4gICAgICAgID48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNza2VsZXRvbkJhcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBqdXN0aWZ5LWNvbnRlbnQtZXZlbmx5XCI+XG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCIxMHJlbVwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEwcmVtXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImhlYWRlclwiICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2Ugc2tlbGV0b25CYXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidQYWdlIEhlYWRlcidcIj5cbiAgICAgICAgPGgxIGlkPVwicGFnZS1oZWFkZXJcIiAqbmdJZj1cIiEhaGVhZGVyXCI+e3sgaGVhZGVyIH19PC9oMT5cbiAgICAgICAgPGRpdiBpZD1cInBhZ2Utc3ViaGVhZGVyXCIgKm5nSWY9XCIhIXN1YmhlYWRlclwiIHJvbGU9XCJub3RlXCI+e3sgc3ViaGVhZGVyIH19PC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWl0ZW1zLXdyYXAgbXQtMiBtZDptdC0wXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudExlZnRcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc2FibGVEZWZhdWx0QWN0aW9uc1wiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2tlbGV0b25BY3Rpb25zPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiNXJlbVwiIGhlaWdodD1cIjJyZW1cIiBzdHlsZUNsYXNzPVwibXItMlwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjJyZW1cIiBoZWlnaHQ9XCIycmVtXCIgc3R5bGVDbGFzcz1cIm1iLTJcIj48L3Atc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBza2VsZXRvbkFjdGlvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlubGluZUFjdGlvbnMkIHwgYXN5bmMgYXMgaW5saW5lQWN0aW9uc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpbmxpbmVBY3Rpb25zICYmIGlubGluZUFjdGlvbnMubGVuZ3RoID4gMFwiIGNsYXNzPVwidG9vbGJhciBmbGV4IGZsZXgtd3JhcCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGlubGluZUFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiYWN0aW9uLmRpc2FibGVkID8gKGFjdGlvbi5kaXNhYmxlZFRvb2x0aXBLZXkgPyAoYWN0aW9uLmRpc2FibGVkVG9vbHRpcEtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24uZGlzYWJsZWRUb29sdGlwKSA6IChhY3Rpb24udGl0bGVLZXkgPyAoYWN0aW9uLnRpdGxlS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi50aXRsZSlcIlxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcEV2ZW50PVwiaG92ZXJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBpZD1cInt7IGFjdGlvbi5pZCB9fVwiXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJhY3Rpb24uaWNvbiA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgICBbaWNvblBvc109XCJhY3Rpb24uaWNvblBvcyA/PyAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImFjdGlvbi5hY3Rpb25DYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb24uZGlzYWJsZWQgPyBhY3Rpb24uZGlzYWJsZWQgOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImFjdGlvbi5pY29uID8gJ29jeC1wYWdlLWhlYWRlci1pbmxpbmUtYWN0aW9uLWljb24tYnV0dG9uJyA6ICdvY3gtcGFnZS1oZWFkZXItaW5saW5lLWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiIChhY3Rpb24uYXJpYUxhYmVsS2V5ID8gKGFjdGlvbi5hcmlhTGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLmFyaWFMYWJlbCkgfHwgKGFjdGlvbi50aXRsZUtleSA/IChhY3Rpb24udGl0bGVLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLnRpdGxlKSB8fCAoYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24ubGFiZWwpXCJcbiAgICAgICAgICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbdG9vbGJhckl0ZW1zXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib3ZlcmZsb3dBY3Rpb25zJCB8IGFzeW5jIGFzIG92ZXJmbG93QWN0aW9uc1wiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm92ZXJmbG93QWN0aW9ucy5sZW5ndGggIT09IDBcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGlkPVwicGFnZUhlYWRlck1lbnVCdXR0b25cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktZWxsaXBzaXMtdlwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtb3JlLWFjdGlvbnMtbWVudS1idXR0b24gYWN0aW9uLWJ1dHRvbiBtbC0yXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVudS50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cIm9jeC1wYWdlLWhlYWRlci1vdmVyZmxvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPQ1hfUEFHRV9IRUFERVIuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidPQ1hfUEFHRV9IRUFERVIuTU9SRV9BQ1RJT05TJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcEV2ZW50PVwiaG92ZXJcIlxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAtbWVudSAjbWVudSBbcG9wdXBdPVwidHJ1ZVwiIFttb2RlbF09XCJvdmVyZmxvd0FjdGlvbnNcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFkZGl0aW9uYWxUb29sYmFyQ29udGVudFwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm9iamVjdC1wYW5lbFwiIFtuZ0NsYXNzXT1cImdldE9iamVjdFBhbmVsTGF5b3V0Q2xhc3NlcygpXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9iamVjdERldGFpbHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvYmplY3QtaW5mb1wiIFtuZ0NsYXNzXT1cImdldE9iamVjdEluZm9MYXlvdXRDbGFzc2VzKClcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvYmplY3REZXRhaWxzXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZvbnQtbWVkaXVtIHRleHQtNjAwIG9iamVjdC1pbmZvLWdyaWQtbGFiZWxcIlxuICAgICAgICAgIG5hbWU9XCJvYmplY3QtZGV0YWlsLWxhYmVsXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbS5sYWJlbFRvb2x0aXAgfHwgJydcIlxuICAgICAgICAgIHRvb2x0aXBFdmVudD1cImhvdmVyXCJcbiAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgID57eyBpdGVtLmxhYmVsIHwgZHluYW1pY1BpcGU6aXRlbS5sYWJlbFBpcGUgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uaWNvbiB8fCBpdGVtLnZhbHVlXCIgY2xhc3M9XCJvYmplY3QtaW5mby1ncmlkLXZhbHVlXCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCB0ZXh0LTkwMCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgdy1tYXhcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2VuZXJhdGVJdGVtU3R5bGUoaXRlbSlcIlxuICAgICAgICAgICAgbmFtZT1cIm9iamVjdC1kZXRhaWwtdmFsdWVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiaXRlbS52YWx1ZVRvb2x0aXAgfHwgaXRlbS50b29sdGlwIHx8ICcnXCJcbiAgICAgICAgICAgICAgdG9vbHRpcEV2ZW50PVwiaG92ZXJcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz0ne3tpdGVtLmljb24gKyBcIiBcIiArIChpdGVtLmljb25TdHlsZUNsYXNzIHx8IFwiXCIpfX0nXG4gICAgICAgICAgICAgICAgbmFtZT1cIm9iamVjdC1kZXRhaWwtaWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfCBkeW5hbWljUGlwZTppdGVtLnZhbHVlUGlwZTppdGVtLnZhbHVlUGlwZUFyZ3N9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5hY3Rpb25JdGVtSWNvbiAmJiBpdGVtLmFjdGlvbkl0ZW1DYWxsYmFja1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uYWN0aW9uSXRlbUljb25cIlxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dCBwLTAgdy1mdWxsXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIml0ZW0uYWN0aW9uSXRlbVRvb2x0aXAgfHwgJydcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICB0b29sdGlwRXZlbnQ9XCJob3ZlclwiXG4gICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiKGl0ZW0uYWN0aW9uSXRlbUFyaWFMYWJlbEtleSA/IChpdGVtLmFjdGlvbkl0ZW1BcmlhTGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogaXRlbS5hY3Rpb25JdGVtQXJpYUxhYmVsKSB8fCBpdGVtLmFjdGlvbkl0ZW1Ub29sdGlwIHx8ICcnXCJcbiAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiaXRlbS5hY3Rpb25JdGVtQ2FsbGJhY2soKVwiXG4gICAgICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9wYWdlLWhlYWRlci9wYWdlLWhlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL3BhZ2UtaGVhZGVyL3BhZ2UtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFZLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUE7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ2xFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXJFLE9BQU8sRUFBRSxzQkFBc0IsRUFBd0IsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7QUFzRW5GLE1BQU0sT0FBTyxtQkFBbUI7SUF3QjlCLElBQ0ksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNqQyxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSztRQUNmLElBQUks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IENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBNZW51SXRlbSwgUHJpbWVJY29ucyB9IGZyb20gJ3ByaW1lbmcvYXBpJ1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb25jYXQsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICdAb25lY3gvYW5ndWxhci1pbnRlZ3JhdGlvbi1pbnRlcmZhY2UnXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLWludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IEJyZWFkY3J1bWJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYnJlYWRjcnVtYi5zZXJ2aWNlJ1xuaW1wb3J0IHsgUHJpbWVJY29uIH0gZnJvbSAnLi4vLi4vdXRpbHMvcHJpbWVpY29uLnV0aWxzJ1xuaW1wb3J0IHsgSEFTX1BFUk1JU1NJT05fQ0hFQ0tFUiwgSGFzUGVybWlzc2lvbkNoZWNrZXIgfSBmcm9tICdAb25lY3gvYW5ndWxhci11dGlscydcbmltcG9ydCB7IFRyYW5zbGF0aW9uS2V5IH0gZnJvbSAnLi4vLi4vbW9kZWwvdHJhbnNsYXRpb24ubW9kZWwnXG5cbi8qKlxuICogQWN0aW9uIGRlZmluaXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uIHtcbiAgaWQ/OiBzdHJpbmdcbiAgbGFiZWw/OiBzdHJpbmdcbiAgbGFiZWxLZXk/OiBzdHJpbmdcbiAgaWNvbj86IHN0cmluZ1xuICBpY29uUG9zPzogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbSdcbiAgLyoqXG4gICAqIFBlcm1pc3Npb24gZm9yIHRoaXMgYWN0aW9uLiBJZiB0aGUgY3VycmVudCB1c2VyIGRvZXMgbm90IGhhdmUgdGhpcyBwZXJtaXNzaW9uLCB0aGUgYWN0aW9uIHdpbGwgbm90IGJlIHNob3duLlxuICAgKi9cbiAgcGVybWlzc2lvbj86IHN0cmluZ1xuICB0aXRsZT86IHN0cmluZ1xuICB0aXRsZUtleT86IHN0cmluZ1xuICBhcmlhTGFiZWw/OiBzdHJpbmdcbiAgYXJpYUxhYmVsS2V5Pzogc3RyaW5nXG4gIGJ0bkNsYXNzPzogc3RyaW5nXG4gIGFjdGlvbkNhbGxiYWNrKCk6IHZvaWRcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIGRpc2FibGVkVG9vbHRpcD86IHN0cmluZ1xuICBkaXNhYmxlZFRvb2x0aXBLZXk/OiBzdHJpbmdcbiAgc2hvdz86ICdhbHdheXMnIHwgJ2FzT3ZlcmZsb3cnXG4gIGNvbmRpdGlvbmFsPzogYm9vbGVhblxuICAvLyBOb3RlOiBUaGlzIGN1cnJlbnRseSBkb2Vzbid0IHdvcmsgd2l0aCBkeW5hbWljIHZhbHVlcywgc2luY2UgYSBwYXNzZWQgaW4gQWN0aW9uIGlzIGp1c3QgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gIC8vIEFzIGEgd29ya2Fyb3VuZCwgeW91IGNhbiBtYW51YWxseSB1cGRhdGUvcmVwbGFjZSB0aGUgcGFzc2VkIGluIEFjdGlvbiBpZiB5b3Ugd2lzaCB0byB1cGRhdGUgYSBzaG93Q29uZGl0aW9uXG4gIHNob3dDb25kaXRpb24/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0RGV0YWlsSXRlbSB7XG4gIGxhYmVsOiBzdHJpbmdcbiAgdmFsdWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgdmFsdWVUb29sdGlwYCBpbnN0ZWFkXG4gICAqL1xuICB0b29sdGlwPzogc3RyaW5nXG4gIGxhYmVsVG9vbHRpcD86IHN0cmluZ1xuICB2YWx1ZVRvb2x0aXA/OiBzdHJpbmdcbiAgaWNvbj86IFByaW1lSWNvblxuICBpY29uU3R5bGVDbGFzcz86IHN0cmluZ1xuICBsYWJlbFBpcGU/OiBUeXBlPGFueT5cbiAgdmFsdWVQaXBlPzogVHlwZTxhbnk+XG4gIHZhbHVlUGlwZUFyZ3M/OiBzdHJpbmdcbiAgdmFsdWVDc3NDbGFzcz86IHN0cmluZ1xuICBhY3Rpb25JdGVtSWNvbj86IFByaW1lSWNvblxuICBhY3Rpb25JdGVtQ2FsbGJhY2s/OiAoKSA9PiB2b2lkXG4gIGFjdGlvbkl0ZW1BcmlhTGFiZWw/OiBzdHJpbmdcbiAgYWN0aW9uSXRlbUFyaWFMYWJlbEtleT86IFRyYW5zbGF0aW9uS2V5XG4gIGFjdGlvbkl0ZW1Ub29sdGlwPzogc3RyaW5nXG4gIGFjdGlvbkl0ZW1Ub29sdGlwS2V5PzogVHJhbnNsYXRpb25LZXlcbiAgbGFiZWxUb29sdGlwS2V5PzogVHJhbnNsYXRpb25LZXlcbiAgdmFsdWVUb29sdGlwS2V5PzogVHJhbnNsYXRpb25LZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb21lSXRlbSB7XG4gIG1lbnVJdGVtOiBNZW51SXRlbVxuICBwYWdlPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEdyaWRDb2x1bW5PcHRpb25zID0gMSB8IDIgfCAzIHwgNCB8IDYgfCAxMlxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvY3gtcGFnZS1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYWdlLWhlYWRlci5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQYWdlSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHVibGljIGhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgQElucHV0KClcbiAgbG9hZGluZyA9IGZhbHNlXG5cbiAgQElucHV0KClcbiAgZmlndXJlQmFja2dyb3VuZCA9IHRydWVcblxuICBASW5wdXQoKVxuICBzaG93RmlndXJlID0gdHJ1ZVxuXG4gIC8vaW1hZ2UgZm90IHByZXZpZXcgaW4gdG9wLWhlYWRlciBsZWZ0IHNpZGVcbiAgQElucHV0KClcbiAgZmlndXJlSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVEZWZhdWx0QWN0aW9ucyA9IGZhbHNlXG5cbiAgQElucHV0KClcbiAgc3ViaGVhZGVyOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBfYWN0aW9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWN0aW9uW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgYWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IGFjdGlvbnModmFsdWUpIHtcbiAgICB0aGlzLl9hY3Rpb25zLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKVxuICBvYmplY3REZXRhaWxzOiBPYmplY3REZXRhaWxJdGVtW10gfCB1bmRlZmluZWRcblxuICBASW5wdXQoKVxuICBzaG93QnJlYWRjcnVtYnMgPSB0cnVlXG5cbiAgQElucHV0KClcbiAgbWFudWFsQnJlYWRjcnVtYnMgPSBmYWxzZVxuXG4gIEBJbnB1dCgpXG4gIGVuYWJsZUdyaWRWaWV3OiB1bmRlZmluZWQgfCBib29sZWFuXG5cbiAgQElucHV0KClcbiAgZ3JpZExheW91dERlc2t0b3BDb2x1bW5zOiB1bmRlZmluZWQgfCBHcmlkQ29sdW1uT3B0aW9uc1xuXG4gIEBPdXRwdXQoKVxuICBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQENvbnRlbnRDaGlsZCgnYWRkaXRpb25hbFRvb2xiYXJDb250ZW50JylcbiAgYWRkaXRpb25hbFRvb2xiYXJDb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG5cbiAgQENvbnRlbnRDaGlsZCgnYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdCcpXG4gIGFkZGl0aW9uYWxUb29sYmFyQ29udGVudExlZnQ6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcblxuICBvdmVyZmxvd0FjdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZW51SXRlbVtdPihbXSlcbiAgaW5saW5lQWN0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFjdGlvbltdPihbXSlcbiAgZGQgPSBuZXcgRGF0ZSgpXG4gIGJyZWFkY3J1bWJzJCE6IE9ic2VydmFibGU8TWVudUl0ZW1bXT5cblxuICBob21lJCE6IE9ic2VydmFibGU8SG9tZUl0ZW0+XG5cbiAgZmlndXJlSW1hZ2VMb2FkRXJyb3IgPSBmYWxzZVxuXG4gIG9iamVjdFBhbmVsR3JpZExheW91dENsYXNzZXMgPSAnZ3JpZCByb3ctZ2FwLTIgbS0wJ1xuICBvYmplY3RQYW5lbENvbHVtbkxheW91dENsYXNzZXMgPSAnZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBvdmVyZmxvdy14LWF1dG8nXG5cbiAgb2JqZWN0UGFuZWxEZWZhdWx0TGF5b3V0Q2xhc3NlcyA9ICdmbGV4IGZsZXgtY29sdW1uIHJvdy1nYXAtMiBtZDpmbGV4LXJvdyBtZDpqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbidcblxuICBvYmplY3RJbmZvR3JpZExheW91dENsYXNzZXMgPSAnY29sLTEyIGZsZXggZ2FwLTQgbWQ6Y29sLTYgYWxpZ24taXRlbXMtY2VudGVyIHAtMCdcbiAgb2JqZWN0SW5mb0NvbHVtbkxheW91dENsYXNzZXMgPSAnZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgbWluLXctMTIwJ1xuXG4gIG9iamVjdEluZm9EZWZhdWx0TGF5b3V0Q2xhc3NlcyA9ICdmbGV4IGZsZXgtcm93IG1kOmZsZXgtY29sdW1uIG1kOmFsaWduLWl0ZW1zLWNlbnRlciBtZDpnYXAtMidcblxuICBwcm90ZWN0ZWQgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnJlYWRjcnVtYnM6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoSEFTX1BFUk1JU1NJT05fQ0hFQ0tFUilcbiAgICBwcml2YXRlIGhhc1Blcm1pc3Npb25DaGVja2VyPzogSGFzUGVybWlzc2lvbkNoZWNrZXJcbiAgKSB7XG4gICAgdGhpcy5icmVhZGNydW1icyA9IGJyZWFkY3J1bWJzXG4gICAgdGhpcy5ob21lJCA9IGNvbmNhdChcbiAgICAgIG9mKHsgbWVudUl0ZW06IHsgaWNvbjogUHJpbWVJY29ucy5IT01FLCByb3V0ZXJMaW5rOiAnLycgfSB9KSxcbiAgICAgIHRoaXMuYXBwU3RhdGVTZXJ2aWNlLmN1cnJlbnRQb3J0YWwkLnBpcGUoXG4gICAgICAgIG1hcCgocG9ydGFsKSA9PiAoe1xuICAgICAgICAgIG1lbnVJdGVtOiB7XG4gICAgICAgICAgICBpY29uOiBQcmltZUljb25zLkhPTUUsXG4gICAgICAgICAgICByb3V0ZXJMaW5rOiBwb3J0YWwuYmFzZVVybCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhZ2U6IHBvcnRhbC5wb3J0YWxOYW1lLFxuICAgICAgICB9KSlcbiAgICAgIClcbiAgICApXG5cbiAgICB0aGlzLl9hY3Rpb25zXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHRoaXMuZmlsdGVySW5saW5lQWN0aW9ucyksXG4gICAgICAgIHN3aXRjaE1hcCgoYWN0aW9ucykgPT4gdGhpcy5maWx0ZXJBY3Rpb25zQmFzZWRPblBlcm1pc3Npb25zKGFjdGlvbnMpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmlubGluZUFjdGlvbnMkKVxuXG4gICAgdGhpcy5fYWN0aW9uc1xuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCh0aGlzLmZpbHRlck92ZXJmbG93QWN0aW9ucyksXG4gICAgICAgIHN3aXRjaE1hcCgoYWN0aW9ucykgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvblRyYW5zbGF0aW9uS2V5cyhhY3Rpb25zKS5waXBlKG1hcCgodHJhbnNsYXRpb25zKSA9PiAoeyBhY3Rpb25zLCB0cmFuc2xhdGlvbnMgfSkpKVxuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCh7IGFjdGlvbnMsIHRyYW5zbGF0aW9ucyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyQWN0aW9uc0Jhc2VkT25QZXJtaXNzaW9ucyhhY3Rpb25zKS5waXBlKFxuICAgICAgICAgICAgbWFwKChmaWx0ZXJlZEFjdGlvbnMpID0+ICh7IGZpbHRlcmVkQWN0aW9ucywgdHJhbnNsYXRpb25zIH0pKVxuICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIG1hcCgoeyBmaWx0ZXJlZEFjdGlvbnMsIHRyYW5zbGF0aW9ucyB9KSA9PiB0aGlzLm1hcE92ZXJmbG93QWN0aW9uc1RvTWVudUl0ZW1zKGZpbHRlcmVkQWN0aW9ucywgdHJhbnNsYXRpb25zKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUodGhpcy5vdmVyZmxvd0FjdGlvbnMkKVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hbnVhbEJyZWFkY3J1bWJzKSB7XG4gICAgICB0aGlzLmJyZWFkY3J1bWJzJCA9IHRoaXMuYnJlYWRjcnVtYnMuZ2VuZXJhdGVkSXRlbXNTb3VyY2VcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5icmVhZGNydW1icyQgPSB0aGlzLmJyZWFkY3J1bWJzLml0ZW1zSGFuZGxlclxuICAgIH1cbiAgfVxuXG4gIG9uQWN0aW9uKGFjdGlvbjogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICB0aGlzLnNhdmUuZW1pdCgpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUltYWdlRXJyb3IoKSB7XG4gICAgdGhpcy5maWd1cmVJbWFnZUxvYWRFcnJvciA9IHRydWVcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZUl0ZW1TdHlsZShpdGVtOiBPYmplY3REZXRhaWxJdGVtKTogc3RyaW5nIHtcbiAgICBsZXQgc3R5bGUgPSAnJ1xuICAgIGlmIChpdGVtLmljb24pIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsICdnYXAtMSBhbGlnbi1pdGVtcy1jZW50ZXInKVxuICAgIGlmIChpdGVtLnZhbHVlQ3NzQ2xhc3MpIHN0eWxlID0gc3R5bGUuY29uY2F0KHN0eWxlLCAnICcsIGl0ZW0udmFsdWVDc3NDbGFzcylcbiAgICByZXR1cm4gc3R5bGVcbiAgfVxuXG4gIHB1YmxpYyBnZXRPYmplY3RQYW5lbExheW91dENsYXNzZXMoKSB7XG4gICAgaWYgKHRoaXMuZW5hYmxlR3JpZFZpZXcpIHtcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdFBhbmVsR3JpZExheW91dENsYXNzZXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZW5hYmxlR3JpZFZpZXcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYmplY3RQYW5lbENvbHVtbkxheW91dENsYXNzZXNcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub2JqZWN0UGFuZWxEZWZhdWx0TGF5b3V0Q2xhc3Nlc1xuICB9XG5cbiAgcHVibGljIGdldE9iamVjdEluZm9MYXlvdXRDbGFzc2VzKCkge1xuICAgIGlmICh0aGlzLmVuYWJsZUdyaWRWaWV3KSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5vYmplY3RJbmZvR3JpZExheW91dENsYXNzZXN9IGxnOmNvbC0ke1xuICAgICAgICB0aGlzLmdyaWRMYXlvdXREZXNrdG9wQ29sdW1ucyA/IDEyIC8gdGhpcy5ncmlkTGF5b3V0RGVza3RvcENvbHVtbnMgOiA0XG4gICAgICB9YFxuICAgIH1cbiAgICBpZiAodGhpcy5lbmFibGVHcmlkVmlldyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdEluZm9Db2x1bW5MYXlvdXRDbGFzc2VzXG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9iamVjdEluZm9EZWZhdWx0TGF5b3V0Q2xhc3Nlc1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJbmxpbmVBY3Rpb25zKGFjdGlvbnM6IEFjdGlvbltdKTogQWN0aW9uW10ge1xuICAgIHJldHVybiBhY3Rpb25zXG4gICAgICAuZmlsdGVyKChhKSA9PiBhLnNob3cgPT09ICdhbHdheXMnKVxuICAgICAgLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICBpZiAoYS5jb25kaXRpb25hbCkge1xuICAgICAgICAgIHJldHVybiBhLnNob3dDb25kaXRpb25cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyT3ZlcmZsb3dBY3Rpb25zKGFjdGlvbnM6IEFjdGlvbltdKTogQWN0aW9uW10ge1xuICAgIHJldHVybiBhY3Rpb25zXG4gICAgICAuZmlsdGVyKChhKSA9PiBhLnNob3cgPT09ICdhc092ZXJmbG93JylcbiAgICAgIC5maWx0ZXIoKGEpID0+IHtcbiAgICAgICAgaWYgKGEuY29uZGl0aW9uYWwpIHtcbiAgICAgICAgICByZXR1cm4gYS5zaG93Q29uZGl0aW9uXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGZpbHRlckFjdGlvbnNCYXNlZE9uUGVybWlzc2lvbnMoYWN0aW9uczogQWN0aW9uW10pOiBPYnNlcnZhYmxlPEFjdGlvbltdPiB7XG4gICAgY29uc3QgZ2V0UGVybWlzc2lvbnMgPVxuICAgICAgdGhpcy5oYXNQZXJtaXNzaW9uQ2hlY2tlcj8uZ2V0UGVybWlzc2lvbnM/LmJpbmQodGhpcy5oYXNQZXJtaXNzaW9uQ2hlY2tlcikgfHxcbiAgICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0UGVybWlzc2lvbnMuYmluZCh0aGlzLnVzZXJTZXJ2aWNlKVxuICAgIHJldHVybiBnZXRQZXJtaXNzaW9ucygpLnBpcGUoXG4gICAgICBtYXAoKHBlcm1pc3Npb25zKSA9PiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zLmZpbHRlcigoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGFjdGlvbi5wZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnMuaW5jbHVkZXMoYWN0aW9uLnBlcm1pc3Npb24hKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldEFjdGlvblRyYW5zbGF0aW9uS2V5cyhhY3Rpb25zOiBBY3Rpb25bXSk6IE9ic2VydmFibGU8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5cyA9IFtcbiAgICAgIC4uLmFjdGlvbnMubWFwKChhKSA9PiBhLmxhYmVsS2V5IHx8ICcnKS5maWx0ZXIoKGEpID0+ICEhYSksXG4gICAgICAuLi5hY3Rpb25zLm1hcCgoYSkgPT4gYS50aXRsZUtleSB8fCAnJykuZmlsdGVyKChhKSA9PiAhIWEpLFxuICAgIF1cbiAgICByZXR1cm4gdHJhbnNsYXRpb25LZXlzLmxlbmd0aCA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQodHJhbnNsYXRpb25LZXlzKSA6IG9mKHt9KVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBPdmVyZmxvd0FjdGlvbnNUb01lbnVJdGVtcyhhY3Rpb25zOiBBY3Rpb25bXSwgdHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogTWVudUl0ZW1bXSB7XG4gICAgcmV0dXJuIGFjdGlvbnMubWFwPE1lbnVJdGVtPigoYSkgPT4gKHtcbiAgICAgIGlkOiBhLmlkLFxuICAgICAgbGFiZWw6IGEubGFiZWxLZXkgPyB0cmFuc2xhdGlvbnNbYS5sYWJlbEtleV0gOiBhLmxhYmVsLFxuICAgICAgaWNvbjogYS5pY29uLFxuICAgICAgdG9vbHRpcE9wdGlvbnM6IHtcbiAgICAgICAgdG9vbHRpcExhYmVsOiBhLnRpdGxlS2V5ID8gdHJhbnNsYXRpb25zW2EudGl0bGVLZXldIDogYS50aXRsZSxcbiAgICAgICAgdG9vbHRpcEV2ZW50OiAnaG92ZXInLFxuICAgICAgICB0b29sdGlwUG9zaXRpb246ICd0b3AnLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IGEuYWN0aW9uQ2FsbGJhY2ssXG4gICAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gZXh0cmFjdCB0cmFuc2xhdGlvbiBrZXkgYW5kIHBhcmFtZXRlcnMgZnJvbSBhIHN0cmluZyBvciBvYmplY3QuXG4gICAqIEBwYXJhbSBpbnB1dCAtIENhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3Qgd2l0aCAna2V5JyBhbmQgJ3BhcmFtZXRlcnMnLlxuICAgKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB7IGtleSwgcGFyYW1zIH0gZm9yIHVzZSBpbiB0cmFuc2xhdGlvbiBwaXBlcyBvciBzZXJ2aWNlcy4gVGhlIHJldHVybmVkIGtleSBpcyBhbHdheXMgYSBzdHJpbmcgKG5ldmVyIHVuZGVmaW5lZCkuXG4gICAqXG4gICAqIEV4YW1wbGUgdXNhZ2UgaW4gdGVtcGxhdGU6XG4gICAqICAgbGV0IHJlc3VsdCA9IGV4dHJhY3RLZXlBbmRQYXJhbXMoaXRlbS5sYWJlbFRvb2x0aXBLZXkpO1xuICAgKiAgIHJlc3VsdC5rZXkgfCB0cmFuc2xhdGUgOiByZXN1bHQucGFyYW1zXG4gICAqXG4gICAqIC5rZXkgd2lsbCBhbHdheXMgYmUgYSBzdHJpbmcsIHNvIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgYD8/ICcnYCBpbiB0aGUgdGVtcGxhdGUuXG4gICAqL1xuICBwdWJsaWMgZXh0cmFjdEtleUFuZFBhcmFtcyhpbnB1dDogYW55KTogeyBrZXk6IHN0cmluZywgcGFyYW1zOiBhbnkgfSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB7IGtleTogaW5wdXQsIHBhcmFtczogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4geyBrZXk6IGlucHV0LmtleSA/PyAnJywgcGFyYW1zOiBpbnB1dC5wYXJhbWV0ZXJzIH07XG4gICAgfVxuICAgIHJldHVybiB7IGtleTogJycsIHBhcmFtczogdW5kZWZpbmVkIH07XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJvbmVjeC1wYWdlLWhlYWRlciBtYi00XCIgbmFtZT1cIm9jeC1wYWdlLWhlYWRlci13cmFwcGVyXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93QnJlYWRjcnVtYnNcIj5cbiAgICA8cC1icmVhZGNydW1iXG4gICAgICAqbmdJZj1cImJyZWFkY3J1bWJzJCB8IGFzeW5jIGFzIGl0ZW1zXCJcbiAgICAgIFttb2RlbF09XCJpdGVtc1wiXG4gICAgICBbaG9tZV09XCIoaG9tZSQgfCBhc3luYyk/Lm1lbnVJdGVtID8/IHt9XCJcbiAgICAgIFtob21lQXJpYUxhYmVsXT1cIihob21lJCB8IGFzeW5jKT8ucGFnZSA/ICgnT0NYX1BBR0VfSEVBREVSLkhPTUVfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGU6IHsgcGFnZTogKGhvbWUkIHwgYXN5bmMpPy5wYWdlfSkgOiAoJ09DWF9QQUdFX0hFQURFUi5IT01FX0RFRkFVTFRfQVJJQV9MQUJFTCcgfCB0cmFuc2xhdGUpXCJcbiAgICAgIFthdHRyLm1hbnVhbF09XCJtYW51YWxCcmVhZGNydW1ic1wiXG4gICAgPlxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInNlcGFyYXRvclwiPiA8c3BhbiBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+IDwvbmctdGVtcGxhdGVcbiAgICA+PC9wLWJyZWFkY3J1bWI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJwLTMgdGl0bGUtYmFyIGZsZXggZmxleC1yb3cgZmxleC13cmFwIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibXItMiBmaWd1cmUgcmVsYXRpdmUgZmxleCBoLTJyZW0gdy0ycmVtIG1kOmgtM3JlbSBtZDp3LTNyZW1cIiAqbmdJZj1cInNob3dGaWd1cmVcIj5cbiAgICAgICAgPGRpdiAjcHJldmlld0ltYWdlIGNsYXNzPVwiZmlndXJlLWltYWdlIGFic29sdXRlIHRvcC0wIGxlZnQtMCByaWdodC0wIGJvdHRvbS0wXCI+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ZpZ3VyZUltYWdlXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAqbmdJZj1cImZpZ3VyZUltYWdlICYmICFmaWd1cmVJbWFnZUxvYWRFcnJvclwiXG4gICAgICAgICAgICBbb2N4U3JjXT1cImZpZ3VyZUltYWdlXCJcbiAgICAgICAgICAgIFthbHRdPVwiJ09DWF9QQUdFX0hFQURFUi5JTUFHRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLXJvdW5kLXNtXCJcbiAgICAgICAgICAgIChlcnJvcik9XCJoYW5kbGVJbWFnZUVycm9yKClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJjb2xvcmJsb2IgZmxleC0xIGJvcmRlci1yb3VuZFwiXG4gICAgICAgICAgKm5nSWY9XCJwcmV2aWV3SW1hZ2UuY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGZpZ3VyZUltYWdlTG9hZEVycm9yXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uQmFyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGp1c3RpZnktY29udGVudC1ldmVubHlcIj5cbiAgICAgICAgICA8cC1za2VsZXRvbiB3aWR0aD1cIjEwcmVtXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMTByZW1cIj48L3Atc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiaGVhZGVyXCIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBza2VsZXRvbkJhclwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1BhZ2UgSGVhZGVyJ1wiPlxuICAgICAgICA8aDEgaWQ9XCJwYWdlLWhlYWRlclwiICpuZ0lmPVwiISFoZWFkZXJcIj57eyBoZWFkZXIgfX08L2gxPlxuICAgICAgICA8ZGl2IGlkPVwicGFnZS1zdWJoZWFkZXJcIiAqbmdJZj1cIiEhc3ViaGVhZGVyXCIgcm9sZT1cIm5vdGVcIj57eyBzdWJoZWFkZXIgfX08L2Rpdj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24taXRlbXMtd3JhcCBtdC0yIG1kOm10LTBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhZGRpdGlvbmFsVG9vbGJhckNvbnRlbnRMZWZ0XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50TGVmdFwiPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzYWJsZURlZmF1bHRBY3Rpb25zXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNza2VsZXRvbkFjdGlvbnM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgPHAtc2tlbGV0b24gd2lkdGg9XCI1cmVtXCIgaGVpZ2h0PVwiMnJlbVwiIHN0eWxlQ2xhc3M9XCJtci0yXCI+PC9wLXNrZWxldG9uPlxuICAgICAgICAgIDxwLXNrZWxldG9uIHdpZHRoPVwiMnJlbVwiIGhlaWdodD1cIjJyZW1cIiBzdHlsZUNsYXNzPVwibWItMlwiPjwvcC1za2VsZXRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIHNrZWxldG9uQWN0aW9uc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5saW5lQWN0aW9ucyQgfCBhc3luYyBhcyBpbmxpbmVBY3Rpb25zXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImlubGluZUFjdGlvbnMgJiYgaW5saW5lQWN0aW9ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJ0b29sYmFyIGZsZXggZmxleC13cmFwIGdhcC0xIHNtOmdhcC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaW5saW5lQWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJhY3Rpb24uZGlzYWJsZWQgPyAoYWN0aW9uLmRpc2FibGVkVG9vbHRpcEtleSA/IChhY3Rpb24uZGlzYWJsZWRUb29sdGlwS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi5kaXNhYmxlZFRvb2x0aXApIDogKGFjdGlvbi50aXRsZUtleSA/IChhY3Rpb24udGl0bGVLZXkgfCB0cmFuc2xhdGUpIDogYWN0aW9uLnRpdGxlKVwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICB0b29sdGlwRXZlbnQ9XCJob3ZlclwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwie3sgYWN0aW9uLmlkIH19XCJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cImFjdGlvbi5pY29uID8/ICcnXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uUG9zXT1cImFjdGlvbi5pY29uUG9zID8/ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiYWN0aW9uLmFjdGlvbkNhbGxiYWNrKClcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCA/IGFjdGlvbi5kaXNhYmxlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiYWN0aW9uLmljb24gPyAnb2N4LXBhZ2UtaGVhZGVyLWlubGluZS1hY3Rpb24taWNvbi1idXR0b24nIDogJ29jeC1wYWdlLWhlYWRlci1pbmxpbmUtYWN0aW9uLWJ1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCIgKGFjdGlvbi5hcmlhTGFiZWxLZXkgPyAoYWN0aW9uLmFyaWFMYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24uYXJpYUxhYmVsKSB8fCAoYWN0aW9uLnRpdGxlS2V5ID8gKGFjdGlvbi50aXRsZUtleSB8IHRyYW5zbGF0ZSkgOiBhY3Rpb24udGl0bGUpIHx8IChhY3Rpb24ubGFiZWxLZXkgPyAoYWN0aW9uLmxhYmVsS2V5IHwgdHJhbnNsYXRlKSA6IGFjdGlvbi5sYWJlbClcIlxuICAgICAgICAgICAgICAgID48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt0b29sYmFySXRlbXNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvdmVyZmxvd0FjdGlvbnMkIHwgYXN5bmMgYXMgb3ZlcmZsb3dBY3Rpb25zXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3ZlcmZsb3dBY3Rpb25zLmxlbmd0aCAhPT0gMFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgaWQ9XCJwYWdlSGVhZGVyTWVudUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1vcmUtYWN0aW9ucy1tZW51LWJ1dHRvbiBhY3Rpb24tYnV0dG9uIG1sLTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwib2N4LXBhZ2UtaGVhZGVyLW92ZXJmbG93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ09DWF9QQUdFX0hFQURFUi5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ09DWF9QQUdFX0hFQURFUi5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0b29sdGlwRXZlbnQ9XCJob3ZlclwiXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8cC1tZW51ICNtZW51IFtwb3B1cF09XCJ0cnVlXCIgW21vZGVsXT1cIm92ZXJmbG93QWN0aW9uc1wiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50XCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWRkaXRpb25hbFRvb2xiYXJDb250ZW50XCI+IDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwib2JqZWN0LXBhbmVsXCIgW25nQ2xhc3NdPVwiZ2V0T2JqZWN0UGFuZWxMYXlvdXRDbGFzc2VzKClcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwib2JqZWN0RGV0YWlsc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm9iamVjdC1pbmZvXCIgW25nQ2xhc3NdPVwiZ2V0T2JqZWN0SW5mb0xheW91dENsYXNzZXMoKVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9iamVjdERldGFpbHNcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImZsZXggZm9udC1tZWRpdW0gdGV4dC02MDAgb2JqZWN0LWluZm8tZ3JpZC1sYWJlbFwiXG4gICAgICAgICAgbmFtZT1cIm9iamVjdC1kZXRhaWwtbGFiZWxcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCJpdGVtLmxhYmVsVG9vbHRpcEtleSA/ICgoZXh0cmFjdEtleUFuZFBhcmFtcyhpdGVtLmxhYmVsVG9vbHRpcEtleSkua2V5ID8/ICcnKSB8IHRyYW5zbGF0ZSA6IGV4dHJhY3RLZXlBbmRQYXJhbXMoaXRlbS5sYWJlbFRvb2x0aXBLZXkpLnBhcmFtcykgOiAoaXRlbS5sYWJlbFRvb2x0aXAgPz8gJycpXCJcbiAgICAgICAgICB0b29sdGlwRXZlbnQ9XCJob3ZlclwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgPnt7IGl0ZW0ubGFiZWwgfCBkeW5hbWljUGlwZTppdGVtLmxhYmVsUGlwZSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLmljb24gfHwgaXRlbS52YWx1ZVwiIGNsYXNzPVwib2JqZWN0LWluZm8tZ3JpZC12YWx1ZVwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggdGV4dC05MDAgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIHctbWF4XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdlbmVyYXRlSXRlbVN0eWxlKGl0ZW0pXCJcbiAgICAgICAgICAgIG5hbWU9XCJvYmplY3QtZGV0YWlsLXZhbHVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIml0ZW0udmFsdWVUb29sdGlwS2V5ID8gKChleHRyYWN0S2V5QW5kUGFyYW1zKGl0ZW0udmFsdWVUb29sdGlwS2V5KS5rZXkgPz8gJycpIHwgdHJhbnNsYXRlIDogZXh0cmFjdEtleUFuZFBhcmFtcyhpdGVtLnZhbHVlVG9vbHRpcEtleSkucGFyYW1zKSA6IChpdGVtLnZhbHVlVG9vbHRpcCB8fCBpdGVtLnRvb2x0aXAgfHwgJycpXCJcbiAgICAgICAgICAgICAgdG9vbHRpcEV2ZW50PVwiaG92ZXJcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz0ne3tpdGVtLmljb24gKyBcIiBcIiArIChpdGVtLmljb25TdHlsZUNsYXNzIHx8IFwiXCIpfX0nXG4gICAgICAgICAgICAgICAgbmFtZT1cIm9iamVjdC1kZXRhaWwtaWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIHt7IGl0ZW0udmFsdWUgfCBkeW5hbWljUGlwZTppdGVtLnZhbHVlUGlwZTppdGVtLnZhbHVlUGlwZUFyZ3N9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5hY3Rpb25JdGVtSWNvbiAmJiBpdGVtLmFjdGlvbkl0ZW1DYWxsYmFja1wiXG4gICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uYWN0aW9uSXRlbUljb25cIlxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tdGV4dCBwLTAgdy1mdWxsXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIml0ZW0uYWN0aW9uSXRlbVRvb2x0aXBLZXkgPyAoKGV4dHJhY3RLZXlBbmRQYXJhbXMoaXRlbS5hY3Rpb25JdGVtVG9vbHRpcEtleSkua2V5ID8/ICcnKSB8IHRyYW5zbGF0ZSA6IGV4dHJhY3RLZXlBbmRQYXJhbXMoaXRlbS5hY3Rpb25JdGVtVG9vbHRpcEtleSkucGFyYW1zKSA6IChpdGVtLmFjdGlvbkl0ZW1Ub29sdGlwIHx8ICcnKVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgIHRvb2x0aXBFdmVudD1cImhvdmVyXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJpdGVtLmFjdGlvbkl0ZW1BcmlhTGFiZWxLZXkgPyAoKGV4dHJhY3RLZXlBbmRQYXJhbXMoaXRlbS5hY3Rpb25JdGVtQXJpYUxhYmVsS2V5KS5rZXkgPz8gJycpIHwgdHJhbnNsYXRlIDogZXh0cmFjdEtleUFuZFBhcmFtcyhpdGVtLmFjdGlvbkl0ZW1BcmlhTGFiZWxLZXkpLnBhcmFtcykgOiAoaXRlbS5hY3Rpb25JdGVtQXJpYUxhYmVsID8/IChpdGVtLmFjdGlvbkl0ZW1Ub29sdGlwS2V5ID8gKChleHRyYWN0S2V5QW5kUGFyYW1zKGl0ZW0uYWN0aW9uSXRlbVRvb2x0aXBLZXkpLmtleSA/PyAnJykgfCB0cmFuc2xhdGUgOiBleHRyYWN0S2V5QW5kUGFyYW1zKGl0ZW0uYWN0aW9uSXRlbVRvb2x0aXBLZXkpLnBhcmFtcykgOiAoaXRlbS5hY3Rpb25JdGVtVG9vbHRpcCA/PyBpdGVtPy5sYWJlbCA/PyAoJ1Rvb2x0aXAgZm9yICcgKyBpdGVtLmFjdGlvbkl0ZW1JY29uKSkpKVwiXG4gICAgICAgICAgICAgIChvbkNsaWNrKT1cIml0ZW0uYWN0aW9uSXRlbUNhbGxiYWNrKClcIlxuICAgICAgICAgICAgPjwvcC1idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=