@huntsman-cancer-institute/cod 16.0.0 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/cod.module.d.ts +31 -31
  2. package/components/attribute-absolute.component.d.ts +28 -28
  3. package/components/attribute-base.d.ts +135 -135
  4. package/components/attribute-configuration.component.d.ts +52 -52
  5. package/components/attribute-container.component.d.ts +50 -50
  6. package/components/attribute-default.component.d.ts +20 -20
  7. package/components/attribute-edit.component.d.ts +15 -15
  8. package/components/attribute-flex.component.d.ts +25 -25
  9. package/date/date-util.d.ts +9 -9
  10. package/esm2022/cod.module.mjs +119 -119
  11. package/esm2022/components/attribute-absolute.component.mjs +104 -104
  12. package/esm2022/components/attribute-base.mjs +564 -564
  13. package/esm2022/components/attribute-configuration.component.mjs +138 -138
  14. package/esm2022/components/attribute-container.component.mjs +155 -155
  15. package/esm2022/components/attribute-default.component.mjs +63 -63
  16. package/esm2022/components/attribute-edit.component.mjs +33 -33
  17. package/esm2022/components/attribute-flex.component.mjs +58 -58
  18. package/esm2022/date/date-util.mjs +59 -59
  19. package/esm2022/huntsman-cancer-institute-cod.mjs +4 -4
  20. package/esm2022/index.mjs +20 -20
  21. package/esm2022/model/attribute-choice.entity.mjs +1 -1
  22. package/esm2022/model/attribute-configuration.dto.mjs +1 -1
  23. package/esm2022/model/attribute-configuration.entity.mjs +1 -1
  24. package/esm2022/model/attribute-container.entity.mjs +1 -1
  25. package/esm2022/model/attribute-dictionary.entity.mjs +1 -1
  26. package/esm2022/model/attribute-long-text.entity.mjs +1 -1
  27. package/esm2022/model/attribute-value-grid-row.entity.mjs +1 -1
  28. package/esm2022/model/attribute-value-set.entity.mjs +1 -1
  29. package/esm2022/model/attribute-value.entity.mjs +2 -2
  30. package/esm2022/model/attribute.entity.mjs +1 -1
  31. package/esm2022/model/dictionary-entries.dto.mjs +2 -2
  32. package/esm2022/model/extractable-field-status.entity.mjs +1 -1
  33. package/esm2022/model/graphical-attribute.entity.mjs +1 -1
  34. package/esm2022/model/pre-eval.dto.mjs +2 -2
  35. package/esm2022/pipes/is-group-attribute.pipe.mjs +32 -32
  36. package/esm2022/services/attribute.service.mjs +1211 -1211
  37. package/fesm2022/huntsman-cancer-institute-cod.mjs +2409 -2409
  38. package/fesm2022/huntsman-cancer-institute-cod.mjs.map +1 -1
  39. package/index.d.ts +27 -27
  40. package/model/attribute-choice.entity.d.ts +16 -16
  41. package/model/attribute-configuration.dto.d.ts +13 -13
  42. package/model/attribute-configuration.entity.d.ts +12 -12
  43. package/model/attribute-container.entity.d.ts +9 -9
  44. package/model/attribute-dictionary.entity.d.ts +12 -12
  45. package/model/attribute-long-text.entity.d.ts +4 -4
  46. package/model/attribute-value-grid-row.entity.d.ts +7 -7
  47. package/model/attribute-value-set.entity.d.ts +11 -11
  48. package/model/attribute-value.entity.d.ts +28 -28
  49. package/model/attribute.entity.d.ts +26 -26
  50. package/model/dictionary-entries.dto.d.ts +6 -6
  51. package/model/extractable-field-status.entity.d.ts +8 -8
  52. package/model/graphical-attribute.entity.d.ts +13 -13
  53. package/model/pre-eval.dto.d.ts +5 -5
  54. package/package.json +23 -7
  55. package/pipes/is-group-attribute.pipe.d.ts +13 -13
  56. package/services/attribute.service.d.ts +263 -263
@@ -1,564 +1,564 @@
1
- import { ElementRef, EventEmitter, Input, isDevMode, Output, Renderer2, ViewChild, Directive } from "@angular/core";
2
- import { DatePipe } from '@angular/common';
3
- import { Subscription } from "rxjs";
4
- import { first } from "rxjs/operators";
5
- import { AttributeService } from "../services/attribute.service";
6
- import { DateUtil } from "../date/date-util";
7
- import { NativeSelectComponent } from "@huntsman-cancer-institute/input";
8
- import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../services/attribute.service";
11
- import * as i2 from "@ng-bootstrap/ng-bootstrap";
12
- /**
13
- * The base class for an attribute. Attributes are iterated over by container. These may be in traditional absolute
14
- * positioning, flex positioning, or an edit mode as a column in a modal. Regardless of the template, the fundamental
15
- * needs of setting up the attribute values and persisting data are the same. So this class provides base functionality
16
- * and the components that extend it provide the template and may also extend the functionality.
17
- *
18
- * Types:
19
- * LINE
20
- * NLP_LINK
21
- * DICT
22
- * GA
23
- * LABEL
24
- * DT
25
- * AC
26
- * TXT
27
- * D
28
- * S
29
- * I
30
- * CB
31
- * B
32
- * N
33
- * EB
34
- */
35
- export class AttributeBase {
36
- constructor(attributeService, elementRef, renderer, modalService) {
37
- this.modalService = modalService;
38
- this.internalValues = false;
39
- this.editInline = true;
40
- this.groupAttributeRowId = undefined;
41
- this.resortColumns = new EventEmitter();
42
- this.attributeValues = [];
43
- this.width = 0;
44
- this.gridOptions = {
45
- headerHeight: 23,
46
- rowHeight: 23,
47
- rowStyle: {
48
- 'font-family': 'Prompt, sans-serif',
49
- 'color': '#3d7a99'
50
- },
51
- enableCellTextSelection: true,
52
- ensureDomOrder: true,
53
- suppressColumnVirtualisation: false
54
- };
55
- this.subscriptions = new Subscription();
56
- this.attributeService = attributeService;
57
- this.elementRef = elementRef;
58
- this.renderer = renderer;
59
- }
60
- /**
61
- * Get any attribute values for this attribute. If a complex attribute like a grid, set it up.
62
- */
63
- ngOnInit() {
64
- this.init();
65
- this.subscriptions.add(this.attributeService.getContainerUpdated().subscribe((updated) => {
66
- this.init();
67
- }));
68
- }
69
- ngOnDestroy() {
70
- this.subscriptions.unsubscribe();
71
- }
72
- onGridReady(params) {
73
- this.gridApi = params.api;
74
- this.gridApi.sizeColumnsToFit();
75
- }
76
- onModelUpdated(_event) {
77
- if (this.gridApi) {
78
- this.gridApi.sizeColumnsToFit();
79
- }
80
- }
81
- onGridSizeChanged(_event) {
82
- if (this.gridApi) {
83
- this.gridApi.sizeColumnsToFit();
84
- }
85
- }
86
- /**
87
- * Pulls the attribute values associated with this attribute and performs any specialized initialization such as for
88
- * the grid or multi choice.
89
- */
90
- init() {
91
- if (isDevMode()) {
92
- console.debug("Attribute.init: " + this.attribute.idAttribute);
93
- }
94
- this.gridData = undefined;
95
- this.gridColumns = undefined;
96
- this.attributeChoices = undefined;
97
- this.width = this.attributeService.getWidth();
98
- if (!this.internalValues) {
99
- this.attributeValues = this.attributeService.getAttributeValues(this.attribute.idAttribute, this.groupAttributeRowId);
100
- }
101
- if (this.attributeValues.length === 0 && this.attribute.codeAttributeDataType !== "GA" && this.attribute.isMultiValue !== "Y") {
102
- // TODO: Decide when to persist this to get the idAttributeValue.
103
- this.attributeValues.push({
104
- codeAttributeDataType: this.attribute.codeAttributeDataType,
105
- idAttributeValue: this.attributeService.getUniqueId(),
106
- idAttribute: this.attribute.idAttribute,
107
- idGroupAttribute: this.attribute.idGroupAttribute,
108
- groupAttributeRowId: this.groupAttributeRowId
109
- });
110
- }
111
- if (this.attribute.codeAttributeDataType === "GA") {
112
- this.initializeGrid();
113
- }
114
- else if (this.attribute.codeAttributeDataType === "AC") {
115
- this.initializeAttributeChoices();
116
- }
117
- else if (this.attribute.codeAttributeDataType === "TXT" && !this.attributeValues[0].valueLongText) {
118
- this.attributeValues[0].valueLongText = {
119
- idLongText: undefined,
120
- textData: undefined
121
- };
122
- }
123
- else if (this.attribute.codeAttributeDataType === "DICT") {
124
- this.loadDictionaryEntries(this.attribute, this.attributeValues, this.groupAttributeRowId);
125
- }
126
- else if (this.attribute.codeAttributeDataType === "DT") {
127
- //Make a proper date for the date time component
128
- this.attributeValues[0].date = new Date(this.attributeValues[0].valueDateTime);
129
- }
130
- }
131
- loadDictionaryEntries(attribute, values, groupAttributeRowId) {
132
- //Adding this to subscriptions is probably unnecessary, since the first() will unsubscribe. We only get one value.
133
- this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, values, groupAttributeRowId).pipe(first()).subscribe((dto) => {
134
- this.dictionaryEntries = dto.entries;
135
- if (this.attribute.isMultiValue === 'Y') {
136
- this.initializeMultiDictEntries();
137
- }
138
- //If there is a referenced attribute this means this attribute is filtered by another attribute.
139
- if (dto.referencedAttribute) {
140
- //Need to subscribe to attribute pushes, in order to update our FILTERED DICTIONARY when the referenced attribute was changed
141
- this.subscriptions.add(this.attributeService.getAttributeValuePushedSubject().subscribe((av) => {
142
- //If it is the referenced attribute, (and for the same row if this is a grid row) we need to update the dictionary entries
143
- if (av.idAttribute === dto.referencedAttribute.idAttribute
144
- && ((av.groupAttributeRowId == null && this.groupAttributeRowId == null) || av.groupAttributeRowId === this.groupAttributeRowId)) {
145
- //Make another call to get the dictionary entries
146
- //Note that when passing in the referenceAttributeValue, the resulting DTO won't contain a referencedAttribute. A second subscription won't be created.
147
- this.reloadFilteredDictionaryEntries(attribute, values, groupAttributeRowId, av);
148
- }
149
- }));
150
- }
151
- }));
152
- }
153
- reloadFilteredDictionaryEntries(attribute, values, groupAttributeRowId, referencedAttributeValue) {
154
- //Adding this to subscriptions is probably unnecessary, since the first() will unsubscribe. We only get one value.
155
- this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, values, groupAttributeRowId, referencedAttributeValue).pipe(first()).subscribe((dto) => {
156
- this.dictionaryEntries = dto.entries;
157
- //Multi
158
- if (this.attribute.isMultiValue === 'Y') {
159
- this.initializeMultiDictEntries();
160
- //Probably need to slice out multi values that don't apply
161
- this.deleteFilteredOutDictionaryValues();
162
- }
163
- //Single
164
- else {
165
- //Maybe need to clear out the value if it no longer applies
166
- if (!dto.entriesIncludeSelectedValue) {
167
- this.valueDictChange(undefined);
168
- }
169
- }
170
- }));
171
- }
172
- deleteFilteredOutDictionaryValues() {
173
- //Iterate existing values
174
- for (let attributeValue of this.attributeValues) {
175
- let applicable = false;
176
- //Does it exist in new dicationryEntries?
177
- for (let entry of this.dictionaryEntries) {
178
- if (attributeValue.valueIdDictionary && entry.value === attributeValue.valueIdDictionary) {
179
- //keep
180
- applicable = true;
181
- break;
182
- }
183
- }
184
- if (!applicable) {
185
- //Get rid of values that no longer apply
186
- this.attributeService.spliceAttributeValueDict(this.attribute, attributeValue.valueIdDictionary);
187
- }
188
- }
189
- }
190
- initializeMultiDictEntries() {
191
- for (let entry of this.dictionaryEntries) {
192
- entry.checked = false;
193
- for (let attributeValue of this.attributeValues) {
194
- if (attributeValue.valueIdDictionary && entry.value === attributeValue.valueIdDictionary) {
195
- entry.checked = true;
196
- break;
197
- }
198
- }
199
- }
200
- }
201
- /**
202
- * Set a transient value on the attributeChoice to keep track of selected values.
203
- */
204
- initializeAttributeChoices() {
205
- this.attributeChoices = this.attribute.attributeChoices.slice();
206
- for (let attributeChoice of this.attributeChoices) {
207
- attributeChoice.value = false;
208
- for (let attributeValue of this.attributeValues) {
209
- if (attributeValue.valueAttributeChoice && attributeChoice.idAttributeChoice === attributeValue.valueAttributeChoice.idAttributeChoice) {
210
- attributeChoice.value = true;
211
- break;
212
- }
213
- }
214
- }
215
- }
216
- /**
217
- * If the attribute is a grid, find its children attributes which make up the columns and generate data based on all
218
- * the attribute values by their groupAttributeRowId.
219
- */
220
- initializeGrid() {
221
- if (isDevMode()) {
222
- console.debug("AttributeComponent.initializeGrid");
223
- }
224
- let columns = [];
225
- let data = [];
226
- if (!this.attribute.attributes) {
227
- return;
228
- }
229
- this.childAttributes = this.attribute.attributes.filter((attribute) => {
230
- return attribute["tabOrder"] !== undefined || attribute["w"] !== undefined;
231
- }).sort((a, b) => {
232
- if (a.tabOrder < b.tabOrder) {
233
- return -1;
234
- }
235
- else if (a.tabOrder > b.tabOrder) {
236
- return 1;
237
- }
238
- else {
239
- return 0;
240
- }
241
- });
242
- if (isDevMode()) {
243
- console.debug("AttributeComponent.initializeGrid: n Grid Attributes: " + this.childAttributes.length);
244
- }
245
- this.initializeGridColumns(this.childAttributes, columns);
246
- if (isDevMode()) {
247
- console.debug("AttributeComponent.initializeGrid: n Columns: " + columns.length);
248
- console.debug(columns);
249
- }
250
- if (isDevMode()) {
251
- console.debug("AttributeComponent.initializeGrid: n attributeValues: " + this.attributeValues.length);
252
- console.debug(this.attributeValues);
253
- }
254
- let sortedRowValues = this.attributeValues.filter((attributeValue) => attributeValue.idGroupAttribute = this.attribute.idAttribute)
255
- .sort((a, b) => {
256
- if (a.groupAttributeRowId < b.groupAttributeRowId) {
257
- return -1;
258
- }
259
- else if (a.groupAttributeRowId > b.groupAttributeRowId) {
260
- return 1;
261
- }
262
- else {
263
- return 0;
264
- }
265
- });
266
- let n = 0;
267
- for (let datum of sortedRowValues) {
268
- if (datum.groupAttributeRowId > n) {
269
- n = datum.groupAttributeRowId;
270
- data.push({
271
- groupAttributeRowId: datum.groupAttributeRowId
272
- });
273
- }
274
- }
275
- if (isDevMode()) {
276
- console.debug("AttributeComponent.initializeGrid: n Data: " + data.length);
277
- }
278
- this.initializeGridValues(data, sortedRowValues);
279
- if (isDevMode()) {
280
- console.debug("AttributeComponent.initializeGrid: Data");
281
- console.debug(data);
282
- }
283
- this.gridColumns = columns;
284
- this.gridData = data;
285
- }
286
- /**
287
- * Generate a column array based on the grouped attributes within the grid.
288
- *
289
- * @param {Attribute[]} attributes
290
- * @param {any[]} columns
291
- */
292
- initializeGridColumns(attributes, columns) {
293
- /*
294
- columns.push({
295
- field: "groupAttributeRowId", isKey: true, visible: false
296
- });*/
297
- for (const [i, attribute] of attributes.entries()) {
298
- let column = {
299
- field: attribute.attributeName,
300
- headerName: attribute.displayName,
301
- editable: false,
302
- sortable: true,
303
- resizable: true,
304
- filter: false,
305
- width: attribute.w,
306
- };
307
- // the last column should auto fill the remaining space
308
- if (attribute.w && i < attributes.length - 1) {
309
- column.suppressSizeToFit = true;
310
- }
311
- if (attribute.codeAttributeDataType === "D") {
312
- column.comparator = DateUtil.dateComparator;
313
- }
314
- else if (attribute.codeAttributeDataType === "DT") {
315
- column.comparator = DateUtil.dateTimeComparator;
316
- }
317
- columns.push(column);
318
- }
319
- }
320
- /**
321
- * After the columns are created, assigned
322
- *
323
- * @param {any[]} data
324
- */
325
- initializeGridValues(data, attributeValues) {
326
- for (let datum of attributeValues) {
327
- let attribute = this.childAttributes.filter((attribute) => {
328
- return attribute.idAttribute === datum.idAttribute;
329
- })[0];
330
- //Make a rowValue object with values for each attribute of the row
331
- let rowValue = data.find((row) => row.groupAttributeRowId === datum.groupAttributeRowId);
332
- if (!rowValue) {
333
- rowValue = { groupAttributeRowId: datum.groupAttributeRowId };
334
- data.push(rowValue);
335
- }
336
- if (!attribute) {
337
- console.error("Attribute.initializeGrid: idAttribute " + datum.idAttribute + " not found.");
338
- continue;
339
- }
340
- if (attribute.codeAttributeDataType === "DT") {
341
- rowValue[attribute.attributeName] = new DatePipe("en-US").transform(new Date(datum.valueDateTime), "M/d/yy, h:mm:ss a");
342
- }
343
- else if (attribute.codeAttributeDataType === "AC" && attribute.isMultiValue === "N") {
344
- if (datum.valueAttributeChoice) {
345
- rowValue[attribute.attributeName] = datum.valueAttributeChoice.choice;
346
- }
347
- }
348
- else if (attribute.codeAttributeDataType === "AC" && attribute.isMultiValue === "Y") {
349
- //Concatenated display
350
- if (rowValue[attribute.attributeName]) {
351
- rowValue[attribute.attributeName] = rowValue[attribute.attributeName] + ", " + datum.valueAttributeChoice.choice;
352
- }
353
- else {
354
- rowValue[attribute.attributeName] = datum.valueAttributeChoice.choice;
355
- }
356
- }
357
- else if (attribute.codeAttributeDataType === "DICT") {
358
- this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, attributeValues, datum.groupAttributeRowId).pipe(first()).subscribe((dto) => {
359
- let entry = dto.entries.find((entry) => entry.value === datum.valueIdDictionary);
360
- if (entry) {
361
- rowValue[attribute.attributeName] = dto.entries.find((entry) => entry.value === datum.valueIdDictionary).display;
362
- if (this.gridApi) {
363
- this.gridApi.refreshCells();
364
- }
365
- }
366
- }));
367
- }
368
- else if (attribute.codeAttributeDataType === "S" || attribute.codeAttributeDataType === "B" || attribute.codeAttributeDataType === "EB" || attribute.codeAttributeDataType === "CB") {
369
- rowValue[attribute.attributeName] = datum.valueString;
370
- }
371
- else {
372
- rowValue[attribute.attributeName] = datum.value;
373
- }
374
- }
375
- }
376
- /**
377
- * For override.
378
- */
379
- refresh() {
380
- if (isDevMode()) {
381
- console.debug("Attribute.refresh: " + this.attribute.idAttribute);
382
- }
383
- }
384
- valueStringChange(value) {
385
- if (value === "") {
386
- value = undefined;
387
- }
388
- this.attributeValues[0].valueString = value;
389
- this.attributeValues[0].value = value;
390
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
391
- }
392
- valueCheckboxChange(event) {
393
- if (event.target.checked) {
394
- this.attributeValues[0].valueString = "Y";
395
- }
396
- else {
397
- this.attributeValues[0].valueString = "N";
398
- }
399
- this.attributeValues[0].value = this.attributeValues[0].valueString;
400
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
401
- }
402
- valueIntegerChange(value) {
403
- this.attributeValues[0].valueInteger = value;
404
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
405
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
406
- }
407
- valueNumericChange(value) {
408
- this.attributeValues[0].valueNumeric = value;
409
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
410
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
411
- }
412
- valueDictChange(value) {
413
- this.attributeValues[0].valueIdDictionary = value;
414
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
415
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
416
- }
417
- valueDateChange(value) {
418
- this.attributeValues[0].valueDateTime = value;
419
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
420
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
421
- }
422
- valueTextChange(value) {
423
- if (this.attributeValues[0].valueLongText) {
424
- this.attributeValues[0].valueLongText.textData = value;
425
- }
426
- else {
427
- this.attributeValues[0].valueLongText = {
428
- idLongText: undefined,
429
- textData: value
430
- };
431
- }
432
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
433
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
434
- }
435
- valueChoiceChange(value) {
436
- this.attributeValues[0].valueAttributeChoice = this.attributeChoices.find((attr) => attr.idAttributeChoice === value);
437
- this.attributeValues[0].value = (value) ? value.toString() : undefined;
438
- this.attributeService.pushAttributeValue(this.attributeValues[0]);
439
- }
440
- valueMultiChoiceChange(attributeChoice) {
441
- attributeChoice.value = !attributeChoice.value;
442
- //Remove
443
- if (!attributeChoice.value) {
444
- this.attributeService.spliceAttributeValueChoice(this.attribute, attributeChoice);
445
- }
446
- //Add
447
- else {
448
- this.attributeValues.push({
449
- codeAttributeDataType: "AC",
450
- idAttributeValue: this.attributeService.getUniqueId(),
451
- idAttributeValueSet: this.attributeService.getAttributeValueSet().getValue().idAttributeValueSet,
452
- idAttribute: this.attribute.idAttribute,
453
- valueAttributeChoice: attributeChoice,
454
- groupAttributeRowId: this.groupAttributeRowId,
455
- idGroupAttribute: this.attribute.idGroupAttribute
456
- });
457
- this.attributeService.pushAttributeValueMultiChoice(this.attributeValues[this.attributeValues.length - 1]);
458
- }
459
- }
460
- valueMultiDictChange(entry) {
461
- entry.checked = !entry.checked;
462
- //Remove
463
- if (!entry.checked) {
464
- this.attributeService.spliceAttributeValueDict(this.attribute, entry.value);
465
- }
466
- //Add
467
- else {
468
- this.attributeValues.push({
469
- codeAttributeDataType: "DICT",
470
- idAttributeValue: this.attributeService.getUniqueId(),
471
- idAttributeValueSet: this.attributeService.getAttributeValueSet().getValue().idAttributeValueSet,
472
- idAttribute: this.attribute.idAttribute,
473
- valueIdDictionary: entry.value,
474
- groupAttributeRowId: this.groupAttributeRowId,
475
- idGroupAttribute: this.attribute.idGroupAttribute
476
- });
477
- this.attributeService.pushAttributeValueMultiDict(this.attributeValues[this.attributeValues.length - 1]);
478
- }
479
- }
480
- addGridRow(modal, idGroupAttribute) {
481
- console.log("add grid row: " + idGroupAttribute);
482
- //Get a negative ID, so we know this is a new row
483
- this.editGroupAttributeRowId = this.attributeService.getUniqueId();
484
- this.editGroupRowAttributes = this.childAttributes;
485
- this.modalService.open(modal, { windowClass: "modal-lg" }).result.then((result) => {
486
- if (result === "Save") {
487
- this.saveGridRow(idGroupAttribute);
488
- }
489
- else if (result === "Cancel") {
490
- this.cancelEditCodGridRow();
491
- }
492
- }, (reason) => { });
493
- }
494
- editGridRow(modal, idGroupAttribute, event) {
495
- //EditInline is actually the ONLY way this can be editable, so this is really whether the grid is editable, at all
496
- if (this.editInline) {
497
- this.editGroupAttributeRowId = event.data.groupAttributeRowId;
498
- this.editGroupRowAttributes = this.childAttributes;
499
- this.modalService.open(modal, { windowClass: "modal-lg" }).result.then((result) => {
500
- if (result === "Save") {
501
- this.saveGridRow(idGroupAttribute);
502
- }
503
- else if (result === "Cancel") {
504
- this.cancelEditCodGridRow();
505
- }
506
- }, (reason) => { });
507
- }
508
- }
509
- removeGridRow(idGroupAttribute) {
510
- console.log("remove grid row: " + idGroupAttribute);
511
- let selectedColumns = this.gridApi.getSelectedNodes();
512
- if (selectedColumns.length > 0) {
513
- this.attributeService.deleteGridRowAttributeValues(idGroupAttribute, selectedColumns[0].data.groupAttributeRowId);
514
- }
515
- }
516
- cancelEditCodGridRow() {
517
- this.attributeService.clearUpdatedGridRowAttributeValues(this.editGroupAttributeRowId);
518
- this.editGroupRowAttributes = [];
519
- this.editGroupAttributeRowId = undefined;
520
- }
521
- /**
522
- * Values for a new grid row are stored separately. This function will add that data to the current grid data and
523
- * push the values to the service.
524
- */
525
- saveGridRow(idGroupAttribute) {
526
- console.log("save grid row");
527
- this.attributeService.saveGridRowAttributeValues(idGroupAttribute, this.editGroupAttributeRowId);
528
- this.editGroupAttributeRowId = undefined;
529
- this.editGroupRowAttributes = [];
530
- }
531
- comboFilterValueGetter(params) {
532
- let value = params.data[params.colDef.field];
533
- if (value) {
534
- let option = params.colDef.selectOptions.find((entry) => (entry[params.colDef.selectOptionsValueField] === value));
535
- return option ? option[params.colDef.selectOptionsDisplayField] : "";
536
- }
537
- return "";
538
- }
539
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeBase, deps: [{ token: i1.AttributeService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Directive }); }
540
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: AttributeBase, selector: "hci-attribute-base", inputs: { attribute: "attribute", internalValues: "internalValues", editInline: "editInline", groupAttributeRowId: "groupAttributeRowId" }, outputs: { resortColumns: "resortColumns" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "nativeSelectRef", first: true, predicate: ["nativeSelectRef"], descendants: true }], ngImport: i0 }); }
541
- }
542
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AttributeBase, decorators: [{
543
- type: Directive,
544
- args: [{
545
- selector: "hci-attribute-base"
546
- }]
547
- }], ctorParameters: function () { return [{ type: i1.AttributeService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.NgbModal }]; }, propDecorators: { attribute: [{
548
- type: Input
549
- }], internalValues: [{
550
- type: Input
551
- }], editInline: [{
552
- type: Input
553
- }], groupAttributeRowId: [{
554
- type: Input
555
- }], resortColumns: [{
556
- type: Output
557
- }], inputRef: [{
558
- type: ViewChild,
559
- args: ["inputRef", { static: false }]
560
- }], nativeSelectRef: [{
561
- type: ViewChild,
562
- args: ["nativeSelectRef", { static: false }]
563
- }] } });
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL2NvbXBvbmVudHMvYXR0cmlidXRlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFBZSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBMkMsU0FBUyxFQUMxSSxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFeEMsT0FBTyxFQUFtQixZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBTy9ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUMsUUFBUSxFQUFXLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFHOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQStDeEIsWUFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLFFBQW1CLEVBQVUsWUFBc0I7UUFBdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUE1Q2xILG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0Isd0JBQW1CLEdBQVcsU0FBUyxDQUFDO1FBRXZDLGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFLckUsb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBYXZDLFVBQUssR0FBVyxDQUFDLENBQUM7UUFRbEIsZ0JBQVcsR0FBRztZQUNWLFlB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RSxLQUFLLEVBQUM7Z0JBQ1MsZUFBZTtzQkFBN0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEVsZW1lbnRSZWYsIFRlbXBsYXRlUmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBpc0Rldk1vZGUsIE91dHB1dCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgT25Jbml0LCBPbkRlc3Ryb3ksIEluamVjdCwgRGlyZWN0aXZlLCBRdWVyeUxpc3RcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xyXG5cclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Zmlyc3R9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGVTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvYXR0cmlidXRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVMb25nVGV4dH0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1sb25nLXRleHQuZW50aXR5XCI7XHJcbmltcG9ydCB7R3JhcGhpY2FsQXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvZ3JhcGhpY2FsLWF0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuaW1wb3J0IHtEYXRlVXRpbH0gZnJvbSBcIi4uL2RhdGUvZGF0ZS11dGlsXCI7XHJcbmltcG9ydCB7TmF0aXZlU2VsZWN0Q29tcG9uZW50fSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvaW5wdXRcIjtcclxuaW1wb3J0IHtOZ2JNb2RhbCwgTmdiUGFuZWx9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge0dyaWRBcGksIFJvd0RvdWJsZUNsaWNrZWRFdmVudCwgUm93Tm9kZSwgUm93U2VsZWN0ZWRFdmVudCwgQWdHcmlkRXZlbnQsIEdyaWRTaXplQ2hhbmdlZEV2ZW50LCBNb2RlbFVwZGF0ZWRFdmVudH0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcblxyXG4vKipcclxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFuIGF0dHJpYnV0ZS4gIEF0dHJpYnV0ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgYnkgY29udGFpbmVyLiAgVGhlc2UgbWF5IGJlIGluIHRyYWRpdGlvbmFsIGFic29sdXRlXHJcbiAqIHBvc2l0aW9uaW5nLCBmbGV4IHBvc2l0aW9uaW5nLCBvciBhbiBlZGl0IG1vZGUgYXMgYSBjb2x1bW4gaW4gYSBtb2RhbC4gIFJlZ2FyZGxlc3Mgb2YgdGhlIHRlbXBsYXRlLCB0aGUgZnVuZGFtZW50YWxcclxuICogbmVlZHMgb2Ygc2V0dGluZyB1cCB0aGUgYXR0cmlidXRlIHZhbHVlcyBhbmQgcGVyc2lzdGluZyBkYXRhIGFyZSB0aGUgc2FtZS4gIFNvIHRoaXMgY2xhc3MgcHJvdmlkZXMgYmFzZSBmdW5jdGlvbmFsaXR5XHJcbiAqIGFuZCB0aGUgY29tcG9uZW50cyB0aGF0IGV4dGVuZCBpdCBwcm92aWRlIHRoZSB0ZW1wbGF0ZSBhbmQgbWF5IGFsc28gZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5LlxyXG4gKlxyXG4gKiBUeXBlczpcclxuICogTElORVxyXG4gKiBOTFBfTElOS1xyXG4gKiBESUNUXHJcbiAqIEdBXHJcbiAqIExBQkVMXHJcbiAqIERUXHJcbiAqIEFDXHJcbiAqIFRYVFxyXG4gKiBEXHJcbiAqIFNcclxuICogSVxyXG4gKiBDQlxyXG4gKiBCXHJcbiAqIE5cclxuICogRUJcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLWF0dHJpYnV0ZS1iYXNlXCJcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIEBJbnB1dCgpIGF0dHJpYnV0ZTogR3JhcGhpY2FsQXR0cmlidXRlO1xyXG4gIEBJbnB1dCgpIGludGVybmFsVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZWRpdElubGluZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICBAT3V0cHV0KCkgcmVzb3J0Q29sdW1uczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0UmVmXCIsIHtzdGF0aWM6IGZhbHNlfSkgaW5wdXRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcIm5hdGl2ZVNlbGVjdFJlZlwiLCB7c3RhdGljOiBmYWxzZX0pIG5hdGl2ZVNlbGVjdFJlZjogTmF0aXZlU2VsZWN0Q29tcG9uZW50O1xyXG5cclxuICBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuICBhdHRyaWJ1dGVDaG9pY2VzOiBBdHRyaWJ1dGVDaG9pY2VbXTtcclxuXHJcbiAgY2hpbGRBdHRyaWJ1dGVzOiBHcmFwaGljYWxBdHRyaWJ1dGVbXTtcclxuICBncmlkRGF0YTogYW55W107XHJcbiAgZ3JpZENvbHVtbnM6IGFueVtdO1xyXG5cclxuICAvL1VzZWQgZm9yIHRoZSBlZGl0IGdyb3VwIHJvdyB0ZW1wbGF0ZVxyXG4gIGVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXI7XHJcbiAgZWRpdEdyb3VwUm93QXR0cmlidXRlczogR3JhcGhpY2FsQXR0cmlidXRlW107XHJcblxyXG4gIGRpY3Rpb25hcnlFbnRyaWVzOiBhbnlbXTtcclxuXHJcbiAgd2lkdGg6IG51bWJlciA9IDA7XHJcblxyXG4gIGF0dHJpYnV0ZVNlcnZpY2U6IEF0dHJpYnV0ZVNlcnZpY2U7XHJcbiAgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuICByZW5kZXJlcjogUmVuZGVyZXIyO1xyXG5cclxuICBncmlkQXBpOiBHcmlkQXBpO1xyXG5cclxuICBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVySGVpZ2h0OiAyMyxcclxuICAgICAgcm93SGVpZ2h0OiAyMyxcclxuICAgICAgcm93U3R5bGU6IHtcclxuICAgICAgICAgICdmb250LWZhbWlseSc6ICdQcm9tcHQsIHNhbnMtc2VyaWYnLFxyXG4gICAgICAgICAgJ2NvbG9yJzogJyMzZDdhOTknXHJcbiAgICAgIH0sXHJcbiAgICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICBlbnN1cmVEb21PcmRlcjogdHJ1ZSxcclxuICAgICAgc3VwcHJlc3NDb2x1bW5WaXJ0dWFsaXNhdGlvbjogZmFsc2VcclxuICAgIH07XHJcblxyXG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlU2VydmljZTogQXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UgPSBhdHRyaWJ1dGVTZXJ2aWNlO1xyXG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcclxuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbnkgYXR0cmlidXRlIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUuICBJZiBhIGNvbXBsZXggYXR0cmlidXRlIGxpa2UgYSBncmlkLCBzZXQgaXQgdXAuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuYXR0cmlidXRlU2VydmljZS5nZXRDb250YWluZXJVcGRhdGVkKCkuc3Vic2NyaWJlKCh1cGRhdGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zIDogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICB9XHJcblxyXG4gIG9uTW9kZWxVcGRhdGVkKF9ldmVudDogTW9kZWxVcGRhdGVkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uR3JpZFNpemVDaGFuZ2VkKF9ldmVudDogR3JpZFNpemVDaGFuZ2VkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1bGxzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBhbmQgcGVyZm9ybXMgYW55IHNwZWNpYWxpemVkIGluaXRpYWxpemF0aW9uIHN1Y2ggYXMgZm9yXHJcbiAgICogdGhlIGdyaWQgb3IgbXVsdGkgY2hvaWNlLlxyXG4gICAqL1xyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZS5pbml0OiBcIiArIHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWREYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1ucyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuYXR0cmlidXRlQ2hvaWNlcyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMud2lkdGggPSB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0V2lkdGgoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaW50ZXJuYWxWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVzKHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLCB0aGlzLmdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5hdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlICE9PSBcIkdBXCIgJiYgdGhpcy5hdHRyaWJ1dGUuaXNNdWx0aVZhbHVlICE9PSBcIllcIikge1xyXG4gICAgICAvLyBUT0RPOiBEZWNpZGUgd2hlbiB0byBwZXJzaXN0IHRoaXMgdG8gZ2V0IHRoZSBpZEF0dHJpYnV0ZVZhbHVlLlxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKDxBdHRyaWJ1dGVWYWx1ZT57XHJcbiAgICAgICAgY29kZUF0dHJpYnV0ZURhdGFUeXBlOiB0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGVWYWx1ZTogdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmdldFVuaXF1ZUlkKCksXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIGlkR3JvdXBBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUsXHJcbiAgICAgICAgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiR0FcIikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVHcmlkKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJBQ1wiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZUNob2ljZXMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5hdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIlRYVFwiICYmICF0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0KSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlTG9uZ1RleHQgPSA8QXR0cmlidXRlTG9uZ1RleHQ+e1xyXG4gICAgICAgIGlkTG9uZ1RleHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICB0ZXh0RGF0YTogdW5kZWZpbmVkXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRElDVFwiKSB7XHJcbiAgICAgIHRoaXMubG9hZERpY3Rpb25hcnlFbnRyaWVzKHRoaXMuYXR0cmlidXRlLCB0aGlzLmF0dHJpYnV0ZVZhbHVlcywgdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEVFwiKSB7XHJcbiAgICAgIC8vTWFrZSBhIHByb3BlciBkYXRlIGZvciB0aGUgZGF0ZSB0aW1lIGNvbXBvbmVudFxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS5kYXRlID0gbmV3IERhdGUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVEYXRlVGltZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGxvYWREaWN0aW9uYXJ5RW50cmllcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpIHtcclxuICAgIC8vQWRkaW5nIHRoaXMgdG8gc3Vic2NyaXB0aW9ucyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSwgc2luY2UgdGhlIGZpcnN0KCkgd2lsbCB1bnN1YnNjcmliZS4gV2Ugb25seSBnZXQgb25lIHZhbHVlLlxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCB2YWx1ZXMsIGdyb3VwQXR0cmlidXRlUm93SWQpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkdG8uZW50cmllcztcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZS5pc011bHRpVmFsdWUgPT09ICdZJykge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU11bHRpRGljdEVudHJpZXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9JZiB0aGVyZSBpcyBhIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRoaXMgbWVhbnMgdGhpcyBhdHRyaWJ1dGUgaXMgZmlsdGVyZWQgYnkgYW5vdGhlciBhdHRyaWJ1dGUuXHJcbiAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIC8vTmVlZCB0byBzdWJzY3JpYmUgdG8gYXR0cmlidXRlIHB1c2hlcywgaW4gb3JkZXIgdG8gdXBkYXRlIG91ciBGSUxURVJFRCBESUNUSU9OQVJZIHdoZW4gdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHdhcyBjaGFuZ2VkXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0KCkuc3Vic2NyaWJlKChhdjogQXR0cmlidXRlVmFsdWUpID0+IHtcclxuICAgICAgICAgIC8vSWYgaXQgaXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlLCAoYW5kIGZvciB0aGUgc2FtZSByb3cgaWYgdGhpcyBpcyBhIGdyaWQgcm93KSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGljdGlvbmFyeSBlbnRyaWVzXHJcbiAgICAgICAgICBpZiAoYXYuaWRBdHRyaWJ1dGUgPT09IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICAgJiYgKChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09IG51bGwgJiYgdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkID09IG51bGwpIHx8IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMuZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vTWFrZSBhbm90aGVyIGNhbGwgdG8gZ2V0IHRoZSBkaWN0aW9uYXJ5IGVudHJpZXNcclxuICAgICAgICAgICAgLy9Ob3RlIHRoYXQgd2hlbiBwYXNzaW5nIGluIHRoZSByZWZlcmVuY2VBdHRyaWJ1dGVWYWx1ZSwgdGhlIHJlc3VsdGluZyBEVE8gd29uJ3QgY29udGFpbiBhIHJlZmVyZW5jZWRBdHRyaWJ1dGUuIEEgc2Vjb25kIHN1YnNjcmlwdGlvbiB3b24ndCBiZSBjcmVhdGVkLlxyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZEZpbHRlcmVkRGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCB2YWx1ZXMsIGdyb3VwQXR0cmlidXRlUm93SWQsIGF2KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHJlbG9hZEZpbHRlcmVkRGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAvL0FkZGluZyB0aGlzIHRvIHN1YnNjcmlwdGlvbnMgaXMgcHJvYmFibHkgdW5uZWNlc3NhcnksIHNpbmNlIHRoZSBmaXJzdCgpIHdpbGwgdW5zdWJzY3JpYmUuIFdlIG9ubHkgZ2V0IG9uZSB2YWx1ZS5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKGF0dHJpYnV0ZSwgdmFsdWVzLCBncm91cEF0dHJpYnV0ZVJvd0lkLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkdG8uZW50cmllcztcclxuXHJcbiAgICAgIC8vTXVsdGlcclxuICAgICAgaWYgKHRoaXMuYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gJ1knKSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTXVsdGlEaWN0RW50cmllcygpO1xyXG5cclxuICAgICAgICAvL1Byb2JhYmx5IG5lZWQgdG8gc2xpY2Ugb3V0IG11bHRpIHZhbHVlcyB0aGF0IGRvbid0IGFwcGx5XHJcbiAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXJlZE91dERpY3Rpb25hcnlWYWx1ZXMoKTtcclxuICAgICAgfVxyXG4gICAgICAvL1NpbmdsZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL01heWJlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSB2YWx1ZSBpZiBpdCBubyBsb25nZXIgYXBwbGllc1xyXG4gICAgICAgIGlmICghIGR0by5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMudmFsdWVEaWN0Q2hhbmdlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaWx0ZXJlZE91dERpY3Rpb25hcnlWYWx1ZXMoKSB7XHJcbiAgICAvL0l0ZXJhdGUgZXhpc3RpbmcgdmFsdWVzXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICBsZXQgYXBwbGljYWJsZTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAvL0RvZXMgaXQgZXhpc3QgaW4gbmV3IGRpY2F0aW9ucnlFbnRyaWVzP1xyXG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5ICYmIGVudHJ5LnZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgLy9rZWVwXHJcbiAgICAgICAgICBhcHBsaWNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEgYXBwbGljYWJsZSkge1xyXG4gICAgICAgIC8vR2V0IHJpZCBvZiB2YWx1ZXMgdGhhdCBubyBsb25nZXIgYXBwbHlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2Uuc3BsaWNlQXR0cmlidXRlVmFsdWVEaWN0KHRoaXMuYXR0cmlidXRlLCBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZU11bHRpRGljdEVudHJpZXMoKSB7XHJcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKSB7XHJcbiAgICAgIGVudHJ5LmNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZVZhbHVlIG9mIHRoaXMuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5ICYmIGVudHJ5LnZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgZW50cnkuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhIHRyYW5zaWVudCB2YWx1ZSBvbiB0aGUgYXR0cmlidXRlQ2hvaWNlIHRvIGtlZXAgdHJhY2sgb2Ygc2VsZWN0ZWQgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGluaXRpYWxpemVBdHRyaWJ1dGVDaG9pY2VzKCkge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDaG9pY2VzID0gdGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlQ2hvaWNlcy5zbGljZSgpO1xyXG5cclxuICAgIGZvciAobGV0IGF0dHJpYnV0ZUNob2ljZSBvZiB0aGlzLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgYXR0cmlidXRlQ2hvaWNlLnZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZSAmJiBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVDaG9pY2UudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgYXR0cmlidXRlIGlzIGEgZ3JpZCwgZmluZCBpdHMgY2hpbGRyZW4gYXR0cmlidXRlcyB3aGljaCBtYWtlIHVwIHRoZSBjb2x1bW5zIGFuZCBnZW5lcmF0ZSBkYXRhIGJhc2VkIG9uIGFsbFxyXG4gICAqIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGJ5IHRoZWlyIGdyb3VwQXR0cmlidXRlUm93SWQuXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29sdW1uczogYW55W10gPSBbXTtcclxuICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGlmICghdGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGlsZEF0dHJpYnV0ZXMgPSA8R3JhcGhpY2FsQXR0cmlidXRlW10+dGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZTogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVbXCJ0YWJPcmRlclwiXSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJpYnV0ZVtcIndcIl0gIT09IHVuZGVmaW5lZDtcclxuICAgIH0pLnNvcnQoKGE6IEdyYXBoaWNhbEF0dHJpYnV0ZSwgYjogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIGlmIChhLnRhYk9yZGVyIDwgYi50YWJPcmRlcikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfSBlbHNlIGlmIChhLnRhYk9yZGVyID4gYi50YWJPcmRlcikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZDogbiBHcmlkIEF0dHJpYnV0ZXM6IFwiICsgdGhpcy5jaGlsZEF0dHJpYnV0ZXMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVHcmlkQ29sdW1ucyh0aGlzLmNoaWxkQXR0cmlidXRlcywgY29sdW1ucyk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IG4gQ29sdW1uczogXCIgKyBjb2x1bW5zLmxlbmd0aCk7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoY29sdW1ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IG4gYXR0cmlidXRlVmFsdWVzOiBcIiArIHRoaXMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCk7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5hdHRyaWJ1dGVWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsZXQgc29ydGVkUm93VmFsdWVzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdHRyaWJ1dGVWYWx1ZSkgPT4gYXR0cmlidXRlVmFsdWUuaWRHcm91cEF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKVxyXG4gICAgICAuc29ydCgoYTogQXR0cmlidXRlVmFsdWUsIGI6IEF0dHJpYnV0ZVZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChhLmdyb3VwQXR0cmlidXRlUm93SWQgPCBiLmdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH0gZWxzZSBpZiAoYS5ncm91cEF0dHJpYnV0ZVJvd0lkID4gYi5ncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBuOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgZGF0dW0gb2Ygc29ydGVkUm93VmFsdWVzKSB7XHJcbiAgICAgIGlmIChkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkID4gbikge1xyXG4gICAgICAgIG4gPSBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkO1xyXG4gICAgICAgIGRhdGEucHVzaCh7XHJcbiAgICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZDogbiBEYXRhOiBcIiArIGRhdGEubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVHcmlkVmFsdWVzKGRhdGEsIHNvcnRlZFJvd1ZhbHVlcyk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IERhdGFcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkQ29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICB0aGlzLmdyaWREYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgY29sdW1uIGFycmF5IGJhc2VkIG9uIHRoZSBncm91cGVkIGF0dHJpYnV0ZXMgd2l0aGluIHRoZSBncmlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVbXX0gYXR0cmlidXRlc1xyXG4gICAqIEBwYXJhbSB7YW55W119IGNvbHVtbnNcclxuICAgKi9cclxuICBpbml0aWFsaXplR3JpZENvbHVtbnMoYXR0cmlidXRlczogR3JhcGhpY2FsQXR0cmlidXRlW10sIGNvbHVtbnM6IGFueVtdKSB7XHJcblxyXG4gICAgLypcclxuICAgIGNvbHVtbnMucHVzaCh7XHJcbiAgICAgIGZpZWxkOiBcImdyb3VwQXR0cmlidXRlUm93SWRcIiwgaXNLZXk6IHRydWUsIHZpc2libGU6IGZhbHNlXHJcbiAgICB9KTsqL1xyXG5cclxuICAgIGZvciAoY29uc3QgW2ksIGF0dHJpYnV0ZV0gb2YgYXR0cmlidXRlcy5lbnRyaWVzKCkpIHtcclxuICAgICAgbGV0IGNvbHVtbjogYW55ID0ge1xyXG4gICAgICAgIGZpZWxkOiBhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSxcclxuICAgICAgICBoZWFkZXJOYW1lOiBhdHRyaWJ1dGUuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICBmaWx0ZXI6IGZhbHNlLFxyXG4gICAgICAgIHdpZHRoOiBhdHRyaWJ1dGUudyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBzaG91bGQgYXV0byBmaWxsIHRoZSByZW1haW5pbmcgc3BhY2VcclxuICAgICAgaWYgKGF0dHJpYnV0ZS53ICYmIGkgPCBhdHRyaWJ1dGVzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb2x1bW4uc3VwcHJlc3NTaXplVG9GaXQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEXCIpIHtcclxuICAgICAgICBjb2x1bW4uY29tcGFyYXRvciA9IERhdGVVdGlsLmRhdGVDb21wYXJhdG9yO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRFRcIikge1xyXG4gICAgICAgIGNvbHVtbi5jb21wYXJhdG9yID0gRGF0ZVV0aWwuZGF0ZVRpbWVDb21wYXJhdG9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFmdGVyIHRoZSBjb2x1bW5zIGFyZSBjcmVhdGVkLCBhc3NpZ25lZFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YVxyXG4gICAqL1xyXG4gIGluaXRpYWxpemVHcmlkVmFsdWVzKGRhdGE6IGFueVtdLCBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGRhdHVtIG9mIGF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBBdHRyaWJ1dGUgPSB0aGlzLmNoaWxkQXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gZGF0dW0uaWRBdHRyaWJ1dGU7XHJcbiAgICAgIH0pWzBdO1xyXG5cclxuICAgICAgLy9NYWtlIGEgcm93VmFsdWUgb2JqZWN0IHdpdGggdmFsdWVzIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgcm93XHJcbiAgICAgIGxldCByb3dWYWx1ZTogYW55ID0gZGF0YS5maW5kKChyb3cpID0+IHJvdy5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgaWYgKCEgcm93VmFsdWUpIHtcclxuICAgICAgICByb3dWYWx1ZSA9IHtncm91cEF0dHJpYnV0ZVJvd0lkOiBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkfTtcclxuICAgICAgICBkYXRhLnB1c2gocm93VmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdHRyaWJ1dGUuaW5pdGlhbGl6ZUdyaWQ6IGlkQXR0cmlidXRlIFwiICsgZGF0dW0uaWRBdHRyaWJ1dGUgKyBcIiBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEVFwiKSB7XHJcbiAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gbmV3IERhdGVQaXBlKFwiZW4tVVNcIikudHJhbnNmb3JtKG5ldyBEYXRlKGRhdHVtLnZhbHVlRGF0ZVRpbWUpLCBcIk0vZC95eSwgaDptbTpzcyBhXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiQUNcIiAmJiBhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlID09PSBcIk5cIikge1xyXG4gICAgICAgIGlmIChkYXR1bS52YWx1ZUF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gZGF0dW0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuY2hvaWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIkFDXCIgJiYgYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gXCJZXCIpIHtcclxuICAgICAgICAvL0NvbmNhdGVuYXRlZCBkaXNwbGF5XHJcbiAgICAgICAgaWYgKHJvd1ZhbHVlW2F0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lXSkge1xyXG4gICAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdICsgXCIsIFwiICsgZGF0dW0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuY2hvaWNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5jaG9pY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRElDVFwiKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCBhdHRyaWJ1dGVWYWx1ZXMsIGRhdHVtLmdyb3VwQXR0cmlidXRlUm93SWQpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW50cnkgPSBkdG8uZW50cmllcy5maW5kKChlbnRyeTphbnkpID0+IGVudHJ5LnZhbHVlID09PSBkYXR1bS52YWx1ZUlkRGljdGlvbmFyeSk7XHJcblxyXG4gICAgICAgICAgaWYgKGVudHJ5KSB7XHJcbiAgICAgICAgICAgIHJvd1ZhbHVlW2F0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lXSA9IGR0by5lbnRyaWVzLmZpbmQoKGVudHJ5OmFueSkgPT4gZW50cnkudmFsdWUgPT09IGRhdHVtLnZhbHVlSWREaWN0aW9uYXJ5KS5kaXNwbGF5O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hDZWxscygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiU1wiIHx8IGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiQlwiIHx8IGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRUJcIiB8fCBhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIkNCXCIpIHtcclxuICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZVN0cmluZztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIG92ZXJyaWRlLlxyXG4gICAqL1xyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZS5yZWZyZXNoOiBcIiArIHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgdmFsdWVTdHJpbmdDaGFuZ2UodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlU3RyaW5nID0gdmFsdWU7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgdmFsdWVDaGVja2JveENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPSBcIllcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9IFwiTlwiO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWUgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZztcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlSW50ZWdlckNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUludGVnZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlTnVtZXJpY0NoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZU51bWVyaWMgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlRGljdENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUlkRGljdGlvbmFyeSA9IHZhbHVlO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWUgPSAodmFsdWUpP3ZhbHVlLnRvU3RyaW5nKCk6dW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgdmFsdWVEYXRlQ2hhbmdlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlRGF0ZVRpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlVGV4dENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVMb25nVGV4dCkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0LnRleHREYXRhID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0ID0gPEF0dHJpYnV0ZUxvbmdUZXh0PntcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9ICh2YWx1ZSk/dmFsdWUudG9TdHJpbmcoKTp1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnB1c2hBdHRyaWJ1dGVWYWx1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXSk7XHJcbiAgfVxyXG5cclxuICB2YWx1ZUNob2ljZUNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUF0dHJpYnV0ZUNob2ljZSA9IHRoaXMuYXR0cmlidXRlQ2hvaWNlcy5maW5kKChhdHRyKSA9PiBhdHRyLmlkQXR0cmlidXRlQ2hvaWNlID09PSB2YWx1ZSk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9ICh2YWx1ZSk/dmFsdWUudG9TdHJpbmcoKTp1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnB1c2hBdHRyaWJ1dGVWYWx1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXSk7XHJcbiAgfVxyXG5cclxuICB2YWx1ZU11bHRpQ2hvaWNlQ2hhbmdlKGF0dHJpYnV0ZUNob2ljZTogYW55KTogdm9pZCB7XHJcbiAgICBhdHRyaWJ1dGVDaG9pY2UudmFsdWUgPSAhYXR0cmlidXRlQ2hvaWNlLnZhbHVlO1xyXG5cclxuICAgIC8vUmVtb3ZlXHJcbiAgICBpZiAoIWF0dHJpYnV0ZUNob2ljZS52YWx1ZSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2Uuc3BsaWNlQXR0cmlidXRlVmFsdWVDaG9pY2UodGhpcy5hdHRyaWJ1dGUsIGF0dHJpYnV0ZUNob2ljZSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzLnB1c2goPEF0dHJpYnV0ZVZhbHVlPntcclxuICAgICAgICBjb2RlQXR0cmlidXRlRGF0YVR5cGU6IFwiQUNcIixcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlOiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0VW5pcXVlSWQoKSxcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVTZXQoKS5nZXRWYWx1ZSgpLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIHZhbHVlQXR0cmlidXRlQ2hvaWNlOiBhdHRyaWJ1dGVDaG9pY2UsXHJcbiAgICAgICAgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGlkR3JvdXBBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGVcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbdGhpcy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsdWVNdWx0aURpY3RDaGFuZ2UoZW50cnk6IGFueSk6IHZvaWQge1xyXG4gICAgZW50cnkuY2hlY2tlZCA9ICFlbnRyeS5jaGVja2VkO1xyXG5cclxuICAgIC8vUmVtb3ZlXHJcbiAgICBpZiAoIWVudHJ5LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdCh0aGlzLmF0dHJpYnV0ZSwgZW50cnkudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy9BZGRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKDxBdHRyaWJ1dGVWYWx1ZT57XHJcbiAgICAgICAgY29kZUF0dHJpYnV0ZURhdGFUeXBlOiBcIkRJQ1RcIixcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlOiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0VW5pcXVlSWQoKSxcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVTZXQoKS5nZXRWYWx1ZSgpLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIHZhbHVlSWREaWN0aW9uYXJ5OiBlbnRyeS52YWx1ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiB0aGlzLmdyb3VwQXR0cmlidXRlUm93SWQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogdGhpcy5hdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWVNdWx0aURpY3QodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbdGhpcy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFkZEdyaWRSb3cobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4sIGlkR3JvdXBBdHRyaWJ1dGU6IG51bWJlcikge1xyXG4gICAgY29uc29sZS5sb2coXCJhZGQgZ3JpZCByb3c6IFwiICsgaWRHcm91cEF0dHJpYnV0ZSk7XHJcblxyXG4gICAgLy9HZXQgYSBuZWdhdGl2ZSBJRCwgc28gd2Uga25vdyB0aGlzIGlzIGEgbmV3IHJvd1xyXG4gICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IHRoaXMuYXR0cmlidXRlU2VydmljZS5nZXRVbmlxdWVJZCgpO1xyXG4gICAgdGhpcy5lZGl0R3JvdXBSb3dBdHRyaWJ1dGVzID0gdGhpcy5jaGlsZEF0dHJpYnV0ZXM7XHJcblxyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWwsIHt3aW5kb3dDbGFzczogXCJtb2RhbC1sZ1wifSkucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0ID09PSBcIlNhdmVcIikge1xyXG4gICAgICAgIHRoaXMuc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIkNhbmNlbFwiKSB7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFZGl0Q29kR3JpZFJvdygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAocmVhc29uKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBlZGl0R3JpZFJvdyhtb2RhbDogVGVtcGxhdGVSZWY8YW55PiwgaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBldmVudDogUm93RG91YmxlQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICAvL0VkaXRJbmxpbmUgaXMgYWN0dWFsbHkgdGhlIE9OTFkgd2F5IHRoaXMgY2FuIGJlIGVkaXRhYmxlLCBzbyB0aGlzIGlzIHJlYWxseSB3aGV0aGVyIHRoZSBncmlkIGlzIGVkaXRhYmxlLCBhdCBhbGxcclxuICAgIGlmICh0aGlzLmVkaXRJbmxpbmUpIHtcclxuICAgICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IGV2ZW50LmRhdGEuZ3JvdXBBdHRyaWJ1dGVSb3dJZDtcclxuICAgICAgdGhpcy5lZGl0R3JvdXBSb3dBdHRyaWJ1dGVzID0gdGhpcy5jaGlsZEF0dHJpYnV0ZXM7XHJcblxyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihtb2RhbCwge3dpbmRvd0NsYXNzOiBcIm1vZGFsLWxnXCJ9KS5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gXCJTYXZlXCIpIHtcclxuICAgICAgICAgIHRoaXMuc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IFwiQ2FuY2VsXCIpIHtcclxuICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdENvZEdyaWRSb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIChyZWFzb24pID0+IHt9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcInJlbW92ZSBncmlkIHJvdzogXCIgKyBpZEdyb3VwQXR0cmlidXRlKTtcclxuICAgIGxldCBzZWxlY3RlZENvbHVtbnM6IFJvd05vZGVbXSA9IHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZE5vZGVzKCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5kZWxldGVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGUsIHNlbGVjdGVkQ29sdW1uc1swXS5kYXRhLmdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsRWRpdENvZEdyaWRSb3coKSB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuY2xlYXJVcGRhdGVkR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyh0aGlzLmVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIHRoaXMuZWRpdEdyb3VwUm93QXR0cmlidXRlcyA9IFtdO1xyXG4gICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBWYWx1ZXMgZm9yIGEgbmV3IGdyaWQgcm93IGFyZSBzdG9yZWQgc2VwYXJhdGVseS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgdGhhdCBkYXRhIHRvIHRoZSBjdXJyZW50IGdyaWQgZGF0YSBhbmRcclxuICAgKiBwdXNoIHRoZSB2YWx1ZXMgdG8gdGhlIHNlcnZpY2UuXHJcbiAgICovXHJcbiAgc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhcInNhdmUgZ3JpZCByb3dcIik7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnNhdmVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGUsIHRoaXMuZWRpdEdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgIHRoaXMuZWRpdEdyb3VwQXR0cmlidXRlUm93SWQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVkaXRHcm91cFJvd0F0dHJpYnV0ZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tYm9GaWx0ZXJWYWx1ZUdldHRlcihwYXJhbXMpOiBhbnkge1xyXG4gICAgbGV0IHZhbHVlID0gcGFyYW1zLmRhdGFbcGFyYW1zLmNvbERlZi5maWVsZF07XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgbGV0IG9wdGlvbiA9ICgocGFyYW1zLmNvbERlZiBhcyBhbnkpLnNlbGVjdE9wdGlvbnMgYXMgYW55W10pLmZpbmQoKGVudHJ5KSA9PiAoZW50cnlbcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zVmFsdWVGaWVsZF0gPT09IHZhbHVlKSk7XHJcbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkXSA6IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcbn1cclxuIl19
1
+ import { ElementRef, EventEmitter, Input, isDevMode, Output, Renderer2, ViewChild, Directive } from "@angular/core";
2
+ import { DatePipe } from '@angular/common';
3
+ import { Subscription } from "rxjs";
4
+ import { first } from "rxjs/operators";
5
+ import { AttributeService } from "../services/attribute.service";
6
+ import { DateUtil } from "../date/date-util";
7
+ import { NativeSelectComponent } from "@huntsman-cancer-institute/input";
8
+ import { NgbModal } from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../services/attribute.service";
11
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
12
+ /**
13
+ * The base class for an attribute. Attributes are iterated over by container. These may be in traditional absolute
14
+ * positioning, flex positioning, or an edit mode as a column in a modal. Regardless of the template, the fundamental
15
+ * needs of setting up the attribute values and persisting data are the same. So this class provides base functionality
16
+ * and the components that extend it provide the template and may also extend the functionality.
17
+ *
18
+ * Types:
19
+ * LINE
20
+ * NLP_LINK
21
+ * DICT
22
+ * GA
23
+ * LABEL
24
+ * DT
25
+ * AC
26
+ * TXT
27
+ * D
28
+ * S
29
+ * I
30
+ * CB
31
+ * B
32
+ * N
33
+ * EB
34
+ */
35
+ export class AttributeBase {
36
+ constructor(attributeService, elementRef, renderer, modalService) {
37
+ this.modalService = modalService;
38
+ this.internalValues = false;
39
+ this.editInline = true;
40
+ this.groupAttributeRowId = undefined;
41
+ this.resortColumns = new EventEmitter();
42
+ this.attributeValues = [];
43
+ this.width = 0;
44
+ this.gridOptions = {
45
+ headerHeight: 23,
46
+ rowHeight: 23,
47
+ rowStyle: {
48
+ 'font-family': 'Prompt, sans-serif',
49
+ 'color': '#3d7a99'
50
+ },
51
+ enableCellTextSelection: true,
52
+ ensureDomOrder: true,
53
+ suppressColumnVirtualisation: false
54
+ };
55
+ this.subscriptions = new Subscription();
56
+ this.attributeService = attributeService;
57
+ this.elementRef = elementRef;
58
+ this.renderer = renderer;
59
+ }
60
+ /**
61
+ * Get any attribute values for this attribute. If a complex attribute like a grid, set it up.
62
+ */
63
+ ngOnInit() {
64
+ this.init();
65
+ this.subscriptions.add(this.attributeService.getContainerUpdated().subscribe((updated) => {
66
+ this.init();
67
+ }));
68
+ }
69
+ ngOnDestroy() {
70
+ this.subscriptions.unsubscribe();
71
+ }
72
+ onGridReady(params) {
73
+ this.gridApi = params.api;
74
+ this.gridApi.sizeColumnsToFit();
75
+ }
76
+ onModelUpdated(_event) {
77
+ if (this.gridApi) {
78
+ this.gridApi.sizeColumnsToFit();
79
+ }
80
+ }
81
+ onGridSizeChanged(_event) {
82
+ if (this.gridApi) {
83
+ this.gridApi.sizeColumnsToFit();
84
+ }
85
+ }
86
+ /**
87
+ * Pulls the attribute values associated with this attribute and performs any specialized initialization such as for
88
+ * the grid or multi choice.
89
+ */
90
+ init() {
91
+ if (isDevMode()) {
92
+ console.debug("Attribute.init: " + this.attribute.idAttribute);
93
+ }
94
+ this.gridData = undefined;
95
+ this.gridColumns = undefined;
96
+ this.attributeChoices = undefined;
97
+ this.width = this.attributeService.getWidth();
98
+ if (!this.internalValues) {
99
+ this.attributeValues = this.attributeService.getAttributeValues(this.attribute.idAttribute, this.groupAttributeRowId);
100
+ }
101
+ if (this.attributeValues.length === 0 && this.attribute.codeAttributeDataType !== "GA" && this.attribute.isMultiValue !== "Y") {
102
+ // TODO: Decide when to persist this to get the idAttributeValue.
103
+ this.attributeValues.push({
104
+ codeAttributeDataType: this.attribute.codeAttributeDataType,
105
+ idAttributeValue: this.attributeService.getUniqueId(),
106
+ idAttribute: this.attribute.idAttribute,
107
+ idGroupAttribute: this.attribute.idGroupAttribute,
108
+ groupAttributeRowId: this.groupAttributeRowId
109
+ });
110
+ }
111
+ if (this.attribute.codeAttributeDataType === "GA") {
112
+ this.initializeGrid();
113
+ }
114
+ else if (this.attribute.codeAttributeDataType === "AC") {
115
+ this.initializeAttributeChoices();
116
+ }
117
+ else if (this.attribute.codeAttributeDataType === "TXT" && !this.attributeValues[0].valueLongText) {
118
+ this.attributeValues[0].valueLongText = {
119
+ idLongText: undefined,
120
+ textData: undefined
121
+ };
122
+ }
123
+ else if (this.attribute.codeAttributeDataType === "DICT") {
124
+ this.loadDictionaryEntries(this.attribute, this.attributeValues, this.groupAttributeRowId);
125
+ }
126
+ else if (this.attribute.codeAttributeDataType === "DT") {
127
+ //Make a proper date for the date time component
128
+ this.attributeValues[0].date = new Date(this.attributeValues[0].valueDateTime);
129
+ }
130
+ }
131
+ loadDictionaryEntries(attribute, values, groupAttributeRowId) {
132
+ //Adding this to subscriptions is probably unnecessary, since the first() will unsubscribe. We only get one value.
133
+ this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, values, groupAttributeRowId).pipe(first()).subscribe((dto) => {
134
+ this.dictionaryEntries = dto.entries;
135
+ if (this.attribute.isMultiValue === 'Y') {
136
+ this.initializeMultiDictEntries();
137
+ }
138
+ //If there is a referenced attribute this means this attribute is filtered by another attribute.
139
+ if (dto.referencedAttribute) {
140
+ //Need to subscribe to attribute pushes, in order to update our FILTERED DICTIONARY when the referenced attribute was changed
141
+ this.subscriptions.add(this.attributeService.getAttributeValuePushedSubject().subscribe((av) => {
142
+ //If it is the referenced attribute, (and for the same row if this is a grid row) we need to update the dictionary entries
143
+ if (av.idAttribute === dto.referencedAttribute.idAttribute
144
+ && ((av.groupAttributeRowId == null && this.groupAttributeRowId == null) || av.groupAttributeRowId === this.groupAttributeRowId)) {
145
+ //Make another call to get the dictionary entries
146
+ //Note that when passing in the referenceAttributeValue, the resulting DTO won't contain a referencedAttribute. A second subscription won't be created.
147
+ this.reloadFilteredDictionaryEntries(attribute, values, groupAttributeRowId, av);
148
+ }
149
+ }));
150
+ }
151
+ }));
152
+ }
153
+ reloadFilteredDictionaryEntries(attribute, values, groupAttributeRowId, referencedAttributeValue) {
154
+ //Adding this to subscriptions is probably unnecessary, since the first() will unsubscribe. We only get one value.
155
+ this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, values, groupAttributeRowId, referencedAttributeValue).pipe(first()).subscribe((dto) => {
156
+ this.dictionaryEntries = dto.entries;
157
+ //Multi
158
+ if (this.attribute.isMultiValue === 'Y') {
159
+ this.initializeMultiDictEntries();
160
+ //Probably need to slice out multi values that don't apply
161
+ this.deleteFilteredOutDictionaryValues();
162
+ }
163
+ //Single
164
+ else {
165
+ //Maybe need to clear out the value if it no longer applies
166
+ if (!dto.entriesIncludeSelectedValue) {
167
+ this.valueDictChange(undefined);
168
+ }
169
+ }
170
+ }));
171
+ }
172
+ deleteFilteredOutDictionaryValues() {
173
+ //Iterate existing values
174
+ for (let attributeValue of this.attributeValues) {
175
+ let applicable = false;
176
+ //Does it exist in new dicationryEntries?
177
+ for (let entry of this.dictionaryEntries) {
178
+ if (attributeValue.valueIdDictionary && entry.value === attributeValue.valueIdDictionary) {
179
+ //keep
180
+ applicable = true;
181
+ break;
182
+ }
183
+ }
184
+ if (!applicable) {
185
+ //Get rid of values that no longer apply
186
+ this.attributeService.spliceAttributeValueDict(this.attribute, attributeValue.valueIdDictionary);
187
+ }
188
+ }
189
+ }
190
+ initializeMultiDictEntries() {
191
+ for (let entry of this.dictionaryEntries) {
192
+ entry.checked = false;
193
+ for (let attributeValue of this.attributeValues) {
194
+ if (attributeValue.valueIdDictionary && entry.value === attributeValue.valueIdDictionary) {
195
+ entry.checked = true;
196
+ break;
197
+ }
198
+ }
199
+ }
200
+ }
201
+ /**
202
+ * Set a transient value on the attributeChoice to keep track of selected values.
203
+ */
204
+ initializeAttributeChoices() {
205
+ this.attributeChoices = this.attribute.attributeChoices.slice();
206
+ for (let attributeChoice of this.attributeChoices) {
207
+ attributeChoice.value = false;
208
+ for (let attributeValue of this.attributeValues) {
209
+ if (attributeValue.valueAttributeChoice && attributeChoice.idAttributeChoice === attributeValue.valueAttributeChoice.idAttributeChoice) {
210
+ attributeChoice.value = true;
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * If the attribute is a grid, find its children attributes which make up the columns and generate data based on all
218
+ * the attribute values by their groupAttributeRowId.
219
+ */
220
+ initializeGrid() {
221
+ if (isDevMode()) {
222
+ console.debug("AttributeComponent.initializeGrid");
223
+ }
224
+ let columns = [];
225
+ let data = [];
226
+ if (!this.attribute.attributes) {
227
+ return;
228
+ }
229
+ this.childAttributes = this.attribute.attributes.filter((attribute) => {
230
+ return attribute["tabOrder"] !== undefined || attribute["w"] !== undefined;
231
+ }).sort((a, b) => {
232
+ if (a.tabOrder < b.tabOrder) {
233
+ return -1;
234
+ }
235
+ else if (a.tabOrder > b.tabOrder) {
236
+ return 1;
237
+ }
238
+ else {
239
+ return 0;
240
+ }
241
+ });
242
+ if (isDevMode()) {
243
+ console.debug("AttributeComponent.initializeGrid: n Grid Attributes: " + this.childAttributes.length);
244
+ }
245
+ this.initializeGridColumns(this.childAttributes, columns);
246
+ if (isDevMode()) {
247
+ console.debug("AttributeComponent.initializeGrid: n Columns: " + columns.length);
248
+ console.debug(columns);
249
+ }
250
+ if (isDevMode()) {
251
+ console.debug("AttributeComponent.initializeGrid: n attributeValues: " + this.attributeValues.length);
252
+ console.debug(this.attributeValues);
253
+ }
254
+ let sortedRowValues = this.attributeValues.filter((attributeValue) => attributeValue.idGroupAttribute = this.attribute.idAttribute)
255
+ .sort((a, b) => {
256
+ if (a.groupAttributeRowId < b.groupAttributeRowId) {
257
+ return -1;
258
+ }
259
+ else if (a.groupAttributeRowId > b.groupAttributeRowId) {
260
+ return 1;
261
+ }
262
+ else {
263
+ return 0;
264
+ }
265
+ });
266
+ let n = 0;
267
+ for (let datum of sortedRowValues) {
268
+ if (datum.groupAttributeRowId > n) {
269
+ n = datum.groupAttributeRowId;
270
+ data.push({
271
+ groupAttributeRowId: datum.groupAttributeRowId
272
+ });
273
+ }
274
+ }
275
+ if (isDevMode()) {
276
+ console.debug("AttributeComponent.initializeGrid: n Data: " + data.length);
277
+ }
278
+ this.initializeGridValues(data, sortedRowValues);
279
+ if (isDevMode()) {
280
+ console.debug("AttributeComponent.initializeGrid: Data");
281
+ console.debug(data);
282
+ }
283
+ this.gridColumns = columns;
284
+ this.gridData = data;
285
+ }
286
+ /**
287
+ * Generate a column array based on the grouped attributes within the grid.
288
+ *
289
+ * @param {Attribute[]} attributes
290
+ * @param {any[]} columns
291
+ */
292
+ initializeGridColumns(attributes, columns) {
293
+ /*
294
+ columns.push({
295
+ field: "groupAttributeRowId", isKey: true, visible: false
296
+ });*/
297
+ for (const [i, attribute] of attributes.entries()) {
298
+ let column = {
299
+ field: attribute.attributeName,
300
+ headerName: attribute.displayName,
301
+ editable: false,
302
+ sortable: true,
303
+ resizable: true,
304
+ filter: false,
305
+ width: attribute.w,
306
+ };
307
+ // the last column should auto fill the remaining space
308
+ if (attribute.w && i < attributes.length - 1) {
309
+ column.suppressSizeToFit = true;
310
+ }
311
+ if (attribute.codeAttributeDataType === "D") {
312
+ column.comparator = DateUtil.dateComparator;
313
+ }
314
+ else if (attribute.codeAttributeDataType === "DT") {
315
+ column.comparator = DateUtil.dateTimeComparator;
316
+ }
317
+ columns.push(column);
318
+ }
319
+ }
320
+ /**
321
+ * After the columns are created, assigned
322
+ *
323
+ * @param {any[]} data
324
+ */
325
+ initializeGridValues(data, attributeValues) {
326
+ for (let datum of attributeValues) {
327
+ let attribute = this.childAttributes.filter((attribute) => {
328
+ return attribute.idAttribute === datum.idAttribute;
329
+ })[0];
330
+ //Make a rowValue object with values for each attribute of the row
331
+ let rowValue = data.find((row) => row.groupAttributeRowId === datum.groupAttributeRowId);
332
+ if (!rowValue) {
333
+ rowValue = { groupAttributeRowId: datum.groupAttributeRowId };
334
+ data.push(rowValue);
335
+ }
336
+ if (!attribute) {
337
+ console.error("Attribute.initializeGrid: idAttribute " + datum.idAttribute + " not found.");
338
+ continue;
339
+ }
340
+ if (attribute.codeAttributeDataType === "DT") {
341
+ rowValue[attribute.attributeName] = new DatePipe("en-US").transform(new Date(datum.valueDateTime), "M/d/yy, h:mm:ss a");
342
+ }
343
+ else if (attribute.codeAttributeDataType === "AC" && attribute.isMultiValue === "N") {
344
+ if (datum.valueAttributeChoice) {
345
+ rowValue[attribute.attributeName] = datum.valueAttributeChoice.choice;
346
+ }
347
+ }
348
+ else if (attribute.codeAttributeDataType === "AC" && attribute.isMultiValue === "Y") {
349
+ //Concatenated display
350
+ if (rowValue[attribute.attributeName]) {
351
+ rowValue[attribute.attributeName] = rowValue[attribute.attributeName] + ", " + datum.valueAttributeChoice.choice;
352
+ }
353
+ else {
354
+ rowValue[attribute.attributeName] = datum.valueAttributeChoice.choice;
355
+ }
356
+ }
357
+ else if (attribute.codeAttributeDataType === "DICT") {
358
+ this.subscriptions.add(this.attributeService.getDictionaryEntries(attribute, attributeValues, datum.groupAttributeRowId).pipe(first()).subscribe((dto) => {
359
+ let entry = dto.entries.find((entry) => entry.value === datum.valueIdDictionary);
360
+ if (entry) {
361
+ rowValue[attribute.attributeName] = dto.entries.find((entry) => entry.value === datum.valueIdDictionary).display;
362
+ if (this.gridApi) {
363
+ this.gridApi.refreshCells();
364
+ }
365
+ }
366
+ }));
367
+ }
368
+ else if (attribute.codeAttributeDataType === "S" || attribute.codeAttributeDataType === "B" || attribute.codeAttributeDataType === "EB" || attribute.codeAttributeDataType === "CB") {
369
+ rowValue[attribute.attributeName] = datum.valueString;
370
+ }
371
+ else {
372
+ rowValue[attribute.attributeName] = datum.value;
373
+ }
374
+ }
375
+ }
376
+ /**
377
+ * For override.
378
+ */
379
+ refresh() {
380
+ if (isDevMode()) {
381
+ console.debug("Attribute.refresh: " + this.attribute.idAttribute);
382
+ }
383
+ }
384
+ valueStringChange(value) {
385
+ if (value === "") {
386
+ value = undefined;
387
+ }
388
+ this.attributeValues[0].valueString = value;
389
+ this.attributeValues[0].value = value;
390
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
391
+ }
392
+ valueCheckboxChange(event) {
393
+ if (event.target.checked) {
394
+ this.attributeValues[0].valueString = "Y";
395
+ }
396
+ else {
397
+ this.attributeValues[0].valueString = "N";
398
+ }
399
+ this.attributeValues[0].value = this.attributeValues[0].valueString;
400
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
401
+ }
402
+ valueIntegerChange(value) {
403
+ this.attributeValues[0].valueInteger = value;
404
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
405
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
406
+ }
407
+ valueNumericChange(value) {
408
+ this.attributeValues[0].valueNumeric = value;
409
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
410
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
411
+ }
412
+ valueDictChange(value) {
413
+ this.attributeValues[0].valueIdDictionary = value;
414
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
415
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
416
+ }
417
+ valueDateChange(value) {
418
+ this.attributeValues[0].valueDateTime = value;
419
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
420
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
421
+ }
422
+ valueTextChange(value) {
423
+ if (this.attributeValues[0].valueLongText) {
424
+ this.attributeValues[0].valueLongText.textData = value;
425
+ }
426
+ else {
427
+ this.attributeValues[0].valueLongText = {
428
+ idLongText: undefined,
429
+ textData: value
430
+ };
431
+ }
432
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
433
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
434
+ }
435
+ valueChoiceChange(value) {
436
+ this.attributeValues[0].valueAttributeChoice = this.attributeChoices.find((attr) => attr.idAttributeChoice === value);
437
+ this.attributeValues[0].value = (value) ? value.toString() : undefined;
438
+ this.attributeService.pushAttributeValue(this.attributeValues[0]);
439
+ }
440
+ valueMultiChoiceChange(attributeChoice) {
441
+ attributeChoice.value = !attributeChoice.value;
442
+ //Remove
443
+ if (!attributeChoice.value) {
444
+ this.attributeService.spliceAttributeValueChoice(this.attribute, attributeChoice);
445
+ }
446
+ //Add
447
+ else {
448
+ this.attributeValues.push({
449
+ codeAttributeDataType: "AC",
450
+ idAttributeValue: this.attributeService.getUniqueId(),
451
+ idAttributeValueSet: this.attributeService.getAttributeValueSet().getValue().idAttributeValueSet,
452
+ idAttribute: this.attribute.idAttribute,
453
+ valueAttributeChoice: attributeChoice,
454
+ groupAttributeRowId: this.groupAttributeRowId,
455
+ idGroupAttribute: this.attribute.idGroupAttribute
456
+ });
457
+ this.attributeService.pushAttributeValueMultiChoice(this.attributeValues[this.attributeValues.length - 1]);
458
+ }
459
+ }
460
+ valueMultiDictChange(entry) {
461
+ entry.checked = !entry.checked;
462
+ //Remove
463
+ if (!entry.checked) {
464
+ this.attributeService.spliceAttributeValueDict(this.attribute, entry.value);
465
+ }
466
+ //Add
467
+ else {
468
+ this.attributeValues.push({
469
+ codeAttributeDataType: "DICT",
470
+ idAttributeValue: this.attributeService.getUniqueId(),
471
+ idAttributeValueSet: this.attributeService.getAttributeValueSet().getValue().idAttributeValueSet,
472
+ idAttribute: this.attribute.idAttribute,
473
+ valueIdDictionary: entry.value,
474
+ groupAttributeRowId: this.groupAttributeRowId,
475
+ idGroupAttribute: this.attribute.idGroupAttribute
476
+ });
477
+ this.attributeService.pushAttributeValueMultiDict(this.attributeValues[this.attributeValues.length - 1]);
478
+ }
479
+ }
480
+ addGridRow(modal, idGroupAttribute) {
481
+ console.log("add grid row: " + idGroupAttribute);
482
+ //Get a negative ID, so we know this is a new row
483
+ this.editGroupAttributeRowId = this.attributeService.getUniqueId();
484
+ this.editGroupRowAttributes = this.childAttributes;
485
+ this.modalService.open(modal, { windowClass: "modal-lg" }).result.then((result) => {
486
+ if (result === "Save") {
487
+ this.saveGridRow(idGroupAttribute);
488
+ }
489
+ else if (result === "Cancel") {
490
+ this.cancelEditCodGridRow();
491
+ }
492
+ }, (reason) => { });
493
+ }
494
+ editGridRow(modal, idGroupAttribute, event) {
495
+ //EditInline is actually the ONLY way this can be editable, so this is really whether the grid is editable, at all
496
+ if (this.editInline) {
497
+ this.editGroupAttributeRowId = event.data.groupAttributeRowId;
498
+ this.editGroupRowAttributes = this.childAttributes;
499
+ this.modalService.open(modal, { windowClass: "modal-lg" }).result.then((result) => {
500
+ if (result === "Save") {
501
+ this.saveGridRow(idGroupAttribute);
502
+ }
503
+ else if (result === "Cancel") {
504
+ this.cancelEditCodGridRow();
505
+ }
506
+ }, (reason) => { });
507
+ }
508
+ }
509
+ removeGridRow(idGroupAttribute) {
510
+ console.log("remove grid row: " + idGroupAttribute);
511
+ let selectedColumns = this.gridApi.getSelectedNodes();
512
+ if (selectedColumns.length > 0) {
513
+ this.attributeService.deleteGridRowAttributeValues(idGroupAttribute, selectedColumns[0].data.groupAttributeRowId);
514
+ }
515
+ }
516
+ cancelEditCodGridRow() {
517
+ this.attributeService.clearUpdatedGridRowAttributeValues(this.editGroupAttributeRowId);
518
+ this.editGroupRowAttributes = [];
519
+ this.editGroupAttributeRowId = undefined;
520
+ }
521
+ /**
522
+ * Values for a new grid row are stored separately. This function will add that data to the current grid data and
523
+ * push the values to the service.
524
+ */
525
+ saveGridRow(idGroupAttribute) {
526
+ console.log("save grid row");
527
+ this.attributeService.saveGridRowAttributeValues(idGroupAttribute, this.editGroupAttributeRowId);
528
+ this.editGroupAttributeRowId = undefined;
529
+ this.editGroupRowAttributes = [];
530
+ }
531
+ comboFilterValueGetter(params) {
532
+ let value = params.data[params.colDef.field];
533
+ if (value) {
534
+ let option = params.colDef.selectOptions.find((entry) => (entry[params.colDef.selectOptionsValueField] === value));
535
+ return option ? option[params.colDef.selectOptionsDisplayField] : "";
536
+ }
537
+ return "";
538
+ }
539
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AttributeBase, deps: [{ token: i1.AttributeService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Directive }); }
540
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.2", type: AttributeBase, selector: "hci-attribute-base", inputs: { attribute: "attribute", internalValues: "internalValues", editInline: "editInline", groupAttributeRowId: "groupAttributeRowId" }, outputs: { resortColumns: "resortColumns" }, viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["inputRef"], descendants: true }, { propertyName: "nativeSelectRef", first: true, predicate: ["nativeSelectRef"], descendants: true }], ngImport: i0 }); }
541
+ }
542
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AttributeBase, decorators: [{
543
+ type: Directive,
544
+ args: [{
545
+ selector: "hci-attribute-base"
546
+ }]
547
+ }], ctorParameters: () => [{ type: i1.AttributeService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.NgbModal }], propDecorators: { attribute: [{
548
+ type: Input
549
+ }], internalValues: [{
550
+ type: Input
551
+ }], editInline: [{
552
+ type: Input
553
+ }], groupAttributeRowId: [{
554
+ type: Input
555
+ }], resortColumns: [{
556
+ type: Output
557
+ }], inputRef: [{
558
+ type: ViewChild,
559
+ args: ["inputRef", { static: false }]
560
+ }], nativeSelectRef: [{
561
+ type: ViewChild,
562
+ args: ["nativeSelectRef", { static: false }]
563
+ }] } });
564
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Qvc3JjL2NvbXBvbmVudHMvYXR0cmlidXRlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFBZSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBMkMsU0FBUyxFQUMxSSxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFFeEMsT0FBTyxFQUFtQixZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBTy9ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUMsUUFBUSxFQUFXLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFHOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQStDeEIsWUFBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLFFBQW1CLEVBQVUsWUFBc0I7UUFBdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUE1Q2xILG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0Isd0JBQW1CLEdBQVcsU0FBUyxDQUFDO1FBRXZDLGtCQUFhLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFLckUsb0JBQWUsR0FBcUIsRUFBRSxDQUFDO1FBYXZDLFVBQUssR0FBVyxDQUFDLENBQUM7UUFRbEIsZ0JBQVcsR0FBRztZQUNWLFlB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QUM7UUFFcEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBVTtRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUEsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUMsQ0FBQSxTQUFTLENBQUM7UUFFbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBVTtRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUEsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUMsQ0FBQSxTQUFTLENBQUM7UUFFbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUEsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBLENBQUMsQ0FBQSxTQUFTLENB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UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBpc0Rldk1vZGUsIE91dHB1dCwgUmVuZGVyZXIyLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgT25Jbml0LCBPbkRlc3Ryb3ksIEluamVjdCwgRGlyZWN0aXZlLCBRdWVyeUxpc3RcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xyXG5cclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Zmlyc3R9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuaW1wb3J0IHtBdHRyaWJ1dGVTZXJ2aWNlfSBmcm9tIFwiLi4vc2VydmljZXMvYXR0cmlidXRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlVmFsdWV9IGZyb20gXCIuLi9tb2RlbC9hdHRyaWJ1dGUtdmFsdWUuZW50aXR5XCI7XHJcbmltcG9ydCB7QXR0cmlidXRlQ2hvaWNlfSBmcm9tIFwiLi4vbW9kZWwvYXR0cmlidXRlLWNob2ljZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtBdHRyaWJ1dGVMb25nVGV4dH0gZnJvbSBcIi4uL21vZGVsL2F0dHJpYnV0ZS1sb25nLXRleHQuZW50aXR5XCI7XHJcbmltcG9ydCB7R3JhcGhpY2FsQXR0cmlidXRlfSBmcm9tIFwiLi4vbW9kZWwvZ3JhcGhpY2FsLWF0dHJpYnV0ZS5lbnRpdHlcIjtcclxuaW1wb3J0IHtEaWN0aW9uYXJ5RW50cmllc0RUT30gZnJvbSBcIi4uL21vZGVsL2RpY3Rpb25hcnktZW50cmllcy5kdG9cIjtcclxuaW1wb3J0IHtEYXRlVXRpbH0gZnJvbSBcIi4uL2RhdGUvZGF0ZS11dGlsXCI7XHJcbmltcG9ydCB7TmF0aXZlU2VsZWN0Q29tcG9uZW50fSBmcm9tIFwiQGh1bnRzbWFuLWNhbmNlci1pbnN0aXR1dGUvaW5wdXRcIjtcclxuaW1wb3J0IHtOZ2JNb2RhbCwgTmdiUGFuZWx9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge0dyaWRBcGksIFJvd0RvdWJsZUNsaWNrZWRFdmVudCwgUm93Tm9kZSwgUm93U2VsZWN0ZWRFdmVudCwgQWdHcmlkRXZlbnQsIEdyaWRTaXplQ2hhbmdlZEV2ZW50LCBNb2RlbFVwZGF0ZWRFdmVudH0gZnJvbSBcImFnLWdyaWQtY29tbXVuaXR5XCI7XHJcblxyXG4vKipcclxuICogVGhlIGJhc2UgY2xhc3MgZm9yIGFuIGF0dHJpYnV0ZS4gIEF0dHJpYnV0ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgYnkgY29udGFpbmVyLiAgVGhlc2UgbWF5IGJlIGluIHRyYWRpdGlvbmFsIGFic29sdXRlXHJcbiAqIHBvc2l0aW9uaW5nLCBmbGV4IHBvc2l0aW9uaW5nLCBvciBhbiBlZGl0IG1vZGUgYXMgYSBjb2x1bW4gaW4gYSBtb2RhbC4gIFJlZ2FyZGxlc3Mgb2YgdGhlIHRlbXBsYXRlLCB0aGUgZnVuZGFtZW50YWxcclxuICogbmVlZHMgb2Ygc2V0dGluZyB1cCB0aGUgYXR0cmlidXRlIHZhbHVlcyBhbmQgcGVyc2lzdGluZyBkYXRhIGFyZSB0aGUgc2FtZS4gIFNvIHRoaXMgY2xhc3MgcHJvdmlkZXMgYmFzZSBmdW5jdGlvbmFsaXR5XHJcbiAqIGFuZCB0aGUgY29tcG9uZW50cyB0aGF0IGV4dGVuZCBpdCBwcm92aWRlIHRoZSB0ZW1wbGF0ZSBhbmQgbWF5IGFsc28gZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5LlxyXG4gKlxyXG4gKiBUeXBlczpcclxuICogTElORVxyXG4gKiBOTFBfTElOS1xyXG4gKiBESUNUXHJcbiAqIEdBXHJcbiAqIExBQkVMXHJcbiAqIERUXHJcbiAqIEFDXHJcbiAqIFRYVFxyXG4gKiBEXHJcbiAqIFNcclxuICogSVxyXG4gKiBDQlxyXG4gKiBCXHJcbiAqIE5cclxuICogRUJcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLWF0dHJpYnV0ZS1iYXNlXCJcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIEBJbnB1dCgpIGF0dHJpYnV0ZTogR3JhcGhpY2FsQXR0cmlidXRlO1xyXG4gIEBJbnB1dCgpIGludGVybmFsVmFsdWVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZWRpdElubGluZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyID0gdW5kZWZpbmVkO1xyXG5cclxuICBAT3V0cHV0KCkgcmVzb3J0Q29sdW1uczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0UmVmXCIsIHtzdGF0aWM6IGZhbHNlfSkgaW5wdXRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChcIm5hdGl2ZVNlbGVjdFJlZlwiLCB7c3RhdGljOiBmYWxzZX0pIG5hdGl2ZVNlbGVjdFJlZjogTmF0aXZlU2VsZWN0Q29tcG9uZW50O1xyXG5cclxuICBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10gPSBbXTtcclxuICBhdHRyaWJ1dGVDaG9pY2VzOiBBdHRyaWJ1dGVDaG9pY2VbXTtcclxuXHJcbiAgY2hpbGRBdHRyaWJ1dGVzOiBHcmFwaGljYWxBdHRyaWJ1dGVbXTtcclxuICBncmlkRGF0YTogYW55W107XHJcbiAgZ3JpZENvbHVtbnM6IGFueVtdO1xyXG5cclxuICAvL1VzZWQgZm9yIHRoZSBlZGl0IGdyb3VwIHJvdyB0ZW1wbGF0ZVxyXG4gIGVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXI7XHJcbiAgZWRpdEdyb3VwUm93QXR0cmlidXRlczogR3JhcGhpY2FsQXR0cmlidXRlW107XHJcblxyXG4gIGRpY3Rpb25hcnlFbnRyaWVzOiBhbnlbXTtcclxuXHJcbiAgd2lkdGg6IG51bWJlciA9IDA7XHJcblxyXG4gIGF0dHJpYnV0ZVNlcnZpY2U6IEF0dHJpYnV0ZVNlcnZpY2U7XHJcbiAgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuICByZW5kZXJlcjogUmVuZGVyZXIyO1xyXG5cclxuICBncmlkQXBpOiBHcmlkQXBpO1xyXG5cclxuICBncmlkT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVySGVpZ2h0OiAyMyxcclxuICAgICAgcm93SGVpZ2h0OiAyMyxcclxuICAgICAgcm93U3R5bGU6IHtcclxuICAgICAgICAgICdmb250LWZhbWlseSc6ICdQcm9tcHQsIHNhbnMtc2VyaWYnLFxyXG4gICAgICAgICAgJ2NvbG9yJzogJyMzZDdhOTknXHJcbiAgICAgIH0sXHJcbiAgICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICBlbnN1cmVEb21PcmRlcjogdHJ1ZSxcclxuICAgICAgc3VwcHJlc3NDb2x1bW5WaXJ0dWFsaXNhdGlvbjogZmFsc2VcclxuICAgIH07XHJcblxyXG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlU2VydmljZTogQXR0cmlidXRlU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UgPSBhdHRyaWJ1dGVTZXJ2aWNlO1xyXG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcclxuICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbnkgYXR0cmlidXRlIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUuICBJZiBhIGNvbXBsZXggYXR0cmlidXRlIGxpa2UgYSBncmlkLCBzZXQgaXQgdXAuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuYXR0cmlidXRlU2VydmljZS5nZXRDb250YWluZXJVcGRhdGVkKCkuc3Vic2NyaWJlKCh1cGRhdGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgb25HcmlkUmVhZHkocGFyYW1zIDogYW55KSB7XHJcbiAgICB0aGlzLmdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICB9XHJcblxyXG4gIG9uTW9kZWxVcGRhdGVkKF9ldmVudDogTW9kZWxVcGRhdGVkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uR3JpZFNpemVDaGFuZ2VkKF9ldmVudDogR3JpZFNpemVDaGFuZ2VkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNpemVDb2x1bW5zVG9GaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFB1bGxzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBhbmQgcGVyZm9ybXMgYW55IHNwZWNpYWxpemVkIGluaXRpYWxpemF0aW9uIHN1Y2ggYXMgZm9yXHJcbiAgICogdGhlIGdyaWQgb3IgbXVsdGkgY2hvaWNlLlxyXG4gICAqL1xyXG4gIGluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZS5pbml0OiBcIiArIHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWREYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5ncmlkQ29sdW1ucyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuYXR0cmlidXRlQ2hvaWNlcyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMud2lkdGggPSB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0V2lkdGgoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaW50ZXJuYWxWYWx1ZXMpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXMgPSB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVzKHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLCB0aGlzLmdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5hdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlICE9PSBcIkdBXCIgJiYgdGhpcy5hdHRyaWJ1dGUuaXNNdWx0aVZhbHVlICE9PSBcIllcIikge1xyXG4gICAgICAvLyBUT0RPOiBEZWNpZGUgd2hlbiB0byBwZXJzaXN0IHRoaXMgdG8gZ2V0IHRoZSBpZEF0dHJpYnV0ZVZhbHVlLlxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKDxBdHRyaWJ1dGVWYWx1ZT57XHJcbiAgICAgICAgY29kZUF0dHJpYnV0ZURhdGFUeXBlOiB0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGVWYWx1ZTogdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmdldFVuaXF1ZUlkKCksXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIGlkR3JvdXBBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGUsXHJcbiAgICAgICAgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiR0FcIikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVHcmlkKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJBQ1wiKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZUNob2ljZXMoKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5hdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIlRYVFwiICYmICF0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0KSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlTG9uZ1RleHQgPSA8QXR0cmlidXRlTG9uZ1RleHQ+e1xyXG4gICAgICAgIGlkTG9uZ1RleHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICB0ZXh0RGF0YTogdW5kZWZpbmVkXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRElDVFwiKSB7XHJcbiAgICAgIHRoaXMubG9hZERpY3Rpb25hcnlFbnRyaWVzKHRoaXMuYXR0cmlidXRlLCB0aGlzLmF0dHJpYnV0ZVZhbHVlcywgdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEVFwiKSB7XHJcbiAgICAgIC8vTWFrZSBhIHByb3BlciBkYXRlIGZvciB0aGUgZGF0ZSB0aW1lIGNvbXBvbmVudFxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS5kYXRlID0gbmV3IERhdGUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVEYXRlVGltZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGxvYWREaWN0aW9uYXJ5RW50cmllcyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSwgdmFsdWVzOiBBdHRyaWJ1dGVWYWx1ZVtdLCBncm91cEF0dHJpYnV0ZVJvd0lkOiBudW1iZXIpIHtcclxuICAgIC8vQWRkaW5nIHRoaXMgdG8gc3Vic2NyaXB0aW9ucyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSwgc2luY2UgdGhlIGZpcnN0KCkgd2lsbCB1bnN1YnNjcmliZS4gV2Ugb25seSBnZXQgb25lIHZhbHVlLlxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCB2YWx1ZXMsIGdyb3VwQXR0cmlidXRlUm93SWQpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkdG8uZW50cmllcztcclxuXHJcbiAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZS5pc011bHRpVmFsdWUgPT09ICdZJykge1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU11bHRpRGljdEVudHJpZXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9JZiB0aGVyZSBpcyBhIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRoaXMgbWVhbnMgdGhpcyBhdHRyaWJ1dGUgaXMgZmlsdGVyZWQgYnkgYW5vdGhlciBhdHRyaWJ1dGUuXHJcbiAgICAgIGlmIChkdG8ucmVmZXJlbmNlZEF0dHJpYnV0ZSkge1xyXG4gICAgICAgIC8vTmVlZCB0byBzdWJzY3JpYmUgdG8gYXR0cmlidXRlIHB1c2hlcywgaW4gb3JkZXIgdG8gdXBkYXRlIG91ciBGSUxURVJFRCBESUNUSU9OQVJZIHdoZW4gdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHdhcyBjaGFuZ2VkXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVQdXNoZWRTdWJqZWN0KCkuc3Vic2NyaWJlKChhdjogQXR0cmlidXRlVmFsdWUpID0+IHtcclxuICAgICAgICAgIC8vSWYgaXQgaXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlLCAoYW5kIGZvciB0aGUgc2FtZSByb3cgaWYgdGhpcyBpcyBhIGdyaWQgcm93KSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgZGljdGlvbmFyeSBlbnRyaWVzXHJcbiAgICAgICAgICBpZiAoYXYuaWRBdHRyaWJ1dGUgPT09IGR0by5yZWZlcmVuY2VkQXR0cmlidXRlLmlkQXR0cmlidXRlXHJcbiAgICAgICAgICAgICAgJiYgKChhdi5ncm91cEF0dHJpYnV0ZVJvd0lkID09IG51bGwgJiYgdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkID09IG51bGwpIHx8IGF2Lmdyb3VwQXR0cmlidXRlUm93SWQgPT09IHRoaXMuZ3JvdXBBdHRyaWJ1dGVSb3dJZCkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vTWFrZSBhbm90aGVyIGNhbGwgdG8gZ2V0IHRoZSBkaWN0aW9uYXJ5IGVudHJpZXNcclxuICAgICAgICAgICAgLy9Ob3RlIHRoYXQgd2hlbiBwYXNzaW5nIGluIHRoZSByZWZlcmVuY2VBdHRyaWJ1dGVWYWx1ZSwgdGhlIHJlc3VsdGluZyBEVE8gd29uJ3QgY29udGFpbiBhIHJlZmVyZW5jZWRBdHRyaWJ1dGUuIEEgc2Vjb25kIHN1YnNjcmlwdGlvbiB3b24ndCBiZSBjcmVhdGVkLlxyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZEZpbHRlcmVkRGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCB2YWx1ZXMsIGdyb3VwQXR0cmlidXRlUm93SWQsIGF2KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHJlbG9hZEZpbHRlcmVkRGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlOiBBdHRyaWJ1dGUsIHZhbHVlczogQXR0cmlidXRlVmFsdWVbXSwgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogbnVtYmVyLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWU6IEF0dHJpYnV0ZVZhbHVlKSB7XHJcbiAgICAvL0FkZGluZyB0aGlzIHRvIHN1YnNjcmlwdGlvbnMgaXMgcHJvYmFibHkgdW5uZWNlc3NhcnksIHNpbmNlIHRoZSBmaXJzdCgpIHdpbGwgdW5zdWJzY3JpYmUuIFdlIG9ubHkgZ2V0IG9uZSB2YWx1ZS5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLmdldERpY3Rpb25hcnlFbnRyaWVzKGF0dHJpYnV0ZSwgdmFsdWVzLCBncm91cEF0dHJpYnV0ZVJvd0lkLCByZWZlcmVuY2VkQXR0cmlidXRlVmFsdWUpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgIHRoaXMuZGljdGlvbmFyeUVudHJpZXMgPSBkdG8uZW50cmllcztcclxuXHJcbiAgICAgIC8vTXVsdGlcclxuICAgICAgaWYgKHRoaXMuYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gJ1knKSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplTXVsdGlEaWN0RW50cmllcygpO1xyXG5cclxuICAgICAgICAvL1Byb2JhYmx5IG5lZWQgdG8gc2xpY2Ugb3V0IG11bHRpIHZhbHVlcyB0aGF0IGRvbid0IGFwcGx5XHJcbiAgICAgICAgdGhpcy5kZWxldGVGaWx0ZXJlZE91dERpY3Rpb25hcnlWYWx1ZXMoKTtcclxuICAgICAgfVxyXG4gICAgICAvL1NpbmdsZVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL01heWJlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSB2YWx1ZSBpZiBpdCBubyBsb25nZXIgYXBwbGllc1xyXG4gICAgICAgIGlmICghIGR0by5lbnRyaWVzSW5jbHVkZVNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMudmFsdWVEaWN0Q2hhbmdlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVGaWx0ZXJlZE91dERpY3Rpb25hcnlWYWx1ZXMoKSB7XHJcbiAgICAvL0l0ZXJhdGUgZXhpc3RpbmcgdmFsdWVzXHJcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICBsZXQgYXBwbGljYWJsZTpib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAvL0RvZXMgaXQgZXhpc3QgaW4gbmV3IGRpY2F0aW9ucnlFbnRyaWVzP1xyXG4gICAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5ICYmIGVudHJ5LnZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgLy9rZWVwXHJcbiAgICAgICAgICBhcHBsaWNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCEgYXBwbGljYWJsZSkge1xyXG4gICAgICAgIC8vR2V0IHJpZCBvZiB2YWx1ZXMgdGhhdCBubyBsb25nZXIgYXBwbHlcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2Uuc3BsaWNlQXR0cmlidXRlVmFsdWVEaWN0KHRoaXMuYXR0cmlidXRlLCBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZU11bHRpRGljdEVudHJpZXMoKSB7XHJcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLmRpY3Rpb25hcnlFbnRyaWVzKSB7XHJcbiAgICAgIGVudHJ5LmNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGZvciAobGV0IGF0dHJpYnV0ZVZhbHVlIG9mIHRoaXMuYXR0cmlidXRlVmFsdWVzKSB7XHJcbiAgICAgICAgaWYgKGF0dHJpYnV0ZVZhbHVlLnZhbHVlSWREaWN0aW9uYXJ5ICYmIGVudHJ5LnZhbHVlID09PSBhdHRyaWJ1dGVWYWx1ZS52YWx1ZUlkRGljdGlvbmFyeSkge1xyXG4gICAgICAgICAgZW50cnkuY2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhIHRyYW5zaWVudCB2YWx1ZSBvbiB0aGUgYXR0cmlidXRlQ2hvaWNlIHRvIGtlZXAgdHJhY2sgb2Ygc2VsZWN0ZWQgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGluaXRpYWxpemVBdHRyaWJ1dGVDaG9pY2VzKCkge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVDaG9pY2VzID0gdGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlQ2hvaWNlcy5zbGljZSgpO1xyXG5cclxuICAgIGZvciAobGV0IGF0dHJpYnV0ZUNob2ljZSBvZiB0aGlzLmF0dHJpYnV0ZUNob2ljZXMpIHtcclxuICAgICAgYXR0cmlidXRlQ2hvaWNlLnZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgICBmb3IgKGxldCBhdHRyaWJ1dGVWYWx1ZSBvZiB0aGlzLmF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS52YWx1ZUF0dHJpYnV0ZUNob2ljZSAmJiBhdHRyaWJ1dGVDaG9pY2UuaWRBdHRyaWJ1dGVDaG9pY2UgPT09IGF0dHJpYnV0ZVZhbHVlLnZhbHVlQXR0cmlidXRlQ2hvaWNlLmlkQXR0cmlidXRlQ2hvaWNlKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVDaG9pY2UudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgYXR0cmlidXRlIGlzIGEgZ3JpZCwgZmluZCBpdHMgY2hpbGRyZW4gYXR0cmlidXRlcyB3aGljaCBtYWtlIHVwIHRoZSBjb2x1bW5zIGFuZCBnZW5lcmF0ZSBkYXRhIGJhc2VkIG9uIGFsbFxyXG4gICAqIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGJ5IHRoZWlyIGdyb3VwQXR0cmlidXRlUm93SWQuXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZUdyaWQoKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgY29sdW1uczogYW55W10gPSBbXTtcclxuICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGlmICghdGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlcykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jaGlsZEF0dHJpYnV0ZXMgPSA8R3JhcGhpY2FsQXR0cmlidXRlW10+dGhpcy5hdHRyaWJ1dGUuYXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZTogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVbXCJ0YWJPcmRlclwiXSAhPT0gdW5kZWZpbmVkIHx8IGF0dHJpYnV0ZVtcIndcIl0gIT09IHVuZGVmaW5lZDtcclxuICAgIH0pLnNvcnQoKGE6IEdyYXBoaWNhbEF0dHJpYnV0ZSwgYjogR3JhcGhpY2FsQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgIGlmIChhLnRhYk9yZGVyIDwgYi50YWJPcmRlcikge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfSBlbHNlIGlmIChhLnRhYk9yZGVyID4gYi50YWJPcmRlcikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZDogbiBHcmlkIEF0dHJpYnV0ZXM6IFwiICsgdGhpcy5jaGlsZEF0dHJpYnV0ZXMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVHcmlkQ29sdW1ucyh0aGlzLmNoaWxkQXR0cmlidXRlcywgY29sdW1ucyk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IG4gQ29sdW1uczogXCIgKyBjb2x1bW5zLmxlbmd0aCk7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoY29sdW1ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IG4gYXR0cmlidXRlVmFsdWVzOiBcIiArIHRoaXMuYXR0cmlidXRlVmFsdWVzLmxlbmd0aCk7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcodGhpcy5hdHRyaWJ1dGVWYWx1ZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsZXQgc29ydGVkUm93VmFsdWVzID0gdGhpcy5hdHRyaWJ1dGVWYWx1ZXMuZmlsdGVyKChhdHRyaWJ1dGVWYWx1ZSkgPT4gYXR0cmlidXRlVmFsdWUuaWRHcm91cEF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKVxyXG4gICAgICAuc29ydCgoYTogQXR0cmlidXRlVmFsdWUsIGI6IEF0dHJpYnV0ZVZhbHVlKSA9PiB7XHJcbiAgICAgIGlmIChhLmdyb3VwQXR0cmlidXRlUm93SWQgPCBiLmdyb3VwQXR0cmlidXRlUm93SWQpIHtcclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgIH0gZWxzZSBpZiAoYS5ncm91cEF0dHJpYnV0ZVJvd0lkID4gYi5ncm91cEF0dHJpYnV0ZVJvd0lkKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBuOiBudW1iZXIgPSAwO1xyXG4gICAgZm9yIChsZXQgZGF0dW0gb2Ygc29ydGVkUm93VmFsdWVzKSB7XHJcbiAgICAgIGlmIChkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkID4gbikge1xyXG4gICAgICAgIG4gPSBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkO1xyXG4gICAgICAgIGRhdGEucHVzaCh7XHJcbiAgICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZUNvbXBvbmVudC5pbml0aWFsaXplR3JpZDogbiBEYXRhOiBcIiArIGRhdGEubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmluaXRpYWxpemVHcmlkVmFsdWVzKGRhdGEsIHNvcnRlZFJvd1ZhbHVlcyk7XHJcblxyXG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJBdHRyaWJ1dGVDb21wb25lbnQuaW5pdGlhbGl6ZUdyaWQ6IERhdGFcIik7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5ncmlkQ29sdW1ucyA9IGNvbHVtbnM7XHJcbiAgICB0aGlzLmdyaWREYXRhID0gZGF0YTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgY29sdW1uIGFycmF5IGJhc2VkIG9uIHRoZSBncm91cGVkIGF0dHJpYnV0ZXMgd2l0aGluIHRoZSBncmlkLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtBdHRyaWJ1dGVbXX0gYXR0cmlidXRlc1xyXG4gICAqIEBwYXJhbSB7YW55W119IGNvbHVtbnNcclxuICAgKi9cclxuICBpbml0aWFsaXplR3JpZENvbHVtbnMoYXR0cmlidXRlczogR3JhcGhpY2FsQXR0cmlidXRlW10sIGNvbHVtbnM6IGFueVtdKSB7XHJcblxyXG4gICAgLypcclxuICAgIGNvbHVtbnMucHVzaCh7XHJcbiAgICAgIGZpZWxkOiBcImdyb3VwQXR0cmlidXRlUm93SWRcIiwgaXNLZXk6IHRydWUsIHZpc2libGU6IGZhbHNlXHJcbiAgICB9KTsqL1xyXG5cclxuICAgIGZvciAoY29uc3QgW2ksIGF0dHJpYnV0ZV0gb2YgYXR0cmlidXRlcy5lbnRyaWVzKCkpIHtcclxuICAgICAgbGV0IGNvbHVtbjogYW55ID0ge1xyXG4gICAgICAgIGZpZWxkOiBhdHRyaWJ1dGUuYXR0cmlidXRlTmFtZSxcclxuICAgICAgICBoZWFkZXJOYW1lOiBhdHRyaWJ1dGUuZGlzcGxheU5hbWUsXHJcbiAgICAgICAgZWRpdGFibGU6IGZhbHNlLFxyXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxyXG4gICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICBmaWx0ZXI6IGZhbHNlLFxyXG4gICAgICAgIHdpZHRoOiBhdHRyaWJ1dGUudyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBzaG91bGQgYXV0byBmaWxsIHRoZSByZW1haW5pbmcgc3BhY2VcclxuICAgICAgaWYgKGF0dHJpYnV0ZS53ICYmIGkgPCBhdHRyaWJ1dGVzLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBjb2x1bW4uc3VwcHJlc3NTaXplVG9GaXQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEXCIpIHtcclxuICAgICAgICBjb2x1bW4uY29tcGFyYXRvciA9IERhdGVVdGlsLmRhdGVDb21wYXJhdG9yO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRFRcIikge1xyXG4gICAgICAgIGNvbHVtbi5jb21wYXJhdG9yID0gRGF0ZVV0aWwuZGF0ZVRpbWVDb21wYXJhdG9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFmdGVyIHRoZSBjb2x1bW5zIGFyZSBjcmVhdGVkLCBhc3NpZ25lZFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHthbnlbXX0gZGF0YVxyXG4gICAqL1xyXG4gIGluaXRpYWxpemVHcmlkVmFsdWVzKGRhdGE6IGFueVtdLCBhdHRyaWJ1dGVWYWx1ZXM6IEF0dHJpYnV0ZVZhbHVlW10pOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGRhdHVtIG9mIGF0dHJpYnV0ZVZhbHVlcykge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBBdHRyaWJ1dGUgPSB0aGlzLmNoaWxkQXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZTogQXR0cmlidXRlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5pZEF0dHJpYnV0ZSA9PT0gZGF0dW0uaWRBdHRyaWJ1dGU7XHJcbiAgICAgIH0pWzBdO1xyXG5cclxuICAgICAgLy9NYWtlIGEgcm93VmFsdWUgb2JqZWN0IHdpdGggdmFsdWVzIGZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgcm93XHJcbiAgICAgIGxldCByb3dWYWx1ZTogYW55ID0gZGF0YS5maW5kKChyb3cpID0+IHJvdy5ncm91cEF0dHJpYnV0ZVJvd0lkID09PSBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgICAgaWYgKCEgcm93VmFsdWUpIHtcclxuICAgICAgICByb3dWYWx1ZSA9IHtncm91cEF0dHJpYnV0ZVJvd0lkOiBkYXR1bS5ncm91cEF0dHJpYnV0ZVJvd0lkfTtcclxuICAgICAgICBkYXRhLnB1c2gocm93VmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdHRyaWJ1dGUuaW5pdGlhbGl6ZUdyaWQ6IGlkQXR0cmlidXRlIFwiICsgZGF0dW0uaWRBdHRyaWJ1dGUgKyBcIiBub3QgZm91bmQuXCIpO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYXR0cmlidXRlLmNvZGVBdHRyaWJ1dGVEYXRhVHlwZSA9PT0gXCJEVFwiKSB7XHJcbiAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gbmV3IERhdGVQaXBlKFwiZW4tVVNcIikudHJhbnNmb3JtKG5ldyBEYXRlKGRhdHVtLnZhbHVlRGF0ZVRpbWUpLCBcIk0vZC95eSwgaDptbTpzcyBhXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiQUNcIiAmJiBhdHRyaWJ1dGUuaXNNdWx0aVZhbHVlID09PSBcIk5cIikge1xyXG4gICAgICAgIGlmIChkYXR1bS52YWx1ZUF0dHJpYnV0ZUNob2ljZSkge1xyXG4gICAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gZGF0dW0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuY2hvaWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIkFDXCIgJiYgYXR0cmlidXRlLmlzTXVsdGlWYWx1ZSA9PT0gXCJZXCIpIHtcclxuICAgICAgICAvL0NvbmNhdGVuYXRlZCBkaXNwbGF5XHJcbiAgICAgICAgaWYgKHJvd1ZhbHVlW2F0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lXSkge1xyXG4gICAgICAgICAgcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdID0gcm93VmFsdWVbYXR0cmlidXRlLmF0dHJpYnV0ZU5hbWVdICsgXCIsIFwiICsgZGF0dW0udmFsdWVBdHRyaWJ1dGVDaG9pY2UuY2hvaWNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZUF0dHJpYnV0ZUNob2ljZS5jaG9pY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRElDVFwiKSB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0RGljdGlvbmFyeUVudHJpZXMoYXR0cmlidXRlLCBhdHRyaWJ1dGVWYWx1ZXMsIGRhdHVtLmdyb3VwQXR0cmlidXRlUm93SWQpLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKChkdG86IERpY3Rpb25hcnlFbnRyaWVzRFRPKSA9PiB7XHJcbiAgICAgICAgICBsZXQgZW50cnkgPSBkdG8uZW50cmllcy5maW5kKChlbnRyeTphbnkpID0+IGVudHJ5LnZhbHVlID09PSBkYXR1bS52YWx1ZUlkRGljdGlvbmFyeSk7XHJcblxyXG4gICAgICAgICAgaWYgKGVudHJ5KSB7XHJcbiAgICAgICAgICAgIHJvd1ZhbHVlW2F0dHJpYnV0ZS5hdHRyaWJ1dGVOYW1lXSA9IGR0by5lbnRyaWVzLmZpbmQoKGVudHJ5OmFueSkgPT4gZW50cnkudmFsdWUgPT09IGRhdHVtLnZhbHVlSWREaWN0aW9uYXJ5KS5kaXNwbGF5O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkQXBpLnJlZnJlc2hDZWxscygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiU1wiIHx8IGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiQlwiIHx8IGF0dHJpYnV0ZS5jb2RlQXR0cmlidXRlRGF0YVR5cGUgPT09IFwiRUJcIiB8fCBhdHRyaWJ1dGUuY29kZUF0dHJpYnV0ZURhdGFUeXBlID09PSBcIkNCXCIpIHtcclxuICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZVN0cmluZztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByb3dWYWx1ZVthdHRyaWJ1dGUuYXR0cmlidXRlTmFtZV0gPSBkYXR1bS52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9yIG92ZXJyaWRlLlxyXG4gICAqL1xyXG4gIHJlZnJlc2goKTogdm9pZCB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgY29uc29sZS5kZWJ1ZyhcIkF0dHJpYnV0ZS5yZWZyZXNoOiBcIiArIHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgdmFsdWVTdHJpbmdDaGFuZ2UodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XHJcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlU3RyaW5nID0gdmFsdWU7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgdmFsdWVDaGVja2JveENoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVTdHJpbmcgPSBcIllcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZyA9IFwiTlwiO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWUgPSB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZVN0cmluZztcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlSW50ZWdlckNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUludGVnZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlTnVtZXJpY0NoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZU51bWVyaWMgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlRGljdENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUlkRGljdGlvbmFyeSA9IHZhbHVlO1xyXG4gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWUgPSAodmFsdWUpP3ZhbHVlLnRvU3RyaW5nKCk6dW5kZWZpbmVkO1xyXG5cclxuICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWUodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0pO1xyXG4gIH1cclxuXHJcbiAgdmFsdWVEYXRlQ2hhbmdlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlRGF0ZVRpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdLnZhbHVlID0gKHZhbHVlKT92YWx1ZS50b1N0cmluZygpOnVuZGVmaW5lZDtcclxuXHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlKHRoaXMuYXR0cmlidXRlVmFsdWVzWzBdKTtcclxuICB9XHJcblxyXG4gIHZhbHVlVGV4dENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbMF0udmFsdWVMb25nVGV4dCkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0LnRleHREYXRhID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUxvbmdUZXh0ID0gPEF0dHJpYnV0ZUxvbmdUZXh0PntcclxuICAgICAgICBpZExvbmdUZXh0OiB1bmRlZmluZWQsXHJcbiAgICAgICAgdGV4dERhdGE6IHZhbHVlXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9ICh2YWx1ZSk/dmFsdWUudG9TdHJpbmcoKTp1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnB1c2hBdHRyaWJ1dGVWYWx1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXSk7XHJcbiAgfVxyXG5cclxuICB2YWx1ZUNob2ljZUNoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZUF0dHJpYnV0ZUNob2ljZSA9IHRoaXMuYXR0cmlidXRlQ2hvaWNlcy5maW5kKChhdHRyKSA9PiBhdHRyLmlkQXR0cmlidXRlQ2hvaWNlID09PSB2YWx1ZSk7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXS52YWx1ZSA9ICh2YWx1ZSk/dmFsdWUudG9TdHJpbmcoKTp1bmRlZmluZWQ7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnB1c2hBdHRyaWJ1dGVWYWx1ZSh0aGlzLmF0dHJpYnV0ZVZhbHVlc1swXSk7XHJcbiAgfVxyXG5cclxuICB2YWx1ZU11bHRpQ2hvaWNlQ2hhbmdlKGF0dHJpYnV0ZUNob2ljZTogYW55KTogdm9pZCB7XHJcbiAgICBhdHRyaWJ1dGVDaG9pY2UudmFsdWUgPSAhYXR0cmlidXRlQ2hvaWNlLnZhbHVlO1xyXG5cclxuICAgIC8vUmVtb3ZlXHJcbiAgICBpZiAoIWF0dHJpYnV0ZUNob2ljZS52YWx1ZSkge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2Uuc3BsaWNlQXR0cmlidXRlVmFsdWVDaG9pY2UodGhpcy5hdHRyaWJ1dGUsIGF0dHJpYnV0ZUNob2ljZSk7XHJcbiAgICB9XHJcbiAgICAvL0FkZFxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlVmFsdWVzLnB1c2goPEF0dHJpYnV0ZVZhbHVlPntcclxuICAgICAgICBjb2RlQXR0cmlidXRlRGF0YVR5cGU6IFwiQUNcIixcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlOiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0VW5pcXVlSWQoKSxcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVTZXQoKS5nZXRWYWx1ZSgpLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIHZhbHVlQXR0cmlidXRlQ2hvaWNlOiBhdHRyaWJ1dGVDaG9pY2UsXHJcbiAgICAgICAgZ3JvdXBBdHRyaWJ1dGVSb3dJZDogdGhpcy5ncm91cEF0dHJpYnV0ZVJvd0lkLFxyXG4gICAgICAgIGlkR3JvdXBBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkR3JvdXBBdHRyaWJ1dGVcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UucHVzaEF0dHJpYnV0ZVZhbHVlTXVsdGlDaG9pY2UodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbdGhpcy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdmFsdWVNdWx0aURpY3RDaGFuZ2UoZW50cnk6IGFueSk6IHZvaWQge1xyXG4gICAgZW50cnkuY2hlY2tlZCA9ICFlbnRyeS5jaGVja2VkO1xyXG5cclxuICAgIC8vUmVtb3ZlXHJcbiAgICBpZiAoIWVudHJ5LmNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnNwbGljZUF0dHJpYnV0ZVZhbHVlRGljdCh0aGlzLmF0dHJpYnV0ZSwgZW50cnkudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgLy9BZGRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlcy5wdXNoKDxBdHRyaWJ1dGVWYWx1ZT57XHJcbiAgICAgICAgY29kZUF0dHJpYnV0ZURhdGFUeXBlOiBcIkRJQ1RcIixcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlOiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0VW5pcXVlSWQoKSxcclxuICAgICAgICBpZEF0dHJpYnV0ZVZhbHVlU2V0OiB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuZ2V0QXR0cmlidXRlVmFsdWVTZXQoKS5nZXRWYWx1ZSgpLmlkQXR0cmlidXRlVmFsdWVTZXQsXHJcbiAgICAgICAgaWRBdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLmlkQXR0cmlidXRlLFxyXG4gICAgICAgIHZhbHVlSWREaWN0aW9uYXJ5OiBlbnRyeS52YWx1ZSxcclxuICAgICAgICBncm91cEF0dHJpYnV0ZVJvd0lkOiB0aGlzLmdyb3VwQXR0cmlidXRlUm93SWQsXHJcbiAgICAgICAgaWRHcm91cEF0dHJpYnV0ZTogdGhpcy5hdHRyaWJ1dGUuaWRHcm91cEF0dHJpYnV0ZVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5wdXNoQXR0cmlidXRlVmFsdWVNdWx0aURpY3QodGhpcy5hdHRyaWJ1dGVWYWx1ZXNbdGhpcy5hdHRyaWJ1dGVWYWx1ZXMubGVuZ3RoIC0gMV0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGFkZEdyaWRSb3cobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4sIGlkR3JvdXBBdHRyaWJ1dGU6IG51bWJlcikge1xyXG4gICAgY29uc29sZS5sb2coXCJhZGQgZ3JpZCByb3c6IFwiICsgaWRHcm91cEF0dHJpYnV0ZSk7XHJcblxyXG4gICAgLy9HZXQgYSBuZWdhdGl2ZSBJRCwgc28gd2Uga25vdyB0aGlzIGlzIGEgbmV3IHJvd1xyXG4gICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IHRoaXMuYXR0cmlidXRlU2VydmljZS5nZXRVbmlxdWVJZCgpO1xyXG4gICAgdGhpcy5lZGl0R3JvdXBSb3dBdHRyaWJ1dGVzID0gdGhpcy5jaGlsZEF0dHJpYnV0ZXM7XHJcblxyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWwsIHt3aW5kb3dDbGFzczogXCJtb2RhbC1sZ1wifSkucmVzdWx0LnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAocmVzdWx0ID09PSBcIlNhdmVcIikge1xyXG4gICAgICAgIHRoaXMuc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBcIkNhbmNlbFwiKSB7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFZGl0Q29kR3JpZFJvdygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAocmVhc29uKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICBlZGl0R3JpZFJvdyhtb2RhbDogVGVtcGxhdGVSZWY8YW55PiwgaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyLCBldmVudDogUm93RG91YmxlQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICAvL0VkaXRJbmxpbmUgaXMgYWN0dWFsbHkgdGhlIE9OTFkgd2F5IHRoaXMgY2FuIGJlIGVkaXRhYmxlLCBzbyB0aGlzIGlzIHJlYWxseSB3aGV0aGVyIHRoZSBncmlkIGlzIGVkaXRhYmxlLCBhdCBhbGxcclxuICAgIGlmICh0aGlzLmVkaXRJbmxpbmUpIHtcclxuICAgICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IGV2ZW50LmRhdGEuZ3JvdXBBdHRyaWJ1dGVSb3dJZDtcclxuICAgICAgdGhpcy5lZGl0R3JvdXBSb3dBdHRyaWJ1dGVzID0gdGhpcy5jaGlsZEF0dHJpYnV0ZXM7XHJcblxyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihtb2RhbCwge3dpbmRvd0NsYXNzOiBcIm1vZGFsLWxnXCJ9KS5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gXCJTYXZlXCIpIHtcclxuICAgICAgICAgIHRoaXMuc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IFwiQ2FuY2VsXCIpIHtcclxuICAgICAgICAgIHRoaXMuY2FuY2VsRWRpdENvZEdyaWRSb3coKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIChyZWFzb24pID0+IHt9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcInJlbW92ZSBncmlkIHJvdzogXCIgKyBpZEdyb3VwQXR0cmlidXRlKTtcclxuICAgIGxldCBzZWxlY3RlZENvbHVtbnM6IFJvd05vZGVbXSA9IHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZE5vZGVzKCk7XHJcblxyXG4gICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlU2VydmljZS5kZWxldGVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGUsIHNlbGVjdGVkQ29sdW1uc1swXS5kYXRhLmdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FuY2VsRWRpdENvZEdyaWRSb3coKSB7XHJcbiAgICB0aGlzLmF0dHJpYnV0ZVNlcnZpY2UuY2xlYXJVcGRhdGVkR3JpZFJvd0F0dHJpYnV0ZVZhbHVlcyh0aGlzLmVkaXRHcm91cEF0dHJpYnV0ZVJvd0lkKTtcclxuICAgIHRoaXMuZWRpdEdyb3VwUm93QXR0cmlidXRlcyA9IFtdO1xyXG4gICAgdGhpcy5lZGl0R3JvdXBBdHRyaWJ1dGVSb3dJZCA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBWYWx1ZXMgZm9yIGEgbmV3IGdyaWQgcm93IGFyZSBzdG9yZWQgc2VwYXJhdGVseS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgdGhhdCBkYXRhIHRvIHRoZSBjdXJyZW50IGdyaWQgZGF0YSBhbmRcclxuICAgKiBwdXNoIHRoZSB2YWx1ZXMgdG8gdGhlIHNlcnZpY2UuXHJcbiAgICovXHJcbiAgc2F2ZUdyaWRSb3coaWRHcm91cEF0dHJpYnV0ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhcInNhdmUgZ3JpZCByb3dcIik7XHJcblxyXG4gICAgdGhpcy5hdHRyaWJ1dGVTZXJ2aWNlLnNhdmVHcmlkUm93QXR0cmlidXRlVmFsdWVzKGlkR3JvdXBBdHRyaWJ1dGUsIHRoaXMuZWRpdEdyb3VwQXR0cmlidXRlUm93SWQpO1xyXG5cclxuICAgIHRoaXMuZWRpdEdyb3VwQXR0cmlidXRlUm93SWQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVkaXRHcm91cFJvd0F0dHJpYnV0ZXMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tYm9GaWx0ZXJWYWx1ZUdldHRlcihwYXJhbXMpOiBhbnkge1xyXG4gICAgbGV0IHZhbHVlID0gcGFyYW1zLmRhdGFbcGFyYW1zLmNvbERlZi5maWVsZF07XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgbGV0IG9wdGlvbiA9ICgocGFyYW1zLmNvbERlZiBhcyBhbnkpLnNlbGVjdE9wdGlvbnMgYXMgYW55W10pLmZpbmQoKGVudHJ5KSA9PiAoZW50cnlbcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zVmFsdWVGaWVsZF0gPT09IHZhbHVlKSk7XHJcbiAgICAgIHJldHVybiBvcHRpb24gPyBvcHRpb25bcGFyYW1zLmNvbERlZi5zZWxlY3RPcHRpb25zRGlzcGxheUZpZWxkXSA6IFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcbn1cclxuIl19