@rangertechnologies/ngnxt 2.1.247 → 2.1.249

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 (77) hide show
  1. package/esm2022/environments/version.mjs +2 -2
  2. package/esm2022/lib/components/button/nxt-button.component.mjs +2 -2
  3. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +4 -2
  4. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +8 -6
  5. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +3 -3
  6. package/esm2022/lib/components/datatable/datatable.component.mjs +25 -25
  7. package/esm2022/lib/components/file-upload/file-upload.component.mjs +9 -9
  8. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +26 -14
  9. package/esm2022/lib/components/pick-location/pick-location.component.mjs +5 -4
  10. package/esm2022/lib/components/search-box/search-box.component.mjs +10 -8
  11. package/esm2022/lib/nxt-app.module.mjs +4 -4
  12. package/esm2022/lib/pages/booklet/booklet.component.mjs +28 -56
  13. package/esm2022/lib/pages/builder/element/element.component.mjs +62 -10
  14. package/esm2022/lib/pages/builder/form/form.component.mjs +6 -3
  15. package/esm2022/lib/pages/builder/properties/properties.component.mjs +127 -38
  16. package/esm2022/lib/pages/builder/templates/templates.component.mjs +2 -2
  17. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +2 -2
  18. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +3 -3
  19. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +12 -31
  20. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +12 -8
  21. package/esm2022/lib/pipe/custom-translate.pipe.mjs +16 -10
  22. package/esm2022/lib/services/change/change.service.mjs +46 -0
  23. package/esm2022/lib/services/country/country.service.mjs +135 -0
  24. package/esm2022/lib/services/data/data.service.mjs +100 -0
  25. package/esm2022/lib/services/form-builder/form-builder.service.mjs +485 -0
  26. package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +398 -0
  27. package/esm2022/lib/services/salesforce/salesforce.service.mjs +41 -0
  28. package/esm2022/lib/services/shared/shared.service.mjs +100 -0
  29. package/esm2022/lib/services/storage/storage.service.mjs +59 -0
  30. package/esm2022/lib/services/template/template.service.mjs +351 -0
  31. package/esm2022/lib/services/translation/translation.service.mjs +110 -0
  32. package/esm2022/public-api.mjs +2 -2
  33. package/fesm2022/rangertechnologies-ngnxt.mjs +1100 -853
  34. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  35. package/lib/components/button/nxt-button.component.d.ts +1 -1
  36. package/lib/components/custom-calendar/custom-calendar.component.d.ts +1 -1
  37. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +2 -2
  38. package/lib/components/custom-radio/custom-radio.component.d.ts +2 -2
  39. package/lib/components/datatable/datatable.component.d.ts +4 -4
  40. package/lib/components/file-upload/file-upload.component.d.ts +2 -2
  41. package/lib/components/nxt-input/nxt-input.component.d.ts +2 -2
  42. package/lib/components/search-box/search-box.component.d.ts +4 -4
  43. package/lib/nxt-app.module.d.ts +1 -1
  44. package/lib/pages/booklet/booklet.component.d.ts +9 -9
  45. package/lib/pages/builder/element/element.component.d.ts +10 -4
  46. package/lib/pages/builder/form/form.component.d.ts +2 -1
  47. package/lib/pages/builder/properties/properties.component.d.ts +8 -6
  48. package/lib/pages/builder/templates/templates.component.d.ts +1 -1
  49. package/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.d.ts +1 -1
  50. package/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.d.ts +2 -2
  51. package/lib/pages/questionbook/questionbook.component.d.ts +6 -8
  52. package/lib/pages/questionnaire/questionnaire.component.d.ts +6 -5
  53. package/lib/pipe/custom-translate.pipe.d.ts +2 -3
  54. package/lib/services/{form-builder.service.d.ts → form-builder/form-builder.service.d.ts} +2 -1
  55. package/lib/services/{pdf-designer.service.d.ts → pdf-designer/pdf-designer.service.d.ts} +1 -1
  56. package/lib/services/{storage.service.d.ts → storage/storage.service.d.ts} +2 -2
  57. package/lib/services/{translation.service.d.ts → translation/translation.service.d.ts} +11 -1
  58. package/package.json +1 -1
  59. package/public-api.d.ts +1 -1
  60. package/rangertechnologies-ngnxt-2.1.249.tgz +0 -0
  61. package/esm2022/lib/services/change.service.mjs +0 -46
  62. package/esm2022/lib/services/country.service.mjs +0 -135
  63. package/esm2022/lib/services/data.service.mjs +0 -100
  64. package/esm2022/lib/services/form-builder.service.mjs +0 -401
  65. package/esm2022/lib/services/pdf-designer.service.mjs +0 -398
  66. package/esm2022/lib/services/salesforce.service.mjs +0 -41
  67. package/esm2022/lib/services/shared.service.mjs +0 -100
  68. package/esm2022/lib/services/storage.service.mjs +0 -59
  69. package/esm2022/lib/services/template.service.mjs +0 -351
  70. package/esm2022/lib/services/translation.service.mjs +0 -61
  71. package/rangertechnologies-ngnxt-2.1.247.tgz +0 -0
  72. /package/lib/services/{change.service.d.ts → change/change.service.d.ts} +0 -0
  73. /package/lib/services/{country.service.d.ts → country/country.service.d.ts} +0 -0
  74. /package/lib/services/{data.service.d.ts → data/data.service.d.ts} +0 -0
  75. /package/lib/services/{salesforce.service.d.ts → salesforce/salesforce.service.d.ts} +0 -0
  76. /package/lib/services/{shared.service.d.ts → shared/shared.service.d.ts} +0 -0
  77. /package/lib/services/{template.service.d.ts → template/template.service.d.ts} +0 -0
@@ -1,401 +0,0 @@
1
- // AP 22JAN25
2
- import { Injectable } from '@angular/core';
3
- import { BehaviorSubject } from 'rxjs';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- export class FormBuilderService {
7
- http;
8
- formElements = [];
9
- formElementsSubject = new BehaviorSubject([]);
10
- selectedElementSubject = new BehaviorSubject(-1);
11
- selectHeaderSubject = new BehaviorSubject(null);
12
- actionSubject = new BehaviorSubject(null);
13
- elementComponent = null;
14
- book;
15
- unique_id;
16
- tempElem;
17
- formElements$ = this.formElementsSubject.asObservable();
18
- selectedElement$ = this.selectedElementSubject.asObservable();
19
- selectHeaderSubject$ = this.selectHeaderSubject.asObservable();
20
- actionSubject$ = this.actionSubject.asObservable();
21
- currentElement;
22
- selectTableColumn;
23
- // book: { bookQuestionsMap: { unique_id: { subQuestions: any[]; }; }; };
24
- constructor(http) {
25
- this.http = http;
26
- // Load saved elements from localStorage
27
- this.formElements = [];
28
- const savedFormElements = localStorage.getItem('formElements');
29
- if (savedFormElements) {
30
- this.formElements = JSON.parse(savedFormElements);
31
- this.emitFormElements();
32
- // this.book = JSON.parse(localStorage.getItem('book') || '{}');
33
- }
34
- }
35
- emitFormElements() {
36
- this.formElementsSubject.next([...this.formElements]);
37
- }
38
- intializeBook(book) {
39
- // AP 13MAR25 - Get the unique id in the bookQuestionsMap
40
- this.unique_id = Object.keys(book.bookQuestionsMap)[0];
41
- let tempbook = book.bookQuestionsMap[this.unique_id].subQuestions;
42
- // SKS28MAR25 update nested book QuestionsMap
43
- tempbook.forEach((element) => {
44
- if (element.type === "book" && element.qbReference) {
45
- this.getRefQbData(element.qbReference).subscribe((response) => {
46
- element['qbReferenceQuestions'] = response; // Assign response to qbReferenceQuestions
47
- }, (error) => {
48
- console.error("API Error:", error);
49
- });
50
- }
51
- });
52
- book.bookQuestionsMap[this.unique_id].subQuestions = tempbook;
53
- this.book = book;
54
- this.book.bookQuestionsMap[this.unique_id]?.subQuestions?.forEach(element => {
55
- if (this.book.sqOptions?.[element.id]) {
56
- element.options = this.book.sqOptions[element.id].options;
57
- }
58
- this.addElement(element);
59
- });
60
- }
61
- //SKS28MAR25 Function to fetch refqb data
62
- getRefQbData(refqbid) {
63
- return this.http.get(`https://dev-api.valarhr.com/nxt?name=${refqbid}`);
64
- }
65
- //AP-17APR25 Function to generate unique id
66
- addElementWithId() {
67
- const prefix = 'ngnxt';
68
- const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
69
- let core = '';
70
- for (let i = 0; i < 14; i++) {
71
- core += chars.charAt(Math.floor(Math.random() * chars.length));
72
- }
73
- return prefix + core;
74
- }
75
- // AP 23MAY25 Updates the questionbook action buttons: adds or removes based on action type
76
- updateQuestionBookActionButtons(button, action) {
77
- if (!this.book.questionbook) {
78
- this.book.questionbook = {};
79
- }
80
- if (action === 'add') {
81
- this.book.questionbook.action.push(button);
82
- }
83
- else if (action === 'remove') {
84
- this.book.questionbook.action = this.book.questionbook.action.filter((item) => item.id !== button.id);
85
- }
86
- this.actionSubject.next(this.book);
87
- }
88
- newBook() {
89
- this.unique_id = this.addElementWithId();
90
- this.book = {
91
- 'bookQuestionsMap': {
92
- [this.unique_id]: {
93
- 'subQuestions': [],
94
- 'type': 'Book'
95
- }
96
- },
97
- 'questionbook': {
98
- "action": [
99
- {
100
- "name": "Cancel",
101
- "eventtoemit": "close",
102
- "alt": "",
103
- "positionPercent": 3,
104
- "width": 100,
105
- "textColor": "#ffffff",
106
- "borderRadius": 6,
107
- 'id': 1,
108
- },
109
- {
110
- "name": "Save",
111
- "eventtoemit": "submit",
112
- "alt": "",
113
- "endpoint": "",
114
- "method": "POST",
115
- "positionPercent": 14,
116
- "width": 100,
117
- "textColor": "#ffffff",
118
- "borderRadius": 6,
119
- 'id': 1,
120
- }
121
- ]
122
- },
123
- 'records': [{
124
- 'id': this.unique_id,
125
- 'title': 'Untitled',
126
- 'subQuestions': [{}]
127
- }]
128
- };
129
- }
130
- // AP 26FEB25 - clear the form elements
131
- clearElements() {
132
- this.formElements = [];
133
- this.emitFormElements();
134
- }
135
- // Get the element component reference
136
- getElementComponent() {
137
- return this.elementComponent;
138
- }
139
- setElementComponent(component) {
140
- this.elementComponent = component;
141
- }
142
- // Add a new element to the form
143
- addElement(element) {
144
- if (!element.options) {
145
- element.options = []; // options is initialized
146
- }
147
- element['questionBookId'] = this.unique_id;
148
- this.formElements.push(element);
149
- this.emitFormElements();
150
- }
151
- // SKS13MAR25 add table element
152
- addTableElement(element, ind) {
153
- //SKS13MAR25 Ensure currentElement exists
154
- if (!this.currentElement)
155
- return;
156
- // Clone elements array
157
- const elements = [...this.getElements()];
158
- // SKS13MAR25 Find the element and update its columns
159
- const index = elements.findIndex(el => el.id === this.currentElement.id);
160
- let tempFieldsMeta = {
161
- label: element.label,
162
- apiName: element.fieldName,
163
- isdeleted: false,
164
- orderbyflag: false,
165
- filterflag: false,
166
- outputFlag: true,
167
- ischild: false,
168
- resultantflag: false,
169
- searchflag: false,
170
- fldType: element.type,
171
- readOnly: false,
172
- uniqueIdentifier: element.id,
173
- question: {
174
- style: {
175
- labelClass: null,
176
- labelStyle: null,
177
- labelValueStyle: null,
178
- inputClass: null,
179
- inputStyle: null,
180
- showLabel: true,
181
- bookStyle: null,
182
- direction: "ltr",
183
- questionStyle: null,
184
- },
185
- subText: {
186
- endpoint: null,
187
- variable: null,
188
- field: null,
189
- defaultField: null,
190
- sourceQuestionId: null,
191
- valueField: null,
192
- labelField: null,
193
- isDependentField: false,
194
- dependentValue: null,
195
- queryField: null,
196
- queryValue: null,
197
- queryValueReference: null,
198
- uniqueKey: null,
199
- },
200
- options: element.type === "Dropdown" || element.type === "Radio" || element.type === "Checkbox"
201
- ? []
202
- : null,
203
- }
204
- };
205
- let fieldsMeta = [...(Array.isArray(this.formElements[index].fieldsMeta) ? this.formElements[index].fieldsMeta : (typeof this.formElements[index].fieldsMeta === 'string' ? (JSON.parse(this.formElements[index].fieldsMeta)) : [this.formElements[index].fieldsMeta])), tempFieldsMeta];
206
- if (index !== -1) {
207
- elements[index] = { ...elements[index], fieldsMeta: fieldsMeta };
208
- }
209
- // Emit the updated form elements
210
- // this.formElementsSubject.next(elements);
211
- this.formElements = elements;
212
- this.formElementsSubject.next([...elements]);
213
- this.selectedElementSubject.next(ind);
214
- // Log for debugging
215
- }
216
- updateElement(index, updates) {
217
- const elements = [...this.getElements()];
218
- if (elements[index]) {
219
- elements[index] = {
220
- ...elements[index],
221
- ...updates,
222
- options: updates.options || elements[index].options || [],
223
- };
224
- this.formElementsSubject.next(elements);
225
- }
226
- if (index >= 0 && index < this.formElements.length) {
227
- const updatedElement = {
228
- ...this.formElements[index],
229
- ...updates
230
- };
231
- if (updates.required !== undefined) {
232
- if (updatedElement.questionText) {
233
- const questionText = updatedElement.questionText.replace(/\s*\*+$/, '');
234
- updatedElement.questionText = updates.required ? `${questionText} *` : questionText;
235
- }
236
- if (elements[index]) {
237
- elements[index] = { ...elements[index], ...updates };
238
- this.formElements = elements;
239
- this.emitFormElements();
240
- }
241
- }
242
- // Handle special cases
243
- if (updates.required === true && updatedElement.questionText && !updatedElement.questionText.endsWith('*')) {
244
- updatedElement.questionText = `${updatedElement.questionText} *`;
245
- }
246
- else if (updates.required === false && updatedElement.questionText && updatedElement.questionText.endsWith('*')) {
247
- updatedElement.questionText = updatedElement.questionText.slice(0, -2);
248
- }
249
- this.formElements[index] = updatedElement;
250
- this.emitFormElements();
251
- // localStorage.setItem('formElements', JSON.stringify(this.formElements));
252
- }
253
- }
254
- updateTitle(event) {
255
- //AP-10MAR25 Updates the title of the first record in the book
256
- this.book.records[0].title = event;
257
- }
258
- setSelectedElement(index) {
259
- this.selectedElementSubject.next(index);
260
- this.currentElement = this.formElements[index];
261
- this.selectTableColumn = null;
262
- }
263
- // SKS19MAR25 set the selected table column
264
- setSelectedTableElement(index, event) {
265
- this.currentElement = this.formElements[index];
266
- if (this.currentElement?.type === 'Table') {
267
- this.currentElement['fieldsMeta'] = typeof this.currentElement?.fieldsMeta === 'object' ? this.currentElement?.fieldsMeta : JSON.parse(this.currentElement.fieldsMeta);
268
- }
269
- const foundItem = this.currentElement?.type === 'Table' ? this.currentElement['fieldsMeta'].find(item => item['uniqueIdentifier'] === event?.uniqueIdentifier) : undefined;
270
- this.selectTableColumn = foundItem?.uniqueIdentifier;
271
- this.selectedElementSubject.next(index);
272
- }
273
- removeSelectedTableElement(index, event) {
274
- this.currentElement = this.formElements[index];
275
- if (this.currentElement?.type === 'Table') {
276
- this.currentElement['fieldsMeta'] = typeof this.currentElement?.fieldsMeta === 'object' ? this.currentElement?.fieldsMeta : JSON.parse(this.currentElement.fieldsMeta);
277
- // Find the index of the item
278
- const itemIndex = this.currentElement['fieldsMeta'].findIndex(item => item['uniqueIdentifier'] === event?.uniqueIdentifier);
279
- // Remove the item if found
280
- if (itemIndex !== -1) {
281
- this.currentElement['fieldsMeta'].splice(itemIndex, 1);
282
- }
283
- }
284
- this.selectTableColumn = null;
285
- this.elementUpdate(index, this.currentElement);
286
- }
287
- // SKS19MAR25 get the selected table column
288
- getSelectTableColumn() {
289
- return this.selectTableColumn;
290
- }
291
- selectHeading(event) {
292
- //AP-10MAR25 Emits the selected heading event
293
- this.selectHeaderSubject.next(event);
294
- }
295
- getElements() {
296
- return this.formElements.map(element => ({
297
- ...element,
298
- options: element.options || [],
299
- }));
300
- }
301
- sortElementsByOrder() {
302
- //AP-10MAR25 Sort elements by current order
303
- this.formElements.sort((a, b) => a.questionNumber - b.questionNumber);
304
- this.formElements.forEach((element, index) => {
305
- element.questionNumber = index + 1;
306
- });
307
- this.emitFormElements();
308
- }
309
- //AP-10MAR25 Returns the current book data
310
- getBook() {
311
- return this.book;
312
- }
313
- // In FormBuilderService
314
- downloadElement() {
315
- // SKS28MAR25 remove qbReferenceQuestions for download time and subtext to convert too string
316
- this.formElements.forEach(element => {
317
- if (element.type === 'book') {
318
- delete element.qbReferenceQuestions;
319
- }
320
- if (element.subText) {
321
- element.subText = typeof element?.subText === 'object' ? element?.subText : JSON.parse(element['subText']);
322
- if (typeof element.subText.field === 'string') {
323
- // Convert to an array if it's a comma-separated string
324
- element.subText.field = element.subText.field.split(',').map(item => item.trim());
325
- }
326
- if (typeof element.subText.queryParameter === 'string') {
327
- // Convert to an array if it's a comma-separated string
328
- element.subText.queryParameter = element.subText.queryParameter.split(',').map(item => item.trim());
329
- }
330
- if (typeof element.subText.sourceQuestionId === 'string') {
331
- // Convert to an array if it's a comma-separated string
332
- element.subText.sourceQuestionId = element.subText.sourceQuestionId.split(',').map(item => item.trim());
333
- }
334
- if (typeof element.subText.queryField === 'string') {
335
- // Convert to an array if it's a comma-separated string
336
- element.subText.queryField = element.subText.queryField.split(',').map(item => item.trim());
337
- }
338
- if (typeof element.subText.queryValue === 'string') {
339
- // Convert to an array if it's a comma-separated string
340
- element.subText.queryValue = element.subText.queryValue.split(',').map(item => item.trim());
341
- }
342
- }
343
- if (element.subText) {
344
- element.subText = typeof element?.subText !== 'object' ? element?.subText : JSON.stringify(element['subText']);
345
- }
346
- });
347
- this.book.bookQuestionsMap[this.unique_id].subQuestions = this.formElements;
348
- console.log('book', this.book);
349
- let tempElement = {};
350
- this.formElements.forEach((element) => {
351
- if (element.type === 'Dropdown' || element.type === 'Radio' || element.type === 'Checkbox') {
352
- //AP 25FEB25 - Store the entire question with its options under its ID
353
- tempElement[element.id] = {
354
- ...element,
355
- options: element.options || []
356
- };
357
- }
358
- });
359
- this.book.sqOptions = tempElement;
360
- return this.book;
361
- }
362
- // AP-06MAR25 - Element new order update
363
- updateElementsOrder(updatedElements) {
364
- this.formElements = [...updatedElements];
365
- this.formElementsSubject.next(this.formElements);
366
- }
367
- // Remove an element by ID
368
- // Save elements to localStorage and update the subject
369
- removeElementComponent(id) {
370
- this.tempElem = [];
371
- this.selectedElementSubject.next(null);
372
- this.currentElement = {};
373
- this.formElements.forEach((element) => {
374
- if (element.id !== id) {
375
- this.tempElem.push(element);
376
- }
377
- });
378
- this.formElements = this.tempElem;
379
- // localStorage.setItem('formElements', JSON.stringify(this.formElements));
380
- this.emitFormElements();
381
- }
382
- // SKS19MAR25 update the element
383
- elementUpdate(index, element) {
384
- const elements = [...this.getElements()];
385
- if (elements[index]) {
386
- elements[index] = element;
387
- this.formElements = elements;
388
- this.formElementsSubject.next([...elements]);
389
- this.selectedElementSubject.next(index);
390
- }
391
- }
392
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
393
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, providedIn: 'root' });
394
- }
395
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormBuilderService, decorators: [{
396
- type: Injectable,
397
- args: [{
398
- providedIn: 'root',
399
- }]
400
- }], ctorParameters: () => [{ type: i1.HttpClient }] });
401
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvc2VydmljZXMvZm9ybS1idWlsZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsYUFBYTtBQUNiLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7O0FBMkRuRCxNQUFNLE9BQU8sa0JBQWtCO0lBbUJUO0lBbEJaLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFnQixFQUFFLENBQUMsQ0FBQztJQUM3RCxzQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3JELGFBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztJQUMvQyxnQkFBZ0IsR0FBNEIsSUFBSSxDQUFDO0lBQ3pELElBQUksQ0FBTTtJQUNWLFNBQVMsQ0FBTTtJQUNmLFFBQVEsQ0FBUTtJQUVoQixhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hELGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5RCxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0QsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsY0FBYyxDQUFNO0lBQ3BCLGlCQUFpQixDQUFNO0lBQ3ZCLHlFQUF5RTtJQUV6RSxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FB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QUU7WUFDekMsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDbEMsMkVBQTJFO1FBQzNFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxnQ0FBZ0M7SUFDaEMsYUFBYSxDQUFDLEtBQVUsRUFBRSxPQUFZO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUE7WUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO3dHQXZaVSxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQUZqQixNQUFNOzs0RkFFUCxrQkFBa0I7a0JBSDlCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQVAgMjJKQU4yNVxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vcGFnZXMvYnVpbGRlci9lbGVtZW50L2VsZW1lbnQuY29tcG9uZW50JztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmludGVyZmFjZSBGb3JtRWxlbWVudCB7XG4gIGFjdGlvbjogYW55O1xuICBpZDogYW55O1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IGFueTtcbiAgcXVlc3Rpb25UZXh0Pzogc3RyaW5nO1xuICBxdWVzdGlvbj86IHN0cmluZztcbiAgaGVscFRleHQ/OiBzdHJpbmc7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gIGlzSGlkZGVuPzogYm9vbGVhbjtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICByZWZlcmVuY2VGaWVsZD86IGFueTtcbiAgYWRkaXRpb25hbFJpY2hDb250ZW50PzogYW55O1xuICBncm91cE5hbWU/OiBhbnk7XG4gIGlzRGF0ZUJhY2t3YXJkPzogYm9vbGVhbjtcbiAgdGl0bGU/OiBhbnk7XG4gIHN1YlRpdGxlPzogYW55O1xuICBzaXplPzogbnVtYmVyO1xuICBpc0RhdGVGb3J3YXJkPzogYm9vbGVhbjtcbiAgaXNPcHRpb25hbD86IGJvb2xlYW47XG4gIGlzVGl0bGU/OiBib29sZWFuO1xuICBuZXh0UXVlc3Rpb24/OiBhbnk7XG4gIGFsbG93ZWRGaWxlRXh0ZW5zaW9ucz86IGFueTtcbiAgcXVlc3Rpb25OdW1iZXI/OiBudW1iZXI7XG4gIG9yZGVyOiBudW1iZXI7XG4gIHF1ZXN0aW9uQm9va0lkPzogYW55O1xuICBmaWVsZHNNZXRhPzogYW55O1xuICB0cmFja2luZ0lkPzogYW55O1xuICByZWNvcmRJZD86IGFueTtcbiAgcWJSZWZlcmVuY2U/OiBhbnk7XG4gIHFiUmVmZXJlbmNlUXVlc3Rpb25zPzogYW55O1xuICBwcmltYXJ5S2V5OiBib29sZWFuLFxuICBzdHlsZToge1xuICAgIGxhYmVsQ2xhc3M6IGFueSxcbiAgICBsYWJlbFN0eWxlOiBhbnksXG4gICAgbGFiZWxWYWx1ZVN0eWxlOiBhbnksXG4gICAgaW5wdXRDbGFzczogYW55LFxuICAgIGlucHV0U3R5bGU6IGFueSxcbiAgICBzaG93TGFiZWw6IGJvb2xlYW4sXG4gICAgYm9va1N0eWxlOiBhbnksXG4gICAgZGlyZWN0aW9uOiBhbnksXG4gICAgcXVlc3Rpb25TdHlsZTogYW55LFxuICB9LFxuICAgIC8vIEFQIDI1RkVCMjUgLSBvcHRpb25zIGFycmF5XG4gIG9wdGlvbnM/OiBBcnJheTx7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICB1bmlxdWVJZGVudGlmaWVyOiBhbnk7XG4gICAgaWQ6IGFueTtcbiAgfT47XG4gIHN1YlRleHQ6IGFueVxufVxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1CdWlsZGVyU2VydmljZSB7XG4gIHByaXZhdGUgZm9ybUVsZW1lbnRzOiBGb3JtRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgZm9ybUVsZW1lbnRzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybUVsZW1lbnRbXT4oW10pO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oLTEpO1xuICBwcml2YXRlIHNlbGVjdEhlYWRlclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHByaXZhdGUgYWN0aW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHJpdmF0ZSBlbGVtZW50Q29tcG9uZW50OiBFbGVtZW50Q29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG4gIGJvb2s6IGFueTtcbiAgdW5pcXVlX2lkOiBhbnk7XG4gIHRlbXBFbGVtOiBhbnlbXTtcblxuICBmb3JtRWxlbWVudHMkID0gdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzZWxlY3RlZEVsZW1lbnQkID0gdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzZWxlY3RIZWFkZXJTdWJqZWN0JCA9IHRoaXMuc2VsZWN0SGVhZGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYWN0aW9uU3ViamVjdCQgPSB0aGlzLmFjdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGN1cnJlbnRFbGVtZW50OiBhbnk7XG4gIHNlbGVjdFRhYmxlQ29sdW1uOiBhbnk7XG4gIC8vIGJvb2s6IHsgYm9va1F1ZXN0aW9uc01hcDogeyB1bmlxdWVfaWQ6IHsgc3ViUXVlc3Rpb25zOiBhbnlbXTsgfTsgfTsgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcbiAgICAvLyBMb2FkIHNhdmVkIGVsZW1lbnRzIGZyb20gbG9jYWxTdG9yYWdlXG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSBbXTtcbiAgICBjb25zdCBzYXZlZEZvcm1FbGVtZW50cyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdmb3JtRWxlbWVudHMnKTtcbiAgICBpZiAoc2F2ZWRGb3JtRWxlbWVudHMpIHtcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gSlNPTi5wYXJzZShzYXZlZEZvcm1FbGVtZW50cyk7XG4gICAgICB0aGlzLmVtaXRGb3JtRWxlbWVudHMoKTtcbiAgICAgIC8vIHRoaXMuYm9vayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2Jvb2snKSB8fCAne30nKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbWl0Rm9ybUVsZW1lbnRzKCkge1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzU3ViamVjdC5uZXh0KFsuLi50aGlzLmZvcm1FbGVtZW50c10pO1xuICB9ICBcbiAgaW50aWFsaXplQm9vayhib29rOiBhbnkpIHtcbiAgICAvLyBBUCAxM01BUjI1IC0gR2V0IHRoZSB1bmlxdWUgaWQgaW4gdGhlIGJvb2tRdWVzdGlvbnNNYXAgXG4gICAgdGhpcy51bmlxdWVfaWQgPSBPYmplY3Qua2V5cyhib29rLmJvb2tRdWVzdGlvbnNNYXApWzBdO1xuICAgIGxldCB0ZW1wYm9vayA9IGJvb2suYm9va1F1ZXN0aW9uc01hcFt0aGlzLnVuaXF1ZV9pZF0uc3ViUXVlc3Rpb25zO1xuICAgIC8vIFNLUzI4TUFSMjUgdXBkYXRlIG5lc3RlZCBib29rIFF1ZXN0aW9uc01hcFxuICAgIHRlbXBib29rLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiYm9va1wiICYmIGVsZW1lbnQucWJSZWZlcmVuY2UpIHtcbiAgICAgICAgdGhpcy5nZXRSZWZRYkRhdGEoZWxlbWVudC5xYlJlZmVyZW5jZSkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudFsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSA9IHJlc3BvbnNlOyAvLyBBc3NpZ24gcmVzcG9uc2UgdG8gcWJSZWZlcmVuY2VRdWVzdGlvbnNcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkFQSSBFcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdLnN1YlF1ZXN0aW9ucyA9IHRlbXBib29rXG4gICAgdGhpcy5ib29rID0gYm9va1xuXG4gICAgdGhpcy5ib29rLmJvb2tRdWVzdGlvbnNNYXBbdGhpcy51bmlxdWVfaWRdPy5zdWJRdWVzdGlvbnM/LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBpZiAodGhpcy5ib29rLnNxT3B0aW9ucz8uW2VsZW1lbnQuaWRdKSB7XG4gICAgICAgIGVsZW1lbnQub3B0aW9ucyA9IHRoaXMuYm9vay5zcU9wdGlvbnNbZWxlbWVudC5pZF0ub3B0aW9ucztcbiAgICAgIH1cbiAgICAgIHRoaXMuYWRkRWxlbWVudChlbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vU0tTMjhNQVIyNSBGdW5jdGlvbiB0byBmZXRjaCByZWZxYiBkYXRhXG4gIGdldFJlZlFiRGF0YShyZWZxYmlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYGh0dHBzOi8vZGV2LWFwaS52YWxhcmhyLmNvbS9ueHQ/bmFtZT0ke3JlZnFiaWR9YCk7XG4gIH1cblxuICAgLy9BUC0xN0FQUjI1IEZ1bmN0aW9uIHRvIGdlbmVyYXRlIHVuaXF1ZSBpZFxuICAgYWRkRWxlbWVudFdpdGhJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9ICduZ254dCc7IFxuICAgIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JztcbiAgICBsZXQgY29yZSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xuICAgICAgY29yZSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBjb3JlOyBcbiAgfVxuICAvLyBBUCAyM01BWTI1IFVwZGF0ZXMgdGhlIHF1ZXN0aW9uYm9vayBhY3Rpb24gYnV0dG9uczogYWRkcyBvciByZW1vdmVzIGJhc2VkIG9uIGFjdGlvbiB0eXBlXG4gIHVwZGF0ZVF1ZXN0aW9uQm9va0FjdGlvbkJ1dHRvbnMoYnV0dG9uOiBhbnksYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm9vay5xdWVzdGlvbmJvb2spIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2sgPSB7fTtcbiAgICB9XG4gICAgaWYoYWN0aW9uID09PSAnYWRkJykge1xuICAgICAgdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24ucHVzaChidXR0b24pO1xuICAgIH1lbHNlIGlmKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgIHRoaXMuYm9vay5xdWVzdGlvbmJvb2suYWN0aW9uID0gdGhpcy5ib29rLnF1ZXN0aW9uYm9vay5hY3Rpb24uZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0uaWQgIT09IGJ1dHRvbi5pZCk7XG4gICAgfVxuICAgIHRoaXMuYWN0aW9uU3ViamVjdC5uZXh0KHRoaXMuYm9vayk7XG4gIH1cbiAgXG4gIG5ld0Jvb2soKSB7XG4gICAgdGhpcy51bmlxdWVfaWQgPSB0aGlzLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgICB0aGlzLmJvb2sgPSB7XG4gICAgICAnYm9va1F1ZXN0aW9uc01hcCc6IHtcbiAgICAgICAgW3RoaXMudW5pcXVlX2lkXToge1xuICAgICAgICAgICdzdWJRdWVzdGlvbnMnOiBbXSxcbiAgICAgICAgICAndHlwZSc6ICdCb29rJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ3F1ZXN0aW9uYm9vayc6IHtcbiAgICAgICAgXCJhY3Rpb25cIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibmFtZVwiOiBcIkNhbmNlbFwiLFxuICAgICAgICAgICAgXCJldmVudHRvZW1pdFwiOiBcImNsb3NlXCIsXG4gICAgICAgICAgICBcImFsdFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJwb3NpdGlvblBlcmNlbnRcIjogMyxcbiAgICAgICAgICAgIFwid2lkdGhcIjogMTAwLFxuICAgICAgICAgICAgXCJ0ZXh0Q29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICBcImJvcmRlclJhZGl1c1wiOiA2LFxuICAgICAgICAgICAgJ2lkJzogMSxcblxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJuYW1lXCI6IFwiU2F2ZVwiLFxuICAgICAgICAgICAgXCJldmVudHRvZW1pdFwiOiBcInN1Ym1pdFwiLFxuICAgICAgICAgICAgXCJhbHRcIjogXCJcIixcbiAgICAgICAgICAgIFwiZW5kcG9pbnRcIjogXCJcIixcbiAgICAgICAgICAgIFwibWV0aG9kXCI6IFwiUE9TVFwiLFxuICAgICAgICAgICAgXCJwb3NpdGlvblBlcmNlbnRcIjogMTQsICBcbiAgICAgICAgICAgIFwid2lkdGhcIjogMTAwLFxuICAgICAgICAgICAgXCJ0ZXh0Q29sb3JcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgICAgICBcImJvcmRlclJhZGl1c1wiOiA2LFxuICAgICAgICAgICAgJ2lkJzogMSxcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICAncmVjb3Jkcyc6IFt7XG4gICAgICAgICdpZCc6IHRoaXMudW5pcXVlX2lkLFxuICAgICAgICAndGl0bGUnOiAnVW50aXRsZWQnLFxuICAgICAgICAnc3ViUXVlc3Rpb25zJzogW3t9XVxuICAgICAgfV1cbiAgICB9XG4gIH1cbiAgLy8gQVAgMjZGRUIyNSAtIGNsZWFyIHRoZSBmb3JtIGVsZW1lbnRzIFxuICBjbGVhckVsZW1lbnRzKCkge1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgdGhpcy5lbWl0Rm9ybUVsZW1lbnRzKCk7XG4gIH1cbiAgLy8gR2V0IHRoZSBlbGVtZW50IGNvbXBvbmVudCByZWZlcmVuY2VcbiAgZ2V0RWxlbWVudENvbXBvbmVudCgpOiBFbGVtZW50Q29tcG9uZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENvbXBvbmVudDtcbiAgfVxuXG4gIHNldEVsZW1lbnRDb21wb25lbnQoY29tcG9uZW50OiBFbGVtZW50Q29tcG9uZW50KSB7XG4gICAgdGhpcy5lbGVtZW50Q29tcG9uZW50ID0gY29tcG9uZW50O1xuICB9XG5cbiAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGZvcm1cbiAgYWRkRWxlbWVudChlbGVtZW50OiBGb3JtRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICBlbGVtZW50Lm9wdGlvbnMgPSBbXTsgLy8gb3B0aW9ucyBpcyBpbml0aWFsaXplZFxuICAgIH1cbiAgICBlbGVtZW50WydxdWVzdGlvbkJvb2tJZCddID0gdGhpcy51bmlxdWVfaWQ7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB0aGlzLmVtaXRGb3JtRWxlbWVudHMoKTtcbiAgfVxuICAvLyBTS1MxM01BUjI1IGFkZCB0YWJsZSBlbGVtZW50XG4gIGFkZFRhYmxlRWxlbWVudChlbGVtZW50OiBhbnksIGluZCA6YW55KSB7XG4gICAgLy9TS1MxM01BUjI1IEVuc3VyZSBjdXJyZW50RWxlbWVudCBleGlzdHNcbiAgICBpZiAoIXRoaXMuY3VycmVudEVsZW1lbnQpIHJldHVybjtcbiAgICAvLyBDbG9uZSBlbGVtZW50cyBhcnJheVxuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZ2V0RWxlbWVudHMoKV07XG5cbiAgICAvLyBTS1MxM01BUjI1IEZpbmQgdGhlIGVsZW1lbnQgYW5kIHVwZGF0ZSBpdHMgY29sdW1uc1xuICAgIGNvbnN0IGluZGV4ID0gZWxlbWVudHMuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSB0aGlzLmN1cnJlbnRFbGVtZW50LmlkKTtcblxuICAgIGxldCB0ZW1wRmllbGRzTWV0YSA9IHtcbiAgICAgIGxhYmVsOiBlbGVtZW50LmxhYmVsLFxuICAgICAgYXBpTmFtZTogZWxlbWVudC5maWVsZE5hbWUsXG4gICAgICBpc2RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgb3JkZXJieWZsYWc6IGZhbHNlLFxuICAgICAgZmlsdGVyZmxhZzogZmFsc2UsXG4gICAgICBvdXRwdXRGbGFnOiB0cnVlLFxuICAgICAgaXNjaGlsZDogZmFsc2UsXG4gICAgICByZXN1bHRhbnRmbGFnOiBmYWxzZSxcbiAgICAgIHNlYXJjaGZsYWc6IGZhbHNlLFxuICAgICAgZmxkVHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgdW5pcXVlSWRlbnRpZmllcjogZWxlbWVudC5pZCxcbiAgICAgIHF1ZXN0aW9uOntcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBsYWJlbENsYXNzOiBudWxsLFxuICAgICAgICAgIGxhYmVsU3R5bGU6IG51bGwsXG4gICAgICAgICAgbGFiZWxWYWx1ZVN0eWxlOiBudWxsLFxuICAgICAgICAgIGlucHV0Q2xhc3M6IG51bGwsXG4gICAgICAgICAgaW5wdXRTdHlsZTogbnVsbCxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgICAgYm9va1N0eWxlOiBudWxsLFxuICAgICAgICAgIGRpcmVjdGlvbjogXCJsdHJcIixcbiAgICAgICAgICBxdWVzdGlvblN0eWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICBzdWJUZXh0OiB7XG4gICAgICAgICAgZW5kcG9pbnQ6IG51bGwsXG4gICAgICAgICAgdmFyaWFibGU6IG51bGwsXG4gICAgICAgICAgZmllbGQ6IG51bGwsXG4gICAgICAgICAgZGVmYXVsdEZpZWxkOiBudWxsLFxuICAgICAgICAgIHNvdXJjZVF1ZXN0aW9uSWQ6IG51bGwsXG4gICAgICAgICAgdmFsdWVGaWVsZDogbnVsbCxcbiAgICAgICAgICBsYWJlbEZpZWxkOiBudWxsLFxuICAgICAgICAgIGlzRGVwZW5kZW50RmllbGQ6IGZhbHNlLFxuICAgICAgICAgIGRlcGVuZGVudFZhbHVlOiBudWxsLFxuICAgICAgICAgIHF1ZXJ5RmllbGQ6IG51bGwsXG4gICAgICAgICAgcXVlcnlWYWx1ZTogbnVsbCxcbiAgICAgICAgICBxdWVyeVZhbHVlUmVmZXJlbmNlOiBudWxsLFxuICAgICAgICAgIHVuaXF1ZUtleTogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgb3B0aW9uczpcbiAgICAgICAgZWxlbWVudC50eXBlID09PSBcIkRyb3Bkb3duXCIgfHwgZWxlbWVudC50eXBlID09PSBcIlJhZGlvXCIgfHwgZWxlbWVudC50eXBlID09PSBcIkNoZWNrYm94XCJcbiAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICB9XG4gICAgfTsgICAgXG4gICAgbGV0IGZpZWxkc01ldGEgPSBbLi4uKEFycmF5LmlzQXJyYXkodGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGEpID8gdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGEgOiAodHlwZW9mIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhID09PSAnc3RyaW5nJyA/IChKU09OLnBhcnNlKHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhKSkgOiBbdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmZpZWxkc01ldGFdKSksIHRlbXBGaWVsZHNNZXRhXTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IHsgLi4uZWxlbWVudHNbaW5kZXhdLCBmaWVsZHNNZXRhOiBmaWVsZHNNZXRhIH07XG4gICAgfVxuXG4gICAgLy8gRW1pdCB0aGUgdXBkYXRlZCBmb3JtIGVsZW1lbnRzXG4gICAgLy8gdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoZWxlbWVudHMpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQoWy4uLmVsZW1lbnRzXSk7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0Lm5leHQoaW5kKTtcbiAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICB9XG5cbiAgdXBkYXRlRWxlbWVudChpbmRleDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPEZvcm1FbGVtZW50Pikge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZ2V0RWxlbWVudHMoKV07XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XSkge1xuICAgICAgZWxlbWVudHNbaW5kZXhdID0ge1xuICAgICAgICAuLi5lbGVtZW50c1tpbmRleF0sXG4gICAgICAgIC4uLnVwZGF0ZXMsXG4gICAgICAgIG9wdGlvbnM6IHVwZGF0ZXMub3B0aW9ucyB8fCBlbGVtZW50c1tpbmRleF0ub3B0aW9ucyB8fCBbXSxcbiAgICAgIH07XG4gICAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChlbGVtZW50cyk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmZvcm1FbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRFbGVtZW50ID0ge1xuICAgICAgICAuLi50aGlzLmZvcm1FbGVtZW50c1tpbmRleF0sXG4gICAgICAgIC4uLnVwZGF0ZXNcbiAgICAgIH07XG4gICAgICBpZiAodXBkYXRlcy5yZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQpIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvblRleHQgPSB1cGRhdGVkRWxlbWVudC5xdWVzdGlvblRleHQucmVwbGFjZSgvXFxzKlxcKiskLywgJycpO1xuICAgICAgICAgIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCA9IHVwZGF0ZXMucmVxdWlyZWQgPyBgJHtxdWVzdGlvblRleHR9ICpgIDogcXVlc3Rpb25UZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgICAgICBlbGVtZW50c1tpbmRleF0gPSB7IC4uLmVsZW1lbnRzW2luZGV4XSwgLi4udXBkYXRlcyB9O1xuICAgICAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICAgICAgdGhpcy5lbWl0Rm9ybUVsZW1lbnRzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZXNcbiAgICAgIGlmICh1cGRhdGVzLnJlcXVpcmVkID09PSB0cnVlICYmIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCAmJiAhdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0LmVuZHNXaXRoKCcqJykpIHtcbiAgICAgICAgdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0ID0gYCR7dXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0fSAqYDtcbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlcy5yZXF1aXJlZCA9PT0gZmFsc2UgJiYgdXBkYXRlZEVsZW1lbnQucXVlc3Rpb25UZXh0ICYmIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dC5lbmRzV2l0aCgnKicpKSB7XG4gICAgICAgIHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dCA9IHVwZGF0ZWRFbGVtZW50LnF1ZXN0aW9uVGV4dC5zbGljZSgwLCAtMik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XSA9IHVwZGF0ZWRFbGVtZW50O1xuICAgICAgdGhpcy5lbWl0Rm9ybUVsZW1lbnRzKCk7XG4gICAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUVsZW1lbnRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5mb3JtRWxlbWVudHMpKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlVGl0bGUoZXZlbnQ6IGFueSkge1xuICAgIC8vQVAtMTBNQVIyNSBVcGRhdGVzIHRoZSB0aXRsZSBvZiB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBib29rICBcbiAgICB0aGlzLmJvb2sucmVjb3Jkc1swXS50aXRsZSA9IGV2ZW50O1xuICB9XG4gIHNldFNlbGVjdGVkRWxlbWVudChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRTdWJqZWN0Lm5leHQoaW5kZXgpO1xuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF1cbiAgICB0aGlzLnNlbGVjdFRhYmxlQ29sdW1uID0gbnVsbFxuICB9XG4gIC8vIFNLUzE5TUFSMjUgc2V0IHRoZSBzZWxlY3RlZCB0YWJsZSBjb2x1bW5cbiAgc2V0U2VsZWN0ZWRUYWJsZUVsZW1lbnQoaW5kZXg6IGFueSwgZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF1cbiAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJykge1xuICAgICAgdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddID0gdHlwZW9mIHRoaXMuY3VycmVudEVsZW1lbnQ/LmZpZWxkc01ldGEgPT09ICdvYmplY3QnID8gdGhpcy5jdXJyZW50RWxlbWVudD8uZmllbGRzTWV0YSA6IEpTT04ucGFyc2UodGhpcy5jdXJyZW50RWxlbWVudC5maWVsZHNNZXRhKTtcbiAgICB9XG4gICAgY29uc3QgZm91bmRJdGVtID0gdGhpcy5jdXJyZW50RWxlbWVudD8udHlwZSA9PT0gJ1RhYmxlJyA/IHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXS5maW5kKGl0ZW0gPT4gaXRlbVsndW5pcXVlSWRlbnRpZmllciddID09PSBldmVudD8udW5pcXVlSWRlbnRpZmllcikgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWxlY3RUYWJsZUNvbHVtbiA9IGZvdW5kSXRlbT8udW5pcXVlSWRlbnRpZmllclxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZGV4KTtcbiAgfVxuICByZW1vdmVTZWxlY3RlZFRhYmxlRWxlbWVudChpbmRleDogbnVtYmVyLCBldmVudDogYW55KSB7XG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50Py50eXBlID09PSAnVGFibGUnKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFbGVtZW50WydmaWVsZHNNZXRhJ10gPSB0eXBlb2YgdGhpcy5jdXJyZW50RWxlbWVudD8uZmllbGRzTWV0YSA9PT0gJ29iamVjdCcgPyB0aGlzLmN1cnJlbnRFbGVtZW50Py5maWVsZHNNZXRhIDogSlNPTi5wYXJzZSh0aGlzLmN1cnJlbnRFbGVtZW50LmZpZWxkc01ldGEpO1xuICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGl0ZW1cbiAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuY3VycmVudEVsZW1lbnRbJ2ZpZWxkc01ldGEnXS5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWyd1bmlxdWVJZGVudGlmaWVyJ10gPT09IGV2ZW50Py51bmlxdWVJZGVudGlmaWVyKTtcbiAgICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBpZiBmb3VuZFxuICAgICAgaWYgKGl0ZW1JbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudFsnZmllbGRzTWV0YSddLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdFRhYmxlQ29sdW1uID0gbnVsbFxuICAgIHRoaXMuZWxlbWVudFVwZGF0ZShpbmRleCwgdGhpcy5jdXJyZW50RWxlbWVudClcbiAgfVxuICAvLyBTS1MxOU1BUjI1IGdldCB0aGUgc2VsZWN0ZWQgdGFibGUgY29sdW1uXG4gIGdldFNlbGVjdFRhYmxlQ29sdW1uKCkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdFRhYmxlQ29sdW1uO1xuICB9XG4gIHNlbGVjdEhlYWRpbmcoZXZlbnQ6IGFueSkge1xuICAgIC8vQVAtMTBNQVIyNSBFbWl0cyB0aGUgc2VsZWN0ZWQgaGVhZGluZyBldmVudCAgXG4gICAgdGhpcy5zZWxlY3RIZWFkZXJTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICB9XG5cblxuICBnZXRFbGVtZW50cygpOiBGb3JtRWxlbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRWxlbWVudHMubWFwKGVsZW1lbnQgPT4gKHtcbiAgICAgIC4uLmVsZW1lbnQsXG4gICAgICBvcHRpb25zOiBlbGVtZW50Lm9wdGlvbnMgfHwgW10sXG4gICAgfSkpO1xuICB9XG4gIHNvcnRFbGVtZW50c0J5T3JkZXIoKTogdm9pZCB7XG4gICAgLy9BUC0xME1BUjI1IFNvcnQgZWxlbWVudHMgYnkgY3VycmVudCBvcmRlclxuICAgIHRoaXMuZm9ybUVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IGEucXVlc3Rpb25OdW1iZXIgLSBiLnF1ZXN0aW9uTnVtYmVyKTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgZWxlbWVudC5xdWVzdGlvbk51bWJlciA9IGluZGV4ICsgMTtcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRGb3JtRWxlbWVudHMoKTtcbiAgfVxuICAvL0FQLTEwTUFSMjUgUmV0dXJucyB0aGUgY3VycmVudCBib29rIGRhdGEgIFxuICBnZXRCb29rKCkge1xuICAgIHJldHVybiB0aGlzLmJvb2s7XG4gIH1cbiAgLy8gSW4gRm9ybUJ1aWxkZXJTZXJ2aWNlXG4gIGRvd25sb2FkRWxlbWVudCgpIHtcbiAgICAvLyBTS1MyOE1BUjI1IHJlbW92ZSBxYlJlZmVyZW5jZVF1ZXN0aW9ucyBmb3IgZG93bmxvYWQgdGltZSBhbmQgc3VidGV4dCB0byBjb252ZXJ0IHRvbyBzdHJpbmdcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2Jvb2snKSB7XG4gICAgICAgIGRlbGV0ZSBlbGVtZW50LnFiUmVmZXJlbmNlUXVlc3Rpb25zO1xuICAgICAgfVxuICAgICAgaWYoIGVsZW1lbnQuc3ViVGV4dCl7XG4gICAgICAgIGVsZW1lbnQuc3ViVGV4dCA9IHR5cGVvZiBlbGVtZW50Py5zdWJUZXh0ID09PSAnb2JqZWN0JyA/IGVsZW1lbnQ/LnN1YlRleHQgOiBKU09OLnBhcnNlKGVsZW1lbnRbJ3N1YlRleHQnXSk7XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5zdWJUZXh0LmZpZWxkICA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IHRvIGFuIGFycmF5IGlmIGl0J3MgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgZWxlbWVudC5zdWJUZXh0LmZpZWxkICA9IGVsZW1lbnQuc3ViVGV4dC5maWVsZC5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuc3ViVGV4dC5xdWVyeVBhcmFtZXRlciAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBhbiBhcnJheSBpZiBpdCdzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgIGVsZW1lbnQuc3ViVGV4dC5xdWVyeVBhcmFtZXRlciAgPSBlbGVtZW50LnN1YlRleHQucXVlcnlQYXJhbWV0ZXIuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnN1YlRleHQuc291cmNlUXVlc3Rpb25JZCAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBhbiBhcnJheSBpZiBpdCdzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgIGVsZW1lbnQuc3ViVGV4dC5zb3VyY2VRdWVzdGlvbklkICA9IGVsZW1lbnQuc3ViVGV4dC5zb3VyY2VRdWVzdGlvbklkLnNwbGl0KCcsJykubWFwKGl0ZW0gPT4gaXRlbS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5zdWJUZXh0LnF1ZXJ5RmllbGQgID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIENvbnZlcnQgdG8gYW4gYXJyYXkgaWYgaXQncyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgICAgICAgICBlbGVtZW50LnN1YlRleHQucXVlcnlGaWVsZCAgPSBlbGVtZW50LnN1YlRleHQucXVlcnlGaWVsZC5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuc3ViVGV4dC5xdWVyeVZhbHVlICA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IHRvIGFuIGFycmF5IGlmIGl0J3MgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgZWxlbWVudC5zdWJUZXh0LnF1ZXJ5VmFsdWUgID0gZWxlbWVudC5zdWJUZXh0LnF1ZXJ5VmFsdWUuc3BsaXQoJywnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKCBlbGVtZW50LnN1YlRleHQpe1xuICAgICAgICBlbGVtZW50LnN1YlRleHQgPSB0eXBlb2YgZWxlbWVudD8uc3ViVGV4dCAhPT0gJ29iamVjdCcgPyBlbGVtZW50Py5zdWJUZXh0IDogSlNPTi5zdHJpbmdpZnkoZWxlbWVudFsnc3ViVGV4dCddKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcFt0aGlzLnVuaXF1ZV9pZF0uc3ViUXVlc3Rpb25zID0gdGhpcy5mb3JtRWxlbWVudHM7XG4gICAgY29uc29sZS5sb2coJ2Jvb2snLCB0aGlzLmJvb2spO1xuICAgIGxldCB0ZW1wRWxlbWVudDogYW55ID0ge307XG5cbiAgICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudC50eXBlID09PSAnRHJvcGRvd24nIHx8IGVsZW1lbnQudHlwZSA9PT0gJ1JhZGlvJyB8fCBlbGVtZW50LnR5cGUgPT09ICdDaGVja2JveCcpIHtcbiAgICAgICAgLy9BUCAyNUZFQjI1IC0gU3RvcmUgdGhlIGVudGlyZSBxdWVzdGlvbiB3aXRoIGl0cyBvcHRpb25zIHVuZGVyIGl0cyBJRFxuICAgICAgICB0ZW1wRWxlbWVudFtlbGVtZW50LmlkXSA9IHtcbiAgICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICAgIG9wdGlvbnM6IGVsZW1lbnQub3B0aW9ucyB8fCBbXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ib29rLnNxT3B0aW9ucyA9IHRlbXBFbGVtZW50O1xuICAgIHJldHVybiB0aGlzLmJvb2s7XG4gIH1cbiAgLy8gQVAtMDZNQVIyNSAtIEVsZW1lbnQgbmV3IG9yZGVyIHVwZGF0ZVxuICB1cGRhdGVFbGVtZW50c09yZGVyKHVwZGF0ZWRFbGVtZW50czogRm9ybUVsZW1lbnRbXSk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gWy4uLnVwZGF0ZWRFbGVtZW50c107XG4gICAgdGhpcy5mb3JtRWxlbWVudHNTdWJqZWN0Lm5leHQodGhpcy5mb3JtRWxlbWVudHMpO1xuICB9XG4gIC8vIFJlbW92ZSBhbiBlbGVtZW50IGJ5IElEXG4gIC8vIFNhdmUgZWxlbWVudHMgdG8gbG9jYWxTdG9yYWdlIGFuZCB1cGRhdGUgdGhlIHN1YmplY3RcbiAgcmVtb3ZlRWxlbWVudENvbXBvbmVudChpZDogYW55KSB7XG4gICAgdGhpcy50ZW1wRWxlbSA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSB7fVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuaWQgIT09IGlkKSB7XG4gICAgICAgIHRoaXMudGVtcEVsZW0ucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMudGVtcEVsZW07XG4gICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2Zvcm1FbGVtZW50cycsIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybUVsZW1lbnRzKSk7XG4gICAgdGhpcy5lbWl0Rm9ybUVsZW1lbnRzKCk7XG4gIH1cbiAgLy8gU0tTMTlNQVIyNSB1cGRhdGUgdGhlIGVsZW1lbnRcbiAgZWxlbWVudFVwZGF0ZShpbmRleDogYW55LCBlbGVtZW50OiBhbnkpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IFsuLi50aGlzLmdldEVsZW1lbnRzKCldO1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0pIHtcbiAgICAgIGVsZW1lbnRzW2luZGV4XSA9IGVsZW1lbnRcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgICB0aGlzLmZvcm1FbGVtZW50c1N1YmplY3QubmV4dChbLi4uZWxlbWVudHNdKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50U3ViamVjdC5uZXh0KGluZGV4KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==