@valtimo/dossier-management 10.7.0 → 11.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.
Files changed (56) hide show
  1. package/esm2022/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +75 -0
  2. package/{esm2020 → esm2022}/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/dossier-management-detail-container/dossier-management-detail-container.component.mjs +5 -5
  4. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +100 -0
  5. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +458 -0
  6. package/esm2022/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +416 -0
  7. package/esm2022/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +84 -0
  8. package/esm2022/lib/dossier-management-list/dossier-management-list.component.mjs +75 -0
  9. package/esm2022/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +59 -0
  10. package/{esm2020 → esm2022}/lib/dossier-management-routing.module.mjs +5 -5
  11. package/{esm2020 → esm2022}/lib/dossier-management-upload/dossier-management-upload.component.mjs +5 -5
  12. package/esm2022/lib/dossier-management.module.mjs +167 -0
  13. package/{esm2020 → esm2022}/lib/tab.service.mjs +4 -4
  14. package/{fesm2020 → fesm2022}/valtimo-dossier-management.mjs +158 -247
  15. package/fesm2022/valtimo-dossier-management.mjs.map +1 -0
  16. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts +1 -1
  17. package/lib/dossier-management-assignee/dossier-management-assignee.component.d.ts.map +1 -1
  18. package/lib/dossier-management-connect-modal/dossier-management-connect-modal.component.d.ts +1 -1
  19. package/lib/dossier-management-detail-container/dossier-management-detail-container.component.d.ts +1 -1
  20. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts +1 -3
  21. package/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.d.ts.map +1 -1
  22. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts +9 -10
  23. package/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.d.ts.map +1 -1
  24. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts +2 -2
  25. package/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.d.ts.map +1 -1
  26. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts +2 -2
  27. package/lib/dossier-management-link-process/dossier-management-link-process.component.d.ts.map +1 -1
  28. package/lib/dossier-management-list/dossier-management-list.component.d.ts +1 -2
  29. package/lib/dossier-management-list/dossier-management-list.component.d.ts.map +1 -1
  30. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts +1 -1
  31. package/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.d.ts.map +1 -1
  32. package/lib/dossier-management-upload/dossier-management-upload.component.d.ts +1 -1
  33. package/lib/dossier-management.module.d.ts +14 -16
  34. package/lib/dossier-management.module.d.ts.map +1 -1
  35. package/lib/models/list-column.model.d.ts +1 -1
  36. package/lib/models/list-column.model.d.ts.map +1 -1
  37. package/package.json +8 -14
  38. package/esm2020/lib/dossier-management-assignee/dossier-management-assignee.component.mjs +0 -73
  39. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-detail/dossier-management-detail.component.mjs +0 -104
  40. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-list-columns/dossier-management-list-columns.component.mjs +0 -456
  41. package/esm2020/lib/dossier-management-detail-container/tabs/dossier-management-search-fields/dossier-management-search-fields.component.mjs +0 -417
  42. package/esm2020/lib/dossier-management-link-process/dossier-management-link-process.component.mjs +0 -84
  43. package/esm2020/lib/dossier-management-list/dossier-management-list.component.mjs +0 -76
  44. package/esm2020/lib/dossier-management-remove-modal/dossier-management-remove-modal.component.mjs +0 -57
  45. package/esm2020/lib/dossier-management-roles/dossier-management-roles.component.mjs +0 -97
  46. package/esm2020/lib/dossier-management.module.mjs +0 -171
  47. package/fesm2015/valtimo-dossier-management.mjs +0 -1846
  48. package/fesm2015/valtimo-dossier-management.mjs.map +0 -1
  49. package/fesm2020/valtimo-dossier-management.mjs.map +0 -1
  50. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts +0 -33
  51. package/lib/dossier-management-roles/dossier-management-roles.component.d.ts.map +0 -1
  52. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  53. /package/{esm2020 → esm2022}/lib/models/list-column.model.mjs +0 -0
  54. /package/{esm2020 → esm2022}/lib/tab.enum.mjs +0 -0
  55. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  56. /package/{esm2020 → esm2022}/valtimo-dossier-management.mjs +0 -0
@@ -1,456 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, ViewChild } from '@angular/core';
17
- import { BehaviorSubject, combineLatest, delay, filter, map, startWith, Subject, switchMap, tap, } from 'rxjs';
18
- import { FormControl, FormGroup, Validators } from '@angular/forms';
19
- import { take } from 'rxjs/operators';
20
- import * as i0 from "@angular/core";
21
- import * as i1 from "@valtimo/document";
22
- import * as i2 from "@angular/router";
23
- import * as i3 from "@ngx-translate/core";
24
- import * as i4 from "@valtimo/config";
25
- import * as i5 from "@angular/platform-browser";
26
- import * as i6 from "@angular/common";
27
- import * as i7 from "@valtimo/components";
28
- import * as i8 from "@angular/forms";
29
- import * as i9 from "carbon-components-angular";
30
- import * as i10 from "@valtimo/user-interface";
31
- export class DossierManagementListColumnsComponent {
32
- constructor(documentService, route, translateService, configService, sanitizer) {
33
- this.documentService = documentService;
34
- this.route = route;
35
- this.translateService = translateService;
36
- this.configService = configService;
37
- this.sanitizer = sanitizer;
38
- this.downloadName$ = new BehaviorSubject('');
39
- this.downloadUrl$ = new BehaviorSubject(undefined);
40
- this.COLUMNS = [
41
- {
42
- viewType: 'string',
43
- sortable: false,
44
- propertyName: 'title',
45
- translationKey: 'title',
46
- },
47
- {
48
- viewType: 'string',
49
- sortable: false,
50
- propertyName: 'key',
51
- translationKey: 'key',
52
- },
53
- {
54
- viewType: 'string',
55
- sortable: false,
56
- propertyName: 'path',
57
- translationKey: 'path',
58
- },
59
- {
60
- viewType: 'string',
61
- sortable: false,
62
- propertyName: 'displayType',
63
- translationKey: 'displayType',
64
- },
65
- {
66
- viewType: 'string',
67
- sortable: false,
68
- propertyName: 'displayTypeParameters',
69
- translationKey: 'displayTypeParameters',
70
- },
71
- {
72
- viewType: 'string',
73
- sortable: false,
74
- propertyName: 'sortable',
75
- translationKey: 'sortable',
76
- },
77
- {
78
- viewType: 'string',
79
- sortable: false,
80
- propertyName: 'defaultSort',
81
- translationKey: 'defaultSort',
82
- },
83
- ];
84
- this.loadingCaseListColumns = true;
85
- this.fields$ = this.translateService.stream('key').pipe(map(() => this.COLUMNS.map(column => ({
86
- key: column.propertyName,
87
- label: this.translateService.instant(`listColumn.${column.translationKey}`),
88
- sortable: column.sortable,
89
- ...(column.viewType && { viewType: column.viewType }),
90
- ...(column.enum && { enum: column.enum }),
91
- }))));
92
- this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
93
- this.disableInput$ = new BehaviorSubject(false);
94
- this.hasEnvironmentConfig$ = this.documentDefinitionName$.pipe(map(documentDefinitionName => !!this.configService?.config?.customDefinitionTables[documentDefinitionName]));
95
- this.cachedCaseListColumns = [];
96
- this.refreshCaseListcolumns$ = new BehaviorSubject(null);
97
- this.caseListColumns$ = combineLatest([
98
- this.documentDefinitionName$,
99
- this.refreshCaseListcolumns$,
100
- ]).pipe(switchMap(([documentDefinitionName]) => this.documentService.getCaseList(documentDefinitionName)), tap(caseListColumns => {
101
- this.documentDefinitionName$.pipe(take(1)).subscribe(documentDefinitionName => {
102
- if (caseListColumns && Array.isArray(caseListColumns) && caseListColumns.length > 0) {
103
- this.setDownload(documentDefinitionName, caseListColumns);
104
- }
105
- });
106
- }), tap(caseListColumns => {
107
- this.cachedCaseListColumns = caseListColumns;
108
- this.loadingCaseListColumns = false;
109
- this.enableInput();
110
- }));
111
- this.translatedCaseListColumns$ = combineLatest([
112
- this.caseListColumns$,
113
- this.translateService.stream('key'),
114
- ]).pipe(map(([columns]) => columns.map(column => ({
115
- ...column,
116
- title: column.title || '-',
117
- sortable: column.sortable
118
- ? this.translateService.instant('listColumn.sortableYes')
119
- : this.translateService.instant('listColumn.sortableNo'),
120
- defaultSort: (column.defaultSort === 'ASC' &&
121
- this.translateService.instant('listColumn.sortableAsc')) ||
122
- (column.defaultSort === 'DESC' &&
123
- this.translateService.instant('listColumn.sortableDesc')) ||
124
- '-',
125
- displayType: this.translateService.instant(`listColumnDisplayType.${column?.displayType?.type}`),
126
- displayTypeParameters: this.getDisplayTypeParametersView(column.displayType.displayTypeParameters),
127
- }))));
128
- this.currentModalType$ = new BehaviorSubject('create');
129
- this.showModal$ = new BehaviorSubject(false);
130
- this.modalShowing$ = this.showModal$.pipe(delay(250));
131
- this.INVALID_KEY = 'invalid';
132
- this.formGroup = new FormGroup({
133
- title: new FormControl(''),
134
- key: new FormControl('', Validators.required),
135
- path: new FormControl('', Validators.required),
136
- dateFormat: new FormControl(''),
137
- displayType: new FormControl({
138
- key: this.INVALID_KEY,
139
- }),
140
- sortable: new FormControl(false),
141
- defaultSort: new FormControl({
142
- key: this.INVALID_KEY,
143
- }),
144
- enum: new FormControl([]),
145
- });
146
- this.disableDefaultSort$ = combineLatest([
147
- this.currentModalType$,
148
- this.formGroup.valueChanges,
149
- ]).pipe(map(([currentModalType]) => currentModalType === 'create' &&
150
- this.cachedCaseListColumns.find(column => !!column.defaultSort)), startWith(false));
151
- this.DISPLAY_TYPES = [
152
- 'string',
153
- 'date',
154
- 'boolean',
155
- 'enum',
156
- 'arrayCount',
157
- 'underscoresToSpaces',
158
- ];
159
- this.showDateFormat$ = this.formGroup.valueChanges.pipe(map(formValues => !!(formValues.displayType?.key === this.DISPLAY_TYPES[1])), tap(showDateFormat => {
160
- if (showDateFormat === false && !!this.formGroup.value.dateFormat) {
161
- this.formGroup.patchValue({ dateFormat: '' });
162
- }
163
- }), startWith(false));
164
- this.showEnum$ = this.formGroup.valueChanges.pipe(map(formValues => !!(formValues.displayType?.key === this.DISPLAY_TYPES[3] ||
165
- formValues.displayType?.key === this.DISPLAY_TYPES[2])), tap(showEnum => {
166
- const enumValue = this.formGroup.value.enum;
167
- if (showEnum === false && Array.isArray(enumValue) && enumValue.length > 0) {
168
- this.formGroup.patchValue({ enum: [] });
169
- }
170
- }), startWith(false));
171
- this.isYesNo$ = this.formGroup.valueChanges.pipe(map(formValues => !!(formValues.displayType?.key === this.DISPLAY_TYPES[2])));
172
- this.selectedViewTypeItemIndex$ = new BehaviorSubject(0);
173
- this.viewTypeItems$ = combineLatest([
174
- this.selectedViewTypeItemIndex$,
175
- this.translateService.stream('key'),
176
- ]).pipe(map(([selectedViewTypeItemIndex]) => [
177
- {
178
- content: this.translateService.instant(`listColumnDisplayType.select`),
179
- key: this.INVALID_KEY,
180
- },
181
- ...this.DISPLAY_TYPES.map(type => ({
182
- content: this.translateService.instant(`listColumnDisplayType.${type}`),
183
- key: type,
184
- })),
185
- ].map((item, index) => ({
186
- ...item,
187
- selected: index === selectedViewTypeItemIndex,
188
- }))));
189
- this.selectedSortItemIndex$ = new BehaviorSubject(0);
190
- this.sortItems$ = combineLatest([
191
- this.selectedSortItemIndex$,
192
- this.translateService.stream('key'),
193
- ]).pipe(map(([selectedSortItemIndex]) => [
194
- {
195
- content: this.translateService.instant(`listColumn.selectDefaultSort`),
196
- key: this.INVALID_KEY,
197
- },
198
- {
199
- content: this.translateService.instant(`listColumn.sortableAsc`),
200
- key: 'ASC',
201
- },
202
- {
203
- content: this.translateService.instant(`listColumn.sortableDesc`),
204
- key: 'DESC',
205
- },
206
- ].map((item, index) => ({
207
- ...item,
208
- selected: index === selectedSortItemIndex,
209
- }))));
210
- this.validKey$ = combineLatest([this.formGroup.valueChanges, this.currentModalType$]).pipe(map(([formValues, currentModalType]) => {
211
- const existingKeys = this.cachedCaseListColumns.map(column => column.key);
212
- return currentModalType === 'create' ? !existingKeys.includes(formValues.key) : true;
213
- }), startWith(false));
214
- this.valid$ = combineLatest([this.formGroup.valueChanges, this.validKey$]).pipe(map(([formValues, validKey]) => !!(formValues.displayType?.key !== this.INVALID_KEY &&
215
- formValues.path &&
216
- validKey &&
217
- (formValues.displayType.key === 'enum' ? formValues.enum?.length > 0 : true))), startWith(false));
218
- this.showDeleteModal$ = new Subject();
219
- this.deleteRowIndex$ = new BehaviorSubject(0);
220
- this.defaultEnumValues$ = new BehaviorSubject(undefined);
221
- }
222
- openModal(modalType) {
223
- this.showModal$.next(true);
224
- this.currentModalType$.next(modalType);
225
- if (modalType === 'create') {
226
- this.formGroup.controls['key'].enable();
227
- this.resetFormGroup();
228
- }
229
- else if (modalType === 'edit') {
230
- this.formGroup.controls['key'].disable();
231
- }
232
- }
233
- closeModal() {
234
- this.showModal$.next(false);
235
- }
236
- deleteRow(caseListColumnRowIndex, clickEvent) {
237
- clickEvent.stopPropagation();
238
- this.showDeleteModal$.next(true);
239
- this.deleteRowIndex$.next(caseListColumnRowIndex);
240
- }
241
- deleteRowConfirmation(caseListColumnRowIndex) {
242
- const columnKey = this.cachedCaseListColumns[caseListColumnRowIndex]?.key;
243
- if (columnKey) {
244
- this.disableInput();
245
- this.documentDefinitionName$.pipe(take(1)).subscribe(docDefName => {
246
- this.documentService.deleteCaseList(docDefName, columnKey).subscribe(() => {
247
- this.refreshCaseListColumns();
248
- }, () => {
249
- this.enableInput();
250
- });
251
- });
252
- }
253
- }
254
- moveRow(caseListColumnRowIndex, moveUp, clickEvent, documentDefinitionName) {
255
- const caseListColumns = [...this.cachedCaseListColumns];
256
- const caseListColumnRow = caseListColumns[caseListColumnRowIndex];
257
- clickEvent.stopPropagation();
258
- const caseListColumnIndex = caseListColumns.findIndex(field => field.key === caseListColumnRow.key);
259
- const foundCaseListColumn = { ...caseListColumns[caseListColumnIndex] };
260
- const filteredCaseListColumns = caseListColumns.filter(field => field.key !== caseListColumnRow.key);
261
- const multipleCaseListColumns = caseListColumns.length > 1;
262
- if (multipleCaseListColumns && moveUp && caseListColumnIndex > 0) {
263
- const caseListColumnBeforeKey = `${caseListColumns[caseListColumnIndex - 1].key}`;
264
- const caseListColumnBeforeIndex = filteredCaseListColumns.findIndex(field => field.key === caseListColumnBeforeKey);
265
- filteredCaseListColumns.splice(caseListColumnBeforeIndex, 0, foundCaseListColumn);
266
- this.updateCaseListColumns(documentDefinitionName, filteredCaseListColumns);
267
- }
268
- else if (multipleCaseListColumns && !moveUp && caseListColumnIndex < caseListColumns.length) {
269
- const caseListColumnAfterKey = `${caseListColumns[caseListColumnIndex + 1].key}`;
270
- const caseListColumnAfterIndex = filteredCaseListColumns.findIndex(field => field.key === caseListColumnAfterKey);
271
- filteredCaseListColumns.splice(caseListColumnAfterIndex + 1, 0, foundCaseListColumn);
272
- this.updateCaseListColumns(documentDefinitionName, filteredCaseListColumns);
273
- }
274
- }
275
- saveCasListColumns() {
276
- this.disableInput();
277
- this.currentModalType$.pipe(take(1)).subscribe(currentModalType => {
278
- if (currentModalType === 'create') {
279
- this.addColumn();
280
- }
281
- else {
282
- this.updateColumn();
283
- }
284
- });
285
- }
286
- enumValueChange(value) {
287
- this.formGroup.patchValue({ enum: value });
288
- }
289
- columnRowClicked(row) {
290
- this.resetFormGroup();
291
- combineLatest([this.viewTypeItems$, this.sortItems$])
292
- .pipe(take(1))
293
- .subscribe(([viewTypeItems, sortItems]) => {
294
- const column = this.cachedCaseListColumns.find(cachedColumn => cachedColumn.key === row.key);
295
- const viewTypeItem = viewTypeItems.find(item => item.key === column.displayType.type);
296
- const viewTypeItemIndex = viewTypeItems.findIndex(item => item.key === column.displayType.type);
297
- const sortItem = sortItems.find(item => item.key === column.defaultSort);
298
- const sortItemIndex = sortItems.findIndex(item => item.key === column.defaultSort);
299
- const enumValues = column?.displayType?.displayTypeParameters?.enum;
300
- const mappedEnumValues = [];
301
- const columnDateFormat = column?.displayType?.displayTypeParameters?.dateFormat;
302
- this.selectedViewTypeItemIndex$.next(viewTypeItemIndex);
303
- if (sortItem) {
304
- this.selectedSortItemIndex$.next(sortItemIndex);
305
- }
306
- if (enumValues) {
307
- Object.keys(enumValues).forEach(key => {
308
- mappedEnumValues.push({ key, value: enumValues[key] });
309
- });
310
- this.defaultEnumValues$.next(mappedEnumValues);
311
- }
312
- else {
313
- this.defaultEnumValues$.next([{ key: '', value: '' }]);
314
- }
315
- this.formGroup.patchValue({
316
- key: column.key,
317
- title: column.title,
318
- path: column.path,
319
- sortable: column.sortable,
320
- // @ts-ignore
321
- displayType: { ...viewTypeItem },
322
- // @ts-ignore
323
- defaultSort: sortItem ? { ...sortItem } : { ...sortItems[0] },
324
- ...(columnDateFormat && {
325
- dateFormat: columnDateFormat,
326
- }),
327
- });
328
- this.openModal('edit');
329
- });
330
- }
331
- updateCaseListColumns(documentDefinitionName, newCaseListColumns) {
332
- this.disableInput();
333
- this.documentService.putCaseList(documentDefinitionName, newCaseListColumns).subscribe(() => {
334
- this.refreshCaseListColumns();
335
- localStorage.setItem(`list-search-${documentDefinitionName}`, null);
336
- }, () => {
337
- this.enableInput();
338
- });
339
- }
340
- addColumn() {
341
- const formValue = this.formGroup.value;
342
- this.documentDefinitionName$.pipe(take(1)).subscribe(docDefName => {
343
- this.documentService
344
- .postCaseList(docDefName, this.mapFormValuesToColumn(formValue))
345
- .subscribe(() => {
346
- this.closeModal();
347
- this.refreshCaseListColumns();
348
- }, () => {
349
- this.enableInput();
350
- });
351
- });
352
- }
353
- getDisplayTypeParametersView(displayTypeParameters) {
354
- if (displayTypeParameters?.dateFormat) {
355
- return displayTypeParameters.dateFormat;
356
- }
357
- else if (displayTypeParameters?.enum) {
358
- return Object.keys(displayTypeParameters.enum).reduce((acc, curr) => {
359
- const keyValuePairString = `${curr}: ${displayTypeParameters.enum[curr]}`;
360
- if (!acc) {
361
- return `${keyValuePairString}`;
362
- }
363
- return `${acc}, ${keyValuePairString}`;
364
- }, '');
365
- }
366
- return '-';
367
- }
368
- updateColumn() {
369
- const updatedColumnFormValue = this.formGroup.value;
370
- const mappedUpdatedColumn = this.mapFormValuesToColumn(updatedColumnFormValue);
371
- const currentColumns = this.cachedCaseListColumns;
372
- const mappedCurrentColumns = currentColumns.map(column => {
373
- const columnCopy = { ...column };
374
- if (columnCopy.key === updatedColumnFormValue.key) {
375
- const changedColumn = { ...columnCopy, ...mappedUpdatedColumn };
376
- if (!mappedUpdatedColumn.defaultSort) {
377
- delete changedColumn.defaultSort;
378
- }
379
- return changedColumn;
380
- }
381
- if (mappedUpdatedColumn.defaultSort) {
382
- delete columnCopy.defaultSort;
383
- }
384
- return columnCopy;
385
- });
386
- this.documentDefinitionName$.pipe(take(1)).subscribe(docDefName => {
387
- this.documentService.putCaseList(docDefName, mappedCurrentColumns).subscribe(() => {
388
- this.closeModal();
389
- this.refreshCaseListColumns();
390
- }, () => {
391
- this.enableInput();
392
- });
393
- });
394
- }
395
- setDownload(documentDefinitionName, caseListColumns) {
396
- this.downloadName$.next(`${documentDefinitionName}.json`);
397
- this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
398
- encodeURIComponent(JSON.stringify(caseListColumns, null, 2))));
399
- }
400
- disableInput() {
401
- this.disableInput$.next(true);
402
- this.formGroup.disable();
403
- }
404
- enableInput() {
405
- this.disableInput$.next(false);
406
- this.formGroup.enable();
407
- }
408
- refreshCaseListColumns() {
409
- this.refreshCaseListcolumns$.next(null);
410
- }
411
- resetFormGroup() {
412
- this.formGroup.reset();
413
- combineLatest([this.sortItems$, this.viewTypeItems$])
414
- .pipe(take(1))
415
- .subscribe(([sortItems, viewTypeItems]) => {
416
- this.defaultEnumValues$.next([{ key: '', value: '' }]);
417
- this.selectedViewTypeItemIndex$.next(0);
418
- // @ts-ignore
419
- this.formGroup.patchValue({ displayType: viewTypeItems[0] });
420
- this.selectedSortItemIndex$.next(0);
421
- // @ts-ignore
422
- this.formGroup.patchValue({ defaultSort: sortItems[0] });
423
- });
424
- }
425
- mapFormValuesToColumn(formValue) {
426
- return {
427
- key: formValue.key,
428
- sortable: formValue.sortable,
429
- ...(formValue.defaultSort?.key !== this.INVALID_KEY && {
430
- defaultSort: formValue.defaultSort?.key,
431
- }),
432
- title: formValue.title || '',
433
- path: formValue.path,
434
- displayType: {
435
- type: formValue.displayType?.key,
436
- displayTypeParameters: {
437
- ...(formValue.dateFormat && { dateFormat: formValue.dateFormat }),
438
- ...(Array.isArray(formValue.enum) &&
439
- formValue.enum.length > 0 && {
440
- enum: formValue.enum.reduce((acc, curr) => ({ ...acc, [curr.key]: curr.value }), {}),
441
- }),
442
- },
443
- },
444
- };
445
- }
446
- }
447
- DossierManagementListColumnsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DossierManagementListColumnsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
448
- DossierManagementListColumnsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: DossierManagementListColumnsComponent, selector: "valtimo-dossier-management-list-columns", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n fields: fields$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.hasEnvironmentConfig; else environmentConfigWarning\">\n <ng-container *ngIf=\"!loadingCaseListColumns; else loading\">\n <ng-container *ngIf=\"obs.caseListColumn?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n {{ 'listColumn.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.caseListColumn\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.caseListColumn; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div\n class=\"cds--text-input__field-wrapper\"\n *ngIf=\"modalObs.showEnum || modalObs.isYesNo\"\n [ngClass]=\"{'no-margin': modalObs.isYesNo}\"\n >\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><<cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.no-margin{margin-bottom:0!important}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "component", type: i9.Notification, selector: "cds-notification, cds-inline-notification, ibm-notification, ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "directive", type: i9.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i9.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i9.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i9.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i9.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i9.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i9.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "component", type: i9.Label, selector: "cds-label, ibm-label", inputs: ["labelInputID", "disabled", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i9.TextInput, selector: "[cdsText], [ibmText]", inputs: ["theme", "size", "invalid", "warn", "skeleton"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i9.Dropdown, selector: "cds-dropdown, ibm-dropdown", inputs: ["id", "label", "helperText", "placeholder", "displayValue", "clearText", "size", "type", "theme", "disabled", "skeleton", "inline", "disableArrowKeys", "invalid", "invalidText", "warn", "warnText", "appendInline", "scrollableContainer", "itemValueKey", "selectionFeedback", "menuButtonLabel", "selectedLabel", "dropUp"], outputs: ["selected", "onClose", "close"] }, { kind: "component", type: i9.DropdownList, selector: "cds-dropdown-list, ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i9.Checkbox, selector: "cds-checkbox, ibm-checkbox", inputs: ["disabled", "skeleton", "hideLabel", "name", "id", "required", "value", "ariaLabel", "ariaLabelledby", "indeterminate", "checked"], outputs: ["click", "checkedChange", "indeterminateChange"] }, { kind: "component", type: i10.TooltipIconComponent, selector: "v-tooltip-icon", inputs: ["tooltip", "disabled"] }, { kind: "component", type: i7.CarbonMultiInputComponent, selector: "valtimo-carbon-multi-input", inputs: ["name", "title", "titleTranslationKey", "type", "initialAmountOfRows", "minimumAmountOfRows", "maxRows", "addRowText", "addRowTranslationKey", "deleteRowText", "deleteRowTranslationKey", "disabled", "defaultValues", "margin", "tooltip", "required", "keyColumnTitle", "valueColumnTitle", "dropdownColumnTitle", "hideDeleteButton", "hideAddButton", "dropdownItems", "dropdownWidth", "fullWidth"], outputs: ["valueChange", "allValuesValidEvent"] }, { kind: "component", type: i9.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i9.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent"] }, { kind: "directive", type: i7.ValtimoCdsModalDirective, selector: "[valtimoCdsModal]" }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
449
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: DossierManagementListColumnsComponent, decorators: [{
450
- type: Component,
451
- args: [{ selector: 'valtimo-dossier-management-list-columns', template: "<!--\n ~ Copyright 2015-2023 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<ng-container\n *ngIf=\"{\n caseListColumn: translatedCaseListColumns$ | async,\n fields: fields$ | async,\n documentDefinitionName: documentDefinitionName$ | async,\n hasEnvironmentConfig: hasEnvironmentConfig$ | async,\n downloadUrl: downloadUrl$ | async,\n downloadName: downloadName$ | async\n } as obs\"\n>\n <div class=\"container-fluid pr-0 pl-0\">\n <div class=\"text-right\">\n <div class=\"btn-group mt-m3px mb-3 mr-2\">\n <ng-container *ngTemplateOutlet=\"buttons; context: {obs: obs}\"></ng-container>\n </div>\n </div>\n <ng-container *ngIf=\"!obs.hasEnvironmentConfig; else environmentConfigWarning\">\n <ng-container *ngIf=\"!loadingCaseListColumns; else loading\">\n <ng-container *ngIf=\"obs.caseListColumn?.length > 0; else noConfigWarning\">\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"createEditModal\"></ng-container>\n <ng-container *ngTemplateOutlet=\"deleteModal\"></ng-container>\n</ng-container>\n\n<ng-template #buttons let-obs=\"obs\">\n <a\n cdsLink\n class=\"center-link\"\n [href]=\"obs.downloadUrl\"\n [download]=\"obs.downloadName\"\n [disabled]=\"\n obs.hasEnvironmentConfig ||\n !obs.downloadUrl ||\n !obs.downloadName ||\n obs.caseListColumn?.length < 1 ||\n obs.disableInput ||\n loadingCaseListColumns\n \"\n >\n {{ 'listColumn.downloadButtonText' | translate }}\n </a>\n <button\n (click)=\"openModal('create')\"\n cdsButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" cdsIcon=\"add\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<ng-template #moveRowButtons let-index=\"index\" let-length=\"length\">\n <div\n class=\"move-row-buttons\"\n *ngIf=\"{\n disableInput: disableInput$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n >\n <i\n class=\"mdi mdi-delete btn btn-outline-danger mr-1\"\n (click)=\"deleteRow(index, $event)\"\n [ngClass]=\"{'disabled disabled-move-row-button': obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-up-bold btn btn-outline-primary mr-1\"\n (click)=\"moveRow(index, true, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === 0 || obs.disableInput}\"\n ></i>\n <i\n class=\"mdi mdi-arrow-down-bold btn btn-outline-secondary\"\n (click)=\"moveRow(index, false, $event, obs.documentDefinitionName)\"\n [ngClass]=\"{'disabled disabled-move-row-button': index === length - 1 || obs.disableInput}\"\n ></i>\n </div>\n</ng-template>\n\n<ng-template #list let-obs=\"obs\">\n <valtimo-list\n [items]=\"obs.caseListColumn\"\n [fields]=\"obs.fields\"\n [viewMode]=\"false\"\n [header]=\"false\"\n *ngIf=\"obs.caseListColumn; else loading\"\n [lastColumnTemplate]=\"moveRowButtonsTemplateRef\"\n (rowClicked)=\"columnRowClicked($event)\"\n >\n </valtimo-list>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"mb-3\">\n <valtimo-spinner></valtimo-spinner>\n </div>\n</ng-template>\n\n<ng-template #environmentConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <cds-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false\n }\"\n >\n </cds-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <cds-modal\n valtimoCdsModal\n *ngIf=\"{\n type: currentModalType$ | async,\n show: showModal$ | async,\n valid: valid$ | async,\n disableInput: disableInput$ | async,\n validKey: validKey$ | async,\n disableDefaultSort: disableDefaultSort$ | async,\n showEnum: showEnum$ | async,\n isYesNo: isYesNo$ | async\n } as modalObs\"\n [open]=\"modalObs.show\"\n >\n <cds-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 cdsModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </cds-modal-header>\n <section cdsModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </cds-modal>\n</ng-template>\n\n<ng-template #modalContent let-modalObs=\"modalObs\">\n <form [formGroup]=\"formGroup\" class=\"list-column-form\">\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.titleTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.titleTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"title\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label\n [disabled]=\"modalObs.disableInput || modalObs.type === 'edit'\"\n [invalid]=\"modalObs.validKey === false\"\n [invalidText]=\"'listColumn.uniqueKeyWarning' | translate\"\n >\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.key' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.keyTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.path' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.pathTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"path\" />\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.displayType' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.displayTypeTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <cds-dropdown-list [items]=\"viewTypeItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip\">\n {{ 'listColumn.dateFormat' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.dateFormatTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <input cdsText formControlName=\"dateFormat\" />\n </cds-label>\n </div>\n <div\n class=\"cds--text-input__field-wrapper\"\n *ngIf=\"modalObs.showEnum || modalObs.isYesNo\"\n [ngClass]=\"{'no-margin': modalObs.isYesNo}\"\n >\n <cds-label [disabled]=\"modalObs.disableInput\">\n <span class=\"label-with-tooltip select-label\">\n {{\n modalObs.isYesNo\n ? ('listColumn.enumTitleOptional' | translate)\n : ('listColumn.enumTitle' | translate)\n }}\n <v-tooltip-icon\n [tooltip]=\"\n modalObs.isYesNo\n ? ('listColumn.enumTooltipOptional' | translate)\n : ('listColumn.enumTooltip' | translate)\n \"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <valtimo-carbon-multi-input\n *ngIf=\"(showModal$ | async) || (modalShowing$ | async)\"\n type=\"keyValue\"\n (valueChange)=\"enumValueChange($event)\"\n [defaultValues]=\"defaultEnumValues$ | async\"\n [hideAddButton]=\"modalObs.isYesNo\"\n [hideDeleteButton]=\"modalObs.isYesNo\"\n [maxRows]=\"modalObs.isYesNo ? 1 : null\"\n [keyColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.Yes' | translate)\"\n [valueColumnTitle]=\"modalObs.isYesNo && ('viewTypeConverter.No' | translate)\"\n ></valtimo-carbon-multi-input>\n </cds-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </cds-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <cds-label [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\">\n <span class=\"label-with-tooltip select-label\">\n {{ 'listColumn.defaultSortTitle' | translate }}\n <v-tooltip-icon\n [tooltip]=\"'listColumn.defaultSortTooltip' | translate\"\n [disabled]=\"modalObs.disableInput\"\n ></v-tooltip-icon>\n </span>\n <cds-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <cds-dropdown-list [items]=\"sortItems$ | async\"></cds-dropdown-list>\n </cds-dropdown>\n </cds-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <cds-modal-footer>\n <ng-container>\n <button\n cdsButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n cdsButton=\"primary\"\n [attr.modal-primary-focus]=\"true\"\n [disabled]=\"modalObs.valid === false\"\n (click)=\"saveCasListColumns()\"\n [disabled]=\"\n modalObs.disableInput || modalObs.valid === false || modalObs.validKey === false\n \"\n >\n {{ 'listColumn.save' | translate }}\n </button>\n </ng-container>\n </cds-modal-footer>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><<cds-loading></cds-loading></div>\n</ng-template>\n\n<ng-template #deleteModal>\n <valtimo-confirmation-modal\n [showModalSubject$]=\"showDeleteModal$\"\n [outputOnConfirm]=\"deleteRowIndex$ | async\"\n (confirmEvent)=\"deleteRowConfirmation($event)\"\n confirmButtonTextTranslationKey=\"listColumn.deleteColumn\"\n titleTranslationKey=\"listColumn.deleteColumn\"\n contentTranslationKey=\"listColumn.deleteColumnConfirmation\"\n ></valtimo-confirmation-modal>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 Ritense BV, the Netherlands.\n *\n * Licensed under EUPL, Version 1.2 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" basis,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */::ng-deep .tab-container{min-height:unset!important}::ng-deep .cds--inline-notification{max-width:100%}.label-with-tooltip{display:flex;align-items:center}.cds--text-input__field-wrapper:not(:last-child){margin-bottom:1rem}.no-margin{margin-bottom:0!important}.display-type-dropdown{width:300px}.list-column-form{margin-bottom:3rem}.select-label{padding-bottom:.5rem;width:250px}.loading-icon{width:100%;display:flex;align-items:center;justify-content:center}.center-link{display:flex;align-items:center}::ng-deep .move-row-buttons{display:flex;flex-direction:row;justify-content:flex-end;padding-right:13px}\n"] }]
452
- }], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
453
- type: ViewChild,
454
- args: ['moveRowButtons']
455
- }] } });
456
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2Rvc3NpZXItbWFuYWdlbWVudC1kZXRhaWwtY29udGFpbmVyL3RhYnMvZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvZG9zc2llci1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFlLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFVZCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQVNwQyxNQUFNLE9BQU8scUNBQXFDO0lBMFJoRCxZQUNtQixlQUFnQyxFQUNoQyxLQUFxQixFQUNyQixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsU0FBdUI7UUFK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Q3JELFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLEdBQUc7YUFDeEMsQ0FBQztZQUNGLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJO1lBQ3BCLFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHO2dCQUNoQyxxQkFBcUIsRUFBRTtvQkFDckIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksRUFBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBQyxDQUFDO29CQUMvRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO3dCQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUk7d0JBQzNCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7cUJBQ25GLENBQUM7aUJBQ0w7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDOztrSUF0a0JVLHFDQUFxQztzSEFBckMscUNBQXFDLDRNQ25EbEQsc3VZQXdWQTsyRkRyU2EscUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLHlDQUF5Qzt5TkFLZix5QkFBeUI7c0JBQTVELFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtDb21wb25lbnQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlLCBEZWZpbml0aW9uQ29sdW1ufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkZWxheSxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ2FzZUxpc3RDb2x1bW4sXG4gIENhc2VMaXN0Q29sdW1uVmlldyxcbiAgRGlzcGxheVR5cGVQYXJhbWV0ZXJzLFxuICBEb2N1bWVudFNlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2RvY3VtZW50JztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtMaXN0Q29sdW1uTW9kYWx9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TGlzdEl0ZW19IGZyb20gJ2NhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvZHJvcGRvd24vbGlzdC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge3Rha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RG9tU2FuaXRpemVyLCBTYWZlVXJsfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7TXVsdGlJbnB1dFZhbHVlc30gZnJvbSAnQHZhbHRpbW8vdXNlci1pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWRvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9zc2llck1hbmFnZW1lbnRMaXN0Q29sdW1uc0NvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ21vdmVSb3dCdXR0b25zJykgcHVibGljIG1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT47XG4gIHJlYWRvbmx5IGRvd25sb2FkTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBkb3dubG9hZFVybCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNhZmVVcmw+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDT0xVTU5TOiBBcnJheTxEZWZpbml0aW9uQ29sdW1uPiA9IFtcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICd0aXRsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3RpdGxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2tleScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2tleScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdwYXRoJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAncGF0aCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5VHlwZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2Rpc3BsYXlUeXBlUGFyYW1ldGVycycsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdzb3J0YWJsZScsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3NvcnRhYmxlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2RlZmF1bHRTb3J0JyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGVmYXVsdFNvcnQnLFxuICAgIH0sXG4gIF07XG5cbiAgbG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyA9IHRydWU7XG5cbiAgcmVhZG9ubHkgZmllbGRzJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0RmllbGQ+PiA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLnBpcGUoXG4gICAgbWFwKCgpID0+XG4gICAgICB0aGlzLkNPTFVNTlMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICBrZXk6IGNvbHVtbi5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi4ke2NvbHVtbi50cmFuc2xhdGlvbktleX1gKSxcbiAgICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZSxcbiAgICAgICAgLi4uKGNvbHVtbi52aWV3VHlwZSAmJiB7dmlld1R5cGU6IGNvbHVtbi52aWV3VHlwZX0pLFxuICAgICAgICAuLi4oY29sdW1uLmVudW0gJiYge2VudW06IGNvbHVtbi5lbnVtfSksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMucm91dGUucGFyYW1zLnBpcGUoXG4gICAgbWFwKHBhcmFtcyA9PiBwYXJhbXMubmFtZSB8fCAnJyksXG4gICAgZmlsdGVyKGRvY0RlZk5hbWUgPT4gISFkb2NEZWZOYW1lKVxuICApO1xuXG4gIHJlYWRvbmx5IGRpc2FibGVJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBoYXNFbnZpcm9ubWVudENvbmZpZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICAhIXRoaXMuY29uZmlnU2VydmljZT8uY29uZmlnPy5jdXN0b21EZWZpbml0aW9uVGFibGVzW2RvY3VtZW50RGVmaW5pdGlvbk5hbWVdXG4gICAgKVxuICApO1xuXG4gIHByaXZhdGUgY2FjaGVkQ2FzZUxpc3RDb2x1bW5zOiBBcnJheTxDYXNlTGlzdENvbHVtbj4gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hDYXNlTGlzdGNvbHVtbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudWxsPihudWxsKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhc2VMaXN0Q29sdW1ucyQ6IE9ic2VydmFibGU8QXJyYXk8Q2FzZUxpc3RDb2x1bW4+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQsXG4gICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3Rjb2x1bW5zJCxcbiAgXSkucGlwZShcbiAgICBzd2l0Y2hNYXAoKFtkb2N1bWVudERlZmluaXRpb25OYW1lXSkgPT5cbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldENhc2VMaXN0KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgKSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB7XG4gICAgICAgIGlmIChjYXNlTGlzdENvbHVtbnMgJiYgQXJyYXkuaXNBcnJheShjYXNlTGlzdENvbHVtbnMpICYmIGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXREb3dubG9hZChkb2N1bWVudERlZmluaXRpb25OYW1lLCBjYXNlTGlzdENvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSxcbiAgICB0YXAoY2FzZUxpc3RDb2x1bW5zID0+IHtcbiAgICAgIHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zID0gY2FzZUxpc3RDb2x1bW5zO1xuICAgICAgdGhpcy5sb2FkaW5nQ2FzZUxpc3RDb2x1bW5zID0gZmFsc2U7XG4gICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgfSlcbiAgKTtcblxuICByZWFkb25seSB0cmFuc2xhdGVkQ2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtblZpZXc+PiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY2FzZUxpc3RDb2x1bW5zJCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtjb2x1bW5zXSkgPT5cbiAgICAgIGNvbHVtbnMubWFwKGNvbHVtbiA9PiAoe1xuICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgIHRpdGxlOiBjb2x1bW4udGl0bGUgfHwgJy0nLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlXG4gICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZVllcycpXG4gICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZU5vJyksXG4gICAgICAgIGRlZmF1bHRTb3J0OlxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdBU0MnICYmXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZUFzYycpKSB8fFxuICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdERVNDJyAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVEZXNjJykpIHx8XG4gICAgICAgICAgJy0nLFxuICAgICAgICBkaXNwbGF5VHlwZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke2NvbHVtbj8uZGlzcGxheVR5cGU/LnR5cGV9YFxuICAgICAgICApLFxuICAgICAgICBkaXNwbGF5VHlwZVBhcmFtZXRlcnM6IHRoaXMuZ2V0RGlzcGxheVR5cGVQYXJhbWV0ZXJzVmlldyhcbiAgICAgICAgICBjb2x1bW4uZGlzcGxheVR5cGUuZGlzcGxheVR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICksXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudE1vZGFsVHlwZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpc3RDb2x1bW5Nb2RhbD4oJ2NyZWF0ZScpO1xuXG4gIHJlYWRvbmx5IHNob3dNb2RhbCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBtb2RhbFNob3dpbmckID0gdGhpcy5zaG93TW9kYWwkLnBpcGUoZGVsYXkoMjUwKSk7XG5cbiAgcmVhZG9ubHkgSU5WQUxJRF9LRVkgPSAnaW52YWxpZCc7XG5cbiAgcmVhZG9ubHkgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAga2V5OiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIHBhdGg6IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgZGF0ZUZvcm1hdDogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICBkaXNwbGF5VHlwZTogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBzb3J0YWJsZTogbmV3IEZvcm1Db250cm9sKGZhbHNlKSxcbiAgICBkZWZhdWx0U29ydDogbmV3IEZvcm1Db250cm9sKHtcbiAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICB9KSxcbiAgICBlbnVtOiBuZXcgRm9ybUNvbnRyb2woW10pLFxuICB9KTtcblxuICByZWFkb25seSBkaXNhYmxlRGVmYXVsdFNvcnQkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5jdXJyZW50TW9kYWxUeXBlJCxcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFtjdXJyZW50TW9kYWxUeXBlXSkgPT5cbiAgICAgICAgY3VycmVudE1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICAgdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnMuZmluZChjb2x1bW4gPT4gISFjb2x1bW4uZGVmYXVsdFNvcnQpXG4gICAgKSxcbiAgICBzdGFydFdpdGgoZmFsc2UpXG4gICk7XG5cbiAgcmVhZG9ubHkgRElTUExBWV9UWVBFUzogQXJyYXk8c3RyaW5nPiA9IFtcbiAgICAnc3RyaW5nJyxcbiAgICAnZGF0ZScsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdlbnVtJyxcbiAgICAnYXJyYXlDb3VudCcsXG4gICAgJ3VuZGVyc2NvcmVzVG9TcGFjZXMnLFxuICBdO1xuXG4gIHJlYWRvbmx5IHNob3dEYXRlRm9ybWF0JCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgIG1hcChmb3JtVmFsdWVzID0+ICEhKGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzFdKSksXG4gICAgdGFwKHNob3dEYXRlRm9ybWF0ID0+IHtcbiAgICAgIGlmIChzaG93RGF0ZUZvcm1hdCA9PT0gZmFsc2UgJiYgISF0aGlzLmZvcm1Hcm91cC52YWx1ZS5kYXRlRm9ybWF0KSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2RhdGVGb3JtYXQ6ICcnfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dFbnVtJCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgIG1hcChcbiAgICAgIGZvcm1WYWx1ZXMgPT5cbiAgICAgICAgISEoXG4gICAgICAgICAgZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ID09PSB0aGlzLkRJU1BMQVlfVFlQRVNbM10gfHxcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1syXVxuICAgICAgICApXG4gICAgKSxcbiAgICB0YXAoc2hvd0VudW0gPT4ge1xuICAgICAgY29uc3QgZW51bVZhbHVlID0gdGhpcy5mb3JtR3JvdXAudmFsdWUuZW51bTtcbiAgICAgIGlmIChzaG93RW51bSA9PT0gZmFsc2UgJiYgQXJyYXkuaXNBcnJheShlbnVtVmFsdWUpICYmIGVudW1WYWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe2VudW06IFtdfSk7XG4gICAgICB9XG4gICAgfSksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzWWVzTm8kID0gdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgbWFwKGZvcm1WYWx1ZXMgPT4gISEoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ID09PSB0aGlzLkRJU1BMQVlfVFlQRVNbMl0pKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gIHJlYWRvbmx5IHZpZXdUeXBlSXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RJdGVtPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXhdKSA9PlxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS5zZWxlY3RgKSxcbiAgICAgICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnRoaXMuRElTUExBWV9UWVBFUy5tYXAodHlwZSA9PiAoe1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuJHt0eXBlfWApLFxuICAgICAgICAgIGtleTogdHlwZSxcbiAgICAgICAgfSkpLFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgsXG4gICAgICB9KSlcbiAgICApXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ZWRTb3J0SXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICByZWFkb25seSBzb3J0SXRlbXMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RJdGVtPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLnNlbGVjdGVkU29ydEl0ZW1JbmRleCQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbc2VsZWN0ZWRTb3J0SXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNlbGVjdERlZmF1bHRTb3J0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW4uc29ydGFibGVBc2NgKSxcbiAgICAgICAgICBrZXk6ICdBU0MnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY29udGVudDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW4uc29ydGFibGVEZXNjYCksXG4gICAgICAgICAga2V5OiAnREVTQycsXG4gICAgICAgIH0sXG4gICAgICBdLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XG4gICAgICAgIC4uLml0ZW0sXG4gICAgICAgIHNlbGVjdGVkOiBpbmRleCA9PT0gc2VsZWN0ZWRTb3J0SXRlbUluZGV4LFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbGlkS2V5JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcywgdGhpcy5jdXJyZW50TW9kYWxUeXBlJF0pLnBpcGUoXG4gICAgbWFwKChbZm9ybVZhbHVlcywgY3VycmVudE1vZGFsVHlwZV0pID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nS2V5cyA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zLm1hcChjb2x1bW4gPT4gY29sdW1uLmtleSk7XG4gICAgICByZXR1cm4gY3VycmVudE1vZGFsVHlwZSA9PT0gJ2NyZWF0ZScgPyAhZXhpc3RpbmdLZXlzLmluY2x1ZGVzKGZvcm1WYWx1ZXMua2V5KSA6IHRydWU7XG4gICAgfSksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IHZhbGlkJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcywgdGhpcy52YWxpZEtleSRdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbZm9ybVZhbHVlcywgdmFsaWRLZXldKSA9PlxuICAgICAgICAhIShcbiAgICAgICAgICBmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgIT09IHRoaXMuSU5WQUxJRF9LRVkgJiZcbiAgICAgICAgICBmb3JtVmFsdWVzLnBhdGggJiZcbiAgICAgICAgICB2YWxpZEtleSAmJlxuICAgICAgICAgIChmb3JtVmFsdWVzLmRpc3BsYXlUeXBlLmtleSA9PT0gJ2VudW0nID8gZm9ybVZhbHVlcy5lbnVtPy5sZW5ndGggPiAwIDogdHJ1ZSlcbiAgICAgICAgKVxuICAgICksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IHNob3dEZWxldGVNb2RhbCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IGRlbGV0ZVJvd0luZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICByZWFkb25seSBkZWZhdWx0RW51bVZhbHVlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE11bHRpSW5wdXRWYWx1ZXM+KHVuZGVmaW5lZCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7fVxuICBvcGVuTW9kYWwobW9kYWxUeXBlOiBMaXN0Q29sdW1uTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dNb2RhbCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLm5leHQobW9kYWxUeXBlKTtcblxuICAgIGlmIChtb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1sna2V5J10uZW5hYmxlKCk7XG4gICAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG4gICAgfSBlbHNlIGlmIChtb2RhbFR5cGUgPT09ICdlZGl0Jykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbJ2tleSddLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZU1vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd01vZGFsJC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyhjYXNlTGlzdENvbHVtblJvd0luZGV4OiBudW1iZXIsIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjbGlja0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5zaG93RGVsZXRlTW9kYWwkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kZWxldGVSb3dJbmRleCQubmV4dChjYXNlTGlzdENvbHVtblJvd0luZGV4KTtcbiAgfVxuXG4gIGRlbGV0ZVJvd0NvbmZpcm1hdGlvbihjYXNlTGlzdENvbHVtblJvd0luZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjb2x1bW5LZXkgPSB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1uc1tjYXNlTGlzdENvbHVtblJvd0luZGV4XT8ua2V5O1xuXG4gICAgaWYgKGNvbHVtbktleSkge1xuICAgICAgdGhpcy5kaXNhYmxlSW5wdXQoKTtcblxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkb2NEZWZOYW1lID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZGVsZXRlQ2FzZUxpc3QoZG9jRGVmTmFtZSwgY29sdW1uS2V5KS5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbW92ZVJvdyhcbiAgICBjYXNlTGlzdENvbHVtblJvd0luZGV4OiBudW1iZXIsXG4gICAgbW92ZVVwOiBib29sZWFuLFxuICAgIGNsaWNrRXZlbnQ6IE1vdXNlRXZlbnQsXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1ucyA9IFsuLi50aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1uc107XG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5Sb3cgPSBjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5Sb3dJbmRleF07XG5cbiAgICBjbGlja0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgY2FzZUxpc3RDb2x1bW5JbmRleCA9IGNhc2VMaXN0Q29sdW1ucy5maW5kSW5kZXgoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uUm93LmtleVxuICAgICk7XG4gICAgY29uc3QgZm91bmRDYXNlTGlzdENvbHVtbiA9IHsuLi5jYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleF19O1xuICAgIGNvbnN0IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zID0gY2FzZUxpc3RDb2x1bW5zLmZpbHRlcihcbiAgICAgIGZpZWxkID0+IGZpZWxkLmtleSAhPT0gY2FzZUxpc3RDb2x1bW5Sb3cua2V5XG4gICAgKTtcbiAgICBjb25zdCBtdWx0aXBsZUNhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGggPiAxO1xuXG4gICAgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmIG1vdmVVcCAmJiBjYXNlTGlzdENvbHVtbkluZGV4ID4gMCkge1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCAtIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5CZWZvcmVJbmRleCA9IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkJlZm9yZUtleVxuICAgICAgKTtcbiAgICAgIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLnNwbGljZShjYXNlTGlzdENvbHVtbkJlZm9yZUluZGV4LCAwLCBmb3VuZENhc2VMaXN0Q29sdW1uKTtcbiAgICAgIHRoaXMudXBkYXRlQ2FzZUxpc3RDb2x1bW5zKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zKTtcbiAgICB9IGVsc2UgaWYgKG11bHRpcGxlQ2FzZUxpc3RDb2x1bW5zICYmICFtb3ZlVXAgJiYgY2FzZUxpc3RDb2x1bW5JbmRleCA8IGNhc2VMaXN0Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXkgPSBgJHtjYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5JbmRleCArIDFdLmtleX1gO1xuICAgICAgY29uc3QgY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ID0gZmlsdGVyZWRDYXNlTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGNhc2VMaXN0Q29sdW1uQWZ0ZXJLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucy5zcGxpY2UoY2FzZUxpc3RDb2x1bW5BZnRlckluZGV4ICsgMSwgMCwgZm91bmRDYXNlTGlzdENvbHVtbik7XG4gICAgICB0aGlzLnVwZGF0ZUNhc2VMaXN0Q29sdW1ucyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZUNhc0xpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICB0aGlzLmN1cnJlbnRNb2RhbFR5cGUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGN1cnJlbnRNb2RhbFR5cGUgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW51bVZhbHVlQ2hhbmdlKHZhbHVlOiBBcnJheTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4pOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiB2YWx1ZX0pO1xuICB9XG5cbiAgY29sdW1uUm93Q2xpY2tlZChyb3c6IHtrZXk6IHN0cmluZ30pOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0Rm9ybUdyb3VwKCk7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnZpZXdUeXBlSXRlbXMkLCB0aGlzLnNvcnRJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt2aWV3VHlwZUl0ZW1zLCBzb3J0SXRlbXNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zLmZpbmQoXG4gICAgICAgICAgY2FjaGVkQ29sdW1uID0+IGNhY2hlZENvbHVtbi5rZXkgPT09IHJvdy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtID0gdmlld1R5cGVJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kaXNwbGF5VHlwZS50eXBlKTtcbiAgICAgICAgY29uc3Qgdmlld1R5cGVJdGVtSW5kZXggPSB2aWV3VHlwZUl0ZW1zLmZpbmRJbmRleChcbiAgICAgICAgICBpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBzb3J0SXRlbSA9IHNvcnRJdGVtcy5maW5kKGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IHNvcnRJdGVtSW5kZXggPSBzb3J0SXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5rZXkgPT09IGNvbHVtbi5kZWZhdWx0U29ydCk7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW07XG4gICAgICAgIGNvbnN0IG1hcHBlZEVudW1WYWx1ZXM6IE11bHRpSW5wdXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0ZUZvcm1hdCA9IGNvbHVtbj8uZGlzcGxheVR5cGU/LmRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZGF0ZUZvcm1hdDtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkVmlld1R5cGVJdGVtSW5kZXgkLm5leHQodmlld1R5cGVJdGVtSW5kZXgpO1xuXG4gICAgICAgIGlmIChzb3J0SXRlbSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTb3J0SXRlbUluZGV4JC5uZXh0KHNvcnRJdGVtSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudW1WYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhlbnVtVmFsdWVzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBtYXBwZWRFbnVtVmFsdWVzLnB1c2goe2tleSwgdmFsdWU6IGVudW1WYWx1ZXNba2V5XX0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQobWFwcGVkRW51bVZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0RW51bVZhbHVlcyQubmV4dChbe2tleTogJycsIHZhbHVlOiAnJ31dKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoe1xuICAgICAgICAgIGtleTogY29sdW1uLmtleSxcbiAgICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlLFxuICAgICAgICAgIHBhdGg6IGNvbHVtbi5wYXRoLFxuICAgICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRpc3BsYXlUeXBlOiB7Li4udmlld1R5cGVJdGVtfSxcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgZGVmYXVsdFNvcnQ6IHNvcnRJdGVtID8gey4uLnNvcnRJdGVtfSA6IHsuLi5zb3J0SXRlbXNbMF19LFxuICAgICAgICAgIC4uLihjb2x1bW5EYXRlRm9ybWF0ICYmIHtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ6IGNvbHVtbkRhdGVGb3JtYXQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCdlZGl0Jyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2FzZUxpc3RDb2x1bW5zKFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZyxcbiAgICBuZXdDYXNlTGlzdENvbHVtbnM6IEFycmF5PENhc2VMaXN0Q29sdW1uPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2UucHV0Q2FzZUxpc3QoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgbmV3Q2FzZUxpc3RDb2x1bW5zKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgbGlzdC1zZWFyY2gtJHtkb2N1bWVudERlZmluaXRpb25OYW1lfWAsIG51bGwpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFkZENvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZTtcblxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgICAucG9zdENhc2VMaXN0KGRvY0RlZk5hbWUsIHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERpc3BsYXlUeXBlUGFyYW1ldGVyc1ZpZXcoZGlzcGxheVR5cGVQYXJhbWV0ZXJzOiBEaXNwbGF5VHlwZVBhcmFtZXRlcnMpOiBzdHJpbmcge1xuICAgIGlmIChkaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmRhdGVGb3JtYXQpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZGF0ZUZvcm1hdDtcbiAgICB9IGVsc2UgaWYgKGRpc3BsYXlUeXBlUGFyYW1ldGVycz8uZW51bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGRpc3BsYXlUeXBlUGFyYW1ldGVycy5lbnVtKS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICBjb25zdCBrZXlWYWx1ZVBhaXJTdHJpbmcgPSBgJHtjdXJyfTogJHtkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZW51bVtjdXJyXX1gO1xuICAgICAgICBpZiAoIWFjYykge1xuICAgICAgICAgIHJldHVybiBgJHtrZXlWYWx1ZVBhaXJTdHJpbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHthY2N9LCAke2tleVZhbHVlUGFpclN0cmluZ31gO1xuICAgICAgfSwgJycpO1xuICAgIH1cblxuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uRm9ybVZhbHVlID0gdGhpcy5mb3JtR3JvdXAudmFsdWU7XG4gICAgY29uc3QgbWFwcGVkVXBkYXRlZENvbHVtbiA9IHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKHVwZGF0ZWRDb2x1bW5Gb3JtVmFsdWUpO1xuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5zID0gdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnM7XG4gICAgY29uc3QgbWFwcGVkQ3VycmVudENvbHVtbnMgPSBjdXJyZW50Q29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbkNvcHkgPSB7Li4uY29sdW1ufTtcbiAgICAgIGlmIChjb2x1bW5Db3B5LmtleSA9PT0gdXBkYXRlZENvbHVtbkZvcm1WYWx1ZS5rZXkpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlZENvbHVtbiA9IHsuLi5jb2x1bW5Db3B5LCAuLi5tYXBwZWRVcGRhdGVkQ29sdW1ufTtcbiAgICAgICAgaWYgKCFtYXBwZWRVcGRhdGVkQ29sdW1uLmRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgZGVsZXRlIGNoYW5nZWRDb2x1bW4uZGVmYXVsdFNvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBpZiAobWFwcGVkVXBkYXRlZENvbHVtbi5kZWZhdWx0U29ydCkge1xuICAgICAgICBkZWxldGUgY29sdW1uQ29weS5kZWZhdWx0U29ydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5Db3B5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkb2NEZWZOYW1lID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLnB1dENhc2VMaXN0KGRvY0RlZk5hbWUsIG1hcHBlZEN1cnJlbnRDb2x1bW5zKS5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RG93bmxvYWQoXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLFxuICAgIGNhc2VMaXN0Q29sdW1uczogQXJyYXk8Q2FzZUxpc3RDb2x1bW4+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZG93bmxvYWROYW1lJC5uZXh0KGAke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9Lmpzb25gKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsJC5uZXh0KFxuICAgICAgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChcbiAgICAgICAgJ2RhdGE6dGV4dC9qc29uO2NoYXJzZXQ9VVRGLTgsJyArXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNhc2VMaXN0Q29sdW1ucywgbnVsbCwgMikpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Y29sdW1ucyQubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNvcnRJdGVtcyQsIHRoaXMudmlld1R5cGVJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtzb3J0SXRlbXMsIHZpZXdUeXBlSXRlbXNdKSA9PiB7XG4gICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQoW3trZXk6ICcnLCB2YWx1ZTogJyd9XSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkaXNwbGF5VHlwZTogdmlld1R5cGVJdGVtc1swXX0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU29ydEl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkZWZhdWx0U29ydDogc29ydEl0ZW1zWzBdfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZTogYW55KTogQ2FzZUxpc3RDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGZvcm1WYWx1ZS5rZXksXG4gICAgICBzb3J0YWJsZTogZm9ybVZhbHVlLnNvcnRhYmxlLFxuICAgICAgLi4uKGZvcm1WYWx1ZS5kZWZhdWx0U29ydD8ua2V5ICE9PSB0aGlzLklOVkFMSURfS0VZICYmIHtcbiAgICAgICAgZGVmYXVsdFNvcnQ6IGZvcm1WYWx1ZS5kZWZhdWx0U29ydD8ua2V5LFxuICAgICAgfSksXG4gICAgICB0aXRsZTogZm9ybVZhbHVlLnRpdGxlIHx8ICcnLFxuICAgICAgcGF0aDogZm9ybVZhbHVlLnBhdGgsXG4gICAgICBkaXNwbGF5VHlwZToge1xuICAgICAgICB0eXBlOiBmb3JtVmFsdWUuZGlzcGxheVR5cGU/LmtleSxcbiAgICAgICAgZGlzcGxheVR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLi4uKGZvcm1WYWx1ZS5kYXRlRm9ybWF0ICYmIHtkYXRlRm9ybWF0OiBmb3JtVmFsdWUuZGF0ZUZvcm1hdH0pLFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS5lbnVtKSAmJlxuICAgICAgICAgICAgZm9ybVZhbHVlLmVudW0ubGVuZ3RoID4gMCAmJiB7XG4gICAgICAgICAgICAgIGVudW06IGZvcm1WYWx1ZS5lbnVtLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiAoey4uLmFjYywgW2N1cnIua2V5XTogY3Vyci52YWx1ZX0pLCB7fSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIGNhc2VMaXN0Q29sdW1uOiB0cmFuc2xhdGVkQ2FzZUxpc3RDb2x1bW5zJCB8IGFzeW5jLFxuICAgIGZpZWxkczogZmllbGRzJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmMsXG4gICAgaGFzRW52aXJvbm1lbnRDb25maWc6IGhhc0Vudmlyb25tZW50Q29uZmlnJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkVXJsOiBkb3dubG9hZFVybCQgfCBhc3luYyxcbiAgICBkb3dubG9hZE5hbWU6IGRvd25sb2FkTmFtZSQgfCBhc3luY1xuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgcHItMCBwbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgbXQtbTNweCBtYi0zIG1yLTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb2JzLmhhc0Vudmlyb25tZW50Q29uZmlnOyBlbHNlIGVudmlyb25tZW50Q29uZmlnV2FybmluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nQ2FzZUxpc3RDb2x1bW5zOyBlbHNlIGxvYWRpbmdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9icy5jYXNlTGlzdENvbHVtbj8ubGVuZ3RoID4gMDsgZWxzZSBub0NvbmZpZ1dhcm5pbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNyZWF0ZUVkaXRNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVsZXRlTW9kYWxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbnMgbGV0LW9icz1cIm9ic1wiPlxuICA8YVxuICAgIGNkc0xpbmtcbiAgICBjbGFzcz1cImNlbnRlci1saW5rXCJcbiAgICBbaHJlZl09XCJvYnMuZG93bmxvYWRVcmxcIlxuICAgIFtkb3dubG9hZF09XCJvYnMuZG93bmxvYWROYW1lXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICBvYnMuaGFzRW52aXJvbm1lbnRDb25maWcgfHxcbiAgICAgICFvYnMuZG93bmxvYWRVcmwgfHxcbiAgICAgICFvYnMuZG93bmxvYWROYW1lIHx8XG4gICAgICBvYnMuY2FzZUxpc3RDb2x1bW4/Lmxlbmd0aCA8IDEgfHxcbiAgICAgIG9icy5kaXNhYmxlSW5wdXQgfHxcbiAgICAgIGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcbiAgICBcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uZG93bmxvYWRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwib3Blbk1vZGFsKCdjcmVhdGUnKVwiXG4gICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgc2l6ZT1cIm1kXCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnIHx8IGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcIlxuICAgIGNsYXNzPVwibWwtM1wiXG4gID5cbiAgICB7eyAnbGlzdENvbHVtbi5hZGRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJhZGRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vdmVSb3dCdXR0b25zIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWxlbmd0aD1cImxlbmd0aFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb3ZlLXJvdy1idXR0b25zXCJcbiAgICAqbmdJZj1cIntcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1xuICAgIH0gYXMgb2JzXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktZGVsZXRlIGJ0biBidG4tb3V0bGluZS1kYW5nZXIgbXItMVwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlUm93KGluZGV4LCAkZXZlbnQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy11cC1ib2xkIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIHRydWUsICRldmVudCwgb2JzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IDAgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy1kb3duLWJvbGQgYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXG4gICAgICAoY2xpY2spPVwibW92ZVJvdyhpbmRleCwgZmFsc2UsICRldmVudCwgb2JzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IGxlbmd0aCAtIDEgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tbGlzdFxuICAgIFtpdGVtc109XCJvYnMuY2FzZUxpc3RDb2x1bW5cIlxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAqbmdJZj1cIm9icy5jYXNlTGlzdENvbHVtbjsgZWxzZSBsb2FkaW5nXCJcbiAgICBbbGFzdENvbHVtblRlbXBsYXRlXT1cIm1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWZcIlxuICAgIChyb3dDbGlja2VkKT1cImNvbHVtblJvd0NsaWNrZWQoJGV2ZW50KVwiXG4gID5cbiAgPC92YWx0aW1vLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgPHZhbHRpbW8tc3Bpbm5lcj48L3ZhbHRpbW8tc3Bpbm5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Vudmlyb25tZW50Q29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlLFxuICAgICAgICBtZXNzYWdlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZVxuICAgICAgfVwiXG4gICAgPlxuICAgIDwvY2RzLW5vdGlmaWNhdGlvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vQ29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGNkcy1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5ub0NvbmZpZ1dhcm5pbmdUaXRsZScgfCB0cmFuc2xhdGUsXG4gICAgICAgIG1lc3NhZ2U6ICdsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZycgfCB0cmFuc2xhdGUsXG4gICAgICAgIHNob3dDbG9zZTogZmFsc2VcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2Nkcy1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjcmVhdGVFZGl0TW9kYWw+XG4gIDxjZHMtbW9kYWxcbiAgICB2YWx0aW1vQ2RzTW9kYWxcbiAgICAqbmdJZj1cIntcbiAgICAgIHR5cGU6IGN1cnJlbnRNb2RhbFR5cGUkIHwgYXN5bmMsXG4gICAgICBzaG93OiBzaG93TW9kYWwkIHwgYXN5bmMsXG4gICAgICB2YWxpZDogdmFsaWQkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCQgfCBhc3luYyxcbiAgICAgIHZhbGlkS2V5OiB2YWxpZEtleSQgfCBhc3luYyxcbiAgICAgIGRpc2FibGVEZWZhdWx0U29ydDogZGlzYWJsZURlZmF1bHRTb3J0JCB8IGFzeW5jLFxuICAgICAgc2hvd0VudW06IHNob3dFbnVtJCB8IGFzeW5jLFxuICAgICAgaXNZZXNObzogaXNZZXNObyQgfCBhc3luY1xuICAgIH0gYXMgbW9kYWxPYnNcIlxuICAgIFtvcGVuXT1cIm1vZGFsT2JzLnNob3dcIlxuICA+XG4gICAgPGNkcy1tb2RhbC1oZWFkZXIgW3Nob3dDbG9zZUJ1dHRvbl09XCJ0cnVlXCIgKGNsb3NlU2VsZWN0KT1cImNsb3NlTW9kYWwoKVwiPlxuICAgICAgPGgzIGNkc01vZGFsSGVhZGVySGVhZGluZz5cbiAgICAgICAge3tcbiAgICAgICAgICBtb2RhbE9icy50eXBlID09PSAnY3JlYXRlJ1xuICAgICAgICAgICAgPyAoJ2xpc3RDb2x1bW4uYWRkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lZGl0Q29sdW1uVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuICAgICAgPC9oMz5cbiAgICA8L2Nkcy1tb2RhbC1oZWFkZXI+XG4gICAgPHNlY3Rpb24gY2RzTW9kYWxDb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsQ29udGVudDsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NlY3Rpb24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsRm9vdGVyOyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50IGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgY2xhc3M9XCJsaXN0LWNvbHVtbi1mb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4udGl0bGVUaXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLnRpdGxlVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgPC9jZHMtbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGNkcy1sYWJlbFxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnR5cGUgPT09ICdlZGl0J1wiXG4gICAgICAgIFtpbnZhbGlkXT1cIm1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVwiXG4gICAgICAgIFtpbnZhbGlkVGV4dF09XCInbGlzdENvbHVtbi51bmlxdWVLZXlXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4ua2V5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4ua2V5VG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCIgW2ludmFsaWRdPVwibW9kYWxPYnMudmFsaWRLZXkgPT09IGZhbHNlXCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLnBhdGgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5wYXRoVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGNkc1RleHQgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kaXNwbGF5VHlwZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJ2aWV3VHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9jZHMtZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9jZHMtZHJvcGRvd24+XG4gICAgICA8L2Nkcy1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCIgKm5nSWY9XCJzaG93RGF0ZUZvcm1hdCQgfCBhc3luY1wiPlxuICAgICAgPGNkcy1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGF0ZUZvcm1hdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmRhdGVGb3JtYXRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgY2RzVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlRm9ybWF0XCIgLz5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCJcbiAgICAgICpuZ0lmPVwibW9kYWxPYnMuc2hvd0VudW0gfHwgbW9kYWxPYnMuaXNZZXNOb1wiXG4gICAgICBbbmdDbGFzc109XCJ7J25vLW1hcmdpbic6IG1vZGFsT2JzLmlzWWVzTm99XCJcbiAgICA+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIG1vZGFsT2JzLmlzWWVzTm9cbiAgICAgICAgICAgICAgPyAoJ2xpc3RDb2x1bW4uZW51bVRpdGxlT3B0aW9uYWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lbnVtVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICAgICAgbW9kYWxPYnMuaXNZZXNOb1xuICAgICAgICAgICAgICAgID8gKCdsaXN0Q29sdW1uLmVudW1Ub29sdGlwT3B0aW9uYWwnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVudW1Ub29sdGlwJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIihzaG93TW9kYWwkIHwgYXN5bmMpIHx8IChtb2RhbFNob3dpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICB0eXBlPVwia2V5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJlbnVtVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwiZGVmYXVsdEVudW1WYWx1ZXMkIHwgYXN5bmNcIlxuICAgICAgICAgIFtoaWRlQWRkQnV0dG9uXT1cIm1vZGFsT2JzLmlzWWVzTm9cIlxuICAgICAgICAgIFtoaWRlRGVsZXRlQnV0dG9uXT1cIm1vZGFsT2JzLmlzWWVzTm9cIlxuICAgICAgICAgIFttYXhSb3dzXT1cIm1vZGFsT2JzLmlzWWVzTm8gPyAxIDogbnVsbFwiXG4gICAgICAgICAgW2tleUNvbHVtblRpdGxlXT1cIm1vZGFsT2JzLmlzWWVzTm8gJiYgKCd2aWV3VHlwZUNvbnZlcnRlci5ZZXMnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgW3ZhbHVlQ29sdW1uVGl0bGVdPVwibW9kYWxPYnMuaXNZZXNObyAmJiAoJ3ZpZXdUeXBlQ29udmVydGVyLk5vJyB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICA+PC92YWx0aW1vLWNhcmJvbi1tdWx0aS1pbnB1dD5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxjZHMtY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwic29ydGFibGVcIlxuICAgICAgICA+e3sgJ2xpc3RDb2x1bW4uc29ydGFibGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2Nkcy1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8Y2RzLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMuZGlzYWJsZURlZmF1bHRTb3J0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwIHNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRlZmF1bHRTb3J0VGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kZWZhdWx0U29ydFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxjZHMtZHJvcGRvd25cbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0U29ydFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy5kaXNhYmxlRGVmYXVsdFNvcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNkcy1kcm9wZG93bi1saXN0IFtpdGVtc109XCJzb3J0SXRlbXMkIHwgYXN5bmNcIj48L2Nkcy1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2Nkcy1kcm9wZG93bj5cbiAgICAgIDwvY2RzLWxhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsRm9vdGVyIGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxjZHMtbW9kYWwtZm9vdGVyPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNkc0J1dHRvbj1cInNlY29uZGFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZU1vZGFsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUNhc0xpc3RDb2x1bW5zKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgbW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnZhbGlkID09PSBmYWxzZSB8fCBtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Nkcy1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWljb25cIj48PGNkcy1sb2FkaW5nPjwvY2RzLWxvYWRpbmc+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dJbmRleCQgfCBhc3luY1wiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJkZWxldGVSb3dDb25maXJtYXRpb24oJGV2ZW50KVwiXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwibGlzdENvbHVtbi5kZWxldGVDb2x1bW5cIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uQ29uZmlybWF0aW9uXCJcbiAgPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuIl19