@valtimo/dossier-management 10.1.0 → 10.2.1

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.
@@ -13,19 +13,30 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Component } from '@angular/core';
17
- import { filter, map, switchMap } from 'rxjs';
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';
18
20
  import * as i0 from "@angular/core";
19
21
  import * as i1 from "@valtimo/document";
20
22
  import * as i2 from "@angular/router";
21
23
  import * as i3 from "@ngx-translate/core";
22
- import * as i4 from "@angular/common";
23
- import * as i5 from "@valtimo/components";
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";
24
31
  export class DossierManagementListColumnsComponent {
25
- constructor(documentService, route, translateService) {
32
+ constructor(documentService, route, translateService, configService, sanitizer) {
26
33
  this.documentService = documentService;
27
34
  this.route = route;
28
35
  this.translateService = translateService;
36
+ this.configService = configService;
37
+ this.sanitizer = sanitizer;
38
+ this.downloadName$ = new BehaviorSubject('');
39
+ this.downloadUrl$ = new BehaviorSubject(undefined);
29
40
  this.COLUMNS = [
30
41
  {
31
42
  viewType: 'string',
@@ -70,6 +81,7 @@ export class DossierManagementListColumnsComponent {
70
81
  translationKey: 'defaultSort',
71
82
  },
72
83
  ];
84
+ this.loadingCaseListColumns = true;
73
85
  this.fields$ = this.translateService.stream('key').pipe(map(() => this.COLUMNS.map(column => ({
74
86
  key: column.propertyName,
75
87
  label: this.translateService.instant(`listColumn.${column.translationKey}`),
@@ -78,9 +90,28 @@ export class DossierManagementListColumnsComponent {
78
90
  ...(column.enum && { enum: column.enum }),
79
91
  }))));
80
92
  this.documentDefinitionName$ = this.route.params.pipe(map(params => params.name || ''), filter(docDefName => !!docDefName));
81
- this.caseListColumns$ = this.translateService
82
- .stream('key')
83
- .pipe(switchMap(() => this.documentDefinitionName$), switchMap(documentDefinitionName => this.documentService.getCaseList(documentDefinitionName)), map(columns => columns.map(column => ({
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 => ({
84
115
  ...column,
85
116
  title: column.title || '-',
86
117
  sortable: column.sortable
@@ -94,6 +125,230 @@ export class DossierManagementListColumnsComponent {
94
125
  displayType: this.translateService.instant(`listColumnDisplayType.${column?.displayType?.type}`),
95
126
  displayTypeParameters: this.getDisplayTypeParametersView(column.displayType.displayTypeParameters),
96
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
+ });
97
352
  }
98
353
  getDisplayTypeParametersView(displayTypeParameters) {
99
354
  if (displayTypeParameters?.dateFormat) {
@@ -114,11 +369,92 @@ export class DossierManagementListColumnsComponent {
114
369
  return '-';
115
370
  }
116
371
  }
372
+ updateColumn() {
373
+ const updatedColumnFormValue = this.formGroup.value;
374
+ const mappedUpdatedColumn = this.mapFormValuesToColumn(updatedColumnFormValue);
375
+ const currentColumns = this.cachedCaseListColumns;
376
+ const mappedCurrentColumns = currentColumns.map(column => {
377
+ const columnCopy = { ...column };
378
+ if (columnCopy.key === updatedColumnFormValue.key) {
379
+ const changedColumn = { ...columnCopy, ...mappedUpdatedColumn };
380
+ if (!mappedUpdatedColumn.defaultSort) {
381
+ delete changedColumn.defaultSort;
382
+ }
383
+ return changedColumn;
384
+ }
385
+ if (mappedUpdatedColumn.defaultSort) {
386
+ delete columnCopy.defaultSort;
387
+ }
388
+ return columnCopy;
389
+ });
390
+ this.documentDefinitionName$.pipe(take(1)).subscribe(docDefName => {
391
+ this.documentService.putCaseList(docDefName, mappedCurrentColumns).subscribe(() => {
392
+ this.closeModal();
393
+ this.refreshCaseListColumns();
394
+ }, () => {
395
+ this.enableInput();
396
+ });
397
+ });
398
+ }
399
+ setDownload(documentDefinitionName, caseListColumns) {
400
+ this.downloadName$.next(`${documentDefinitionName}.json`);
401
+ this.downloadUrl$.next(this.sanitizer.bypassSecurityTrustUrl('data:text/json;charset=UTF-8,' +
402
+ encodeURIComponent(JSON.stringify(caseListColumns, null, 2))));
403
+ }
404
+ disableInput() {
405
+ this.disableInput$.next(true);
406
+ this.formGroup.disable();
407
+ }
408
+ enableInput() {
409
+ this.disableInput$.next(false);
410
+ this.formGroup.enable();
411
+ }
412
+ refreshCaseListColumns() {
413
+ this.refreshCaseListcolumns$.next(null);
414
+ }
415
+ resetFormGroup() {
416
+ this.formGroup.reset();
417
+ combineLatest([this.sortItems$, this.viewTypeItems$])
418
+ .pipe(take(1))
419
+ .subscribe(([sortItems, viewTypeItems]) => {
420
+ this.defaultEnumValues$.next([{ key: '', value: '' }]);
421
+ this.selectedViewTypeItemIndex$.next(0);
422
+ // @ts-ignore
423
+ this.formGroup.patchValue({ displayType: viewTypeItems[0] });
424
+ this.selectedSortItemIndex$.next(0);
425
+ // @ts-ignore
426
+ this.formGroup.patchValue({ defaultSort: sortItems[0] });
427
+ });
428
+ }
429
+ mapFormValuesToColumn(formValue) {
430
+ return {
431
+ key: formValue.key,
432
+ sortable: formValue.sortable,
433
+ ...(formValue.defaultSort?.key !== this.INVALID_KEY && {
434
+ defaultSort: formValue.defaultSort?.key,
435
+ }),
436
+ title: formValue.title || '',
437
+ path: formValue.path,
438
+ displayType: {
439
+ type: formValue.displayType?.key,
440
+ displayTypeParameters: {
441
+ ...(formValue.dateFormat && { dateFormat: formValue.dateFormat }),
442
+ ...(Array.isArray(formValue.enum) &&
443
+ formValue.enum.length > 0 && {
444
+ enum: formValue.enum.reduce((acc, curr) => ({ ...acc, [curr.key]: curr.value }), {}),
445
+ }),
446
+ },
447
+ },
448
+ };
449
+ }
117
450
  }
118
- DossierManagementListColumnsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DossierManagementListColumnsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
119
- DossierManagementListColumnsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DossierManagementListColumnsComponent, selector: "valtimo-dossier-management-list-columns", ngImport: i0, template: "<!--\n ~ Copyright 2015-2022 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: caseListColumns$ | async,\n fields: fields$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n</ng-container>\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 >\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", styles: ["::ng-deep .tab-container{min-height:unset!important}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ListComponent, selector: "valtimo-list", inputs: ["items", "fields", "pagination", "viewMode", "isSearchable", "header", "actions", "paginationIdentifier", "initialSortState", "lastColumnTemplate"], outputs: ["rowClicked", "paginationClicked", "paginationSet", "search", "sortChanged"] }, { kind: "component", type: i5.SpinnerComponent, selector: "valtimo-spinner", inputs: ["useBootstrapSpinner", "name", "type", "size", "color", "bdColor", "fullScreen", "noMarginTop"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
451
+ DossierManagementListColumnsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DossierManagementListColumnsComponent, deps: [{ token: i1.DocumentService }, { token: i2.ActivatedRoute }, { token: i3.TranslateService }, { token: i4.ConfigService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
452
+ DossierManagementListColumnsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DossierManagementListColumnsComponent, selector: "valtimo-dossier-management-list-columns", viewQueries: [{ propertyName: "moveRowButtonsTemplateRef", first: true, predicate: ["moveRowButtons"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2022 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 ibmLink\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 ibmButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" ibmIcon=\"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 <ibm-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <ibm-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <ibm-modal\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 <ibm-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 ibmModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </ibm-modal-header>\n <section ibmModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </ibm-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 <ibm-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 ibmText formControlName=\"title\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"path\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <ibm-dropdown-list [items]=\"viewTypeItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <ibm-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 ibmText formControlName=\"dateFormat\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <ibm-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]=\"'listColumn.enumTooltip' | translate\"\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 ></valtimo-carbon-multi-input>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </ibm-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <ibm-dropdown-list [items]=\"sortItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <ibm-modal-footer>\n <ng-container>\n <button\n ibmButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n ibmButton=\"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 </ibm-modal-footer>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><<ibm-loading></ibm-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: ["::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}.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: "ibm-notification,ibm-inline-notification", inputs: ["notificationObj"] }, { kind: "directive", type: i9.Button, selector: "[ibmButton]", inputs: ["ibmButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i9.IconDirective, selector: "[ibmIcon]", inputs: ["ibmIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i9.Modal, selector: "ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i9.ModalHeader, selector: "ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i9.ModalFooter, selector: "ibm-modal-footer" }, { kind: "directive", type: i9.ModalContent, selector: "[ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i9.ModalHeaderHeading, selector: "[ibmModalHeaderHeading]" }, { kind: "component", type: i9.Label, selector: "ibm-label", inputs: ["labelInputID", "disabled", "labelState", "skeleton", "helperText", "invalidText", "invalid", "warn", "warnText", "ariaLabel"] }, { kind: "directive", type: i9.TextInput, selector: "[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: "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: "ibm-dropdown-list", inputs: ["ariaLabel", "items", "listTpl", "type", "showTitles"], outputs: ["select", "scroll", "blurIntent"] }, { kind: "component", type: i9.Checkbox, selector: "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"], outputs: ["valueChange"] }, { kind: "component", type: i9.Loading, selector: "ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i9.Link, selector: "[ibmLink]", inputs: ["inline", "disabled"] }, { kind: "component", type: i7.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "cancelButtonText", "cancelButtonTextTranslationKey", "showModalSubject$", "outputOnConfirm"], outputs: ["confirmEvent"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
120
453
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DossierManagementListColumnsComponent, decorators: [{
121
454
  type: Component,
122
- args: [{ selector: 'valtimo-dossier-management-list-columns', template: "<!--\n ~ Copyright 2015-2022 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: caseListColumns$ | async,\n fields: fields$ | async,\n documentDefinitionName: documentDefinitionName$ | async\n } as obs\"\n>\n <ng-container *ngTemplateOutlet=\"list; context: {obs: obs}\"></ng-container>\n</ng-container>\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 >\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", styles: ["::ng-deep .tab-container{min-height:unset!important}\n"] }]
123
- }], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }]; } });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2Rvc3NpZXItbWFuYWdlbWVudC1kZXRhaWwtY29udGFpbmVyL3RhYnMvZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvZG9zc2llci1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3hDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFjLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQVV4RCxNQUFNLE9BQU8scUNBQXFDO0lBMkZoRCxZQUNtQixlQUFnQyxFQUNoQyxLQUFxQixFQUNyQixnQkFBa0M7UUFGbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUE3RnBDLFlBQU8sR0FBNEI7WUFDbEQ7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFlBQVksRUFBRSxPQUFPO2dCQUNyQixjQUFjLEVBQUUsT0FBTzthQUN4QjtZQUNE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QzdCbEQsbXlDQTBDQTs0RkRiYSxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UseUNBQXlDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjIgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMaXN0RmllbGR9IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtEZWZpbml0aW9uQ29sdW1ufSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q2FzZUxpc3RDb2x1bW5WaWV3LCBEaXNwbGF5VHlwZVBhcmFtZXRlcnMsIERvY3VtZW50U2VydmljZX0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IENPTFVNTlM6IEFycmF5PERlZmluaXRpb25Db2x1bW4+ID0gW1xuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ3RpdGxlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAndGl0bGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAna2V5JyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAna2V5JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ3BhdGgnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdwYXRoJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ2Rpc3BsYXlUeXBlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGlzcGxheVR5cGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZGlzcGxheVR5cGVQYXJhbWV0ZXJzJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnZGlzcGxheVR5cGVQYXJhbWV0ZXJzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHZpZXdUeXBlOiAnc3RyaW5nJyxcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHByb3BlcnR5TmFtZTogJ3NvcnRhYmxlJyxcbiAgICAgIHRyYW5zbGF0aW9uS2V5OiAnc29ydGFibGUnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZGVmYXVsdFNvcnQnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdkZWZhdWx0U29ydCcsXG4gICAgfSxcbiAgXTtcblxuICByZWFkb25seSBmaWVsZHMkOiBPYnNlcnZhYmxlPEFycmF5PExpc3RGaWVsZD4+ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT5cbiAgICAgIHRoaXMuQ09MVU1OUy5tYXAoY29sdW1uID0+ICh7XG4gICAgICAgIGtleTogY29sdW1uLnByb3BlcnR5TmFtZSxcbiAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLiR7Y29sdW1uLnRyYW5zbGF0aW9uS2V5fWApLFxuICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAuLi4oY29sdW1uLnZpZXdUeXBlICYmIHt2aWV3VHlwZTogY29sdW1uLnZpZXdUeXBlfSksXG4gICAgICAgIC4uLihjb2x1bW4uZW51bSAmJiB7ZW51bTogY29sdW1uLmVudW19KSxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5uYW1lIHx8ICcnKSxcbiAgICBmaWx0ZXIoZG9jRGVmTmFtZSA9PiAhIWRvY0RlZk5hbWUpXG4gICk7XG5cbiAgcmVhZG9ubHkgY2FzZUxpc3RDb2x1bW5zJDogT2JzZXJ2YWJsZTxBcnJheTxDYXNlTGlzdENvbHVtblZpZXc+PiA9IHRoaXMudHJhbnNsYXRlU2VydmljZVxuICAgIC5zdHJlYW0oJ2tleScpXG4gICAgLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCksXG4gICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRDYXNlTGlzdChkb2N1bWVudERlZmluaXRpb25OYW1lKSksXG4gICAgICBtYXAoY29sdW1ucyA9PlxuICAgICAgICBjb2x1bW5zLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgdGl0bGU6IGNvbHVtbi50aXRsZSB8fCAnLScsXG4gICAgICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlzdENvbHVtbi5zb3J0YWJsZVllcycpXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaXN0Q29sdW1uLnNvcnRhYmxlTm8nKSxcbiAgICAgICAgICBkZWZhdWx0U29ydDpcbiAgICAgICAgICAgIChjb2x1bW4uZGVmYXVsdFNvcnQgPT09ICdBU0MnICYmXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaXN0Q29sdW1uLnNvcnRhYmxlQXNjJykpIHx8XG4gICAgICAgICAgICAoY29sdW1uLmRlZmF1bHRTb3J0ID09PSAnREVTQycgJiZcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVEZXNjJykpIHx8XG4gICAgICAgICAgICAnLScsXG4gICAgICAgICAgZGlzcGxheVR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgYGxpc3RDb2x1bW5EaXNwbGF5VHlwZS4ke2NvbHVtbj8uZGlzcGxheVR5cGU/LnR5cGV9YFxuICAgICAgICAgICksXG4gICAgICAgICAgZGlzcGxheVR5cGVQYXJhbWV0ZXJzOiB0aGlzLmdldERpc3BsYXlUeXBlUGFyYW1ldGVyc1ZpZXcoXG4gICAgICAgICAgICBjb2x1bW4uZGlzcGxheVR5cGUuZGlzcGxheVR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICAgKSxcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KGRpc3BsYXlUeXBlUGFyYW1ldGVyczogRGlzcGxheVR5cGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcbiAgICBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5kYXRlRm9ybWF0KSB7XG4gICAgICByZXR1cm4gZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmRhdGVGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChkaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW0pIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZW51bSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyU3RyaW5nID0gYCR7Y3Vycn06ICR7ZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW1bY3Vycl19YDtcbiAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICByZXR1cm4gYCR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGAke2FjY30sICR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH1cbiAgICAgIH0sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICctJztcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIyIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIntcbiAgICBjYXNlTGlzdENvbHVtbjogY2FzZUxpc3RDb2x1bW5zJCB8IGFzeW5jLFxuICAgIGZpZWxkczogZmllbGRzJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdCBsZXQtb2JzPVwib2JzXCI+XG4gIDx2YWx0aW1vLWxpc3RcbiAgICBbaXRlbXNdPVwib2JzLmNhc2VMaXN0Q29sdW1uXCJcbiAgICBbZmllbGRzXT1cIm9icy5maWVsZHNcIlxuICAgIFt2aWV3TW9kZV09XCJmYWxzZVwiXG4gICAgW2hlYWRlcl09XCJmYWxzZVwiXG4gICAgKm5nSWY9XCJvYnMuY2FzZUxpc3RDb2x1bW47IGVsc2UgbG9hZGluZ1wiXG4gID5cbiAgPC92YWx0aW1vLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgPHZhbHRpbW8tc3Bpbm5lcj48L3ZhbHRpbW8tc3Bpbm5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
455
+ args: [{ selector: 'valtimo-dossier-management-list-columns', template: "<!--\n ~ Copyright 2015-2022 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 ibmLink\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 ibmButton=\"primary\"\n size=\"md\"\n [disabled]=\"obs.hasEnvironmentConfig || loadingCaseListColumns\"\n class=\"ml-3\"\n >\n {{ 'listColumn.addButtonText' | translate }}\n <svg class=\"cds--btn__icon\" ibmIcon=\"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 <ibm-notification\n [notificationObj]=\"{\n type: 'warning',\n title: 'listColumn.hasEnvConfigWarningTitle' | translate,\n message: 'listColumn.hasEnvConfigWarning' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #noConfigWarning>\n <div class=\"pl-2 pr-2 pb-2\">\n <ibm-notification\n [notificationObj]=\"{\n type: 'info',\n title: 'listColumn.noConfigWarningTitle' | translate,\n message: 'listColumn.noConfigWarning' | translate,\n showClose: false\n }\"\n >\n </ibm-notification>\n </div>\n</ng-template>\n\n<ng-template #createEditModal>\n <ibm-modal\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 <ibm-modal-header [showCloseButton]=\"true\" (closeSelect)=\"closeModal()\">\n <h3 ibmModalHeaderHeading>\n {{\n modalObs.type === 'create'\n ? ('listColumn.addButtonText' | translate)\n : ('listColumn.editColumnTitle' | translate)\n }}\n </h3>\n </ibm-modal-header>\n <section ibmModalContent>\n <ng-container *ngTemplateOutlet=\"modalContent; context: {modalObs: modalObs}\"></ng-container>\n </section>\n <ng-container *ngTemplateOutlet=\"modalFooter; context: {modalObs: modalObs}\"></ng-container>\n </ibm-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 <ibm-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 ibmText formControlName=\"title\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"key\" [invalid]=\"modalObs.validKey === false\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 ibmText formControlName=\"path\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown formControlName=\"displayType\" [disabled]=\"modalObs.disableInput\">\n <ibm-dropdown-list [items]=\"viewTypeItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"showDateFormat$ | async\">\n <ibm-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 ibmText formControlName=\"dateFormat\" />\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\" *ngIf=\"modalObs.showEnum || modalObs.isYesNo\">\n <ibm-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]=\"'listColumn.enumTooltip' | translate\"\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 ></valtimo-carbon-multi-input>\n </ibm-label>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-checkbox formControlName=\"sortable\"\n >{{ 'listColumn.sortable' | translate }}\n </ibm-checkbox>\n </div>\n <div class=\"cds--text-input__field-wrapper\">\n <ibm-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 <ibm-dropdown\n formControlName=\"defaultSort\"\n [disabled]=\"modalObs.disableInput || modalObs.disableDefaultSort\"\n >\n <ibm-dropdown-list [items]=\"sortItems$ | async\"></ibm-dropdown-list>\n </ibm-dropdown>\n </ibm-label>\n </div>\n </form>\n</ng-template>\n\n<ng-template #modalFooter let-modalObs=\"modalObs\">\n <ibm-modal-footer>\n <ng-container>\n <button\n ibmButton=\"secondary\"\n [attr.modal-primary-focus]=\"true\"\n (click)=\"closeModal()\"\n [disabled]=\"modalObs.disableInput\"\n >\n {{ 'listColumn.close' | translate }}\n </button>\n <button\n ibmButton=\"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 </ibm-modal-footer>\n</ng-template>\n\n<ng-template #loading>\n <div class=\"loading-icon\"><<ibm-loading></ibm-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: ["::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}.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"] }]
456
+ }], ctorParameters: function () { return [{ type: i1.DocumentService }, { type: i2.ActivatedRoute }, { type: i3.TranslateService }, { type: i4.ConfigService }, { type: i5.DomSanitizer }]; }, propDecorators: { moveRowButtonsTemplateRef: [{
457
+ type: ViewChild,
458
+ args: ['moveRowButtons']
459
+ }] } });
460
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXItbWFuYWdlbWVudC9zcmMvbGliL2Rvc3NpZXItbWFuYWdlbWVudC1kZXRhaWwtY29udGFpbmVyL3RhYnMvZG9zc2llci1tYW5hZ2VtZW50LWxpc3QtY29sdW1ucy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZG9zc2llci1tYW5hZ2VtZW50L3NyYy9saWIvZG9zc2llci1tYW5hZ2VtZW50LWRldGFpbC1jb250YWluZXIvdGFicy9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFlLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdoRSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixLQUFLLEVBQ0wsTUFBTSxFQUNOLEdBQUcsRUFFSCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFVZCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7OztBQVNwQyxNQUFNLE9BQU8scUNBQXFDO0lBMFJoRCxZQUNtQixlQUFnQyxFQUNoQyxLQUFxQixFQUNyQixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsU0FBdUI7UUFK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QUFJLENBQUMsV0FBVyxJQUFJO2dCQUNyRCxXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHO2FBQ3hDLENBQUM7WUFDRixLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtZQUNwQixXQUFXLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsR0FBRztnQkFDaEMscUJBQXFCLEVBQUU7b0JBQ3JCLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLEVBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUMsQ0FBQztvQkFDL0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQzt3QkFDL0IsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJO3dCQUMzQixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO3FCQUNuRixDQUFDO2lCQUNMO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7bUlBdGtCVSxxQ0FBcUM7dUhBQXJDLHFDQUFxQyw0TUNuRGxELHFyWEEwVUE7NEZEdlJhLHFDQUFxQztrQkFMakQsU0FBUzsrQkFDRSx5Q0FBeUM7eU5BS2YseUJBQXlCO3NCQUE1RCxTQUFTO3VCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIyIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TGlzdEZpZWxkfSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7Q29uZmlnU2VydmljZSwgRGVmaW5pdGlvbkNvbHVtbn0gZnJvbSAnQHZhbHRpbW8vY29uZmlnJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVsYXksXG4gIGZpbHRlcixcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENhc2VMaXN0Q29sdW1uLFxuICBDYXNlTGlzdENvbHVtblZpZXcsXG4gIERpc3BsYXlUeXBlUGFyYW1ldGVycyxcbiAgRG9jdW1lbnRTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TGlzdENvbHVtbk1vZGFsfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0xpc3RJdGVtfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2Ryb3Bkb3duL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0RvbVNhbml0aXplciwgU2FmZVVybH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge011bHRpSW5wdXRWYWx1ZXN9IGZyb20gJ0B2YWx0aW1vL3VzZXItaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rvc3NpZXItbWFuYWdlbWVudC1saXN0LWNvbHVtbnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLW1hbmFnZW1lbnQtbGlzdC1jb2x1bW5zLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJNYW5hZ2VtZW50TGlzdENvbHVtbnNDb21wb25lbnQge1xuICBAVmlld0NoaWxkKCdtb3ZlUm93QnV0dG9ucycpIHB1YmxpYyBtb3ZlUm93QnV0dG9uc1RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICByZWFkb25seSBkb3dubG9hZE5hbWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgZG93bmxvYWRVcmwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTYWZlVXJsPih1bmRlZmluZWQpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgQ09MVU1OUzogQXJyYXk8RGVmaW5pdGlvbkNvbHVtbj4gPSBbXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAndGl0bGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICd0aXRsZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdrZXknLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdrZXknLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAncGF0aCcsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ3BhdGgnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnZGlzcGxheVR5cGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdkaXNwbGF5VHlwZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkaXNwbGF5VHlwZVBhcmFtZXRlcnMnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdkaXNwbGF5VHlwZVBhcmFtZXRlcnMnLFxuICAgIH0sXG4gICAge1xuICAgICAgdmlld1R5cGU6ICdzdHJpbmcnLFxuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcHJvcGVydHlOYW1lOiAnc29ydGFibGUnLFxuICAgICAgdHJhbnNsYXRpb25LZXk6ICdzb3J0YWJsZScsXG4gICAgfSxcbiAgICB7XG4gICAgICB2aWV3VHlwZTogJ3N0cmluZycsXG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwcm9wZXJ0eU5hbWU6ICdkZWZhdWx0U29ydCcsXG4gICAgICB0cmFuc2xhdGlvbktleTogJ2RlZmF1bHRTb3J0JyxcbiAgICB9LFxuICBdO1xuXG4gIGxvYWRpbmdDYXNlTGlzdENvbHVtbnMgPSB0cnVlO1xuXG4gIHJlYWRvbmx5IGZpZWxkcyQ6IE9ic2VydmFibGU8QXJyYXk8TGlzdEZpZWxkPj4gPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKS5waXBlKFxuICAgIG1hcCgoKSA9PlxuICAgICAgdGhpcy5DT0xVTU5TLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAga2V5OiBjb2x1bW4ucHJvcGVydHlOYW1lLFxuICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYGxpc3RDb2x1bW4uJHtjb2x1bW4udHJhbnNsYXRpb25LZXl9YCksXG4gICAgICAgIHNvcnRhYmxlOiBjb2x1bW4uc29ydGFibGUsXG4gICAgICAgIC4uLihjb2x1bW4udmlld1R5cGUgJiYge3ZpZXdUeXBlOiBjb2x1bW4udmlld1R5cGV9KSxcbiAgICAgICAgLi4uKGNvbHVtbi5lbnVtICYmIHtlbnVtOiBjb2x1bW4uZW51bX0pLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKFxuICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLm5hbWUgfHwgJycpLFxuICAgIGZpbHRlcihkb2NEZWZOYW1lID0+ICEhZG9jRGVmTmFtZSlcbiAgKTtcblxuICByZWFkb25seSBkaXNhYmxlSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgaGFzRW52aXJvbm1lbnRDb25maWckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKFxuICAgIG1hcChcbiAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgICAgISF0aGlzLmNvbmZpZ1NlcnZpY2U/LmNvbmZpZz8uY3VzdG9tRGVmaW5pdGlvblRhYmxlc1tkb2N1bWVudERlZmluaXRpb25OYW1lXVxuICAgIClcbiAgKTtcblxuICBwcml2YXRlIGNhY2hlZENhc2VMaXN0Q29sdW1uczogQXJyYXk8Q2FzZUxpc3RDb2x1bW4+ID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoQ2FzZUxpc3Rjb2x1bW5zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXNlTGlzdENvbHVtbnMkOiBPYnNlcnZhYmxlPEFycmF5PENhc2VMaXN0Q29sdW1uPj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLFxuICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Y29sdW1ucyQsXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbZG9jdW1lbnREZWZpbml0aW9uTmFtZV0pID0+XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRDYXNlTGlzdChkb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICksXG4gICAgdGFwKGNhc2VMaXN0Q29sdW1ucyA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4ge1xuICAgICAgICBpZiAoY2FzZUxpc3RDb2x1bW5zICYmIEFycmF5LmlzQXJyYXkoY2FzZUxpc3RDb2x1bW5zKSAmJiBjYXNlTGlzdENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0RG93bmxvYWQoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgY2FzZUxpc3RDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgdGFwKGNhc2VMaXN0Q29sdW1ucyA9PiB7XG4gICAgICB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucztcbiAgICAgIHRoaXMubG9hZGluZ0Nhc2VMaXN0Q29sdW1ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgIH0pXG4gICk7XG5cbiAgcmVhZG9ubHkgdHJhbnNsYXRlZENhc2VMaXN0Q29sdW1ucyQ6IE9ic2VydmFibGU8QXJyYXk8Q2FzZUxpc3RDb2x1bW5WaWV3Pj4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmNhc2VMaXN0Q29sdW1ucyQsXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JyksXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbY29sdW1uc10pID0+XG4gICAgICBjb2x1bW5zLm1hcChjb2x1bW4gPT4gKHtcbiAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICB0aXRsZTogY29sdW1uLnRpdGxlIHx8ICctJyxcbiAgICAgICAgc29ydGFibGU6IGNvbHVtbi5zb3J0YWJsZVxuICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVZZXMnKVxuICAgICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVObycpLFxuICAgICAgICBkZWZhdWx0U29ydDpcbiAgICAgICAgICAoY29sdW1uLmRlZmF1bHRTb3J0ID09PSAnQVNDJyAmJlxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpc3RDb2x1bW4uc29ydGFibGVBc2MnKSkgfHxcbiAgICAgICAgICAoY29sdW1uLmRlZmF1bHRTb3J0ID09PSAnREVTQycgJiZcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdsaXN0Q29sdW1uLnNvcnRhYmxlRGVzYycpKSB8fFxuICAgICAgICAgICctJyxcbiAgICAgICAgZGlzcGxheVR5cGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgIGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuJHtjb2x1bW4/LmRpc3BsYXlUeXBlPy50eXBlfWBcbiAgICAgICAgKSxcbiAgICAgICAgZGlzcGxheVR5cGVQYXJhbWV0ZXJzOiB0aGlzLmdldERpc3BsYXlUeXBlUGFyYW1ldGVyc1ZpZXcoXG4gICAgICAgICAgY29sdW1uLmRpc3BsYXlUeXBlLmRpc3BsYXlUeXBlUGFyYW1ldGVyc1xuICAgICAgICApLFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRNb2RhbFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaXN0Q29sdW1uTW9kYWw+KCdjcmVhdGUnKTtcblxuICByZWFkb25seSBzaG93TW9kYWwkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgbW9kYWxTaG93aW5nJCA9IHRoaXMuc2hvd01vZGFsJC5waXBlKGRlbGF5KDI1MCkpO1xuXG4gIHJlYWRvbmx5IElOVkFMSURfS0VZID0gJ2ludmFsaWQnO1xuXG4gIHJlYWRvbmx5IGZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHRpdGxlOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgIGtleTogbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICBwYXRoOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIGRhdGVGb3JtYXQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgZGlzcGxheVR5cGU6IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgfSksXG4gICAgc29ydGFibGU6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXG4gICAgZGVmYXVsdFNvcnQ6IG5ldyBGb3JtQ29udHJvbCh7XG4gICAgICBrZXk6IHRoaXMuSU5WQUxJRF9LRVksXG4gICAgfSksXG4gICAgZW51bTogbmV3IEZvcm1Db250cm9sKFtdKSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZGlzYWJsZURlZmF1bHRTb3J0JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY3VycmVudE1vZGFsVHlwZSQsXG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbY3VycmVudE1vZGFsVHlwZV0pID0+XG4gICAgICAgIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnICYmXG4gICAgICAgIHRoaXMuY2FjaGVkQ2FzZUxpc3RDb2x1bW5zLmZpbmQoY29sdW1uID0+ICEhY29sdW1uLmRlZmF1bHRTb3J0KVxuICAgICksXG4gICAgc3RhcnRXaXRoKGZhbHNlKVxuICApO1xuXG4gIHJlYWRvbmx5IERJU1BMQVlfVFlQRVM6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgJ3N0cmluZycsXG4gICAgJ2RhdGUnLFxuICAgICdib29sZWFuJyxcbiAgICAnZW51bScsXG4gICAgJ2FycmF5Q291bnQnLFxuICAgICd1bmRlcnNjb3Jlc1RvU3BhY2VzJyxcbiAgXTtcblxuICByZWFkb25seSBzaG93RGF0ZUZvcm1hdCQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoZm9ybVZhbHVlcyA9PiAhIShmb3JtVmFsdWVzLmRpc3BsYXlUeXBlPy5rZXkgPT09IHRoaXMuRElTUExBWV9UWVBFU1sxXSkpLFxuICAgIHRhcChzaG93RGF0ZUZvcm1hdCA9PiB7XG4gICAgICBpZiAoc2hvd0RhdGVGb3JtYXQgPT09IGZhbHNlICYmICEhdGhpcy5mb3JtR3JvdXAudmFsdWUuZGF0ZUZvcm1hdCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkYXRlRm9ybWF0OiAnJ30pO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSBzaG93RW51bSQgPSB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICBtYXAoXG4gICAgICBmb3JtVmFsdWVzID0+XG4gICAgICAgICEhKFxuICAgICAgICAgIGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzNdIHx8XG4gICAgICAgICAgZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ID09PSB0aGlzLkRJU1BMQVlfVFlQRVNbMl1cbiAgICAgICAgKVxuICAgICksXG4gICAgdGFwKHNob3dFbnVtID0+IHtcbiAgICAgIGNvbnN0IGVudW1WYWx1ZSA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlLmVudW07XG4gICAgICBpZiAoc2hvd0VudW0gPT09IGZhbHNlICYmIEFycmF5LmlzQXJyYXkoZW51bVZhbHVlKSAmJiBlbnVtVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtlbnVtOiBbXX0pO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSBpc1llc05vJCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgIG1hcChmb3JtVmFsdWVzID0+ICEhKGZvcm1WYWx1ZXMuZGlzcGxheVR5cGU/LmtleSA9PT0gdGhpcy5ESVNQTEFZX1RZUEVTWzJdKSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcblxuICByZWFkb25seSB2aWV3VHlwZUl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JCxcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgXSkucGlwZShcbiAgICBtYXAoKFtzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4XSkgPT5cbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uRGlzcGxheVR5cGUuc2VsZWN0YCksXG4gICAgICAgICAga2V5OiB0aGlzLklOVkFMSURfS0VZLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLkRJU1BMQVlfVFlQRVMubWFwKHR5cGUgPT4gKHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbkRpc3BsYXlUeXBlLiR7dHlwZX1gKSxcbiAgICAgICAgICBrZXk6IHR5cGUsXG4gICAgICAgIH0pKSxcbiAgICAgIF0ubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgc2VsZWN0ZWQ6IGluZGV4ID09PSBzZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4LFxuICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkU29ydEl0ZW1JbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgc29ydEl0ZW1zJDogT2JzZXJ2YWJsZTxBcnJheTxMaXN0SXRlbT4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5zZWxlY3RlZFNvcnRJdGVtSW5kZXgkLFxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW3NlbGVjdGVkU29ydEl0ZW1JbmRleF0pID0+XG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50OiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgbGlzdENvbHVtbi5zZWxlY3REZWZhdWx0U29ydGApLFxuICAgICAgICAgIGtleTogdGhpcy5JTlZBTElEX0tFWSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlQXNjYCksXG4gICAgICAgICAga2V5OiAnQVNDJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRlbnQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGBsaXN0Q29sdW1uLnNvcnRhYmxlRGVzY2ApLFxuICAgICAgICAgIGtleTogJ0RFU0MnLFxuICAgICAgICB9LFxuICAgICAgXS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBzZWxlY3RlZDogaW5kZXggPT09IHNlbGVjdGVkU29ydEl0ZW1JbmRleCxcbiAgICAgIH0pKVxuICAgIClcbiAgKTtcblxuICByZWFkb25seSB2YWxpZEtleSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMuY3VycmVudE1vZGFsVHlwZSRdKS5waXBlKFxuICAgIG1hcCgoW2Zvcm1WYWx1ZXMsIGN1cnJlbnRNb2RhbFR5cGVdKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZ0tleXMgPSB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1ucy5tYXAoY29sdW1uID0+IGNvbHVtbi5rZXkpO1xuICAgICAgcmV0dXJuIGN1cnJlbnRNb2RhbFR5cGUgPT09ICdjcmVhdGUnID8gIWV4aXN0aW5nS2V5cy5pbmNsdWRlcyhmb3JtVmFsdWVzLmtleSkgOiB0cnVlO1xuICAgIH0pLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSB2YWxpZCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMsIHRoaXMudmFsaWRLZXkkXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW2Zvcm1WYWx1ZXMsIHZhbGlkS2V5XSkgPT5cbiAgICAgICAgISEoXG4gICAgICAgICAgZm9ybVZhbHVlcy5kaXNwbGF5VHlwZT8ua2V5ICE9PSB0aGlzLklOVkFMSURfS0VZICYmXG4gICAgICAgICAgZm9ybVZhbHVlcy5wYXRoICYmXG4gICAgICAgICAgdmFsaWRLZXkgJiZcbiAgICAgICAgICAoZm9ybVZhbHVlcy5kaXNwbGF5VHlwZS5rZXkgPT09ICdlbnVtJyA/IGZvcm1WYWx1ZXMuZW51bT8ubGVuZ3RoID4gMCA6IHRydWUpXG4gICAgICAgIClcbiAgICApLFxuICAgIHN0YXJ0V2l0aChmYWxzZSlcbiAgKTtcblxuICByZWFkb25seSBzaG93RGVsZXRlTW9kYWwkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSBkZWxldGVSb3dJbmRleCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdEVudW1WYWx1ZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNdWx0aUlucHV0VmFsdWVzPih1bmRlZmluZWQpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyXG4gICkge31cbiAgb3Blbk1vZGFsKG1vZGFsVHlwZTogTGlzdENvbHVtbk1vZGFsKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9kYWwkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxUeXBlJC5uZXh0KG1vZGFsVHlwZSk7XG5cbiAgICBpZiAobW9kYWxUeXBlID09PSAnY3JlYXRlJykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbJ2tleSddLmVuYWJsZSgpO1xuICAgICAgdGhpcy5yZXNldEZvcm1Hcm91cCgpO1xuICAgIH0gZWxzZSBpZiAobW9kYWxUeXBlID09PSAnZWRpdCcpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzWydrZXknXS5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2VNb2RhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dNb2RhbCQubmV4dChmYWxzZSk7XG4gIH1cblxuICBkZWxldGVSb3coY2FzZUxpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyLCBjbGlja0V2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVsZXRlUm93SW5kZXgkLm5leHQoY2FzZUxpc3RDb2x1bW5Sb3dJbmRleCk7XG4gIH1cblxuICBkZWxldGVSb3dDb25maXJtYXRpb24oY2FzZUxpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY29sdW1uS2V5ID0gdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnNbY2FzZUxpc3RDb2x1bW5Sb3dJbmRleF0/LmtleTtcblxuICAgIGlmIChjb2x1bW5LZXkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cbiAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZG9jRGVmTmFtZSA9PiB7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmRlbGV0ZUNhc2VMaXN0KGRvY0RlZk5hbWUsIGNvbHVtbktleSkuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Q29sdW1ucygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVJbnB1dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVSb3coXG4gICAgY2FzZUxpc3RDb2x1bW5Sb3dJbmRleDogbnVtYmVyLFxuICAgIG1vdmVVcDogYm9vbGVhbixcbiAgICBjbGlja0V2ZW50OiBNb3VzZUV2ZW50LFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYXNlTGlzdENvbHVtbnMgPSBbLi4udGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnNdO1xuICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uUm93ID0gY2FzZUxpc3RDb2x1bW5zW2Nhc2VMaXN0Q29sdW1uUm93SW5kZXhdO1xuXG4gICAgY2xpY2tFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uSW5kZXggPSBjYXNlTGlzdENvbHVtbnMuZmluZEluZGV4KFxuICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtblJvdy5rZXlcbiAgICApO1xuICAgIGNvbnN0IGZvdW5kQ2FzZUxpc3RDb2x1bW4gPSB7Li4uY2FzZUxpc3RDb2x1bW5zW2Nhc2VMaXN0Q29sdW1uSW5kZXhdfTtcbiAgICBjb25zdCBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucyA9IGNhc2VMaXN0Q29sdW1ucy5maWx0ZXIoXG4gICAgICBmaWVsZCA9PiBmaWVsZC5rZXkgIT09IGNhc2VMaXN0Q29sdW1uUm93LmtleVxuICAgICk7XG4gICAgY29uc3QgbXVsdGlwbGVDYXNlTGlzdENvbHVtbnMgPSBjYXNlTGlzdENvbHVtbnMubGVuZ3RoID4gMTtcblxuICAgIGlmIChtdWx0aXBsZUNhc2VMaXN0Q29sdW1ucyAmJiBtb3ZlVXAgJiYgY2FzZUxpc3RDb2x1bW5JbmRleCA+IDApIHtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQmVmb3JlS2V5ID0gYCR7Y2FzZUxpc3RDb2x1bW5zW2Nhc2VMaXN0Q29sdW1uSW5kZXggLSAxXS5rZXl9YDtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQmVmb3JlSW5kZXggPSBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucy5maW5kSW5kZXgoXG4gICAgICAgIGZpZWxkID0+IGZpZWxkLmtleSA9PT0gY2FzZUxpc3RDb2x1bW5CZWZvcmVLZXlcbiAgICAgICk7XG4gICAgICBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucy5zcGxpY2UoY2FzZUxpc3RDb2x1bW5CZWZvcmVJbmRleCwgMCwgZm91bmRDYXNlTGlzdENvbHVtbik7XG4gICAgICB0aGlzLnVwZGF0ZUNhc2VMaXN0Q29sdW1ucyhkb2N1bWVudERlZmluaXRpb25OYW1lLCBmaWx0ZXJlZENhc2VMaXN0Q29sdW1ucyk7XG4gICAgfSBlbHNlIGlmIChtdWx0aXBsZUNhc2VMaXN0Q29sdW1ucyAmJiAhbW92ZVVwICYmIGNhc2VMaXN0Q29sdW1uSW5kZXggPCBjYXNlTGlzdENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjYXNlTGlzdENvbHVtbkFmdGVyS2V5ID0gYCR7Y2FzZUxpc3RDb2x1bW5zW2Nhc2VMaXN0Q29sdW1uSW5kZXggKyAxXS5rZXl9YDtcbiAgICAgIGNvbnN0IGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCA9IGZpbHRlcmVkQ2FzZUxpc3RDb2x1bW5zLmZpbmRJbmRleChcbiAgICAgICAgZmllbGQgPT4gZmllbGQua2V5ID09PSBjYXNlTGlzdENvbHVtbkFmdGVyS2V5XG4gICAgICApO1xuICAgICAgZmlsdGVyZWRDYXNlTGlzdENvbHVtbnMuc3BsaWNlKGNhc2VMaXN0Q29sdW1uQWZ0ZXJJbmRleCArIDEsIDAsIGZvdW5kQ2FzZUxpc3RDb2x1bW4pO1xuICAgICAgdGhpcy51cGRhdGVDYXNlTGlzdENvbHVtbnMoZG9jdW1lbnREZWZpbml0aW9uTmFtZSwgZmlsdGVyZWRDYXNlTGlzdENvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIHNhdmVDYXNMaXN0Q29sdW1ucygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVJbnB1dCgpO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxUeXBlJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShjdXJyZW50TW9kYWxUeXBlID0+IHtcbiAgICAgIGlmIChjdXJyZW50TW9kYWxUeXBlID09PSAnY3JlYXRlJykge1xuICAgICAgICB0aGlzLmFkZENvbHVtbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW4oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGVudW1WYWx1ZUNoYW5nZSh2YWx1ZTogQXJyYXk8e1trZXk6IHN0cmluZ106IHN0cmluZ30+KTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh7ZW51bTogdmFsdWV9KTtcbiAgfVxuXG4gIGNvbHVtblJvd0NsaWNrZWQocm93OiB7a2V5OiBzdHJpbmd9KTogdm9pZCB7XG4gICAgdGhpcy5yZXNldEZvcm1Hcm91cCgpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy52aWV3VHlwZUl0ZW1zJCwgdGhpcy5zb3J0SXRlbXMkXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChbdmlld1R5cGVJdGVtcywgc29ydEl0ZW1zXSkgPT4ge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNhY2hlZENhc2VMaXN0Q29sdW1ucy5maW5kKFxuICAgICAgICAgIGNhY2hlZENvbHVtbiA9PiBjYWNoZWRDb2x1bW4ua2V5ID09PSByb3cua2V5XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZpZXdUeXBlSXRlbSA9IHZpZXdUeXBlSXRlbXMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGlzcGxheVR5cGUudHlwZSk7XG4gICAgICAgIGNvbnN0IHZpZXdUeXBlSXRlbUluZGV4ID0gdmlld1R5cGVJdGVtcy5maW5kSW5kZXgoXG4gICAgICAgICAgaXRlbSA9PiBpdGVtLmtleSA9PT0gY29sdW1uLmRpc3BsYXlUeXBlLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc29ydEl0ZW0gPSBzb3J0SXRlbXMuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGVmYXVsdFNvcnQpO1xuICAgICAgICBjb25zdCBzb3J0SXRlbUluZGV4ID0gc29ydEl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ua2V5ID09PSBjb2x1bW4uZGVmYXVsdFNvcnQpO1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0gY29sdW1uPy5kaXNwbGF5VHlwZT8uZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5lbnVtO1xuICAgICAgICBjb25zdCBtYXBwZWRFbnVtVmFsdWVzOiBNdWx0aUlucHV0VmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGNvbHVtbkRhdGVGb3JtYXQgPSBjb2x1bW4/LmRpc3BsYXlUeXBlPy5kaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmRhdGVGb3JtYXQ7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXdUeXBlSXRlbUluZGV4JC5uZXh0KHZpZXdUeXBlSXRlbUluZGV4KTtcblxuICAgICAgICBpZiAoc29ydEl0ZW0pIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU29ydEl0ZW1JbmRleCQubmV4dChzb3J0SXRlbUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnVtVmFsdWVzKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoZW51bVZhbHVlcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbWFwcGVkRW51bVZhbHVlcy5wdXNoKHtrZXksIHZhbHVlOiBlbnVtVmFsdWVzW2tleV19KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmRlZmF1bHRFbnVtVmFsdWVzJC5uZXh0KG1hcHBlZEVudW1WYWx1ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQoW3trZXk6ICcnLCB2YWx1ZTogJyd9XSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBrZXk6IGNvbHVtbi5rZXksXG4gICAgICAgICAgdGl0bGU6IGNvbHVtbi50aXRsZSxcbiAgICAgICAgICBwYXRoOiBjb2x1bW4ucGF0aCxcbiAgICAgICAgICBzb3J0YWJsZTogY29sdW1uLnNvcnRhYmxlLFxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBkaXNwbGF5VHlwZTogey4uLnZpZXdUeXBlSXRlbX0sXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGRlZmF1bHRTb3J0OiBzb3J0SXRlbSA/IHsuLi5zb3J0SXRlbX0gOiB7Li4uc29ydEl0ZW1zWzBdfSxcbiAgICAgICAgICAuLi4oY29sdW1uRGF0ZUZvcm1hdCAmJiB7XG4gICAgICAgICAgICBkYXRlRm9ybWF0OiBjb2x1bW5EYXRlRm9ybWF0LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wZW5Nb2RhbCgnZWRpdCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNhc2VMaXN0Q29sdW1ucyhcbiAgICBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmcsXG4gICAgbmV3Q2FzZUxpc3RDb2x1bW5zOiBBcnJheTxDYXNlTGlzdENvbHVtbj5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQoKTtcblxuICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLnB1dENhc2VMaXN0KGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsIG5ld0Nhc2VMaXN0Q29sdW1ucykuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGxpc3Qtc2VhcmNoLSR7ZG9jdW1lbnREZWZpbml0aW9uTmFtZX1gLCBudWxsKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDb2x1bW4oKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtR3JvdXAudmFsdWU7XG5cbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRvY0RlZk5hbWUgPT4ge1xuICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgICAgLnBvc3RDYXNlTGlzdChkb2NEZWZOYW1lLCB0aGlzLm1hcEZvcm1WYWx1ZXNUb0NvbHVtbihmb3JtVmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCgpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUlucHV0KCk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXNwbGF5VHlwZVBhcmFtZXRlcnNWaWV3KGRpc3BsYXlUeXBlUGFyYW1ldGVyczogRGlzcGxheVR5cGVQYXJhbWV0ZXJzKTogc3RyaW5nIHtcbiAgICBpZiAoZGlzcGxheVR5cGVQYXJhbWV0ZXJzPy5kYXRlRm9ybWF0KSB7XG4gICAgICByZXR1cm4gZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmRhdGVGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChkaXNwbGF5VHlwZVBhcmFtZXRlcnM/LmVudW0pIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkaXNwbGF5VHlwZVBhcmFtZXRlcnMuZW51bSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyU3RyaW5nID0gYCR7Y3Vycn06ICR7ZGlzcGxheVR5cGVQYXJhbWV0ZXJzLmVudW1bY3Vycl19YDtcbiAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICByZXR1cm4gYCR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGAke2FjY30sICR7a2V5VmFsdWVQYWlyU3RyaW5nfWA7XG4gICAgICAgIH1cbiAgICAgIH0sICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICctJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbigpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkQ29sdW1uRm9ybVZhbHVlID0gdGhpcy5mb3JtR3JvdXAudmFsdWU7XG4gICAgY29uc3QgbWFwcGVkVXBkYXRlZENvbHVtbiA9IHRoaXMubWFwRm9ybVZhbHVlc1RvQ29sdW1uKHVwZGF0ZWRDb2x1bW5Gb3JtVmFsdWUpO1xuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5zID0gdGhpcy5jYWNoZWRDYXNlTGlzdENvbHVtbnM7XG4gICAgY29uc3QgbWFwcGVkQ3VycmVudENvbHVtbnMgPSBjdXJyZW50Q29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbkNvcHkgPSB7Li4uY29sdW1ufTtcbiAgICAgIGlmIChjb2x1bW5Db3B5LmtleSA9PT0gdXBkYXRlZENvbHVtbkZvcm1WYWx1ZS5rZXkpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlZENvbHVtbiA9IHsuLi5jb2x1bW5Db3B5LCAuLi5tYXBwZWRVcGRhdGVkQ29sdW1ufTtcbiAgICAgICAgaWYgKCFtYXBwZWRVcGRhdGVkQ29sdW1uLmRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgZGVsZXRlIGNoYW5nZWRDb2x1bW4uZGVmYXVsdFNvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoYW5nZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBpZiAobWFwcGVkVXBkYXRlZENvbHVtbi5kZWZhdWx0U29ydCkge1xuICAgICAgICBkZWxldGUgY29sdW1uQ29weS5kZWZhdWx0U29ydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW5Db3B5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkb2NEZWZOYW1lID0+IHtcbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLnB1dENhc2VMaXN0KGRvY0RlZk5hbWUsIG1hcHBlZEN1cnJlbnRDb2x1bW5zKS5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsb3NlTW9kYWwoKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hDYXNlTGlzdENvbHVtbnMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZW5hYmxlSW5wdXQoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RG93bmxvYWQoXG4gICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogc3RyaW5nLFxuICAgIGNhc2VMaXN0Q29sdW1uczogQXJyYXk8Q2FzZUxpc3RDb2x1bW4+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZG93bmxvYWROYW1lJC5uZXh0KGAke2RvY3VtZW50RGVmaW5pdGlvbk5hbWV9Lmpzb25gKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsJC5uZXh0KFxuICAgICAgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChcbiAgICAgICAgJ2RhdGE6dGV4dC9qc29uO2NoYXJzZXQ9VVRGLTgsJyArXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNhc2VMaXN0Q29sdW1ucywgbnVsbCwgMikpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZUlucHV0JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlSW5wdXQkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoQ2FzZUxpc3RDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaENhc2VMaXN0Y29sdW1ucyQubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtR3JvdXAoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnNvcnRJdGVtcyQsIHRoaXMudmlld1R5cGVJdGVtcyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtzb3J0SXRlbXMsIHZpZXdUeXBlSXRlbXNdKSA9PiB7XG4gICAgICAgIHRoaXMuZGVmYXVsdEVudW1WYWx1ZXMkLm5leHQoW3trZXk6ICcnLCB2YWx1ZTogJyd9XSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3VHlwZUl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkaXNwbGF5VHlwZTogdmlld1R5cGVJdGVtc1swXX0pO1xuICAgICAgICB0aGlzLnNlbGVjdGVkU29ydEl0ZW1JbmRleCQubmV4dCgwKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHtkZWZhdWx0U29ydDogc29ydEl0ZW1zWzBdfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwRm9ybVZhbHVlc1RvQ29sdW1uKGZvcm1WYWx1ZTogYW55KTogQ2FzZUxpc3RDb2x1bW4ge1xuICAgIHJldHVybiB7XG4gICAgICBrZXk6IGZvcm1WYWx1ZS5rZXksXG4gICAgICBzb3J0YWJsZTogZm9ybVZhbHVlLnNvcnRhYmxlLFxuICAgICAgLi4uKGZvcm1WYWx1ZS5kZWZhdWx0U29ydD8ua2V5ICE9PSB0aGlzLklOVkFMSURfS0VZICYmIHtcbiAgICAgICAgZGVmYXVsdFNvcnQ6IGZvcm1WYWx1ZS5kZWZhdWx0U29ydD8ua2V5LFxuICAgICAgfSksXG4gICAgICB0aXRsZTogZm9ybVZhbHVlLnRpdGxlIHx8ICcnLFxuICAgICAgcGF0aDogZm9ybVZhbHVlLnBhdGgsXG4gICAgICBkaXNwbGF5VHlwZToge1xuICAgICAgICB0eXBlOiBmb3JtVmFsdWUuZGlzcGxheVR5cGU/LmtleSxcbiAgICAgICAgZGlzcGxheVR5cGVQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLi4uKGZvcm1WYWx1ZS5kYXRlRm9ybWF0ICYmIHtkYXRlRm9ybWF0OiBmb3JtVmFsdWUuZGF0ZUZvcm1hdH0pLFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGZvcm1WYWx1ZS5lbnVtKSAmJlxuICAgICAgICAgICAgZm9ybVZhbHVlLmVudW0ubGVuZ3RoID4gMCAmJiB7XG4gICAgICAgICAgICAgIGVudW06IGZvcm1WYWx1ZS5lbnVtLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiAoey4uLmFjYywgW2N1cnIua2V5XTogY3Vyci52YWx1ZX0pLCB7fSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjIgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48bmctY29udGFpbmVyXG4gICpuZ0lmPVwie1xuICAgIGNhc2VMaXN0Q29sdW1uOiB0cmFuc2xhdGVkQ2FzZUxpc3RDb2x1bW5zJCB8IGFzeW5jLFxuICAgIGZpZWxkczogZmllbGRzJCB8IGFzeW5jLFxuICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkIHwgYXN5bmMsXG4gICAgaGFzRW52aXJvbm1lbnRDb25maWc6IGhhc0Vudmlyb25tZW50Q29uZmlnJCB8IGFzeW5jLFxuICAgIGRvd25sb2FkVXJsOiBkb3dubG9hZFVybCQgfCBhc3luYyxcbiAgICBkb3dubG9hZE5hbWU6IGRvd25sb2FkTmFtZSQgfCBhc3luY1xuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWQgcHItMCBwbC0wXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgbXQtbTNweCBtYi0zIG1yLTJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJ1dHRvbnM7IGNvbnRleHQ6IHtvYnM6IG9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhb2JzLmhhc0Vudmlyb25tZW50Q29uZmlnOyBlbHNlIGVudmlyb25tZW50Q29uZmlnV2FybmluZ1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nQ2FzZUxpc3RDb2x1bW5zOyBlbHNlIGxvYWRpbmdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9icy5jYXNlTGlzdENvbHVtbj8ubGVuZ3RoID4gMDsgZWxzZSBub0NvbmZpZ1dhcm5pbmdcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdDsgY29udGV4dDoge29iczogb2JzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNyZWF0ZUVkaXRNb2RhbFwiPjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZGVsZXRlTW9kYWxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvbnMgbGV0LW9icz1cIm9ic1wiPlxuICA8YVxuICAgIGlibUxpbmtcbiAgICBjbGFzcz1cImNlbnRlci1saW5rXCJcbiAgICBbaHJlZl09XCJvYnMuZG93bmxvYWRVcmxcIlxuICAgIFtkb3dubG9hZF09XCJvYnMuZG93bmxvYWROYW1lXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICBvYnMuaGFzRW52aXJvbm1lbnRDb25maWcgfHxcbiAgICAgICFvYnMuZG93bmxvYWRVcmwgfHxcbiAgICAgICFvYnMuZG93bmxvYWROYW1lIHx8XG4gICAgICBvYnMuY2FzZUxpc3RDb2x1bW4/Lmxlbmd0aCA8IDEgfHxcbiAgICAgIG9icy5kaXNhYmxlSW5wdXQgfHxcbiAgICAgIGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcbiAgICBcIlxuICA+XG4gICAge3sgJ2xpc3RDb2x1bW4uZG93bmxvYWRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b25cbiAgICAoY2xpY2spPVwib3Blbk1vZGFsKCdjcmVhdGUnKVwiXG4gICAgaWJtQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgc2l6ZT1cIm1kXCJcbiAgICBbZGlzYWJsZWRdPVwib2JzLmhhc0Vudmlyb25tZW50Q29uZmlnIHx8IGxvYWRpbmdDYXNlTGlzdENvbHVtbnNcIlxuICAgIGNsYXNzPVwibWwtM1wiXG4gID5cbiAgICB7eyAnbGlzdENvbHVtbi5hZGRCdXR0b25UZXh0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGlibUljb249XCJhZGRcIiBzaXplPVwiMTZcIj48L3N2Zz5cbiAgPC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vdmVSb3dCdXR0b25zIGxldC1pbmRleD1cImluZGV4XCIgbGV0LWxlbmd0aD1cImxlbmd0aFwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtb3ZlLXJvdy1idXR0b25zXCJcbiAgICAqbmdJZj1cIntcbiAgICAgIGRpc2FibGVJbnB1dDogZGlzYWJsZUlucHV0JCB8IGFzeW5jLFxuICAgICAgZG9jdW1lbnREZWZpbml0aW9uTmFtZTogZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgfCBhc3luY1xuICAgIH0gYXMgb2JzXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm1kaSBtZGktZGVsZXRlIGJ0biBidG4tb3V0bGluZS1kYW5nZXIgbXItMVwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlUm93KGluZGV4LCAkZXZlbnQpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy11cC1ib2xkIGJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG1yLTFcIlxuICAgICAgKGNsaWNrKT1cIm1vdmVSb3coaW5kZXgsIHRydWUsICRldmVudCwgb2JzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IDAgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibWRpIG1kaS1hcnJvdy1kb3duLWJvbGQgYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiXG4gICAgICAoY2xpY2spPVwibW92ZVJvdyhpbmRleCwgZmFsc2UsICRldmVudCwgb2JzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQgZGlzYWJsZWQtbW92ZS1yb3ctYnV0dG9uJzogaW5kZXggPT09IGxlbmd0aCAtIDEgfHwgb2JzLmRpc2FibGVJbnB1dH1cIlxuICAgID48L2k+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0IGxldC1vYnM9XCJvYnNcIj5cbiAgPHZhbHRpbW8tbGlzdFxuICAgIFtpdGVtc109XCJvYnMuY2FzZUxpc3RDb2x1bW5cIlxuICAgIFtmaWVsZHNdPVwib2JzLmZpZWxkc1wiXG4gICAgW3ZpZXdNb2RlXT1cImZhbHNlXCJcbiAgICBbaGVhZGVyXT1cImZhbHNlXCJcbiAgICAqbmdJZj1cIm9icy5jYXNlTGlzdENvbHVtbjsgZWxzZSBsb2FkaW5nXCJcbiAgICBbbGFzdENvbHVtblRlbXBsYXRlXT1cIm1vdmVSb3dCdXR0b25zVGVtcGxhdGVSZWZcIlxuICAgIChyb3dDbGlja2VkKT1cImNvbHVtblJvd0NsaWNrZWQoJGV2ZW50KVwiXG4gID5cbiAgPC92YWx0aW1vLWxpc3Q+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgPHZhbHRpbW8tc3Bpbm5lcj48L3ZhbHRpbW8tc3Bpbm5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2Vudmlyb25tZW50Q29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGlibS1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nVGl0bGUnIHwgdHJhbnNsYXRlLFxuICAgICAgICBtZXNzYWdlOiAnbGlzdENvbHVtbi5oYXNFbnZDb25maWdXYXJuaW5nJyB8IHRyYW5zbGF0ZSxcbiAgICAgICAgc2hvd0Nsb3NlOiBmYWxzZVxuICAgICAgfVwiXG4gICAgPlxuICAgIDwvaWJtLW5vdGlmaWNhdGlvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vQ29uZmlnV2FybmluZz5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcHItMiBwYi0yXCI+XG4gICAgPGlibS1ub3RpZmljYXRpb25cbiAgICAgIFtub3RpZmljYXRpb25PYmpdPVwie1xuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIHRpdGxlOiAnbGlzdENvbHVtbi5ub0NvbmZpZ1dhcm5pbmdUaXRsZScgfCB0cmFuc2xhdGUsXG4gICAgICAgIG1lc3NhZ2U6ICdsaXN0Q29sdW1uLm5vQ29uZmlnV2FybmluZycgfCB0cmFuc2xhdGUsXG4gICAgICAgIHNob3dDbG9zZTogZmFsc2VcbiAgICAgIH1cIlxuICAgID5cbiAgICA8L2libS1ub3RpZmljYXRpb24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjcmVhdGVFZGl0TW9kYWw+XG4gIDxpYm0tbW9kYWxcbiAgICAqbmdJZj1cIntcbiAgICAgIHR5cGU6IGN1cnJlbnRNb2RhbFR5cGUkIHwgYXN5bmMsXG4gICAgICBzaG93OiBzaG93TW9kYWwkIHwgYXN5bmMsXG4gICAgICB2YWxpZDogdmFsaWQkIHwgYXN5bmMsXG4gICAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCQgfCBhc3luYyxcbiAgICAgIHZhbGlkS2V5OiB2YWxpZEtleSQgfCBhc3luYyxcbiAgICAgIGRpc2FibGVEZWZhdWx0U29ydDogZGlzYWJsZURlZmF1bHRTb3J0JCB8IGFzeW5jLFxuICAgICAgc2hvd0VudW06IHNob3dFbnVtJCB8IGFzeW5jLFxuICAgICAgaXNZZXNObzogaXNZZXNObyQgfCBhc3luY1xuICAgIH0gYXMgbW9kYWxPYnNcIlxuICAgIFtvcGVuXT1cIm1vZGFsT2JzLnNob3dcIlxuICA+XG4gICAgPGlibS1tb2RhbC1oZWFkZXIgW3Nob3dDbG9zZUJ1dHRvbl09XCJ0cnVlXCIgKGNsb3NlU2VsZWN0KT1cImNsb3NlTW9kYWwoKVwiPlxuICAgICAgPGgzIGlibU1vZGFsSGVhZGVySGVhZGluZz5cbiAgICAgICAge3tcbiAgICAgICAgICBtb2RhbE9icy50eXBlID09PSAnY3JlYXRlJ1xuICAgICAgICAgICAgPyAoJ2xpc3RDb2x1bW4uYWRkQnV0dG9uVGV4dCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICA6ICgnbGlzdENvbHVtbi5lZGl0Q29sdW1uVGl0bGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICB9fVxuICAgICAgPC9oMz5cbiAgICA8L2libS1tb2RhbC1oZWFkZXI+XG4gICAgPHNlY3Rpb24gaWJtTW9kYWxDb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsQ29udGVudDsgY29udGV4dDoge21vZGFsT2JzOiBtb2RhbE9ic31cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L3NlY3Rpb24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGFsRm9vdGVyOyBjb250ZXh0OiB7bW9kYWxPYnM6IG1vZGFsT2JzfVwiPjwvbmctY29udGFpbmVyPlxuICA8L2libS1tb2RhbD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxDb250ZW50IGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgY2xhc3M9XCJsaXN0LWNvbHVtbi1mb3JtXCI+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGlibS1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4udGl0bGVUaXRsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLnRpdGxlVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlibVRleHQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiAvPlxuICAgICAgPC9pYm0tbGFiZWw+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNkcy0tdGV4dC1pbnB1dF9fZmllbGQtd3JhcHBlclwiPlxuICAgICAgPGlibS1sYWJlbFxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnR5cGUgPT09ICdlZGl0J1wiXG4gICAgICAgIFtpbnZhbGlkXT1cIm1vZGFsT2JzLnZhbGlkS2V5ID09PSBmYWxzZVwiXG4gICAgICAgIFtpbnZhbGlkVGV4dF09XCInbGlzdENvbHVtbi51bmlxdWVLZXlXYXJuaW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4ua2V5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDx2LXRvb2x0aXAtaWNvblxuICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ2xpc3RDb2x1bW4ua2V5VG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlibVRleHQgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCIgW2ludmFsaWRdPVwibW9kYWxPYnMudmFsaWRLZXkgPT09IGZhbHNlXCIgLz5cbiAgICAgIDwvaWJtLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxpYm0tbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLnBhdGgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5wYXRoVG9vbHRpcCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiXG4gICAgICAgICAgPjwvdi10b29sdGlwLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlibVRleHQgZm9ybUNvbnRyb2xOYW1lPVwicGF0aFwiIC8+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8aWJtLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbC13aXRoLXRvb2x0aXAgc2VsZWN0LWxhYmVsXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGlzcGxheVR5cGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kaXNwbGF5VHlwZVRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpYm0tZHJvcGRvd24gZm9ybUNvbnRyb2xOYW1lPVwiZGlzcGxheVR5cGVcIiBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgICAgPGlibS1kcm9wZG93bi1saXN0IFtpdGVtc109XCJ2aWV3VHlwZUl0ZW1zJCB8IGFzeW5jXCI+PC9pYm0tZHJvcGRvd24tbGlzdD5cbiAgICAgICAgPC9pYm0tZHJvcGRvd24+XG4gICAgICA8L2libS1sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCIgKm5nSWY9XCJzaG93RGF0ZUZvcm1hdCQgfCBhc3luY1wiPlxuICAgICAgPGlibS1sYWJlbCBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwXCI+XG4gICAgICAgICAge3sgJ2xpc3RDb2x1bW4uZGF0ZUZvcm1hdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmRhdGVGb3JtYXRUb29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aW5wdXQgaWJtVGV4dCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlRm9ybWF0XCIgLz5cbiAgICAgIDwvaWJtLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIiAqbmdJZj1cIm1vZGFsT2JzLnNob3dFbnVtIHx8IG1vZGFsT2JzLmlzWWVzTm9cIj5cbiAgICAgIDxpYm0tbGFiZWwgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsLXdpdGgtdG9vbHRpcCBzZWxlY3QtbGFiZWxcIj5cbiAgICAgICAgICB7e1xuICAgICAgICAgICAgbW9kYWxPYnMuaXNZZXNOb1xuICAgICAgICAgICAgICA/ICgnbGlzdENvbHVtbi5lbnVtVGl0bGVPcHRpb25hbCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgIDogKCdsaXN0Q29sdW1uLmVudW1UaXRsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgfX1cbiAgICAgICAgICA8di10b29sdGlwLWljb25cbiAgICAgICAgICAgIFt0b29sdGlwXT1cIidsaXN0Q29sdW1uLmVudW1Ub29sdGlwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICA+PC92LXRvb2x0aXAtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8dmFsdGltby1jYXJib24tbXVsdGktaW5wdXRcbiAgICAgICAgICAqbmdJZj1cIihzaG93TW9kYWwkIHwgYXN5bmMpIHx8IChtb2RhbFNob3dpbmckIHwgYXN5bmMpXCJcbiAgICAgICAgICB0eXBlPVwia2V5VmFsdWVcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJlbnVtVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2RlZmF1bHRWYWx1ZXNdPVwiZGVmYXVsdEVudW1WYWx1ZXMkIHwgYXN5bmNcIlxuICAgICAgICA+PC92YWx0aW1vLWNhcmJvbi1tdWx0aS1pbnB1dD5cbiAgICAgIDwvaWJtLWxhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjZHMtLXRleHQtaW5wdXRfX2ZpZWxkLXdyYXBwZXJcIj5cbiAgICAgIDxpYm0tY2hlY2tib3ggZm9ybUNvbnRyb2xOYW1lPVwic29ydGFibGVcIlxuICAgICAgICA+e3sgJ2xpc3RDb2x1bW4uc29ydGFibGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2libS1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2RzLS10ZXh0LWlucHV0X19maWVsZC13cmFwcGVyXCI+XG4gICAgICA8aWJtLWxhYmVsIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXQgfHwgbW9kYWxPYnMuZGlzYWJsZURlZmF1bHRTb3J0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWwtd2l0aC10b29sdGlwIHNlbGVjdC1sYWJlbFwiPlxuICAgICAgICAgIHt7ICdsaXN0Q29sdW1uLmRlZmF1bHRTb3J0VGl0bGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPHYtdG9vbHRpcC1pY29uXG4gICAgICAgICAgICBbdG9vbHRpcF09XCInbGlzdENvbHVtbi5kZWZhdWx0U29ydFRvb2x0aXAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy5kaXNhYmxlSW5wdXRcIlxuICAgICAgICAgID48L3YtdG9vbHRpcC1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxpYm0tZHJvcGRvd25cbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWZhdWx0U29ydFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIm1vZGFsT2JzLmRpc2FibGVJbnB1dCB8fCBtb2RhbE9icy5kaXNhYmxlRGVmYXVsdFNvcnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlibS1kcm9wZG93bi1saXN0IFtpdGVtc109XCJzb3J0SXRlbXMkIHwgYXN5bmNcIj48L2libS1kcm9wZG93bi1saXN0PlxuICAgICAgICA8L2libS1kcm9wZG93bj5cbiAgICAgIDwvaWJtLWxhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21vZGFsRm9vdGVyIGxldC1tb2RhbE9icz1cIm1vZGFsT2JzXCI+XG4gIDxpYm0tbW9kYWwtZm9vdGVyPlxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGlibUJ1dHRvbj1cInNlY29uZGFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZU1vZGFsKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibW9kYWxPYnMuZGlzYWJsZUlucHV0XCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uY2xvc2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgaWJtQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgIFthdHRyLm1vZGFsLXByaW1hcnktZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJtb2RhbE9icy52YWxpZCA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2F2ZUNhc0xpc3RDb2x1bW5zKClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgbW9kYWxPYnMuZGlzYWJsZUlucHV0IHx8IG1vZGFsT2JzLnZhbGlkID09PSBmYWxzZSB8fCBtb2RhbE9icy52YWxpZEtleSA9PT0gZmFsc2VcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2xpc3RDb2x1bW4uc2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2libS1tb2RhbC1mb290ZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmc+XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWljb25cIj48PGlibS1sb2FkaW5nPjwvaWJtLWxvYWRpbmc+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZU1vZGFsPlxuICA8dmFsdGltby1jb25maXJtYXRpb24tbW9kYWxcbiAgICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gICAgW291dHB1dE9uQ29uZmlybV09XCJkZWxldGVSb3dJbmRleCQgfCBhc3luY1wiXG4gICAgKGNvbmZpcm1FdmVudCk9XCJkZWxldGVSb3dDb25maXJtYXRpb24oJGV2ZW50KVwiXG4gICAgY29uZmlybUJ1dHRvblRleHRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uXCJcbiAgICB0aXRsZVRyYW5zbGF0aW9uS2V5PVwibGlzdENvbHVtbi5kZWxldGVDb2x1bW5cIlxuICAgIGNvbnRlbnRUcmFuc2xhdGlvbktleT1cImxpc3RDb2x1bW4uZGVsZXRlQ29sdW1uQ29uZmlybWF0aW9uXCJcbiAgPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG48L25nLXRlbXBsYXRlPlxuIl19