@onecx/angular-accelerator 4.43.1 → 5.0.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.
- package/{esm2020 → esm2022}/lib/angular-accelerator-primeng.module.mjs +53 -53
- package/esm2022/lib/angular-accelerator.module.mjs +168 -0
- package/esm2022/lib/components/column-group-selection/column-group-selection.component.mjs +72 -0
- package/esm2022/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +109 -0
- package/esm2022/lib/components/data-layout-selection/data-layout-selection.component.mjs +46 -0
- package/esm2022/lib/components/data-list-grid/data-list-grid.component.mjs +399 -0
- package/esm2022/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +92 -0
- package/esm2022/lib/components/data-sort-base/data-sort-base.mjs +110 -0
- package/esm2022/lib/components/data-table/data-table.component.mjs +401 -0
- package/esm2022/lib/components/data-view/data-view.component.mjs +407 -0
- package/esm2022/lib/components/diagram/diagram.component.mjs +137 -0
- package/esm2022/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +109 -0
- package/esm2022/lib/components/interactive-data-view/interactive-data-view.component.mjs +375 -0
- package/esm2022/lib/components/page-header/page-header.component.mjs +232 -0
- package/{esm2020 → esm2022}/lib/components/search-config/search-config.component.mjs +4 -4
- package/esm2022/lib/components/search-header/search-header.component.mjs +136 -0
- package/esm2022/lib/directives/advanced.directive.mjs +36 -0
- package/esm2022/lib/directives/if-breakpoint.directive.mjs +39 -0
- package/esm2022/lib/directives/if-permission.directive.mjs +80 -0
- package/esm2022/lib/directives/src.directive.mjs +59 -0
- package/esm2022/lib/functions/flatten-object.mjs +20 -0
- package/{esm2020 → esm2022}/lib/model/breadcrumb-menu-item.model.mjs +1 -1
- package/esm2022/lib/pipes/dynamic.pipe.mjs +58 -0
- package/esm2022/lib/pipes/ocxtimeago.pipe.mjs +107 -0
- package/esm2022/lib/services/app-config-service.mjs +43 -0
- package/esm2022/lib/services/breadcrumb.service.mjs +113 -0
- package/esm2022/lib/services/translation-cache.service.mjs +41 -0
- package/esm2022/lib/utils/async-translate-loader.utils.mjs +12 -0
- package/esm2022/lib/utils/caching-translate-loader.utils.mjs +15 -0
- package/{esm2020 → esm2022}/lib/utils/colorutils.mjs +1 -1
- package/{esm2020 → esm2022}/lib/utils/dateutils.mjs +6 -6
- package/esm2022/lib/utils/objectutils.mjs +30 -0
- package/{esm2020 → esm2022}/lib/utils/translate.combined.loader.mjs +1 -1
- package/{esm2020 → esm2022}/testing/column-group-selection.harness.mjs +2 -2
- package/esm2022/testing/custom-group-column-selector.harness.mjs +31 -0
- package/esm2022/testing/data-layout-selection.harness.mjs +33 -0
- package/esm2022/testing/data-list-grid.harness.mjs +47 -0
- package/esm2022/testing/data-table.harness.mjs +63 -0
- package/{esm2020 → esm2022}/testing/data-view.harness.mjs +2 -2
- package/esm2022/testing/default-grid-item.harness.mjs +24 -0
- package/esm2022/testing/default-list-item.harness.mjs +24 -0
- package/esm2022/testing/diagram.harness.mjs +22 -0
- package/{esm2020 → esm2022}/testing/group-by-count-diagram.harness.mjs +2 -2
- package/{esm2020 → esm2022}/testing/interactive-data-view.harness.mjs +2 -2
- package/esm2022/testing/more-actions-menu-button.harness.mjs +35 -0
- package/esm2022/testing/page-header.harness.mjs +78 -0
- package/{esm2020 → esm2022}/testing/search-config.harness.mjs +2 -2
- package/{esm2020 → esm2022}/testing/search-header.harness.mjs +2 -2
- package/{fesm2020 → fesm2022}/onecx-angular-accelerator-testing.mjs +34 -28
- package/fesm2022/onecx-angular-accelerator-testing.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/onecx-angular-accelerator.mjs +220 -220
- package/fesm2022/onecx-angular-accelerator.mjs.map +1 -0
- package/lib/components/column-group-selection/column-group-selection.component.d.ts +1 -1
- package/lib/components/custom-group-column-selector/custom-group-column-selector.component.d.ts +1 -1
- package/lib/components/data-layout-selection/data-layout-selection.component.d.ts +1 -1
- package/lib/components/data-list-grid/data-list-grid.component.d.ts +1 -1
- package/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.d.ts +1 -1
- package/lib/components/data-table/data-table.component.d.ts +1 -1
- package/lib/components/data-view/data-view.component.d.ts +1 -1
- package/lib/components/diagram/diagram.component.d.ts +2 -2
- package/lib/components/group-by-count-diagram/group-by-count-diagram.component.d.ts +1 -1
- package/lib/components/interactive-data-view/interactive-data-view.component.d.ts +1 -1
- package/lib/components/page-header/page-header.component.d.ts +1 -1
- package/lib/components/search-config/search-config.component.d.ts +1 -1
- package/lib/components/search-header/search-header.component.d.ts +1 -1
- package/lib/directives/if-breakpoint.directive.d.ts +1 -1
- package/lib/directives/if-permission.directive.d.ts +1 -1
- package/lib/directives/src.directive.d.ts +1 -1
- package/lib/model/breadcrumb-menu-item.model.d.ts +2 -2
- package/package.json +20 -28
- package/testing/data-list-grid.harness.d.ts +1 -1
- package/esm2020/lib/angular-accelerator.module.mjs +0 -168
- package/esm2020/lib/components/column-group-selection/column-group-selection.component.mjs +0 -72
- package/esm2020/lib/components/custom-group-column-selector/custom-group-column-selector.component.mjs +0 -109
- package/esm2020/lib/components/data-layout-selection/data-layout-selection.component.mjs +0 -45
- package/esm2020/lib/components/data-list-grid/data-list-grid.component.mjs +0 -399
- package/esm2020/lib/components/data-list-grid-sorting/data-list-grid-sorting.component.mjs +0 -92
- package/esm2020/lib/components/data-sort-base/data-sort-base.mjs +0 -110
- package/esm2020/lib/components/data-table/data-table.component.mjs +0 -401
- package/esm2020/lib/components/data-view/data-view.component.mjs +0 -407
- package/esm2020/lib/components/diagram/diagram.component.mjs +0 -137
- package/esm2020/lib/components/group-by-count-diagram/group-by-count-diagram.component.mjs +0 -109
- package/esm2020/lib/components/interactive-data-view/interactive-data-view.component.mjs +0 -375
- package/esm2020/lib/components/page-header/page-header.component.mjs +0 -232
- package/esm2020/lib/components/search-header/search-header.component.mjs +0 -136
- package/esm2020/lib/directives/advanced.directive.mjs +0 -36
- package/esm2020/lib/directives/if-breakpoint.directive.mjs +0 -39
- package/esm2020/lib/directives/if-permission.directive.mjs +0 -80
- package/esm2020/lib/directives/src.directive.mjs +0 -59
- package/esm2020/lib/functions/flatten-object.mjs +0 -20
- package/esm2020/lib/pipes/dynamic.pipe.mjs +0 -58
- package/esm2020/lib/pipes/ocxtimeago.pipe.mjs +0 -107
- package/esm2020/lib/services/app-config-service.mjs +0 -43
- package/esm2020/lib/services/breadcrumb.service.mjs +0 -113
- package/esm2020/lib/services/translation-cache.service.mjs +0 -41
- package/esm2020/lib/utils/async-translate-loader.utils.mjs +0 -12
- package/esm2020/lib/utils/caching-translate-loader.utils.mjs +0 -15
- package/esm2020/lib/utils/objectutils.mjs +0 -30
- package/esm2020/testing/custom-group-column-selector.harness.mjs +0 -31
- package/esm2020/testing/data-layout-selection.harness.mjs +0 -33
- package/esm2020/testing/data-list-grid.harness.mjs +0 -47
- package/esm2020/testing/data-table.harness.mjs +0 -57
- package/esm2020/testing/default-grid-item.harness.mjs +0 -24
- package/esm2020/testing/default-list-item.harness.mjs +0 -24
- package/esm2020/testing/diagram.harness.mjs +0 -22
- package/esm2020/testing/more-actions-menu-button.harness.mjs +0 -35
- package/esm2020/testing/page-header.harness.mjs +0 -78
- package/fesm2015/onecx-angular-accelerator-testing.mjs +0 -541
- package/fesm2015/onecx-angular-accelerator-testing.mjs.map +0 -1
- package/fesm2015/onecx-angular-accelerator.mjs +0 -3583
- package/fesm2015/onecx-angular-accelerator.mjs.map +0 -1
- package/fesm2020/onecx-angular-accelerator-testing.mjs.map +0 -1
- package/fesm2020/onecx-angular-accelerator.mjs.map +0 -1
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/column-type.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/data-action.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/data-column-name-id.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/data-sort-direction.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/data-table-column.model.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/diagram-column.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/diagram-data.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/diagram-type.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/model/search-config-info.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/create-remote-component-translate-loader.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/create-translate-loader.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/enum-to-dropdown-options.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/primeicon.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/onecx-angular-accelerator.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/onecx-angular-accelerator-testing.mjs +0 -0
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
import { Component, ContentChild, EventEmitter, Inject, Injector, Input, LOCALE_ID, Output, } from '@angular/core';
|
|
2
|
-
import { Router } from '@angular/router';
|
|
3
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
-
import { PrimeIcons } from 'primeng/api';
|
|
5
|
-
import { BehaviorSubject, combineLatest, map, mergeMap } from 'rxjs';
|
|
6
|
-
import { AppStateService } from '@onecx/angular-integration-interface';
|
|
7
|
-
import { UserService } from '@onecx/angular-integration-interface';
|
|
8
|
-
import { ObjectUtils } from '../../utils/objectutils';
|
|
9
|
-
import { DataSortBase } from '../data-sort-base/data-sort-base';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@ngx-translate/core";
|
|
12
|
-
import * as i2 from "@onecx/angular-integration-interface";
|
|
13
|
-
import * as i3 from "@angular/router";
|
|
14
|
-
import * as i4 from "@angular/common";
|
|
15
|
-
import * as i5 from "primeng/api";
|
|
16
|
-
import * as i6 from "primeng/button";
|
|
17
|
-
import * as i7 from "primeng/dataview";
|
|
18
|
-
import * as i8 from "primeng/menu";
|
|
19
|
-
import * as i9 from "../../directives/if-permission.directive";
|
|
20
|
-
export class DataListGridComponent extends DataSortBase {
|
|
21
|
-
get pageSizes() {
|
|
22
|
-
return this._pageSizes$.getValue();
|
|
23
|
-
}
|
|
24
|
-
set pageSizes(value) {
|
|
25
|
-
this._pageSizes$.next(value);
|
|
26
|
-
}
|
|
27
|
-
get pageSize() {
|
|
28
|
-
return this._pageSize$.getValue();
|
|
29
|
-
}
|
|
30
|
-
set pageSize(value) {
|
|
31
|
-
this._pageSize$.next(value);
|
|
32
|
-
}
|
|
33
|
-
get totalRecordsOnServer() {
|
|
34
|
-
return this.params['totalRecordsOnServer'] ? Number(this.params['totalRecordsOnServer']) : undefined;
|
|
35
|
-
}
|
|
36
|
-
set totalRecordsOnServer(value) {
|
|
37
|
-
this.params['totalRecordsOnServer'] = value?.toString() ?? '0';
|
|
38
|
-
}
|
|
39
|
-
get data() {
|
|
40
|
-
return this._data$.getValue();
|
|
41
|
-
}
|
|
42
|
-
set data(value) {
|
|
43
|
-
this._originalData = [...value];
|
|
44
|
-
this._data$.next([...value]);
|
|
45
|
-
}
|
|
46
|
-
get filters() {
|
|
47
|
-
return this._filters$.getValue();
|
|
48
|
-
}
|
|
49
|
-
set filters(value) {
|
|
50
|
-
this._filters$.next(value);
|
|
51
|
-
}
|
|
52
|
-
get sortDirection() {
|
|
53
|
-
return this._sortDirection$.getValue();
|
|
54
|
-
}
|
|
55
|
-
set sortDirection(value) {
|
|
56
|
-
if (value === "NONE" /* DataSortDirection.NONE */) {
|
|
57
|
-
this._data$.next([...this._originalData]);
|
|
58
|
-
}
|
|
59
|
-
this._sortDirection$.next(value);
|
|
60
|
-
}
|
|
61
|
-
get sortField() {
|
|
62
|
-
return this?._sortField$.getValue();
|
|
63
|
-
}
|
|
64
|
-
set sortField(value) {
|
|
65
|
-
this._sortField$.next(value);
|
|
66
|
-
}
|
|
67
|
-
get _gridItemSubtitleLines() {
|
|
68
|
-
return this.gridItemSubtitleLinesTemplate || this.gridItemSubtitleLinesChildTemplate;
|
|
69
|
-
}
|
|
70
|
-
get _listItemSubtitleLines() {
|
|
71
|
-
return this.listItemSubtitleLinesTemplate || this.listItemSubtitleLinesChildTemplate;
|
|
72
|
-
}
|
|
73
|
-
get _listItem() {
|
|
74
|
-
return this.listItemTemplate || this.listItemChildTemplate;
|
|
75
|
-
}
|
|
76
|
-
get _gridItem() {
|
|
77
|
-
return this.gridItemTemplate || this.gridItemChildTemplate;
|
|
78
|
-
}
|
|
79
|
-
get additionalActions() {
|
|
80
|
-
return this._additionalActions;
|
|
81
|
-
}
|
|
82
|
-
set additionalActions(value) {
|
|
83
|
-
this._additionalActions = value;
|
|
84
|
-
this.updateGridMenuItems();
|
|
85
|
-
this.additionalListActions = value.filter((action) => !action.showAsOverflow);
|
|
86
|
-
this.additionalListOverflowActions = value.filter((action) => action.showAsOverflow);
|
|
87
|
-
}
|
|
88
|
-
get viewItemObserved() {
|
|
89
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
90
|
-
return dv?.viewItemObserved || dv?.viewItem.observed || this.viewItem.observed;
|
|
91
|
-
}
|
|
92
|
-
get editItemObserved() {
|
|
93
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
94
|
-
return dv?.editItemObserved || dv?.editItem.observed || this.editItem.observed;
|
|
95
|
-
}
|
|
96
|
-
get deleteItemObserved() {
|
|
97
|
-
const dv = this.injector.get('DataViewComponent', null);
|
|
98
|
-
return dv?.deleteItemObserved || dv?.deleteItem.observed || this.deleteItem.observed;
|
|
99
|
-
}
|
|
100
|
-
get sortDirectionNumber() {
|
|
101
|
-
if (this.sortDirection === "ASCENDING" /* DataSortDirection.ASCENDING */)
|
|
102
|
-
return 1;
|
|
103
|
-
if (this.sortDirection === "DESCENDING" /* DataSortDirection.DESCENDING */)
|
|
104
|
-
return -1;
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
constructor(locale, translateService, userService, router, injector, appStateService) {
|
|
108
|
-
super(locale, translateService);
|
|
109
|
-
this.userService = userService;
|
|
110
|
-
this.router = router;
|
|
111
|
-
this.injector = injector;
|
|
112
|
-
this.appStateService = appStateService;
|
|
113
|
-
this.subtitleLineIds = [];
|
|
114
|
-
this.clientSideSorting = true;
|
|
115
|
-
this.clientSideFiltering = true;
|
|
116
|
-
this.sortStates = [];
|
|
117
|
-
this._pageSizes$ = new BehaviorSubject([10, 25, 50]);
|
|
118
|
-
this._pageSize$ = new BehaviorSubject(undefined);
|
|
119
|
-
this.fallbackImage = 'placeholder.png';
|
|
120
|
-
this.layout = 'grid';
|
|
121
|
-
this.paginator = true;
|
|
122
|
-
this.page = 0;
|
|
123
|
-
this.columns = [];
|
|
124
|
-
this.name = '';
|
|
125
|
-
this.currentPageShowingKey = 'OCX_DATA_TABLE.SHOWING';
|
|
126
|
-
this.currentPageShowingWithTotalOnServerKey = 'OCX_DATA_TABLE.SHOWING_WITH_TOTAL_ON_SERVER';
|
|
127
|
-
this.params = {
|
|
128
|
-
currentPage: '{currentPage}',
|
|
129
|
-
totalPages: '{totalPages}',
|
|
130
|
-
rows: '{rows}',
|
|
131
|
-
first: '{first}',
|
|
132
|
-
last: '{last}',
|
|
133
|
-
totalRecords: '{totalRecords}',
|
|
134
|
-
};
|
|
135
|
-
this._data$ = new BehaviorSubject([]);
|
|
136
|
-
this._filters$ = new BehaviorSubject([]);
|
|
137
|
-
this._originalData = [];
|
|
138
|
-
this._sortDirection$ = new BehaviorSubject("NONE" /* DataSortDirection.NONE */);
|
|
139
|
-
this._sortField$ = new BehaviorSubject('');
|
|
140
|
-
this.additionalListActions = [];
|
|
141
|
-
this.additionalListOverflowActions = [];
|
|
142
|
-
this._additionalActions = [];
|
|
143
|
-
this.viewItem = new EventEmitter();
|
|
144
|
-
this.editItem = new EventEmitter();
|
|
145
|
-
this.deleteItem = new EventEmitter();
|
|
146
|
-
this.pageChanged = new EventEmitter();
|
|
147
|
-
this.showMenu = false;
|
|
148
|
-
this.gridMenuItems = [];
|
|
149
|
-
this.observedOutputs = 0;
|
|
150
|
-
this.name = this.name || this.router.url.replace(/[^A-Za-z0-9]/, '_');
|
|
151
|
-
this.fallbackImagePath$ = this.appStateService.currentMfe$.pipe(map((currentMfe) => this.getFallbackImagePath(currentMfe)));
|
|
152
|
-
this.displayedPageSizes$ = combineLatest([this._pageSizes$, this.translateService.get('OCX_DATA_TABLE.ALL')]).pipe(map(([pageSizes, translation]) => pageSizes.concat({ showAll: translation })));
|
|
153
|
-
this.displayedPageSize$ = combineLatest([this._pageSize$, this._pageSizes$]).pipe(map(([pageSize, pageSizes]) => pageSize ?? pageSizes.find((val) => typeof val === 'number') ?? 50));
|
|
154
|
-
}
|
|
155
|
-
ngDoCheck() {
|
|
156
|
-
const observedOutputs = this.viewItem.observed + this.deleteItem.observed + this.editItem.observed;
|
|
157
|
-
if (this.observedOutputs !== observedOutputs) {
|
|
158
|
-
this.updateGridMenuItems();
|
|
159
|
-
this.observedOutputs = observedOutputs;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
ngOnInit() {
|
|
163
|
-
this.displayedItems$ = combineLatest([this._data$, this._filters$, this._sortField$, this._sortDirection$]).pipe(mergeMap((params) => this.translateItems(params, this.columns, this.clientSideFiltering, this.clientSideSorting)), map((params) => this.filterItems(params, this.clientSideFiltering)), map((params) => this.sortItems(params, this.columns, this.clientSideSorting)), map(([items]) => items));
|
|
164
|
-
this.showMenu =
|
|
165
|
-
(!!this.viewPermission && this.userService.hasPermission(this.viewPermission)) ||
|
|
166
|
-
(!!this.editPermission && this.userService.hasPermission(this.editPermission)) ||
|
|
167
|
-
(!!this.deletePermission && this.userService.hasPermission(this.deletePermission));
|
|
168
|
-
}
|
|
169
|
-
onDeleteRow(element) {
|
|
170
|
-
this.deleteItem.emit(element);
|
|
171
|
-
}
|
|
172
|
-
onViewRow(element) {
|
|
173
|
-
if (!!this.viewPermission && this.userService.hasPermission(this.viewPermission)) {
|
|
174
|
-
this.viewItem.emit(element);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
onEditRow(element) {
|
|
178
|
-
this.editItem.emit(element);
|
|
179
|
-
}
|
|
180
|
-
imgError(item) {
|
|
181
|
-
item.imagePath = '';
|
|
182
|
-
}
|
|
183
|
-
getFallbackImagePath(mfeInfo) {
|
|
184
|
-
return mfeInfo?.remoteBaseUrl
|
|
185
|
-
? `${mfeInfo.remoteBaseUrl}/onecx-portal-lib/assets/images/${this.fallbackImage}`
|
|
186
|
-
: `./onecx-portal-lib/assets/images/${this.fallbackImage}`;
|
|
187
|
-
}
|
|
188
|
-
updateGridMenuItems(useSelectedItem = false) {
|
|
189
|
-
let deleteDisabled = false;
|
|
190
|
-
let editDisabled = false;
|
|
191
|
-
let viewDisabled = false;
|
|
192
|
-
let deleteVisible = true;
|
|
193
|
-
let editVisible = true;
|
|
194
|
-
let viewVisible = true;
|
|
195
|
-
if (useSelectedItem && this.selectedItem) {
|
|
196
|
-
viewDisabled =
|
|
197
|
-
!!this.viewActionEnabledField && !this.fieldIsTruthy(this.selectedItem, this.viewActionEnabledField);
|
|
198
|
-
editDisabled =
|
|
199
|
-
!!this.editActionEnabledField && !this.fieldIsTruthy(this.selectedItem, this.editActionEnabledField);
|
|
200
|
-
deleteDisabled =
|
|
201
|
-
!!this.deleteActionEnabledField && !this.fieldIsTruthy(this.selectedItem, this.deleteActionEnabledField);
|
|
202
|
-
viewVisible = !this.viewActionVisibleField || this.fieldIsTruthy(this.selectedItem, this.viewActionVisibleField);
|
|
203
|
-
editVisible = !this.editActionVisibleField || this.fieldIsTruthy(this.selectedItem, this.editActionVisibleField);
|
|
204
|
-
deleteVisible =
|
|
205
|
-
!this.deleteActionVisibleField || this.fieldIsTruthy(this.selectedItem, this.deleteActionVisibleField);
|
|
206
|
-
}
|
|
207
|
-
this.translateService
|
|
208
|
-
.get([
|
|
209
|
-
this.viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW',
|
|
210
|
-
this.editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT',
|
|
211
|
-
this.deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE',
|
|
212
|
-
...this.additionalActions.map((a) => a.labelKey || ''),
|
|
213
|
-
])
|
|
214
|
-
.subscribe((translations) => {
|
|
215
|
-
let menuItems = [];
|
|
216
|
-
const automationId = 'data-grid-action-button';
|
|
217
|
-
const automationIdHidden = 'data-grid-action-button-hidden';
|
|
218
|
-
if (this.viewItem.observed && this.userService.hasPermission(this.viewPermission || '')) {
|
|
219
|
-
menuItems.push({
|
|
220
|
-
label: translations[this.viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW'],
|
|
221
|
-
icon: PrimeIcons.EYE,
|
|
222
|
-
command: () => this.viewItem.emit(this.selectedItem),
|
|
223
|
-
disabled: viewDisabled,
|
|
224
|
-
visible: viewVisible,
|
|
225
|
-
automationId: viewVisible ? automationId : automationIdHidden,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
if (this.editItem.observed && this.userService.hasPermission(this.editPermission || '')) {
|
|
229
|
-
menuItems.push({
|
|
230
|
-
label: translations[this.editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT'],
|
|
231
|
-
icon: PrimeIcons.PENCIL,
|
|
232
|
-
command: () => this.editItem.emit(this.selectedItem),
|
|
233
|
-
disabled: editDisabled,
|
|
234
|
-
visible: editVisible,
|
|
235
|
-
automationId: editVisible ? automationId : automationIdHidden,
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
if (this.deleteItem.observed && this.userService.hasPermission(this.deletePermission || '')) {
|
|
239
|
-
menuItems.push({
|
|
240
|
-
label: translations[this.deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE'],
|
|
241
|
-
icon: PrimeIcons.TRASH,
|
|
242
|
-
command: () => this.deleteItem.emit(this.selectedItem),
|
|
243
|
-
disabled: deleteDisabled,
|
|
244
|
-
visible: deleteVisible,
|
|
245
|
-
automationId: deleteVisible ? automationId : automationIdHidden,
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
menuItems = menuItems.concat(this.additionalActions
|
|
249
|
-
.filter((a) => this.userService.hasPermission(a.permission))
|
|
250
|
-
.map((a) => ({
|
|
251
|
-
label: translations[a.labelKey || ''],
|
|
252
|
-
icon: a.icon,
|
|
253
|
-
styleClass: (a.classes || []).join(' '),
|
|
254
|
-
disabled: a.disabled || (!!a.actionEnabledField && !this.fieldIsTruthy(this.selectedItem, a.actionEnabledField)),
|
|
255
|
-
visible: !a.actionVisibleField || this.fieldIsTruthy(this.selectedItem, a.actionVisibleField),
|
|
256
|
-
command: () => a.callback(this.selectedItem),
|
|
257
|
-
})));
|
|
258
|
-
this.gridMenuItems = menuItems;
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
setSelectedItem(item) {
|
|
262
|
-
this.selectedItem = item;
|
|
263
|
-
}
|
|
264
|
-
resolveFieldData(object, key) {
|
|
265
|
-
return ObjectUtils.resolveFieldData(object, key);
|
|
266
|
-
}
|
|
267
|
-
onPageChange(event) {
|
|
268
|
-
const page = event.first / event.rows;
|
|
269
|
-
this.page = page;
|
|
270
|
-
this.pageChanged.emit(page);
|
|
271
|
-
}
|
|
272
|
-
fieldIsTruthy(object, key) {
|
|
273
|
-
return !!this.resolveFieldData(object, key);
|
|
274
|
-
}
|
|
275
|
-
hasVisibleOverflowMenuItems(item) {
|
|
276
|
-
return this.additionalListOverflowActions.some((a) => (!a.actionVisibleField || this.fieldIsTruthy(item, a.actionVisibleField)) &&
|
|
277
|
-
this.userService.hasPermission(a.permission));
|
|
278
|
-
}
|
|
279
|
-
getOverflowMenuItems(item) {
|
|
280
|
-
return this.translateService.get([...this.additionalListOverflowActions.map((a) => a.labelKey || '')]).pipe(map((translations) => {
|
|
281
|
-
return this.additionalListOverflowActions
|
|
282
|
-
.filter((a) => this.userService.hasPermission(a.permission))
|
|
283
|
-
.map((a) => ({
|
|
284
|
-
label: translations[a.labelKey || ''],
|
|
285
|
-
icon: a.icon,
|
|
286
|
-
styleClass: (a.classes || []).join(' '),
|
|
287
|
-
disabled: a.disabled || (!!a.actionEnabledField && !this.fieldIsTruthy(item, a.actionEnabledField)),
|
|
288
|
-
visible: !a.actionVisibleField || this.fieldIsTruthy(item, a.actionVisibleField),
|
|
289
|
-
command: () => a.callback(item),
|
|
290
|
-
}));
|
|
291
|
-
}));
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
DataListGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataListGridComponent, deps: [{ token: LOCALE_ID }, { token: i1.TranslateService }, { token: i2.UserService }, { token: i3.Router }, { token: i0.Injector }, { token: i2.AppStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
295
|
-
DataListGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DataListGridComponent, selector: "ocx-data-list-grid", inputs: { titleLineId: "titleLineId", subtitleLineIds: "subtitleLineIds", clientSideSorting: "clientSideSorting", clientSideFiltering: "clientSideFiltering", sortStates: "sortStates", pageSizes: "pageSizes", pageSize: "pageSize", emptyResultsMessage: "emptyResultsMessage", fallbackImage: "fallbackImage", layout: "layout", viewPermission: "viewPermission", editPermission: "editPermission", deletePermission: "deletePermission", deleteActionVisibleField: "deleteActionVisibleField", deleteActionEnabledField: "deleteActionEnabledField", viewActionVisibleField: "viewActionVisibleField", viewActionEnabledField: "viewActionEnabledField", editActionVisibleField: "editActionVisibleField", editActionEnabledField: "editActionEnabledField", viewMenuItemKey: "viewMenuItemKey", editMenuItemKey: "editMenuItemKey", deleteMenuItemKey: "deleteMenuItemKey", paginator: "paginator", page: "page", columns: "columns", name: "name", totalRecordsOnServer: "totalRecordsOnServer", currentPageShowingKey: "currentPageShowingKey", currentPageShowingWithTotalOnServerKey: "currentPageShowingWithTotalOnServerKey", data: "data", filters: "filters", sortDirection: "sortDirection", sortField: "sortField", gridItemSubtitleLinesTemplate: "gridItemSubtitleLinesTemplate", listItemSubtitleLinesTemplate: "listItemSubtitleLinesTemplate", listItemTemplate: "listItemTemplate", gridItemTemplate: "gridItemTemplate", additionalActions: "additionalActions" }, outputs: { viewItem: "viewItem", editItem: "editItem", deleteItem: "deleteItem", pageChanged: "pageChanged" }, queries: [{ propertyName: "gridItemSubtitleLinesChildTemplate", first: true, predicate: ["gridItemSubtitleLines"], descendants: true }, { propertyName: "listItemSubtitleLinesChildTemplate", first: true, predicate: ["listItemSubtitleLines"], descendants: true }, { propertyName: "listItemChildTemplate", first: true, predicate: ["listItem"], descendants: true }, { propertyName: "gridItemChildTemplate", first: true, predicate: ["gridItem"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<p-dataView\n *ngIf=\"displayedPageSize$ | async as displayedPageSize\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n>\n <ng-template #gridItem let-item pTemplate=\"gridItem\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n\n <ng-template #listItem let-item pTemplate=\"listItem\">\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n</p-dataView>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <a [routerLink]=\"\" (click)=\"onViewRow\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div>\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); updateGridMenuItems(true); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [ariaLabel]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item>\n <div class=\"col-12\">\n <div class=\"flex flex-1 align-items-center p-3 w-full\">\n <div class=\"data-list-items flex-1\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </div>\n <div class=\"flex flex-column md:flex-row md:justify-content-between\">\n <ng-container *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\">\n <button\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n title=\"{{ (viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate }}\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\">\n <button\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n title=\"{{ (editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate }}\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\">\n <button\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n title=\"{{ (deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate }}\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of additionalListActions\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item)\">\n <p-menu #menu [model]=\"(getOverflowMenuItems(item) | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"menu.toggle($event)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">{{ resolveFieldData(item, subtitleLineId) }}</div>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color);border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\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: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i6.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i7.DataView, selector: "p-dataView", inputs: ["paginator", "rows", "totalRecords", "pageLinks", "rowsPerPageOptions", "paginatorPosition", "alwaysShowPaginator", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showFirstLastIcon", "showPageLinks", "lazy", "emptyMessage", "style", "styleClass", "gridStyleClass", "trackBy", "filterBy", "filterLocale", "loading", "loadingIcon", "first", "sortField", "sortOrder", "value", "layout"], outputs: ["onLazyLoad", "onPage", "onSort", "onChangeLayout"] }, { kind: "component", type: i8.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i9.IfPermissionDirective, selector: "[ocxIfPermission], [ocxIfNotPermission]", inputs: ["ocxIfPermission", "ocxIfNotPermission", "onMissingPermission", "ocxIfPermissionPermissions", "ocxIfNotPermissionPermissions"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] });
|
|
296
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataListGridComponent, decorators: [{
|
|
297
|
-
type: Component,
|
|
298
|
-
args: [{ selector: 'ocx-data-list-grid', template: "<p-dataView\n *ngIf=\"displayedPageSize$ | async as displayedPageSize\"\n [value]=\"(displayedItems$ | async) ?? []\"\n [paginator]=\"paginator\"\n [first]=\"page * displayedPageSize\"\n (onPage)=\"onPageChange($event)\"\n [rows]=\"displayedPageSize\"\n [layout]=\"layout\"\n [showCurrentPageReport]=\"true\"\n currentPageReportTemplate=\"{{ (totalRecordsOnServer ? currentPageShowingWithTotalOnServerKey : currentPageShowingKey) | translate:params }}\"\n [rowsPerPageOptions]=\"(displayedPageSizes$ | async) ?? []\"\n id=\"dataListGrid_{{name}}\"\n paginatorDropdownAppendTo=\"body\"\n>\n <ng-template #gridItem let-item pTemplate=\"gridItem\">\n <ng-container\n [ngTemplateOutlet]=\"_gridItem ? _gridItem : defaultGridItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n\n <ng-template #listItem let-item pTemplate=\"listItem\">\n <ng-container\n [ngTemplateOutlet]=\"_listItem ? _listItem : defaultListItem\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </ng-template>\n <ng-template pTemplate=\"empty\">\n <span>{{ emptyResultsMessage || (\"OCX_DATA_LIST_GRID.EMPTY_RESULT\" | translate) }}</span>\n </ng-template>\n</p-dataView>\n\n<ng-template #defaultGridItem let-item>\n <div class=\"col-12 lg:col-6 xl:col-4 flex\">\n <div class=\"data-grid-item card flex flex-column justify-content-between w-12 lg:w-11 mb-4 mt-4 align-self-stretch\">\n <div class=\"flex justify-content-center mb-3\">\n <img\n class=\"image\"\n src=\"{{ item.imagePath || (fallbackImagePath$ | async) }}\"\n (error)=\"imgError(item)\"\n alt=\"{{resolveFieldData(item, titleLineId)|| ''}}\"\n />\n </div>\n <div class=\"flex flex-row justify-content-between align-items-center\">\n <div class=\"data-grid-items flex-row\">\n <div class=\"item-name font-medium mr-3 text-2xl\">\n <a [routerLink]=\"\" (click)=\"onViewRow\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </div>\n <ng-container\n [ngTemplateOutlet]=\"_gridItemSubtitleLines ? _gridItemSubtitleLines : defaultGridItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n <div>\n <p-menu #menu [model]=\"gridMenuItems\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n (click)=\"setSelectedItem(item); updateGridMenuItems(true); menu.toggle($event)\"\n icon=\"pi pi-ellipsis-v\"\n [ariaLabel]=\"'OCX_DATA_LIST_GRID.MORE_ACTIONS' | translate\"\n class=\"more-actions-menu-button menu-btn\"\n [attr.name]=\"'data-grid-item-menu-button'\"\n ></button>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultGridItemSubtitleLines let-item>\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine edit-time text-xl my-3\">\n {{ resolveFieldData(item, subtitleLineId) }}\n </div>\n</ng-template>\n<ng-template #defaultListItem let-item>\n <div class=\"col-12\">\n <div class=\"flex flex-1 align-items-center p-3 w-full\">\n <div class=\"data-list-items flex-1\">\n <div class=\"item-name-row flex flex-row justify-content-between\">\n <div class=\"item-name mr-3 text-2xl font-medium\">\n <a [routerLink]=\"\" (click)=\"onViewRow(item)\">{{ resolveFieldData(item, titleLineId) || '' }}</a>\n </div>\n <div class=\"flex flex-column md:flex-row md:justify-content-between\">\n <ng-container *ngIf=\"viewItemObserved && (!viewActionVisibleField || fieldIsTruthy(item, viewActionVisibleField))\">\n <button\n type=\"button\"\n icon=\"pi pi-eye\"\n pButton\n class=\"p-button-rounded p-button-text mb-1 mr-2 viewListItemButton\"\n title=\"{{ (viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate }}\"\n [attr.aria-label]=\"(viewMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.VIEW') | translate\"\n (click)=\"onViewRow(item)\"\n *ocxIfPermission=\"viewPermission\"\n [disabled]=\"!!viewActionEnabledField && !fieldIsTruthy(item, viewActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"editItemObserved && (!editActionVisibleField || fieldIsTruthy(item, editActionVisibleField))\">\n <button\n type=\"button\"\n class=\"p-button-rounded p-button-text mb-1 mr-2 editListItemButton\"\n icon=\"pi pi-pencil\"\n pButton\n title=\"{{ (editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate }}\"\n [attr.aria-label]=\"(editMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.EDIT') | translate\"\n (click)=\"onEditRow(item)\"\n *ocxIfPermission=\"editPermission\"\n [disabled]=\"!!editActionEnabledField && !fieldIsTruthy(item, editActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"deleteItemObserved && (!deleteActionVisibleField || fieldIsTruthy(item, deleteActionVisibleField))\">\n <button\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-rounded p-button-text p-button-danger mb-1 mr-2 deleteListItemButton\"\n pButton\n title=\"{{ (deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate }}\"\n [attr.aria-label]=\"(deleteMenuItemKey || 'OCX_DATA_LIST_GRID.MENU.DELETE') | translate\"\n (click)=\"onDeleteRow(item)\"\n *ocxIfPermission=\"deletePermission\"\n [disabled]=\"!!deleteActionEnabledField && !fieldIsTruthy(item, deleteActionEnabledField)\"\n [attr.name]=\"'data-list-action-button'\"\n ></button>\n </ng-container>\n <ng-container *ngFor=\"let action of additionalListActions\">\n <ng-container *ngIf=\"(!action.actionVisibleField || fieldIsTruthy(item, action.actionVisibleField))\">\n <button\n *ocxIfPermission=\"action.permission\"\n pButton\n class=\"p-button-rounded p-button-text\"\n [ngClass]=\"action.classes\"\n [icon]=\"action.icon || ''\"\n (click)=\"action.callback(item)\"\n [title]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [attr.aria-label]=\"action.labelKey ? (action.labelKey | translate) : ''\"\n [disabled]=\"action.disabled || (!!action.actionEnabledField && !fieldIsTruthy(item, action.actionEnabledField))\"\n ></button>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hasVisibleOverflowMenuItems(item)\">\n <p-menu #menu [model]=\"(getOverflowMenuItems(item) | async) || []\" [popup]=\"true\" appendTo=\"body\"></p-menu>\n <button\n pButton\n class=\"p-button-rounded p-button-text\"\n [icon]=\"'pi pi-ellipsis-v'\"\n (click)=\"menu.toggle($event)\"\n [ariaLabel]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n [title]=\"'OCX_DATA_TABLE.MORE_ACTIONS' | translate\"\n ></button>\n </ng-container>\n </div>\n </div>\n <div class=\"text-base font-light my-1\">\n <ng-container\n [ngTemplateOutlet]=\"_listItemSubtitleLines ? _listItemSubtitleLines : defaultListItemSubtitleLines\"\n [ngTemplateOutletContext]=\"{$implicit:item}\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #defaultListItemSubtitleLines let-item=\"$implicit\">\n <div *ngFor=\"let subtitleLineId of subtitleLineIds\" class=\"subtitleLine text-xl my-3\">{{ resolveFieldData(item, subtitleLineId) }}</div>\n</ng-template>\n", styles: [".image{width:100%;height:100%}.menu-btn{color:var(--primary-text-color);background-color:var(--primary-color);border:var(--button-border);border-radius:var(--border-radius);padding:var(--button-padding);cursor:pointer;min-width:4rem}\n"] }]
|
|
299
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
300
|
-
type: Inject,
|
|
301
|
-
args: [LOCALE_ID]
|
|
302
|
-
}] }, { type: i1.TranslateService }, { type: i2.UserService }, { type: i3.Router }, { type: i0.Injector }, { type: i2.AppStateService }]; }, propDecorators: { titleLineId: [{
|
|
303
|
-
type: Input
|
|
304
|
-
}], subtitleLineIds: [{
|
|
305
|
-
type: Input
|
|
306
|
-
}], clientSideSorting: [{
|
|
307
|
-
type: Input
|
|
308
|
-
}], clientSideFiltering: [{
|
|
309
|
-
type: Input
|
|
310
|
-
}], sortStates: [{
|
|
311
|
-
type: Input
|
|
312
|
-
}], pageSizes: [{
|
|
313
|
-
type: Input
|
|
314
|
-
}], pageSize: [{
|
|
315
|
-
type: Input
|
|
316
|
-
}], emptyResultsMessage: [{
|
|
317
|
-
type: Input
|
|
318
|
-
}], fallbackImage: [{
|
|
319
|
-
type: Input
|
|
320
|
-
}], layout: [{
|
|
321
|
-
type: Input
|
|
322
|
-
}], viewPermission: [{
|
|
323
|
-
type: Input
|
|
324
|
-
}], editPermission: [{
|
|
325
|
-
type: Input
|
|
326
|
-
}], deletePermission: [{
|
|
327
|
-
type: Input
|
|
328
|
-
}], deleteActionVisibleField: [{
|
|
329
|
-
type: Input
|
|
330
|
-
}], deleteActionEnabledField: [{
|
|
331
|
-
type: Input
|
|
332
|
-
}], viewActionVisibleField: [{
|
|
333
|
-
type: Input
|
|
334
|
-
}], viewActionEnabledField: [{
|
|
335
|
-
type: Input
|
|
336
|
-
}], editActionVisibleField: [{
|
|
337
|
-
type: Input
|
|
338
|
-
}], editActionEnabledField: [{
|
|
339
|
-
type: Input
|
|
340
|
-
}], viewMenuItemKey: [{
|
|
341
|
-
type: Input
|
|
342
|
-
}], editMenuItemKey: [{
|
|
343
|
-
type: Input
|
|
344
|
-
}], deleteMenuItemKey: [{
|
|
345
|
-
type: Input
|
|
346
|
-
}], paginator: [{
|
|
347
|
-
type: Input
|
|
348
|
-
}], page: [{
|
|
349
|
-
type: Input
|
|
350
|
-
}], columns: [{
|
|
351
|
-
type: Input
|
|
352
|
-
}], name: [{
|
|
353
|
-
type: Input
|
|
354
|
-
}], totalRecordsOnServer: [{
|
|
355
|
-
type: Input
|
|
356
|
-
}], currentPageShowingKey: [{
|
|
357
|
-
type: Input
|
|
358
|
-
}], currentPageShowingWithTotalOnServerKey: [{
|
|
359
|
-
type: Input
|
|
360
|
-
}], data: [{
|
|
361
|
-
type: Input
|
|
362
|
-
}], filters: [{
|
|
363
|
-
type: Input
|
|
364
|
-
}], sortDirection: [{
|
|
365
|
-
type: Input
|
|
366
|
-
}], sortField: [{
|
|
367
|
-
type: Input
|
|
368
|
-
}], gridItemSubtitleLinesTemplate: [{
|
|
369
|
-
type: Input
|
|
370
|
-
}], gridItemSubtitleLinesChildTemplate: [{
|
|
371
|
-
type: ContentChild,
|
|
372
|
-
args: ['gridItemSubtitleLines']
|
|
373
|
-
}], listItemSubtitleLinesTemplate: [{
|
|
374
|
-
type: Input
|
|
375
|
-
}], listItemSubtitleLinesChildTemplate: [{
|
|
376
|
-
type: ContentChild,
|
|
377
|
-
args: ['listItemSubtitleLines']
|
|
378
|
-
}], listItemTemplate: [{
|
|
379
|
-
type: Input
|
|
380
|
-
}], listItemChildTemplate: [{
|
|
381
|
-
type: ContentChild,
|
|
382
|
-
args: ['listItem']
|
|
383
|
-
}], gridItemTemplate: [{
|
|
384
|
-
type: Input
|
|
385
|
-
}], gridItemChildTemplate: [{
|
|
386
|
-
type: ContentChild,
|
|
387
|
-
args: ['gridItem']
|
|
388
|
-
}], additionalActions: [{
|
|
389
|
-
type: Input
|
|
390
|
-
}], viewItem: [{
|
|
391
|
-
type: Output
|
|
392
|
-
}], editItem: [{
|
|
393
|
-
type: Output
|
|
394
|
-
}], deleteItem: [{
|
|
395
|
-
type: Output
|
|
396
|
-
}], pageChanged: [{
|
|
397
|
-
type: Output
|
|
398
|
-
}] } });
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWFjY2VsZXJhdG9yL3NyYy9saWIvY29tcG9uZW50cy9kYXRhLWxpc3QtZ3JpZC9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItYWNjZWxlcmF0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtbGlzdC1ncmlkL2RhdGEtbGlzdC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEVBRVQsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RCxPQUFPLEVBQVksVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQWMsYUFBYSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUlsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFBOzs7Ozs7Ozs7OztBQW9CL0QsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFTckQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEs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O3NCQURoQixLQUFLO2dCQVlGLFNBQVM7c0JBRFosS0FBSztnQkFRRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ2lDLGtDQUFrQztzQkFBeEUsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSzVCLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDaUMsa0NBQWtDO3NCQUF4RSxZQUFZO3VCQUFDLHVCQUF1QjtnQkFLNUIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNvQixxQkFBcUI7c0JBQTlDLFlBQVk7dUJBQUMsVUFBVTtnQkFLZixnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ29CLHFCQUFxQjtzQkFBOUMsWUFBWTt1QkFBQyxVQUFVO2dCQVNwQixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBV0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBEb0NoZWNrLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBMT0NBTEVfSUQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgTWVudUl0ZW0sIFByaW1lSWNvbnMgfSBmcm9tICdwcmltZW5nL2FwaSdcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBNZmVJbmZvIH0gZnJvbSAnQG9uZWN4L2ludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJ0BvbmVjeC9hbmd1bGFyLWludGVncmF0aW9uLWludGVyZmFjZSdcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnQG9uZWN4L2FuZ3VsYXItaW50ZWdyYXRpb24taW50ZXJmYWNlJ1xuaW1wb3J0IHsgRGF0YUFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVsL2RhdGEtYWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVNvcnREaXJlY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9kYXRhLXNvcnQtZGlyZWN0aW9uJ1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29sdW1uIH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YS10YWJsZS1jb2x1bW4ubW9kZWwnXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL29iamVjdHV0aWxzJ1xuaW1wb3J0IHsgRGF0YVNvcnRCYXNlIH0gZnJvbSAnLi4vZGF0YS1zb3J0LWJhc2UvZGF0YS1zb3J0LWJhc2UnXG5pbXBvcnQgeyBGaWx0ZXIsIFJvdyB9IGZyb20gJy4uL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQnXG5cbmV4cG9ydCB0eXBlIExpc3RHcmlkRGF0YSA9IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlclxuICBpbWFnZVBhdGg6IHN0cmluZyB8IG51bWJlclxuICBbY29sdW1uSWQ6IHN0cmluZ106IHVua25vd25cbn1cblxudHlwZSBSb3dMaXN0R3JpZERhdGEgPSBMaXN0R3JpZERhdGEgJiBSb3dcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0R3JpZERhdGFNZW51SXRlbSBleHRlbmRzIE1lbnVJdGVtIHtcbiAgcGVybWlzc2lvbjogc3RyaW5nXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29jeC1kYXRhLWxpc3QtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWxpc3QtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtbGlzdC1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFMaXN0R3JpZENvbXBvbmVudCBleHRlbmRzIERhdGFTb3J0QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIHRpdGxlTGluZUlkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgc3VidGl0bGVMaW5lSWRzOiBzdHJpbmdbXSA9IFtdXG4gIEBJbnB1dCgpIGNsaWVudFNpZGVTb3J0aW5nID0gdHJ1ZVxuICBASW5wdXQoKSBjbGllbnRTaWRlRmlsdGVyaW5nID0gdHJ1ZVxuICBASW5wdXQoKSBzb3J0U3RhdGVzOiBEYXRhU29ydERpcmVjdGlvbltdID0gW11cblxuICBkaXNwbGF5ZWRQYWdlU2l6ZXMkOiBPYnNlcnZhYmxlPChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdPlxuICBfcGFnZVNpemVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8KG51bWJlciB8IHsgc2hvd0FsbDogc3RyaW5nIH0pW10+KFsxMCwgMjUsIDUwXSlcbiAgQElucHV0KClcbiAgZ2V0IHBhZ2VTaXplcygpOiAobnVtYmVyIHwgeyBzaG93QWxsOiBzdHJpbmcgfSlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplcyQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZXModmFsdWU6IChudW1iZXIgfCB7IHNob3dBbGw6IHN0cmluZyB9KVtdKSB7XG4gICAgdGhpcy5fcGFnZVNpemVzJC5uZXh0KHZhbHVlKVxuICB9XG5cbiAgZGlzcGxheWVkUGFnZVNpemUkOiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgX3BhZ2VTaXplJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIEBJbnB1dCgpXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZSQuZ2V0VmFsdWUoKVxuICB9XG4gIHNldCBwYWdlU2l6ZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnZVNpemUkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBlbXB0eVJlc3VsdHNNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZmFsbGJhY2tJbWFnZSA9ICdwbGFjZWhvbGRlci5wbmcnXG4gIEBJbnB1dCgpIGxheW91dDogJ2dyaWQnIHwgJ2xpc3QnID0gJ2dyaWQnXG4gIEBJbnB1dCgpIHZpZXdQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdFBlcm1pc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBkZWxldGVQZXJtaXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgdmlld0FjdGlvblZpc2libGVGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdBY3Rpb25FbmFibGVkRmllbGQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBASW5wdXQoKSBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgZWRpdEFjdGlvbkVuYWJsZWRGaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIHZpZXdNZW51SXRlbUtleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGVkaXRNZW51SXRlbUtleTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpIGRlbGV0ZU1lbnVJdGVtS2V5OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgcGFnaW5hdG9yID0gdHJ1ZVxuICBASW5wdXQoKSBwYWdlID0gMFxuICBASW5wdXQoKSBjb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5bXSA9IFtdXG4gIEBJbnB1dCgpIG5hbWUgPSAnJ1xuICBASW5wdXQoKVxuICBnZXQgdG90YWxSZWNvcmRzT25TZXJ2ZXIoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10gPyBOdW1iZXIodGhpcy5wYXJhbXNbJ3RvdGFsUmVjb3Jkc09uU2VydmVyJ10pIDogdW5kZWZpbmVkXG4gIH1cbiAgc2V0IHRvdGFsUmVjb3Jkc09uU2VydmVyKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnBhcmFtc1sndG90YWxSZWNvcmRzT25TZXJ2ZXInXSA9IHZhbHVlPy50b1N0cmluZygpID8/ICcwJ1xuICB9XG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlU2hvd2luZ0tleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HJ1xuICBASW5wdXQoKSBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA9ICdPQ1hfREFUQV9UQUJMRS5TSE9XSU5HX1dJVEhfVE9UQUxfT05fU0VSVkVSJ1xuICBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgY3VycmVudFBhZ2U6ICd7Y3VycmVudFBhZ2V9JyxcbiAgICB0b3RhbFBhZ2VzOiAne3RvdGFsUGFnZXN9JyxcbiAgICByb3dzOiAne3Jvd3N9JyxcbiAgICBmaXJzdDogJ3tmaXJzdH0nLFxuICAgIGxhc3Q6ICd7bGFzdH0nLFxuICAgIHRvdGFsUmVjb3JkczogJ3t0b3RhbFJlY29yZHN9JyxcbiAgfVxuXG4gIF9kYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Um93TGlzdEdyaWREYXRhW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgZGF0YSgpOiBSb3dMaXN0R3JpZERhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZGF0YSh2YWx1ZTogUm93TGlzdEdyaWREYXRhW10pIHtcbiAgICB0aGlzLl9vcmlnaW5hbERhdGEgPSBbLi4udmFsdWVdXG4gICAgdGhpcy5fZGF0YSQubmV4dChbLi4udmFsdWVdKVxuICB9XG4gIF9maWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmlsdGVyW10+KFtdKVxuICBASW5wdXQoKVxuICBnZXQgZmlsdGVycygpOiBGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgZmlsdGVycyh2YWx1ZTogRmlsdGVyW10pIHtcbiAgICB0aGlzLl9maWx0ZXJzJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9vcmlnaW5hbERhdGE6IFJvd0xpc3RHcmlkRGF0YVtdID0gW11cbiAgX3NvcnREaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU29ydERpcmVjdGlvbj4oRGF0YVNvcnREaXJlY3Rpb24uTk9ORSlcbiAgQElucHV0KClcbiAgZ2V0IHNvcnREaXJlY3Rpb24oKTogRGF0YVNvcnREaXJlY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9zb3J0RGlyZWN0aW9uJC5nZXRWYWx1ZSgpXG4gIH1cbiAgc2V0IHNvcnREaXJlY3Rpb24odmFsdWU6IERhdGFTb3J0RGlyZWN0aW9uKSB7XG4gICAgaWYgKHZhbHVlID09PSBEYXRhU29ydERpcmVjdGlvbi5OT05FKSB7XG4gICAgICB0aGlzLl9kYXRhJC5uZXh0KFsuLi50aGlzLl9vcmlnaW5hbERhdGFdKVxuICAgIH1cbiAgICB0aGlzLl9zb3J0RGlyZWN0aW9uJC5uZXh0KHZhbHVlKVxuICB9XG4gIF9zb3J0RmllbGQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBASW5wdXQoKVxuICBnZXQgc29ydEZpZWxkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXM/Ll9zb3J0RmllbGQkLmdldFZhbHVlKClcbiAgfVxuICBzZXQgc29ydEZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zb3J0RmllbGQkLm5leHQodmFsdWUpXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBAQ29udGVudENoaWxkKCdncmlkSXRlbVN1YnRpdGxlTGluZXMnKSBncmlkSXRlbVN1YnRpdGxlTGluZXNDaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzKCk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyaWRJdGVtU3VidGl0bGVMaW5lc1RlbXBsYXRlIHx8IHRoaXMuZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgQElucHV0KCkgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzJykgbGlzdEl0ZW1TdWJ0aXRsZUxpbmVzQ2hpbGRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZFxuICBnZXQgX2xpc3RJdGVtU3VidGl0bGVMaW5lcygpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVN1YnRpdGxlTGluZXNUZW1wbGF0ZSB8fCB0aGlzLmxpc3RJdGVtU3VidGl0bGVMaW5lc0NoaWxkVGVtcGxhdGVcbiAgfVxuXG4gIEBJbnB1dCgpIGxpc3RJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgQENvbnRlbnRDaGlsZCgnbGlzdEl0ZW0nKSBsaXN0SXRlbUNoaWxkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWRcbiAgZ2V0IF9saXN0SXRlbSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SXRlbVRlbXBsYXRlIHx8IHRoaXMubGlzdEl0ZW1DaGlsZFRlbXBsYXRlXG4gIH1cblxuICBASW5wdXQoKSBncmlkSXRlbVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIEBDb250ZW50Q2hpbGQoJ2dyaWRJdGVtJykgZ3JpZEl0ZW1DaGlsZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkXG4gIGdldCBfZ3JpZEl0ZW0oKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEl0ZW1UZW1wbGF0ZSB8fCB0aGlzLmdyaWRJdGVtQ2hpbGRUZW1wbGF0ZVxuICB9XG5cbiAgYWRkaXRpb25hbExpc3RBY3Rpb25zOiBEYXRhQWN0aW9uW10gPSBbXVxuICBhZGRpdGlvbmFsTGlzdE92ZXJmbG93QWN0aW9uczogRGF0YUFjdGlvbltdID0gW11cbiAgX2FkZGl0aW9uYWxBY3Rpb25zOiBEYXRhQWN0aW9uW10gPSBbXVxuICBASW5wdXQoKVxuICBnZXQgYWRkaXRpb25hbEFjdGlvbnMoKTogRGF0YUFjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEFjdGlvbnNcbiAgfVxuICBzZXQgYWRkaXRpb25hbEFjdGlvbnModmFsdWU6IERhdGFBY3Rpb25bXSkge1xuICAgIHRoaXMuX2FkZGl0aW9uYWxBY3Rpb25zID0gdmFsdWVcbiAgICB0aGlzLnVwZGF0ZUdyaWRNZW51SXRlbXMoKVxuICAgIHRoaXMuYWRkaXRpb25hbExpc3RBY3Rpb25zID0gdmFsdWUuZmlsdGVyKChhY3Rpb24pID0+ICFhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpXG4gICAgdGhpcy5hZGRpdGlvbmFsTGlzdE92ZXJmbG93QWN0aW9ucyA9IHZhbHVlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uc2hvd0FzT3ZlcmZsb3cpXG4gIH1cblxuICBAT3V0cHV0KCkgdmlld0l0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RHcmlkRGF0YT4oKVxuICBAT3V0cHV0KCkgZWRpdEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RHcmlkRGF0YT4oKVxuICBAT3V0cHV0KCkgZGVsZXRlSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8TGlzdEdyaWREYXRhPigpXG4gIEBPdXRwdXQoKSBwYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG5cbiAgZ2V0IHZpZXdJdGVtT2JzZXJ2ZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZHYgPSB0aGlzLmluamVjdG9yLmdldCgnRGF0YVZpZXdDb21wb25lbnQnLCBudWxsKVxuICAgIHJldHVybiBkdj8udmlld0l0ZW1PYnNlcnZlZCB8fCBkdj8udmlld0l0ZW0ub2JzZXJ2ZWQgfHwgdGhpcy52aWV3SXRlbS5vYnNlcnZlZFxuICB9XG4gIGdldCBlZGl0SXRlbU9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmVkaXRJdGVtT2JzZXJ2ZWQgfHwgZHY/LmVkaXRJdGVtLm9ic2VydmVkIHx8IHRoaXMuZWRpdEl0ZW0ub2JzZXJ2ZWRcbiAgfVxuICBnZXQgZGVsZXRlSXRlbU9ic2VydmVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGR2ID0gdGhpcy5pbmplY3Rvci5nZXQoJ0RhdGFWaWV3Q29tcG9uZW50JywgbnVsbClcbiAgICByZXR1cm4gZHY/LmRlbGV0ZUl0ZW1PYnNlcnZlZCB8fCBkdj8uZGVsZXRlSXRlbS5vYnNlcnZlZCB8fCB0aGlzLmRlbGV0ZUl0ZW0ub2JzZXJ2ZWRcbiAgfVxuXG4gIGdldCBzb3J0RGlyZWN0aW9uTnVtYmVyKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc29ydERpcmVjdGlvbiA9PT0gRGF0YVNvcnREaXJlY3Rpb24uQVNDRU5ESU5HKSByZXR1cm4gMVxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb24gPT09IERhdGFTb3J0RGlyZWN0aW9uLkRFU0NFTkRJTkcpIHJldHVybiAtMVxuICAgIHJldHVybiAwXG4gIH1cblxuICBzaG93TWVudSA9IGZhbHNlXG4gIGdyaWRNZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXVxuICBzZWxlY3RlZEl0ZW06IExpc3RHcmlkRGF0YSB8IHVuZGVmaW5lZFxuICBvYnNlcnZlZE91dHB1dHMgPSAwXG5cbiAgZGlzcGxheWVkSXRlbXMkOiBPYnNlcnZhYmxlPHVua25vd25bXT4gfCB1bmRlZmluZWRcbiAgZmFsbGJhY2tJbWFnZVBhdGgkITogT2JzZXJ2YWJsZTxzdHJpbmc+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGxvY2FsZSwgdHJhbnNsYXRlU2VydmljZSlcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUgfHwgdGhpcy5yb3V0ZXIudXJsLnJlcGxhY2UoL1teQS1aYS16MC05XS8sICdfJylcbiAgICB0aGlzLmZhbGxiYWNrSW1hZ2VQYXRoJCA9IHRoaXMuYXBwU3RhdGVTZXJ2aWNlLmN1cnJlbnRNZmUkLnBpcGUoXG4gICAgICBtYXAoKGN1cnJlbnRNZmUpID0+IHRoaXMuZ2V0RmFsbGJhY2tJbWFnZVBhdGgoY3VycmVudE1mZSkpXG4gICAgKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemVzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3BhZ2VTaXplcyQsIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoJ09DWF9EQVRBX1RBQkxFLkFMTCcpXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplcywgdHJhbnNsYXRpb25dKSA9PiBwYWdlU2l6ZXMuY29uY2F0KHsgc2hvd0FsbDogdHJhbnNsYXRpb24gfSkpXG4gICAgKVxuICAgIHRoaXMuZGlzcGxheWVkUGFnZVNpemUkID0gY29tYmluZUxhdGVzdChbdGhpcy5fcGFnZVNpemUkLCB0aGlzLl9wYWdlU2l6ZXMkXSkucGlwZShcbiAgICAgIG1hcCgoW3BhZ2VTaXplLCBwYWdlU2l6ZXNdKSA9PiBwYWdlU2l6ZSA/PyBwYWdlU2l6ZXMuZmluZCgodmFsKTogdmFsIGlzIG51bWJlciA9PiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykgPz8gNTApXG4gICAgKVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IG9ic2VydmVkT3V0cHV0cyA9IDxhbnk+dGhpcy52aWV3SXRlbS5vYnNlcnZlZCArIDxhbnk+dGhpcy5kZWxldGVJdGVtLm9ic2VydmVkICsgPGFueT50aGlzLmVkaXRJdGVtLm9ic2VydmVkXG4gICAgaWYgKHRoaXMub2JzZXJ2ZWRPdXRwdXRzICE9PSBvYnNlcnZlZE91dHB1dHMpIHtcbiAgICAgIHRoaXMudXBkYXRlR3JpZE1lbnVJdGVtcygpXG4gICAgICB0aGlzLm9ic2VydmVkT3V0cHV0cyA9IG9ic2VydmVkT3V0cHV0c1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheWVkSXRlbXMkID0gY29tYmluZUxhdGVzdChbdGhpcy5fZGF0YSQsIHRoaXMuX2ZpbHRlcnMkLCB0aGlzLl9zb3J0RmllbGQkLCB0aGlzLl9zb3J0RGlyZWN0aW9uJF0pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgocGFyYW1zKSA9PiB0aGlzLnRyYW5zbGF0ZUl0ZW1zKHBhcmFtcywgdGhpcy5jb2x1bW5zLCB0aGlzLmNsaWVudFNpZGVGaWx0ZXJpbmcsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgocGFyYW1zKSA9PiB0aGlzLmZpbHRlckl0ZW1zKHBhcmFtcywgdGhpcy5jbGllbnRTaWRlRmlsdGVyaW5nKSksXG4gICAgICBtYXAoKHBhcmFtcykgPT4gdGhpcy5zb3J0SXRlbXMocGFyYW1zLCB0aGlzLmNvbHVtbnMsIHRoaXMuY2xpZW50U2lkZVNvcnRpbmcpKSxcbiAgICAgIG1hcCgoW2l0ZW1zXSkgPT4gaXRlbXMpXG4gICAgKVxuXG4gICAgdGhpcy5zaG93TWVudSA9XG4gICAgICAoISF0aGlzLnZpZXdQZXJtaXNzaW9uICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnZpZXdQZXJtaXNzaW9uKSkgfHxcbiAgICAgICghIXRoaXMuZWRpdFBlcm1pc3Npb24gJiYgdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKHRoaXMuZWRpdFBlcm1pc3Npb24pKSB8fFxuICAgICAgKCEhdGhpcy5kZWxldGVQZXJtaXNzaW9uICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLmRlbGV0ZVBlcm1pc3Npb24pKVxuICB9XG5cbiAgb25EZWxldGVSb3coZWxlbWVudDogTGlzdEdyaWREYXRhKSB7XG4gICAgdGhpcy5kZWxldGVJdGVtLmVtaXQoZWxlbWVudClcbiAgfVxuXG4gIG9uVmlld1JvdyhlbGVtZW50OiBMaXN0R3JpZERhdGEpIHtcbiAgICBpZiAoISF0aGlzLnZpZXdQZXJtaXNzaW9uICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnZpZXdQZXJtaXNzaW9uKSkge1xuICAgICAgdGhpcy52aWV3SXRlbS5lbWl0KGVsZW1lbnQpXG4gICAgfVxuICB9XG5cbiAgb25FZGl0Um93KGVsZW1lbnQ6IExpc3RHcmlkRGF0YSkge1xuICAgIHRoaXMuZWRpdEl0ZW0uZW1pdChlbGVtZW50KVxuICB9XG5cbiAgaW1nRXJyb3IoaXRlbTogTGlzdEdyaWREYXRhKSB7XG4gICAgaXRlbS5pbWFnZVBhdGggPSAnJ1xuICB9XG5cbiAgZ2V0RmFsbGJhY2tJbWFnZVBhdGgobWZlSW5mbzogTWZlSW5mbykge1xuICAgIHJldHVybiBtZmVJbmZvPy5yZW1vdGVCYXNlVXJsXG4gICAgICA/IGAke21mZUluZm8ucmVtb3RlQmFzZVVybH0vb25lY3gtcG9ydGFsLWxpYi9hc3NldHMvaW1hZ2VzLyR7dGhpcy5mYWxsYmFja0ltYWdlfWBcbiAgICAgIDogYC4vb25lY3gtcG9ydGFsLWxpYi9hc3NldHMvaW1hZ2VzLyR7dGhpcy5mYWxsYmFja0ltYWdlfWBcbiAgfVxuXG4gIHVwZGF0ZUdyaWRNZW51SXRlbXModXNlU2VsZWN0ZWRJdGVtID0gZmFsc2UpOiB2b2lkIHtcbiAgICBsZXQgZGVsZXRlRGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCBlZGl0RGlzYWJsZWQgPSBmYWxzZVxuICAgIGxldCB2aWV3RGlzYWJsZWQgPSBmYWxzZVxuXG4gICAgbGV0IGRlbGV0ZVZpc2libGUgPSB0cnVlXG4gICAgbGV0IGVkaXRWaXNpYmxlID0gdHJ1ZVxuICAgIGxldCB2aWV3VmlzaWJsZSA9IHRydWVcblxuICAgIGlmICh1c2VTZWxlY3RlZEl0ZW0gJiYgdGhpcy5zZWxlY3RlZEl0ZW0pIHtcbiAgICAgIHZpZXdEaXNhYmxlZCA9XG4gICAgICAgICEhdGhpcy52aWV3QWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkodGhpcy5zZWxlY3RlZEl0ZW0sIHRoaXMudmlld0FjdGlvbkVuYWJsZWRGaWVsZClcbiAgICAgIGVkaXREaXNhYmxlZCA9XG4gICAgICAgICEhdGhpcy5lZGl0QWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkodGhpcy5zZWxlY3RlZEl0ZW0sIHRoaXMuZWRpdEFjdGlvbkVuYWJsZWRGaWVsZClcbiAgICAgIGRlbGV0ZURpc2FibGVkID1cbiAgICAgICAgISF0aGlzLmRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHRoaXMuc2VsZWN0ZWRJdGVtLCB0aGlzLmRlbGV0ZUFjdGlvbkVuYWJsZWRGaWVsZClcblxuICAgICAgdmlld1Zpc2libGUgPSAhdGhpcy52aWV3QWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeSh0aGlzLnNlbGVjdGVkSXRlbSwgdGhpcy52aWV3QWN0aW9uVmlzaWJsZUZpZWxkKVxuICAgICAgZWRpdFZpc2libGUgPSAhdGhpcy5lZGl0QWN0aW9uVmlzaWJsZUZpZWxkIHx8IHRoaXMuZmllbGRJc1RydXRoeSh0aGlzLnNlbGVjdGVkSXRlbSwgdGhpcy5lZGl0QWN0aW9uVmlzaWJsZUZpZWxkKVxuICAgICAgZGVsZXRlVmlzaWJsZSA9XG4gICAgICAgICF0aGlzLmRlbGV0ZUFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkodGhpcy5zZWxlY3RlZEl0ZW0sIHRoaXMuZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKVxuICAgIH1cblxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgICAgLmdldChbXG4gICAgICAgIHRoaXMudmlld01lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5WSUVXJyxcbiAgICAgICAgdGhpcy5lZGl0TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkVESVQnLFxuICAgICAgICB0aGlzLmRlbGV0ZU1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5ERUxFVEUnLFxuICAgICAgICAuLi50aGlzLmFkZGl0aW9uYWxBY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyksXG4gICAgICBdKVxuICAgICAgLnN1YnNjcmliZSgodHJhbnNsYXRpb25zKSA9PiB7XG4gICAgICAgIGxldCBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXVxuICAgICAgICBjb25zdCBhdXRvbWF0aW9uSWQgPSAnZGF0YS1ncmlkLWFjdGlvbi1idXR0b24nXG4gICAgICAgIGNvbnN0IGF1dG9tYXRpb25JZEhpZGRlbiA9ICdkYXRhLWdyaWQtYWN0aW9uLWJ1dHRvbi1oaWRkZW4nXG4gICAgICAgIGlmICh0aGlzLnZpZXdJdGVtLm9ic2VydmVkICYmIHRoaXMudXNlclNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnZpZXdQZXJtaXNzaW9uIHx8ICcnKSkge1xuICAgICAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbdGhpcy52aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnXSxcbiAgICAgICAgICAgIGljb246IFByaW1lSWNvbnMuRVlFLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy52aWV3SXRlbS5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtKSxcbiAgICAgICAgICAgIGRpc2FibGVkOiB2aWV3RGlzYWJsZWQsXG4gICAgICAgICAgICB2aXNpYmxlOiB2aWV3VmlzaWJsZSxcbiAgICAgICAgICAgIGF1dG9tYXRpb25JZDogdmlld1Zpc2libGUgPyBhdXRvbWF0aW9uSWQgOiBhdXRvbWF0aW9uSWRIaWRkZW4sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0SXRlbS5vYnNlcnZlZCAmJiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5lZGl0UGVybWlzc2lvbiB8fCAnJykpIHtcbiAgICAgICAgICBtZW51SXRlbXMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogdHJhbnNsYXRpb25zW3RoaXMuZWRpdE1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5FRElUJ10sXG4gICAgICAgICAgICBpY29uOiBQcmltZUljb25zLlBFTkNJTCxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMuZWRpdEl0ZW0uZW1pdCh0aGlzLnNlbGVjdGVkSXRlbSksXG4gICAgICAgICAgICBkaXNhYmxlZDogZWRpdERpc2FibGVkLFxuICAgICAgICAgICAgdmlzaWJsZTogZWRpdFZpc2libGUsXG4gICAgICAgICAgICBhdXRvbWF0aW9uSWQ6IGVkaXRWaXNpYmxlID8gYXV0b21hdGlvbklkIDogYXV0b21hdGlvbklkSGlkZGVuLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlSXRlbS5vYnNlcnZlZCAmJiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24odGhpcy5kZWxldGVQZXJtaXNzaW9uIHx8ICcnKSkge1xuICAgICAgICAgIG1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiB0cmFuc2xhdGlvbnNbdGhpcy5kZWxldGVNZW51SXRlbUtleSB8fCAnT0NYX0RBVEFfTElTVF9HUklELk1FTlUuREVMRVRFJ10sXG4gICAgICAgICAgICBpY29uOiBQcmltZUljb25zLlRSQVNILFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gdGhpcy5kZWxldGVJdGVtLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW0pLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGRlbGV0ZURpc2FibGVkLFxuICAgICAgICAgICAgdmlzaWJsZTogZGVsZXRlVmlzaWJsZSxcbiAgICAgICAgICAgIGF1dG9tYXRpb25JZDogZGVsZXRlVmlzaWJsZSA/IGF1dG9tYXRpb25JZCA6IGF1dG9tYXRpb25JZEhpZGRlbixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1lbnVJdGVtcyA9IG1lbnVJdGVtcy5jb25jYXQoXG4gICAgICAgICAgdGhpcy5hZGRpdGlvbmFsQWN0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigoYSkgPT4gdGhpcy51c2VyU2VydmljZS5oYXNQZXJtaXNzaW9uKGEucGVybWlzc2lvbikpXG4gICAgICAgICAgICAubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgICBsYWJlbDogdHJhbnNsYXRpb25zW2EubGFiZWxLZXkgfHwgJyddLFxuICAgICAgICAgICAgICBpY29uOiBhLmljb24sXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M6IChhLmNsYXNzZXMgfHwgW10pLmpvaW4oJyAnKSxcbiAgICAgICAgICAgICAgZGlzYWJsZWQ6XG4gICAgICAgICAgICAgICAgYS5kaXNhYmxlZCB8fCAoISFhLmFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhdGhpcy5maWVsZElzVHJ1dGh5KHRoaXMuc2VsZWN0ZWRJdGVtLCBhLmFjdGlvbkVuYWJsZWRGaWVsZCkpLFxuICAgICAgICAgICAgICB2aXNpYmxlOiAhYS5hY3Rpb25WaXNpYmxlRmllbGQgfHwgdGhpcy5maWVsZElzVHJ1dGh5KHRoaXMuc2VsZWN0ZWRJdGVtLCBhLmFjdGlvblZpc2libGVGaWVsZCksXG4gICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IGEuY2FsbGJhY2sodGhpcy5zZWxlY3RlZEl0ZW0pLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgIClcbiAgICAgICAgdGhpcy5ncmlkTWVudUl0ZW1zID0gbWVudUl0ZW1zXG4gICAgICB9KVxuICB9XG5cbiAgc2V0U2VsZWN0ZWRJdGVtKGl0ZW06IExpc3RHcmlkRGF0YSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbVxuICB9XG5cbiAgcmVzb2x2ZUZpZWxkRGF0YShvYmplY3Q6IGFueSwga2V5OiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0VXRpbHMucmVzb2x2ZUZpZWxkRGF0YShvYmplY3QsIGtleSlcbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgcGFnZSA9IGV2ZW50LmZpcnN0IC8gZXZlbnQucm93c1xuICAgIHRoaXMucGFnZSA9IHBhZ2VcbiAgICB0aGlzLnBhZ2VDaGFuZ2VkLmVtaXQocGFnZSlcbiAgfVxuXG4gIGZpZWxkSXNUcnV0aHkob2JqZWN0OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuICEhdGhpcy5yZXNvbHZlRmllbGREYXRhKG9iamVjdCwga2V5KVxuICB9XG5cbiAgaGFzVmlzaWJsZU92ZXJmbG93TWVudUl0ZW1zKGl0ZW06IGFueSkge1xuICAgIHJldHVybiB0aGlzLmFkZGl0aW9uYWxMaXN0T3ZlcmZsb3dBY3Rpb25zLnNvbWUoXG4gICAgICAoYSkgPT5cbiAgICAgICAgKCFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkoaXRlbSwgYS5hY3Rpb25WaXNpYmxlRmllbGQpKSAmJlxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKVxuICAgIClcbiAgfVxuXG4gIGdldE92ZXJmbG93TWVudUl0ZW1zKGl0ZW06IGFueSkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFsuLi50aGlzLmFkZGl0aW9uYWxMaXN0T3ZlcmZsb3dBY3Rpb25zLm1hcCgoYSkgPT4gYS5sYWJlbEtleSB8fCAnJyldKS5waXBlKFxuICAgICAgbWFwKCh0cmFuc2xhdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaXRpb25hbExpc3RPdmVyZmxvd0FjdGlvbnNcbiAgICAgICAgICAuZmlsdGVyKChhKSA9PiB0aGlzLnVzZXJTZXJ2aWNlLmhhc1Blcm1pc3Npb24oYS5wZXJtaXNzaW9uKSlcbiAgICAgICAgICAubWFwKChhKSA9PiAoe1xuICAgICAgICAgICAgbGFiZWw6IHRyYW5zbGF0aW9uc1thLmxhYmVsS2V5IHx8ICcnXSxcbiAgICAgICAgICAgIGljb246IGEuaWNvbixcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6IChhLmNsYXNzZXMgfHwgW10pLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBhLmRpc2FibGVkIHx8ICghIWEuYWN0aW9uRW5hYmxlZEZpZWxkICYmICF0aGlzLmZpZWxkSXNUcnV0aHkoaXRlbSwgYS5hY3Rpb25FbmFibGVkRmllbGQpKSxcbiAgICAgICAgICAgIHZpc2libGU6ICFhLmFjdGlvblZpc2libGVGaWVsZCB8fCB0aGlzLmZpZWxkSXNUcnV0aHkoaXRlbSwgYS5hY3Rpb25WaXNpYmxlRmllbGQpLFxuICAgICAgICAgICAgY29tbWFuZDogKCkgPT4gYS5jYWxsYmFjayhpdGVtKSxcbiAgICAgICAgICB9KSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG4iLCI8cC1kYXRhVmlld1xuICAqbmdJZj1cImRpc3BsYXllZFBhZ2VTaXplJCB8IGFzeW5jIGFzIGRpc3BsYXllZFBhZ2VTaXplXCJcbiAgW3ZhbHVlXT1cIihkaXNwbGF5ZWRJdGVtcyQgfCBhc3luYykgPz8gW11cIlxuICBbcGFnaW5hdG9yXT1cInBhZ2luYXRvclwiXG4gIFtmaXJzdF09XCJwYWdlICogZGlzcGxheWVkUGFnZVNpemVcIlxuICAob25QYWdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgW3Jvd3NdPVwiZGlzcGxheWVkUGFnZVNpemVcIlxuICBbbGF5b3V0XT1cImxheW91dFwiXG4gIFtzaG93Q3VycmVudFBhZ2VSZXBvcnRdPVwidHJ1ZVwiXG4gIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAodG90YWxSZWNvcmRzT25TZXJ2ZXIgPyBjdXJyZW50UGFnZVNob3dpbmdXaXRoVG90YWxPblNlcnZlcktleSA6IGN1cnJlbnRQYWdlU2hvd2luZ0tleSkgfCB0cmFuc2xhdGU6cGFyYW1zIH19XCJcbiAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCIoZGlzcGxheWVkUGFnZVNpemVzJCB8IGFzeW5jKSA/PyBbXVwiXG4gIGlkPVwiZGF0YUxpc3RHcmlkX3t7bmFtZX19XCJcbiAgcGFnaW5hdG9yRHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxuPlxuICA8bmctdGVtcGxhdGUgI2dyaWRJdGVtIGxldC1pdGVtIHBUZW1wbGF0ZT1cImdyaWRJdGVtXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiX2dyaWRJdGVtID8gX2dyaWRJdGVtIDogZGVmYXVsdEdyaWRJdGVtXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Oml0ZW19XCJcbiAgICA+PC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNsaXN0SXRlbSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJsaXN0SXRlbVwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9saXN0SXRlbSA/IF9saXN0SXRlbSA6IGRlZmF1bHRMaXN0SXRlbVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDppdGVtfVwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHlcIj5cbiAgICA8c3Bhbj57eyBlbXB0eVJlc3VsdHNNZXNzYWdlIHx8IChcIk9DWF9EQVRBX0xJU1RfR1JJRC5FTVBUWV9SRVNVTFRcIiB8IHRyYW5zbGF0ZSkgfX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZGF0YVZpZXc+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyaWRJdGVtIGxldC1pdGVtPlxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIGxnOmNvbC02IHhsOmNvbC00IGZsZXhcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ncmlkLWl0ZW0gY2FyZCBmbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHctMTIgbGc6dy0xMSBtYi00IG10LTQgYWxpZ24tc2VsZi1zdHJldGNoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1iLTNcIj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgIGNsYXNzPVwiaW1hZ2VcIlxuICAgICAgICAgIHNyYz1cInt7IGl0ZW0uaW1hZ2VQYXRoIHx8IChmYWxsYmFja0ltYWdlUGF0aCQgfCBhc3luYykgfX1cIlxuICAgICAgICAgIChlcnJvcik9XCJpbWdFcnJvcihpdGVtKVwiXG4gICAgICAgICAgYWx0PVwie3tyZXNvbHZlRmllbGREYXRhKGl0ZW0sIHRpdGxlTGluZUlkKXx8ICcnfX1cIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtZ3JpZC1pdGVtcyBmbGV4LXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUgZm9udC1tZWRpdW0gbXItMyB0ZXh0LTJ4bFwiPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiXCIgKGNsaWNrKT1cIm9uVmlld1Jvd1wiPnt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpIHx8ICcnIH19PC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIl9ncmlkSXRlbVN1YnRpdGxlTGluZXMgPyBfZ3JpZEl0ZW1TdWJ0aXRsZUxpbmVzIDogZGVmYXVsdEdyaWRJdGVtU3VidGl0bGVMaW5lc1wiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDppdGVtfVwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCJncmlkTWVudUl0ZW1zXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIj48L3AtbWVudT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWRJdGVtKGl0ZW0pOyB1cGRhdGVHcmlkTWVudUl0ZW1zKHRydWUpOyBtZW51LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1lbGxpcHNpcy12XCJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ09DWF9EQVRBX0xJU1RfR1JJRC5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNsYXNzPVwibW9yZS1hY3Rpb25zLW1lbnUtYnV0dG9uIG1lbnUtYnRuXCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwiJ2RhdGEtZ3JpZC1pdGVtLW1lbnUtYnV0dG9uJ1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRHcmlkSXRlbVN1YnRpdGxlTGluZXMgbGV0LWl0ZW0+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHN1YnRpdGxlTGluZUlkIG9mIHN1YnRpdGxlTGluZUlkc1wiIGNsYXNzPVwic3VidGl0bGVMaW5lIGVkaXQtdGltZSB0ZXh0LXhsIG15LTNcIj5cbiAgICB7eyByZXNvbHZlRmllbGREYXRhKGl0ZW0sIHN1YnRpdGxlTGluZUlkKSB9fVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRMaXN0SXRlbSBsZXQtaXRlbT5cbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtMSBhbGlnbi1pdGVtcy1jZW50ZXIgcC0zIHctZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGEtbGlzdC1pdGVtcyBmbGV4LTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tbmFtZS1yb3cgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLW5hbWUgbXItMyB0ZXh0LTJ4bCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwiXCIgKGNsaWNrKT1cIm9uVmlld1JvdyhpdGVtKVwiPnt7IHJlc29sdmVGaWVsZERhdGEoaXRlbSwgdGl0bGVMaW5lSWQpIHx8ICcnIH19PC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIG1kOmZsZXgtcm93IG1kOmp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlld0l0ZW1PYnNlcnZlZCAmJiAoIXZpZXdBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCB2aWV3QWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBtYi0xIG1yLTIgdmlld0xpc3RJdGVtQnV0dG9uXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICh2aWV3TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLlZJRVcnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIodmlld01lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5WSUVXJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblZpZXdSb3coaXRlbSlcIlxuICAgICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJ2aWV3UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhdmlld0FjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShpdGVtLCB2aWV3QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdEl0ZW1PYnNlcnZlZCAmJiAoIWVkaXRBY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCBlZGl0QWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IG1iLTEgbXItMiBlZGl0TGlzdEl0ZW1CdXR0b25cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChlZGl0TWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkVESVQnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZWRpdE1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5FRElUJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRSb3coaXRlbSlcIlxuICAgICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJlZGl0UGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhZWRpdEFjdGlvbkVuYWJsZWRGaWVsZCAmJiAhZmllbGRJc1RydXRoeShpdGVtLCBlZGl0QWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVsZXRlSXRlbU9ic2VydmVkICYmICghZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkIHx8IGZpZWxkSXNUcnV0aHkoaXRlbSwgZGVsZXRlQWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIG1iLTEgbXItMiBkZWxldGVMaXN0SXRlbUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKGRlbGV0ZU1lbnVJdGVtS2V5IHx8ICdPQ1hfREFUQV9MSVNUX0dSSUQuTUVOVS5ERUxFVEUnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZGVsZXRlTWVudUl0ZW1LZXkgfHwgJ09DWF9EQVRBX0xJU1RfR1JJRC5NRU5VLkRFTEVURScpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVSb3coaXRlbSlcIlxuICAgICAgICAgICAgICAgICpvY3hJZlBlcm1pc3Npb249XCJkZWxldGVQZXJtaXNzaW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFkZWxldGVBY3Rpb25FbmFibGVkRmllbGQgJiYgIWZpZWxkSXNUcnV0aHkoaXRlbSwgZGVsZXRlQWN0aW9uRW5hYmxlZEZpZWxkKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCInZGF0YS1saXN0LWFjdGlvbi1idXR0b24nXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWRkaXRpb25hbExpc3RBY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWFjdGlvbi5hY3Rpb25WaXNpYmxlRmllbGQgfHwgZmllbGRJc1RydXRoeShpdGVtLCBhY3Rpb24uYWN0aW9uVmlzaWJsZUZpZWxkKSlcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAqb2N4SWZQZXJtaXNzaW9uPVwiYWN0aW9uLnBlcm1pc3Npb25cIlxuICAgICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYWN0aW9uLmNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwiYWN0aW9uLmljb24gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5jYWxsYmFjayhpdGVtKVwiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiYWN0aW9uLmxhYmVsS2V5ID8gKGFjdGlvbi5sYWJlbEtleSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFjdGlvbi5sYWJlbEtleSA/IChhY3Rpb24ubGFiZWxLZXkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFjdGlvbi5kaXNhYmxlZCB8fCAoISFhY3Rpb24uYWN0aW9uRW5hYmxlZEZpZWxkICYmICFmaWVsZElzVHJ1dGh5KGl0ZW0sIGFjdGlvbi5hY3Rpb25FbmFibGVkRmllbGQpKVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc1Zpc2libGVPdmVyZmxvd01lbnVJdGVtcyhpdGVtKVwiPlxuICAgICAgICAgICAgICA8cC1tZW51ICNtZW51IFttb2RlbF09XCIoZ2V0T3ZlcmZsb3dNZW51SXRlbXMoaXRlbSkgfCBhc3luYykgfHwgW11cIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPjwvcC1tZW51PlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCIncGkgcGktZWxsaXBzaXMtdidcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtZW51LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cIidPQ1hfREFUQV9UQUJMRS5NT1JFX0FDVElPTlMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09DWF9EQVRBX1RBQkxFLk1PUkVfQUNUSU9OUycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1saWdodCBteS0xXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiX2xpc3RJdGVtU3VidGl0bGVMaW5lcyA/IF9saXN0SXRlbVN1YnRpdGxlTGluZXMgOiBkZWZhdWx0TGlzdEl0ZW1TdWJ0aXRsZUxpbmVzXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0Oml0ZW19XCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdExpc3RJdGVtU3VidGl0bGVMaW5lcyBsZXQtaXRlbT1cIiRpbXBsaWNpdFwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzdWJ0aXRsZUxpbmVJZCBvZiBzdWJ0aXRsZUxpbmVJZHNcIiBjbGFzcz1cInN1YnRpdGxlTGluZSB0ZXh0LXhsIG15LTNcIj57eyByZXNvbHZlRmllbGREYXRhKGl0ZW0sIHN1YnRpdGxlTGluZUlkKSB9fTwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|