@rangertechnologies/ngnxt 2.1.78 → 2.1.79

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 (116) hide show
  1. package/README.md +29 -29
  2. package/esm2022/lib/ar.i18n.mjs +29 -29
  3. package/esm2022/lib/components/custom-button/custom-button.component.mjs +39 -39
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +366 -366
  5. package/esm2022/lib/components/custom-date/custom-date.component.mjs +47 -47
  6. package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +48 -48
  7. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +219 -219
  8. package/esm2022/lib/components/custom-image/custom-image.component.mjs +34 -34
  9. package/esm2022/lib/components/custom-input/custom-input.component.mjs +93 -93
  10. package/esm2022/lib/components/custom-label/custom-label.component.mjs +21 -21
  11. package/esm2022/lib/components/custom-model/custom-model.component.mjs +48 -48
  12. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +115 -115
  13. package/esm2022/lib/components/custom-rich-text/custom-rich-text.component.mjs +156 -0
  14. package/esm2022/lib/components/custom-table/custom-table.component.mjs +169 -169
  15. package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +65 -65
  16. package/esm2022/lib/components/custom-time/custom-time.component.mjs +61 -61
  17. package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +42 -42
  18. package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +39 -39
  19. package/esm2022/lib/components/file-upload/file-upload.component.mjs +233 -233
  20. package/esm2022/lib/components/file-view/file-view.component.mjs +46 -46
  21. package/esm2022/lib/components/loader/loader.component.mjs +23 -23
  22. package/esm2022/lib/components/pick-location/pick-location.component.mjs +188 -188
  23. package/esm2022/lib/components/search-box/search-box.component.mjs +130 -130
  24. package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +123 -123
  25. package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +19 -19
  26. package/esm2022/lib/en.i18n.mjs +29 -29
  27. package/esm2022/lib/i18n-config.service.mjs +4 -4
  28. package/esm2022/lib/i18n.component.mjs +47 -47
  29. package/esm2022/lib/i18n.module.mjs +38 -38
  30. package/esm2022/lib/i18n.pipe.mjs +25 -25
  31. package/esm2022/lib/i18n.service.mjs +56 -56
  32. package/esm2022/lib/interfaces/actionMeta.mjs +2 -2
  33. package/esm2022/lib/interfaces/apimeta.mjs +2 -2
  34. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -2
  35. package/esm2022/lib/model/bookletWrapper.mjs +9 -9
  36. package/esm2022/lib/model/changeWrapper.mjs +11 -11
  37. package/esm2022/lib/model/errorWrapper.mjs +6 -6
  38. package/esm2022/lib/model/tableWrapper.mjs +20 -20
  39. package/esm2022/lib/nxt-app.component.mjs +22 -22
  40. package/esm2022/lib/nxt-app.module.mjs +364 -352
  41. package/esm2022/lib/nxt-app.service.mjs +14 -14
  42. package/esm2022/lib/pages/booklet/booklet.component.mjs +541 -541
  43. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +429 -407
  44. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2393 -2373
  45. package/esm2022/lib/pages/summary-page/summary-page.component.mjs +76 -76
  46. package/esm2022/lib/pipe/get-value.pipe.mjs +50 -50
  47. package/esm2022/lib/sample.mjs +3716 -3431
  48. package/esm2022/lib/services/change.service.mjs +53 -53
  49. package/esm2022/lib/services/data.service.mjs +80 -80
  50. package/esm2022/lib/services/salesforce.service.mjs +46 -46
  51. package/esm2022/lib/services/shared.service.mjs +100 -100
  52. package/esm2022/lib/services/storage.service.mjs +44 -44
  53. package/esm2022/lib/tam.i18n.mjs +29 -29
  54. package/esm2022/lib/wrapper.mjs +175 -175
  55. package/esm2022/public-api.mjs +15 -15
  56. package/esm2022/rangertechnologies-ngnxt.mjs +4 -4
  57. package/fesm2022/rangertechnologies-ngnxt.mjs +10313 -9828
  58. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  59. package/index.d.ts +5 -5
  60. package/lib/ar.i18n.d.ts +24 -24
  61. package/lib/components/custom-button/custom-button.component.d.ts +16 -16
  62. package/lib/components/custom-calendar/custom-calendar.component.d.ts +65 -65
  63. package/lib/components/custom-date/custom-date.component.d.ts +18 -18
  64. package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +19 -19
  65. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +39 -39
  66. package/lib/components/custom-image/custom-image.component.d.ts +13 -13
  67. package/lib/components/custom-input/custom-input.component.d.ts +31 -31
  68. package/lib/components/custom-label/custom-label.component.d.ts +10 -10
  69. package/lib/components/custom-model/custom-model.component.d.ts +19 -19
  70. package/lib/components/custom-radio/custom-radio.component.d.ts +33 -33
  71. package/lib/components/custom-rich-text/custom-rich-text.component.d.ts +29 -0
  72. package/lib/components/custom-table/custom-table.component.d.ts +43 -43
  73. package/lib/components/custom-text-area/custom-text-area.component.d.ts +22 -22
  74. package/lib/components/custom-time/custom-time.component.d.ts +18 -18
  75. package/lib/components/dependent-table/dependent-table.component.d.ts +15 -15
  76. package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +16 -16
  77. package/lib/components/file-upload/file-upload.component.d.ts +42 -42
  78. package/lib/components/file-view/file-view.component.d.ts +16 -16
  79. package/lib/components/loader/loader.component.d.ts +11 -11
  80. package/lib/components/pick-location/pick-location.component.d.ts +42 -42
  81. package/lib/components/search-box/search-box.component.d.ts +40 -40
  82. package/lib/components/table-appendix/table-appendix.component.d.ts +30 -30
  83. package/lib/directives/componenthost/componenthost.directive.d.ts +8 -8
  84. package/lib/en.i18n.d.ts +24 -24
  85. package/lib/i18n-config.service.d.ts +2 -2
  86. package/lib/i18n.component.d.ts +11 -11
  87. package/lib/i18n.module.d.ts +9 -9
  88. package/lib/i18n.pipe.d.ts +10 -10
  89. package/lib/i18n.service.d.ts +14 -14
  90. package/lib/interfaces/actionMeta.d.ts +5 -5
  91. package/lib/interfaces/apimeta.d.ts +14 -14
  92. package/lib/interfaces/dependencyMeta.d.ts +8 -8
  93. package/lib/model/bookletWrapper.d.ts +5 -5
  94. package/lib/model/changeWrapper.d.ts +10 -10
  95. package/lib/model/errorWrapper.d.ts +5 -5
  96. package/lib/model/tableWrapper.d.ts +18 -18
  97. package/lib/nxt-app.component.d.ts +8 -8
  98. package/lib/nxt-app.module.d.ts +47 -46
  99. package/lib/nxt-app.service.d.ts +6 -6
  100. package/lib/pages/booklet/booklet.component.d.ts +68 -68
  101. package/lib/pages/questionbook/questionbook.component.d.ts +66 -66
  102. package/lib/pages/questionnaire/questionnaire.component.d.ts +218 -218
  103. package/lib/pages/summary-page/summary-page.component.d.ts +20 -20
  104. package/lib/pipe/get-value.pipe.d.ts +7 -7
  105. package/lib/sample.d.ts +10 -10
  106. package/lib/services/change.service.d.ts +22 -22
  107. package/lib/services/data.service.d.ts +13 -13
  108. package/lib/services/salesforce.service.d.ts +11 -11
  109. package/lib/services/shared.service.d.ts +15 -15
  110. package/lib/services/storage.service.d.ts +13 -13
  111. package/lib/tam.i18n.d.ts +24 -24
  112. package/lib/wrapper.d.ts +203 -203
  113. package/package.json +3 -3
  114. package/public-api.d.ts +10 -10
  115. package/rangertechnologies-ngnxt-2.1.79.tgz +0 -0
  116. package/rangertechnologies-ngnxt-2.1.78.tgz +0 -0
@@ -1,407 +1,429 @@
1
- import { Component, Input, Output, EventEmitter, Inject } from '@angular/core';
2
- import { ErrorWrapper } from '../../model/errorWrapper';
3
- import { DOCUMENT } from '@angular/common';
4
- import { BehaviorSubject } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/salesforce.service";
7
- import * as i2 from "../../services/data.service";
8
- import * as i3 from "../../services/change.service";
9
- import * as i4 from "../../services/storage.service";
10
- import * as i5 from "../../i18n.service";
11
- import * as i6 from "@angular/common";
12
- import * as i7 from "@angular/forms";
13
- import * as i8 from "@angular/material/tooltip";
14
- import * as i9 from "@angular/cdk/bidi";
15
- import * as i10 from "../../components/pick-location/pick-location.component";
16
- import * as i11 from "../../components/custom-input/custom-input.component";
17
- import * as i12 from "../../components/custom-text-area/custom-text-area.component";
18
- import * as i13 from "../../components/custom-table/custom-table.component";
19
- import * as i14 from "../../components/custom-calendar/custom-calendar.component";
20
- import * as i15 from "../../components/custom-date-picker/custom-date-picker.component";
21
- import * as i16 from "../../components/custom-dropdown/custom-dropdown.component";
22
- import * as i17 from "../../components/search-box/search-box.component";
23
- import * as i18 from "../../components/file-upload/file-upload.component";
24
- import * as i19 from "../../components/dependent-table/dependent-table.component";
25
- import * as i20 from "../../components/custom-label/custom-label.component";
26
- import * as i21 from "../../components/table-appendix/table-appendix.component";
27
- import * as i22 from "../../components/custom-date/custom-date.component";
28
- import * as i23 from "../../components/custom-time/custom-time.component";
29
- import * as i24 from "../../components/custom-button/custom-button.component";
30
- import * as i25 from "../../components/custom-model/custom-model.component";
31
- import * as i26 from "../../components/custom-image/custom-image.component";
32
- import * as i27 from "../../components/custom-radio/custom-radio.component";
33
- import * as i28 from "../../i18n.pipe";
34
- //import { ComponenthostDirective } from '../../directives/componenthost/componenthost.directive';
35
- //import { CustomCalendarComponent } from '../../components/custom-calendar/custom-calendar.component';
36
- export class QuestionbookComponent {
37
- sfService;
38
- dataService;
39
- changeService;
40
- storageService;
41
- i18nService;
42
- cdr;
43
- document;
44
- qbItem;
45
- questionItem;
46
- translatedQuestions = []; // VD 11Jun24 - translation changes
47
- questions;
48
- errorFieldId;
49
- labelValue;
50
- token; // VD 19JAN24 - getting token as input
51
- handleDropDown = new EventEmitter();
52
- handleQuestion = new EventEmitter(); // VD 19Jul01 - get updated question
53
- dropDownData;
54
- //@ViewChild(ComponenthostDirective, { static: true }) dynamicHost: ComponenthostDirective;
55
- subQuestions;
56
- selectedFileData = [];
57
- loadComponent$ = new BehaviorSubject(false);
58
- // HA 28DEC23 Added styling and logics to load the book type questions
59
- qbRef;
60
- // HA 19DEC23 Declaration for Salesforce Styling
61
- style;
62
- langDirection = 'ltr';
63
- bookStyle;
64
- subscription;
65
- hadleDropDownDependent = new EventEmitter();
66
- // VD 06Sep24 calendar changes
67
- handleCalendarDate = new EventEmitter();
68
- handleCalendarEvent = new EventEmitter();
69
- bookQuestionsMap = new Map();
70
- constructor(sfService, dataService, changeService, storageService, i18nService, cdr, document) {
71
- this.sfService = sfService;
72
- this.dataService = dataService;
73
- this.changeService = changeService;
74
- this.storageService = storageService;
75
- this.i18nService = i18nService;
76
- this.cdr = cdr;
77
- this.document = document;
78
- }
79
- ngOnInit() {
80
- // VD 13Sep24 changes
81
- this.processData();
82
- // VD sep1324 changes - process data when databind value change
83
- this.subscription = this.changeService.customChange$.subscribe((changeValue) => {
84
- if (changeValue == 'dataBind') {
85
- this.processData();
86
- }
87
- });
88
- }
89
- // VD 13Sep24 changes
90
- // RS 09DEC24 Changed keys
91
- processData() {
92
- // HA 19DEC23 Logic for Question Book Styling(Slaesforce)
93
- // HA 09FEB24 Added ternary
94
- if (this.qbItem?.style) {
95
- // HA 28DEC23 Added styling and logics to load the book type questions
96
- this.qbItem.style = typeof this.qbItem.style === 'string' ? JSON.parse('' + this.qbItem?.style) : this.qbItem.style;
97
- this.qbItem.style.labelClass = this.qbItem.style?.labelClass ? this.qbItem.style?.labelClass : "";
98
- this.qbItem.style.labelStyle = this.qbItem.style?.labelStyle ? this.qbItem.style?.labelStyle : "";
99
- this.qbItem.style.labelValueStyle = this.qbItem.style?.labelValueStyle ? this.qbItem.style?.labelValueStyle : "";
100
- this.qbItem.style.inputClass = this.qbItem.style?.inputClass ? this.qbItem.style?.inputClass : "";
101
- this.qbItem.style.inputStyle = this.qbItem.style.inputStyle ? this.qbItem.style?.inputStyle : "";
102
- this.qbItem.style.bookStyle = this.qbItem.style?.bookStyle ? this.qbItem.style?.bookStyle : "";
103
- this.qbItem.style.showLabel = this.qbItem.style?.showLabel ? this.qbItem.style?.showLabel : true;
104
- }
105
- else {
106
- if (this.qbItem) {
107
- this.qbItem.style = {
108
- "labelClass": "",
109
- "labelStyle": "",
110
- "labelValueStyle": "",
111
- "inputClass": "",
112
- "inputStyle": "",
113
- "bookStyle": "",
114
- "showLabel": true,
115
- "direction": "ltr",
116
- "questionStyle": ""
117
- };
118
- }
119
- }
120
- this.qbItem.style.questionStyle = this.qbItem?.style?.questionStyle ? this.qbItem?.style.questionStyle : "";
121
- this.langDirection = this.qbItem.style.direction = this.qbItem?.style?.direction ? this.qbItem?.style?.direction : 'ltr';
122
- this.bookStyle = this.qbItem?.style?.bookStyle;
123
- this.questions.forEach(element => {
124
- var htmlElement = element?.questionText;
125
- var textOnly = htmlElement?.replace(/<[^>]*>/g, '');
126
- element.questionText = textOnly;
127
- // HA 19DEC23 Logic for Question Styling(Slaesforce)
128
- // HA 28DEC23 Added styling and logics to load the book type questions
129
- if (element.type === 'Book') {
130
- if (element['qbReferenceQuestions']) {
131
- var qb = JSON.parse(element['qbReferenceQuestions']);
132
- if (qb['questionbook'].style) {
133
- qb['questionbook'].style = typeof qb['questionbook'].style === 'string' ? JSON.parse('' + qb['questionbook'].style) : qb['questionbook'].style;
134
- }
135
- else {
136
- qb['questionbook'].style = this.qbItem.style;
137
- }
138
- // Book type question styling
139
- qb['questionbook'].style.labelClass = qb['questionbook'].style?.labelClass ? qb['questionbook'].style?.labelClass : "";
140
- qb['questionbook'].style.labelStyle = qb['questionbook'].style?.labelStyle ? qb['questionbook'].style?.labelStyle : "";
141
- qb['questionbook'].style.labelValueStyle = qb['questionbook'].Style__?.labelValueStyle ? qb['questionbook'].style.labelValueStyle : "";
142
- qb['questionbook'].style.inputClass = qb['questionbook'].style?.inputClass ? qb['questionbook'].style?.inputClass : "";
143
- qb['questionbook'].style.inputStyle = qb['questionbook'].style?.inputStyle ? qb['questionbook'].style?.inputStyle : "";
144
- qb['questionbook'].style.bookStyle = qb['questionbook'].style?.bookStyle ? qb['questionbook'].style?.bookStyle : "";
145
- qb['questionbook'].style.showLabel = qb['questionbook'].style?.showLabel ? qb['questionbook'].style?.showLabel : true;
146
- qb['questionbook'].style.questionStyle = qb['questionbook'].style?.questionStyle ? qb['questionbook'].style?.questionStyle : "";
147
- qb['langDirection'] = qb['questionbook'].style.direction ? qb['questionbook'].style?.direction : this.langDirection;
148
- // Loop for each question in the book
149
- qb['questionbook'].subQuestions.forEach(questionFromBook => {
150
- questionFromBook.style = questionFromBook.style ? questionFromBook.style : qb['questionbook'].style;
151
- questionFromBook.style.labelClass = questionFromBook.style?.labelClass ? questionFromBook.style?.labelClass : "";
152
- questionFromBook.style.labelStyle = questionFromBook.style?.labelStyle ? questionFromBook.style?.labelStyle : "";
153
- questionFromBook.style.labelValueStyle = questionFromBook.style?.labelValueStyle ? questionFromBook.style?.labelValueStyle : "";
154
- questionFromBook.style.inputClass = questionFromBook.style?.inputClass ? questionFromBook.style?.inputClass : "";
155
- questionFromBook.style.inputStyle = questionFromBook.style?.inputStyle ? questionFromBook.style?.inputStyle : "";
156
- questionFromBook.style.bookStyle = questionFromBook.style?.bookStyle ? questionFromBook.style?.bookStyle : "";
157
- questionFromBook.style.showLabel = questionFromBook.style?.showLabel ? questionFromBook.style?.showLabel : true;
158
- questionFromBook.style.questionStyle = questionFromBook.style?.questionStyle ? questionFromBook.style?.questionStyle : "";
159
- questionFromBook['langDirection'] = questionFromBook.style?.direction ? questionFromBook.style?.direction : this.langDirection;
160
- });
161
- element['qbItem'] = qb['questionbook'];
162
- }
163
- }
164
- element.style = element.style ? typeof element.style === 'string' ? JSON.parse('' + element?.style) : element?.style : this.qbItem?.style;
165
- element.style.labelClass = element.style?.labelClass ? element.style?.labelClass : "";
166
- element.style.labelStyle = element.style?.labelStyle ? element.style?.labelStyle : "";
167
- element.style.labelValueStyle = element.style?.labelValueStyle ? element.style.labelValueStyle : "";
168
- element.style.inputClass = element.style?.inputClass ? element.style?.inputClass : "";
169
- element.style.inputStyle = element.style.inputStyle ? element.style?.inputStyle : "";
170
- element.style.bookStyle = element.style?.bookStyle ? element.style?.bookStyle : "";
171
- element.style.showLabel = element.style?.showLabel ? element.style?.showLabel : true;
172
- element.style.questionStyle = element.style?.questionStyle ? element.style?.questionStyle : "";
173
- element['langDirection'] = element.style?.direction ? element.style?.direction : this.langDirection;
174
- //VD 02Aug24 dependent field show/hide changes
175
- // RS 09DEC24 Changed keys
176
- if (element.referenceField) {
177
- element.dependentRef = element.referenceField;
178
- }
179
- if (element.subText) {
180
- let dependencyObj = JSON.parse(element.subText);
181
- if (dependencyObj.isDependentField) {
182
- element.isHidden = true;
183
- }
184
- // VD 07Aug24 - isDependentField change
185
- this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
186
- // VD 20Aug24 - isDependentField change
187
- if (changeValue != undefined && dependencyObj.isDependentField) {
188
- if (changeValue.valueObj != undefined && changeValue.fromQuestionId == dependencyObj.sourceQuestionId) {
189
- // element.isHiddenField = true;
190
- if (dependencyObj.dependentValue == changeValue.valueObj) {
191
- element.isHidden = false;
192
- element.input = '';
193
- element.selectedValue = undefined;
194
- if (element.dependentRef == changeValue.referenceField) {
195
- element.referenceField = changeValue.referenceField;
196
- }
197
- }
198
- else {
199
- element.isHidden = true;
200
- element.input = '';
201
- element.selectedValue = undefined;
202
- this.hideDependentElements(element.id);
203
- // if there is no dependent selection remove the reference
204
- if (element.dependentRef == changeValue.referenceField) {
205
- element.referenceField = '';
206
- }
207
- }
208
- }
209
- }
210
- });
211
- this.storageService.update(element);
212
- }
213
- // sunday comment
214
- // if (element.type === 'Calendar') {
215
- // this.openCalendarComponent(element);
216
- // }
217
- });
218
- this.subQuestions = [];
219
- this.setSubQuestions(this.questions);
220
- this.processTranslatedQuestions();
221
- }
222
- // VD 07Aug24 - isDependentField change
223
- hideDependentElements(elementId) {
224
- let elementsToHide = this.questions.filter(el => {
225
- if (el.subText) {
226
- let depObj = JSON.parse(el.subText);
227
- return depObj.sourceQuestionId == elementId;
228
- }
229
- return false;
230
- });
231
- elementsToHide.forEach(el => {
232
- el.isHidden = true;
233
- el.input = '';
234
- el.selectedValue = undefined;
235
- this.storageService.update(el);
236
- // Recursively hide elements dependent on this one
237
- this.hideDependentElements(el.id);
238
- });
239
- }
240
- clearSQError(quesId) {
241
- var sqList = this.subQuestions?.filter((item) => item.id == quesId);
242
- for (var sq of sqList) {
243
- sq.error = null;
244
- }
245
- }
246
- // VD 11Jun24 - translation changes
247
- processTranslatedQuestions() {
248
- if (this.translatedQuestions && this.translatedQuestions.length > 0) {
249
- this.questions.forEach((orgQuestion) => {
250
- this.translatedQuestions.forEach((transQuestion) => {
251
- if (orgQuestion.uniqueIdentifier == transQuestion.identifier) {
252
- orgQuestion.questionText = transQuestion.label;
253
- orgQuestion.question = transQuestion.placeHolder;
254
- }
255
- });
256
- });
257
- // console.log('originalQuestion' + this.questions);
258
- // console.log(this.questions);
259
- }
260
- }
261
- setSubQuestions(records) {
262
- this.subQuestions.push(records);
263
- }
264
- // Capture and Process Child Event
265
- childEventCapture(event, ques) {
266
- let dropdownData = {};
267
- this.changeService.announceChange(event);
268
- if (ques) {
269
- if (ques.type == 'Dropdown' || ques.type == 'Radio') {
270
- // HA 19JAN24 Correction of dropdown values
271
- ques.selectedObj = event.valueObj ? event.valueObj : null;
272
- ques.input = event.selectedObj ? event.selectedObj : event.valueObj;
273
- ques.selectedValue = event.valueObj ? event.valueObj : null;
274
- // emit the dropdown data to parent
275
- dropdownData['event'] = event.valueObj;
276
- dropdownData['ques'] = ques;
277
- if (dropdownData['event']) {
278
- this.handleDropDown.emit(dropdownData);
279
- } // VD 21DEC23 - dependent field change
280
- }
281
- else if (ques.type == 'Location') {
282
- ques.input = event.valueObj;
283
- ques.selectedValue = event.valueObj.address;
284
- }
285
- else if (ques.type == 'File') {
286
- ques.input = this.selectedFileData = event;
287
- }
288
- else if (ques.type == 'Date' || ques.type == 'DateTime') { // HA 24JAN24 Converting Date and DateTime to UTC
289
- if (event.value) {
290
- let d = new Date(event.value);
291
- let utcString = d?.toISOString();
292
- ques.input = utcString;
293
- }
294
- else {
295
- ques.input = '';
296
- }
297
- }
298
- else if (ques.type == 'List') {
299
- // VD 20Aug24 handling the list type handle multiple object values
300
- ques.input = this.dataService.getValue(event.valueObj, event.field);
301
- }
302
- else {
303
- ques.input = event;
304
- }
305
- // validating error message
306
- const hasError = ques.errorMessage && ((ques.type === 'File' && ques.input.length == 0) || (ques.type != 'File' && !ques.input));
307
- ques.error = hasError ? new ErrorWrapper() : null;
308
- // Once the right value is stored in ques.input store the ques (with input) in storageService
309
- this.storageService.update(ques);
310
- // VD 19Jul01 - get updated question
311
- this.handleQuestion.emit(ques);
312
- }
313
- }
314
- deleteFile(fileData) {
315
- console.log('fileDATA', fileData);
316
- }
317
- getDropDown(event) {
318
- this.hadleDropDownDependent.emit(event);
319
- }
320
- // VD 06Sep24 calendar changes
321
- getCurrentCalendar(event) {
322
- this.handleCalendarDate.emit(event);
323
- }
324
- getCalendarEvent(event) {
325
- if (event) {
326
- this.handleCalendarEvent.emit(event);
327
- }
328
- }
329
- // VD 06Sep24 remove the special charecters and tags
330
- // from the questionText
331
- removeCharacters(questionText) {
332
- let updatedText = questionText?.replace(/<[^>]*>/g, '');
333
- return updatedText;
334
- }
335
- // sunday comment
336
- // openCalendarComponent(ques) {
337
- // const viewContainerRef = this.dynamicHost.viewContainerRef;
338
- // if(viewContainerRef){
339
- // viewContainerRef.clear();
340
- // const componentRef = viewContainerRef.createComponent(CustomCalendarComponent);
341
- // componentRef.instance.question = ques;
342
- // componentRef.instance.dateSelected.subscribe((event: any) => this.getCurrentCalendar(event));
343
- // componentRef.instance.eventSelected.subscribe((event:any) => this.getCalendarEvent(event))
344
- // }
345
- // }
346
- isCalendarModalOpen = false;
347
- calendarModalTitle;
348
- calendarModalSize;
349
- calendarSaveButtonValue;
350
- referenceQuestions = [];
351
- qbRefrenceBook;
352
- modalCalendarModalFooter;
353
- openCalendarModal(event) {
354
- this.isCalendarModalOpen = true;
355
- this.qbRefrenceBook = event.qbRefrenceBook;
356
- this.referenceQuestions = event.referenceQuestions;
357
- this.calendarModalTitle = event.modalTitle;
358
- this.calendarModalSize = event.modalSize;
359
- this.calendarSaveButtonValue = event.saveButtonValue;
360
- this.modalCalendarModalFooter = event.modalFooter;
361
- }
362
- onCalendarModalSave() {
363
- this.changeService.dataChanges('calendar-modal-save');
364
- }
365
- handleQuestionEvent(event) {
366
- console.log('handle question here');
367
- }
368
- closeCalendarModal(event) {
369
- this.isCalendarModalOpen = false;
370
- }
371
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QuestionbookComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.ChangeService }, { token: i4.StorageService }, { token: i5.I18nService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
372
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QuestionbookComponent, selector: "lib-questionbook", inputs: { qbItem: "qbItem", questionItem: "questionItem", translatedQuestions: "translatedQuestions", questions: "questions", errorFieldId: "errorFieldId", labelValue: "labelValue", token: "token", dropDownData: "dropDownData" }, outputs: { handleDropDown: "handleDropDown", handleQuestion: "handleQuestion", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, ngImport: i0, template: "<!-- HA 20DEC23 Book Style from salesforce -->\r\n<!-- HA 28DEC23 Removed IsShengel(removal of shengel values applies for this reason) and direct styling of books to avoid styling issues-->\r\n<!-- HA 18JAN24 Added class for styling -->\r\n<div [style]=\"bookStyle\" class=\"content-box form-group\">\r\n <div class=\"form-row\">\r\n <!-- HA 20DEC23 Directive and Question Style from salesforce -->\r\n <!-- RA09DEC24 Changed keys-->\r\n <div\r\n [class]=\"'col-lg-' + ques.size + ' paddingnone'\"\r\n *ngFor=\"let ques of questions;let i = index\" [id]=\"ques.id\" [dir]=\"ques.langDirection\" [style]=\"ques?.style?.questionStyle\">\r\n <!-- Sub Question Label -->\r\n <!-- HA 20DEC23 Label Style from salesforce -->\r\n <!-- VD 09May24 is hide field change-->\r\n <div *ngIf=\"!ques.isHidden\">\r\n <div *ngIf=\"ques.type === 'DateTime'\">\r\n \r\n </div>\r\n <!-- VD 20JUN24 - help text changes-->\r\n <!-- VD 01Aug24 - validation change-->\r\n <!-- // VD 02Aug24 - label value style-->\r\n <div [ngClass]=\"{ down2: qbItem?.progressBar }\" *ngIf=\"ques.style?.showLabel ? ques.style?.showLabel : true\" [style]=\"ques.style?.labelStyle\">\r\n <span [class]=\"'dis-flex shengel-myt-font3 myt-font7 '\" [style]=\"ques.style?.labelValueStyle\">{{ removeCharacters(ques?.questionText) }}\r\n <div *ngIf=\"ques.isOptional\" style=\"color: red;\">*</div>\r\n <div *ngIf=\"ques.questionText && ques?.helpText\" class=\"icon\" [matTooltip]=\"ques?.helpText\">i</div></span>\r\n </div>\r\n <!-- // VD 12Jun24 - readonly change-->\r\n <!-- DateTime -->\r\n <div *ngIf=\"ques.type === 'DateTime'\">\r\n <app-custom-date-picker [minDate]=\"ques.minDate\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" [date]=\"ques.input\" (dateChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-date-picker>\r\n </div>\r\n \r\n <!-- Date-->\r\n <div *ngIf=\"ques.type === 'Date'\">\r\n <app-custom-date [date]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (dateChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-date>\r\n </div>\r\n \r\n <!-- Time-->\r\n <div *ngIf=\"ques.type === 'Time'\">\r\n <app-custom-time [time]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (timeChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-time>\r\n </div>\r\n <!-- calendar -->\r\n <div *ngIf=\"ques.type === 'Calendar'\">\r\n <app-custom-calendar\r\n [question]=\"ques\"\r\n (eventSelected)=\"getCalendarEvent($event)\"\r\n (dateSelected)=\"getCurrentCalendar($event)\"\r\n (openModal)=\"openCalendarModal($event)\"\r\n (closeModal)=\"closeCalendarModal($event)\"\r\n ></app-custom-calendar>\r\n <!-- model used in calendar component -->\r\n <app-custom-model *ngIf=\"isCalendarModalOpen\"\r\n [modalTitle]=\"calendarModalTitle\"\r\n [isModalOpen]=\"isCalendarModalOpen\"\r\n [modalSize]=\"calendarModalSize\"\r\n [saveButtonValue]=\"calendarSaveButtonValue\"\r\n [modalFooter]=\"modalCalendarModalFooter\"\r\n (saveButtonEmit)=\"onCalendarModalSave()\"\r\n (cancelButtonEmit)=\"closeCalendarModal($event)\"\r\n >\r\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\r\n </app-custom-model>\r\n </div>\r\n <!-- Text -->\r\n <div *ngIf=\"ques.type === 'Text' || ques.type === 'Link'\" >\r\n <app-custom-input [value]=\"ques.input\" [ngClassValue]=\"{\r\n 'dis-flex dt-line date-line bookText boxoutline myt-font1': qbItem.progressBar,\r\n textBox: !qbItem.progressBar\r\n }\" [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [idValue]=\"ques.trackingId\" [focusEvent]=\"clearSQError(ques.id)\"\r\n [error]=\"ques.error\" [placeholder]=\"ques.question\" (inputValue)=\"childEventCapture($event, ques)\">\r\n </app-custom-input>\r\n </div>\r\n \r\n <!-- for pick location -->\r\n <!-- VD 21DEC23 - dependent field change -->\r\n <div *ngIf=\"ques.type === 'Location'\">\r\n <!-- HA10012024 Added Api key as input -->\r\n <app-pick-location [apiKey]=\"qbItem['apiKey']\" [address]=\"ques.selectedValue\" [question]=\"ques\" (locationSelected)=\"childEventCapture($event, ques)\">\r\n </app-pick-location>\r\n </div>\r\n \r\n <!-- for text area -->\r\n <div *ngIf=\"ques.type === 'TextArea'\">\r\n <app-custom-text-area [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [value]=\"ques.input\" [rows]=\"3\" [error]=\"ques.error\" [placeholder]=\"ques.question \"\r\n (textareaValueChange)=\"childEventCapture($event, ques)\"></app-custom-text-area>\r\n </div>\r\n \r\n <!-- Email -->\r\n <div *ngIf=\"ques.type === 'Email'\">\r\n <input type=\"email\" readOnly=\"ques.isReadOnly\" [(ngModel)]=\"ques.input\" [id]=\"ques.id\" required=\"\" (focus)=\"clearSQError(ques.id)\"\r\n style.border-color=\"{{ ques.error ? 'red' : '' }}\" placeholder=\"{{ ques.question }}\" />\r\n </div>\r\n \r\n <!-- Table -->\r\n <div *ngIf=\"ques.type === 'Table'\" class=\"\">\r\n <app-custom-table [question]=\"ques\" [apiMeta]=\"ques.subText\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-table>\r\n </div>\r\n \r\n <!-- Table Appendix -->\r\n <div *ngIf=\"ques.type === 'TableAppendix'\" class=\"\">\r\n <app-table-appendix [question]=\"ques\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-table-appendix>\r\n </div>\r\n <!-- list -->\r\n <!-- VD 20Aug24 used correct attribute -->\r\n <div *ngIf=\"ques.type === 'List'\" class=\"\">\r\n <lib-search-box [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [placeHolderText]=\"ques.question\" [filterName]=\"ques.input\" (searchValueChange)=\"childEventCapture($event, ques)\">\r\n </lib-search-box>\r\n </div>\r\n \r\n <!-- Dropdown -->\r\n <!-- HA 09FEB24 Added condition of sqOption to the dropdown -->\r\n <div *ngIf=\"ques?.type === 'Dropdown' && ques?.options\" class=\"\">\r\n <!-- HA 20DEC23 For Translation --> <!-- VD 19JAN24 - getting token as input -->\r\n <app-custom-dropdown [options]=\"ques.options\"\r\n [token]=\"token\"\r\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\"\r\n [selectedValue]=\"ques.selectedValue\"\r\n placeholder=\"---{{'select' | i18n:i18nService.currentLanguage}}---\"\r\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\r\n [referenceField]=\"ques.referenceField\"\r\n [readOnly]=\"ques.isReadOnly\"\r\n [question]=\"ques\"\r\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-dropdown>\r\n <i class=\"fa fa-check \" aria-hidden=\"true\" *ngIf=\"ques?.input?.length > 0\"></i>\r\n </div>\r\n <!-- // VD 02Aug24 custom-radio component -->\r\n <div *ngIf=\"ques.type === 'Radio' && ques?.options\" class=\"\">\r\n <app-custom-radio [options]=\"ques.options\" [token]=\"token\"\r\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [selectedValue]=\"ques.selectedValue\"\r\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\r\n [referenceField]=\"ques.referenceField\"\r\n [readOnly]=\"ques.isReadOnly\"\r\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-radio>\r\n </div>\r\n \r\n <!-- Attachment / Files -->\r\n <div *ngIf=\"ques.type === 'File'\" class=\"\">\r\n <app-file-upload [limitFileUploading]=\"5\" [error]=\"ques.error\" [question]=\"ques\" [allFiles]=\"ques.input\" [tableFile]=\"false\"\r\n (selectedFileData)=\"childEventCapture($event, ques)\" (deletedFileData)=\"deleteFile($event)\"\r\n [isDeleteFileButtonVisible]=\"true\"></app-file-upload>\r\n </div>\r\n <div *ngIf=\"ques.type === 'PopUpMessage'\" class=\"\">\r\n <app-dependent-table [alertMessage]=\"ques.errorMessage\">\r\n </app-dependent-table>\r\n </div>\r\n <div *ngIf=\"ques.type === 'Label'\" class=\"\">\r\n <app-custom-label [labelStyle]=\"ques.title\" [labelValue]=\"ques.question\">\r\n </app-custom-label>\r\n </div>\r\n <!-- // VD 02Aug24 image component -->\r\n <div *ngIf=\"ques.type === 'Image'\" class=\"\">\r\n <app-custom-image [question]=\"ques\">\r\n </app-custom-image>\r\n </div>\r\n <!-- 08NOV23 - button type question added -->\r\n <!-- Button -->\r\n <div *ngIf=\"ques.type === 'Button'\" class=\"\">\r\n <app-custom-button [height]=\"'50px'\"\r\n [width]=\"'150px'\"\r\n [buttonText]=\"ques?.question\"\r\n [value]=\"ques?.question\"\r\n (buttonValue)=\"childEventCapture($event, ques)\"\r\n >\r\n </app-custom-button>\r\n </div>\r\n <!-- HA 20DEC23 This is to load book type questions-->\r\n <div *ngIf=\"ques.type === 'Book'\">\r\n <!-- HA 09FEB24 Added ternary operator -->\r\n <lib-questionbook [qbItem]=\"ques.qbItem\" [labelValue]=\"labelValue\" [questions]=\"ques.qbItem?.subQuestions\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- 06-09-24 for calendar type-->\r\n<!-- <ng-template dynamicComponentHost></ng-template> -->", styles: [".col-lg-6{width:100%}.myt-font7{display:flex;justify-content:flex-start;align-items:center}.icon{display:inline-block;width:15px;height:15px;border-radius:50%;background-color:#08010177;color:#fff;text-align:center;line-height:16px;font-size:11px;font-family:Arial,sans-serif;font-weight:700;margin-left:5px}@media (min-width: 1200px){.col-lg-6{width:50%!important}.form-row{display:flex;flex-wrap:wrap}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i9.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "component", type: i10.PickLocationComponent, selector: "app-pick-location", inputs: ["address", "question", "apiKey"], outputs: ["locationSelected"] }, { kind: "component", type: i11.CustomInputComponent, selector: "app-custom-input", inputs: ["value", "question", "disabled", "placeholder", "error", "fromShengel", "readOnly", "ngClassValue", "idValue", "focusEvent"], outputs: ["inputValue"] }, { kind: "component", type: i12.CustomTextAreaComponent, selector: "app-custom-text-area", inputs: ["value", "placeholder", "rows", "error", "question", "readOnly"], outputs: ["textareaValueChange"] }, { kind: "component", type: i13.CustomTableComponent, selector: "app-custom-table", inputs: ["question", "apiMeta"], outputs: ["valueChange"] }, { kind: "component", type: i14.CustomCalendarComponent, selector: "app-custom-calendar", inputs: ["allEvents", "question", "nxtId"], outputs: ["eventSelected", "dateSelected", "openModal", "closeModal"] }, { kind: "component", type: i15.CustomDatePickerComponent, selector: "app-custom-date-picker", inputs: ["date", "minDate", "maxDate", "error", "errorMessage", "readOnly"], outputs: ["dateChange"] }, { kind: "component", type: i16.CustomDropdownComponent, selector: "app-custom-dropdown", inputs: ["options", "placeholder", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "question", "referenceField", "token"], outputs: ["valueChange"] }, { kind: "component", type: i17.SearchBoxComponent, selector: "lib-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "filterName"], outputs: ["searchValueChange"] }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "dropDownData"], outputs: ["handleDropDown", "handleQuestion", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "component", type: i18.FileUploadComponent, selector: "app-file-upload", inputs: ["allFiles", "limitFileUploading", "isDeleteFileButtonVisible", "isShowNoFileIcon", "tableFile", "question", "error"], outputs: ["selectedFileData", "deletedFileData"] }, { kind: "component", type: i19.DependentTableComponent, selector: "app-dependent-table", inputs: ["alertMessage"] }, { kind: "component", type: i20.CustomLabelComponent, selector: "app-custom-label", inputs: ["labelValue", "labelStyle"] }, { kind: "component", type: i21.TableAppendixComponent, selector: "app-table-appendix", inputs: ["question"], outputs: ["valueChange"] }, { kind: "component", type: i22.CustomDateComponent, selector: "app-custom-date", inputs: ["date", "readOnly", "error", "errorMessage"], outputs: ["dateChange"] }, { kind: "component", type: i23.CustomTimeComponent, selector: "app-custom-time", inputs: ["time", "readOnly", "error", "errorMessage"], outputs: ["timeChange"] }, { kind: "component", type: i24.CustomButtonComponent, selector: "app-custom-button", inputs: ["height", "width", "textColor", "buttonText", "value", "backgroundColor"], outputs: ["buttonValue"] }, { kind: "component", type: i25.CustomModelComponent, selector: "app-custom-model", inputs: ["modalTitle", "isModalOpen", "modalSize", "saveButtonValue", "modalFooter"], outputs: ["saveButtonEmit", "cancelButtonEmit"] }, { kind: "component", type: i26.CustomImageComponent, selector: "app-custom-image", inputs: ["alt", "src", "imageStyle", "question"] }, { kind: "component", type: i27.CustomRadioComponent, selector: "app-custom-radio", inputs: ["options", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "referenceField", "token"], outputs: ["valueChange"] }, { kind: "pipe", type: i28.I18nPipe, name: "i18n" }] });
373
- }
374
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QuestionbookComponent, decorators: [{
375
- type: Component,
376
- args: [{ selector: 'lib-questionbook', template: "<!-- HA 20DEC23 Book Style from salesforce -->\r\n<!-- HA 28DEC23 Removed IsShengel(removal of shengel values applies for this reason) and direct styling of books to avoid styling issues-->\r\n<!-- HA 18JAN24 Added class for styling -->\r\n<div [style]=\"bookStyle\" class=\"content-box form-group\">\r\n <div class=\"form-row\">\r\n <!-- HA 20DEC23 Directive and Question Style from salesforce -->\r\n <!-- RA09DEC24 Changed keys-->\r\n <div\r\n [class]=\"'col-lg-' + ques.size + ' paddingnone'\"\r\n *ngFor=\"let ques of questions;let i = index\" [id]=\"ques.id\" [dir]=\"ques.langDirection\" [style]=\"ques?.style?.questionStyle\">\r\n <!-- Sub Question Label -->\r\n <!-- HA 20DEC23 Label Style from salesforce -->\r\n <!-- VD 09May24 is hide field change-->\r\n <div *ngIf=\"!ques.isHidden\">\r\n <div *ngIf=\"ques.type === 'DateTime'\">\r\n \r\n </div>\r\n <!-- VD 20JUN24 - help text changes-->\r\n <!-- VD 01Aug24 - validation change-->\r\n <!-- // VD 02Aug24 - label value style-->\r\n <div [ngClass]=\"{ down2: qbItem?.progressBar }\" *ngIf=\"ques.style?.showLabel ? ques.style?.showLabel : true\" [style]=\"ques.style?.labelStyle\">\r\n <span [class]=\"'dis-flex shengel-myt-font3 myt-font7 '\" [style]=\"ques.style?.labelValueStyle\">{{ removeCharacters(ques?.questionText) }}\r\n <div *ngIf=\"ques.isOptional\" style=\"color: red;\">*</div>\r\n <div *ngIf=\"ques.questionText && ques?.helpText\" class=\"icon\" [matTooltip]=\"ques?.helpText\">i</div></span>\r\n </div>\r\n <!-- // VD 12Jun24 - readonly change-->\r\n <!-- DateTime -->\r\n <div *ngIf=\"ques.type === 'DateTime'\">\r\n <app-custom-date-picker [minDate]=\"ques.minDate\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" [date]=\"ques.input\" (dateChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-date-picker>\r\n </div>\r\n \r\n <!-- Date-->\r\n <div *ngIf=\"ques.type === 'Date'\">\r\n <app-custom-date [date]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (dateChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-date>\r\n </div>\r\n \r\n <!-- Time-->\r\n <div *ngIf=\"ques.type === 'Time'\">\r\n <app-custom-time [time]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (timeChange)=\"childEventCapture($event, ques)\">\r\n </app-custom-time>\r\n </div>\r\n <!-- calendar -->\r\n <div *ngIf=\"ques.type === 'Calendar'\">\r\n <app-custom-calendar\r\n [question]=\"ques\"\r\n (eventSelected)=\"getCalendarEvent($event)\"\r\n (dateSelected)=\"getCurrentCalendar($event)\"\r\n (openModal)=\"openCalendarModal($event)\"\r\n (closeModal)=\"closeCalendarModal($event)\"\r\n ></app-custom-calendar>\r\n <!-- model used in calendar component -->\r\n <app-custom-model *ngIf=\"isCalendarModalOpen\"\r\n [modalTitle]=\"calendarModalTitle\"\r\n [isModalOpen]=\"isCalendarModalOpen\"\r\n [modalSize]=\"calendarModalSize\"\r\n [saveButtonValue]=\"calendarSaveButtonValue\"\r\n [modalFooter]=\"modalCalendarModalFooter\"\r\n (saveButtonEmit)=\"onCalendarModalSave()\"\r\n (cancelButtonEmit)=\"closeCalendarModal($event)\"\r\n >\r\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\r\n </app-custom-model>\r\n </div>\r\n <!-- Text -->\r\n <div *ngIf=\"ques.type === 'Text' || ques.type === 'Link'\" >\r\n <app-custom-input [value]=\"ques.input\" [ngClassValue]=\"{\r\n 'dis-flex dt-line date-line bookText boxoutline myt-font1': qbItem.progressBar,\r\n textBox: !qbItem.progressBar\r\n }\" [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [idValue]=\"ques.trackingId\" [focusEvent]=\"clearSQError(ques.id)\"\r\n [error]=\"ques.error\" [placeholder]=\"ques.question\" (inputValue)=\"childEventCapture($event, ques)\">\r\n </app-custom-input>\r\n </div>\r\n \r\n <!-- for pick location -->\r\n <!-- VD 21DEC23 - dependent field change -->\r\n <div *ngIf=\"ques.type === 'Location'\">\r\n <!-- HA10012024 Added Api key as input -->\r\n <app-pick-location [apiKey]=\"qbItem['apiKey']\" [address]=\"ques.selectedValue\" [question]=\"ques\" (locationSelected)=\"childEventCapture($event, ques)\">\r\n </app-pick-location>\r\n </div>\r\n \r\n <!-- for text area -->\r\n <div *ngIf=\"ques.type === 'TextArea'\">\r\n <app-custom-text-area [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [value]=\"ques.input\" [rows]=\"3\" [error]=\"ques.error\" [placeholder]=\"ques.question \"\r\n (textareaValueChange)=\"childEventCapture($event, ques)\"></app-custom-text-area>\r\n </div>\r\n \r\n <!-- Email -->\r\n <div *ngIf=\"ques.type === 'Email'\">\r\n <input type=\"email\" readOnly=\"ques.isReadOnly\" [(ngModel)]=\"ques.input\" [id]=\"ques.id\" required=\"\" (focus)=\"clearSQError(ques.id)\"\r\n style.border-color=\"{{ ques.error ? 'red' : '' }}\" placeholder=\"{{ ques.question }}\" />\r\n </div>\r\n \r\n <!-- Table -->\r\n <div *ngIf=\"ques.type === 'Table'\" class=\"\">\r\n <app-custom-table [question]=\"ques\" [apiMeta]=\"ques.subText\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-table>\r\n </div>\r\n \r\n <!-- Table Appendix -->\r\n <div *ngIf=\"ques.type === 'TableAppendix'\" class=\"\">\r\n <app-table-appendix [question]=\"ques\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-table-appendix>\r\n </div>\r\n <!-- list -->\r\n <!-- VD 20Aug24 used correct attribute -->\r\n <div *ngIf=\"ques.type === 'List'\" class=\"\">\r\n <lib-search-box [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [placeHolderText]=\"ques.question\" [filterName]=\"ques.input\" (searchValueChange)=\"childEventCapture($event, ques)\">\r\n </lib-search-box>\r\n </div>\r\n \r\n <!-- Dropdown -->\r\n <!-- HA 09FEB24 Added condition of sqOption to the dropdown -->\r\n <div *ngIf=\"ques?.type === 'Dropdown' && ques?.options\" class=\"\">\r\n <!-- HA 20DEC23 For Translation --> <!-- VD 19JAN24 - getting token as input -->\r\n <app-custom-dropdown [options]=\"ques.options\"\r\n [token]=\"token\"\r\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\"\r\n [selectedValue]=\"ques.selectedValue\"\r\n placeholder=\"---{{'select' | i18n:i18nService.currentLanguage}}---\"\r\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\r\n [referenceField]=\"ques.referenceField\"\r\n [readOnly]=\"ques.isReadOnly\"\r\n [question]=\"ques\"\r\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-dropdown>\r\n <i class=\"fa fa-check \" aria-hidden=\"true\" *ngIf=\"ques?.input?.length > 0\"></i>\r\n </div>\r\n <!-- // VD 02Aug24 custom-radio component -->\r\n <div *ngIf=\"ques.type === 'Radio' && ques?.options\" class=\"\">\r\n <app-custom-radio [options]=\"ques.options\" [token]=\"token\"\r\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [selectedValue]=\"ques.selectedValue\"\r\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\r\n [referenceField]=\"ques.referenceField\"\r\n [readOnly]=\"ques.isReadOnly\"\r\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\r\n </app-custom-radio>\r\n </div>\r\n \r\n <!-- Attachment / Files -->\r\n <div *ngIf=\"ques.type === 'File'\" class=\"\">\r\n <app-file-upload [limitFileUploading]=\"5\" [error]=\"ques.error\" [question]=\"ques\" [allFiles]=\"ques.input\" [tableFile]=\"false\"\r\n (selectedFileData)=\"childEventCapture($event, ques)\" (deletedFileData)=\"deleteFile($event)\"\r\n [isDeleteFileButtonVisible]=\"true\"></app-file-upload>\r\n </div>\r\n <div *ngIf=\"ques.type === 'PopUpMessage'\" class=\"\">\r\n <app-dependent-table [alertMessage]=\"ques.errorMessage\">\r\n </app-dependent-table>\r\n </div>\r\n <div *ngIf=\"ques.type === 'Label'\" class=\"\">\r\n <app-custom-label [labelStyle]=\"ques.title\" [labelValue]=\"ques.question\">\r\n </app-custom-label>\r\n </div>\r\n <!-- // VD 02Aug24 image component -->\r\n <div *ngIf=\"ques.type === 'Image'\" class=\"\">\r\n <app-custom-image [question]=\"ques\">\r\n </app-custom-image>\r\n </div>\r\n <!-- 08NOV23 - button type question added -->\r\n <!-- Button -->\r\n <div *ngIf=\"ques.type === 'Button'\" class=\"\">\r\n <app-custom-button [height]=\"'50px'\"\r\n [width]=\"'150px'\"\r\n [buttonText]=\"ques?.question\"\r\n [value]=\"ques?.question\"\r\n (buttonValue)=\"childEventCapture($event, ques)\"\r\n >\r\n </app-custom-button>\r\n </div>\r\n <!-- HA 20DEC23 This is to load book type questions-->\r\n <div *ngIf=\"ques.type === 'Book'\">\r\n <!-- HA 09FEB24 Added ternary operator -->\r\n <lib-questionbook [qbItem]=\"ques.qbItem\" [labelValue]=\"labelValue\" [questions]=\"ques.qbItem?.subQuestions\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- 06-09-24 for calendar type-->\r\n<!-- <ng-template dynamicComponentHost></ng-template> -->", styles: [".col-lg-6{width:100%}.myt-font7{display:flex;justify-content:flex-start;align-items:center}.icon{display:inline-block;width:15px;height:15px;border-radius:50%;background-color:#08010177;color:#fff;text-align:center;line-height:16px;font-size:11px;font-family:Arial,sans-serif;font-weight:700;margin-left:5px}@media (min-width: 1200px){.col-lg-6{width:50%!important}.form-row{display:flex;flex-wrap:wrap}}\n"] }]
377
- }], ctorParameters: function () { return [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.ChangeService }, { type: i4.StorageService }, { type: i5.I18nService }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
378
- type: Inject,
379
- args: [DOCUMENT]
380
- }] }]; }, propDecorators: { qbItem: [{
381
- type: Input
382
- }], questionItem: [{
383
- type: Input
384
- }], translatedQuestions: [{
385
- type: Input
386
- }], questions: [{
387
- type: Input
388
- }], errorFieldId: [{
389
- type: Input
390
- }], labelValue: [{
391
- type: Input
392
- }], token: [{
393
- type: Input
394
- }], handleDropDown: [{
395
- type: Output
396
- }], handleQuestion: [{
397
- type: Output
398
- }], dropDownData: [{
399
- type: Input
400
- }], hadleDropDownDependent: [{
401
- type: Output
402
- }], handleCalendarDate: [{
403
- type: Output
404
- }], handleCalendarEvent: [{
405
- type: Output
406
- }] } });
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25ib29rLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUE2RCxNQUFNLGVBQWUsQ0FBQztBQU9sSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFakUsa0dBQWtHO0FBQ2xHLHVHQUF1RztBQU92RyxNQUFNLE9BQU8scUJBQXFCO0lBMkJaO0lBQ1Y7SUFDQTtJQUNBO0lBQ0Q7SUFDQztJQUNrQjtJQWhDbkIsTUFBTSxDQUFlO0lBQ3JCLFlBQVksQ0FBVztJQUN2QixtQkFBbUIsR0FBVyxFQUFFLENBQUEsQ0FBRSxtQ0FBbUM7SUFDckUsU0FBUyxDQUFhO0lBQ3RCLFlBQVksQ0FBSztJQUNqQixVQUFVLENBQVE7SUFDbEIsS0FBSyxDQUFRLENBQUMsc0NBQXNDO0lBQ25ELGNBQWMsR0FBcUIsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUMzRCxjQUFjLEdBQXFCLElBQUksWUFBWSxFQUFPLENBQUMsQ0FBQyxvQ0FBb0M7SUFDakcsWUFBWSxDQUFLO0lBQzFCLDJGQUEyRjtJQUMzRixZQUFZLENBQWE7SUFDekIsZ0JBQWdCLEdB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QUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckYsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckYsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFL0YsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFD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QUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSztnQkFZSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgU2ltcGxlQ2hhbmdlcywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFF1ZXN0aW9uLCBRdWVzdGlvbkJvb2sgfSBmcm9tICcuLi8uLi93cmFwcGVyJztcclxuaW1wb3J0IHsgU2FsZXNmb3JjZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2FsZXNmb3JjZS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgRXJyb3JXcmFwcGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvZXJyb3JXcmFwcGVyJztcclxuLy8gSEEgMTlERUMyMyBpbXBvcnRlZCB0cmFuc2xhdGlvbiBzZXJ2aWNlXHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEZXBlbmRlbmN5TWV0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGVwZW5kZW5jeU1ldGEnO1xyXG4vL2ltcG9ydCB7IENvbXBvbmVudGhvc3REaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NvbXBvbmVudGhvc3QvY29tcG9uZW50aG9zdC5kaXJlY3RpdmUnO1xyXG4vL2ltcG9ydCB7IEN1c3RvbUNhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jdXN0b20tY2FsZW5kYXIvY3VzdG9tLWNhbGVuZGFyLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1xdWVzdGlvbmJvb2snLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVzdGlvbmJvb2suY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3F1ZXN0aW9uYm9vay5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uYm9va0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgcWJJdGVtOiBRdWVzdGlvbkJvb2s7XHJcbiAgQElucHV0KCkgcXVlc3Rpb25JdGVtOiBRdWVzdGlvbjtcclxuICBASW5wdXQoKSB0cmFuc2xhdGVkUXVlc3Rpb25zIDogYW55W10gPSBbXSAgLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcclxuICBASW5wdXQoKSBxdWVzdGlvbnM6IFF1ZXN0aW9uW107XHJcbiAgQElucHV0KCkgZXJyb3JGaWVsZElkOmFueTtcclxuICBASW5wdXQoKSBsYWJlbFZhbHVlOnN0cmluZzsgXHJcbiAgQElucHV0KCkgdG9rZW46c3RyaW5nOyAvLyBWRCAxOUpBTjI0IC0gZ2V0dGluZyB0b2tlbiBhcyBpbnB1dFxyXG4gIEBPdXRwdXQoKSBoYW5kbGVEcm9wRG93bjpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoYW5kbGVRdWVzdGlvbjpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyBWRCAxOUp1bDAxIC0gZ2V0IHVwZGF0ZWQgcXVlc3Rpb25cclxuICBASW5wdXQoKSBkcm9wRG93bkRhdGE6YW55O1xyXG4gIC8vQFZpZXdDaGlsZChDb21wb25lbnRob3N0RGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljSG9zdDogQ29tcG9uZW50aG9zdERpcmVjdGl2ZTtcclxuICBzdWJRdWVzdGlvbnM6IFF1ZXN0aW9uW107XHJcbiAgc2VsZWN0ZWRGaWxlRGF0YTogYW55W10gPSBbXTtcclxuICBsb2FkQ29tcG9uZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIC8vIEhBIDI4REVDMjMgQWRkZWQgc3R5bGluZyBhbmQgbG9naWNzIHRvIGxvYWQgdGhlIGJvb2sgdHlwZSBxdWVzdGlvbnMgXHJcbiAgcWJSZWY6IFF1ZXN0aW9uQm9vaztcclxuICAvLyAgSEEgMTlERUMyMyBEZWNsYXJhdGlvbiBmb3IgU2FsZXNmb3JjZSBTdHlsaW5nXHJcbiAgc3R5bGU6IGFueTtcclxuICBsYW5nRGlyZWN0aW9uID0gJ2x0cic7XHJcbiAgYm9va1N0eWxlOiBhbnk7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXHJcbiAgQE91dHB1dCgpIGhhbmRsZUNhbGVuZGFyRGF0ZTpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJFdmVudDpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgYm9va1F1ZXN0aW9uc01hcDogYW55ID0gbmV3IE1hcCgpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2ZTZXJ2aWNlOiBTYWxlc2ZvcmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlLCBcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XHJcbiAgICApIHsgXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIFZEIDEzU2VwMjQgY2hhbmdlc1xyXG4gICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xyXG4gICAgLy8gVkQgc2VwMTMyNCBjaGFuZ2VzIC0gcHJvY2VzcyBkYXRhIHdoZW4gZGF0YWJpbmQgdmFsdWUgY2hhbmdlXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jdXN0b21DaGFuZ2UkLnN1YnNjcmliZShcclxuICAgICAgKGNoYW5nZVZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBpZihjaGFuZ2VWYWx1ZSA9PSAnZGF0YUJpbmQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gICAvLyBWRCAxM1NlcDI0IGNoYW5nZXNcclxuICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcclxuICBwcm9jZXNzRGF0YSgpe1xyXG4gICAgLy8gIEhBIDE5REVDMjMgTG9naWMgZm9yIFF1ZXN0aW9uIEJvb2sgU3R5bGluZyhTbGFlc2ZvcmNlKVxyXG4gICAgLy8gSEEgMDlGRUIyNCBBZGRlZCB0ZXJuYXJ5XHJcbiAgICBpZih0aGlzLnFiSXRlbT8uc3R5bGUpe1xyXG4gICAgICAvLyBIQSAyOERFQzIzIEFkZGVkIHN0eWxpbmcgYW5kIGxvZ2ljcyB0byBsb2FkIHRoZSBib29rIHR5cGUgcXVlc3Rpb25zIFxyXG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZSA9IHR5cGVvZiB0aGlzLnFiSXRlbS5zdHlsZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKCcnK3RoaXMucWJJdGVtPy5zdHlsZSkgOiB0aGlzLnFiSXRlbS5zdHlsZTtcclxuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUubGFiZWxDbGFzcyA9IHRoaXMucWJJdGVtLnN0eWxlPy5sYWJlbENsYXNzID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmxhYmVsQ2xhc3MgOiBcIlwiO1xyXG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZS5sYWJlbFN0eWxlID0gdGhpcy5xYkl0ZW0uc3R5bGU/LmxhYmVsU3R5bGUgPyB0aGlzLnFiSXRlbS5zdHlsZT8ubGFiZWxTdHlsZSA6IFwiXCI7XHJcbiAgICAgIHRoaXMucWJJdGVtLnN0eWxlLmxhYmVsVmFsdWVTdHlsZSA9IHRoaXMucWJJdGVtLnN0eWxlPy5sYWJlbFZhbHVlU3R5bGUgPyB0aGlzLnFiSXRlbS5zdHlsZT8ubGFiZWxWYWx1ZVN0eWxlIDogXCJcIjtcclxuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUuaW5wdXRDbGFzcyA9IHRoaXMucWJJdGVtLnN0eWxlPy5pbnB1dENsYXNzID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmlucHV0Q2xhc3MgOiBcIlwiO1xyXG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZS5pbnB1dFN0eWxlID0gdGhpcy5xYkl0ZW0uc3R5bGUuaW5wdXRTdHlsZSA/IHRoaXMucWJJdGVtLnN0eWxlPy5pbnB1dFN0eWxlIDogXCJcIjtcclxuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUuYm9va1N0eWxlID0gdGhpcy5xYkl0ZW0uc3R5bGU/LmJvb2tTdHlsZSA/IHRoaXMucWJJdGVtLnN0eWxlPy5ib29rU3R5bGUgOiBcIlwiO1xyXG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZS5zaG93TGFiZWwgPSB0aGlzLnFiSXRlbS5zdHlsZT8uc2hvd0xhYmVsID8gdGhpcy5xYkl0ZW0uc3R5bGU/LnNob3dMYWJlbCA6IHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNle1xyXG4gICAgICBpZih0aGlzLnFiSXRlbSl7XHJcbiAgICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUgPSB7XHJcbiAgICAgICAgICBcImxhYmVsQ2xhc3NcIiA6IFwiXCIsXHJcbiAgICAgICAgICBcImxhYmVsU3R5bGVcIiA6IFwiXCIsXHJcbiAgICAgICAgICBcImxhYmVsVmFsdWVTdHlsZVwiIDogXCJcIixcclxuICAgICAgICAgIFwiaW5wdXRDbGFzc1wiIDogXCJcIixcclxuICAgICAgICAgIFwiaW5wdXRTdHlsZVwiIDogXCJcIixcclxuICAgICAgICAgIFwiYm9va1N0eWxlXCIgOiBcIlwiLFxyXG4gICAgICAgICAgXCJzaG93TGFiZWxcIjogdHJ1ZSxcclxuICAgICAgICAgIFwiZGlyZWN0aW9uXCIgOiBcImx0clwiLFxyXG4gICAgICAgICAgXCJxdWVzdGlvblN0eWxlXCI6IFwiXCJcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnFiSXRlbS5zdHlsZS5xdWVzdGlvblN0eWxlID0gdGhpcy5xYkl0ZW0/LnN0eWxlPy5xdWVzdGlvblN0eWxlID8gdGhpcy5xYkl0ZW0/LnN0eWxlLnF1ZXN0aW9uU3R5bGUgOiBcIlwiO1xyXG4gICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gdGhpcy5xYkl0ZW0uc3R5bGUuZGlyZWN0aW9uID0gdGhpcy5xYkl0ZW0/LnN0eWxlPy5kaXJlY3Rpb24gPyB0aGlzLnFiSXRlbT8uc3R5bGU/LmRpcmVjdGlvbiA6ICdsdHInO1xyXG4gICAgdGhpcy5ib29rU3R5bGUgPSB0aGlzLnFiSXRlbT8uc3R5bGU/LmJvb2tTdHlsZTtcclxuICAgIHRoaXMucXVlc3Rpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIHZhciBodG1sRWxlbWVudCA9IGVsZW1lbnQ/LnF1ZXN0aW9uVGV4dCA7XHJcbiAgICAgIHZhciB0ZXh0T25seSA9IGh0bWxFbGVtZW50Py5yZXBsYWNlKC88W14+XSo+L2csICcnKVxyXG4gICAgICBlbGVtZW50LnF1ZXN0aW9uVGV4dCA9IHRleHRPbmx5O1xyXG4gICAgICAvLyAgSEEgMTlERUMyMyBMb2dpYyBmb3IgUXVlc3Rpb24gU3R5bGluZyhTbGFlc2ZvcmNlKVxyXG4gICAgICAvLyBIQSAyOERFQzIzIEFkZGVkIHN0eWxpbmcgYW5kIGxvZ2ljcyB0byBsb2FkIHRoZSBib29rIHR5cGUgcXVlc3Rpb25zIFxyXG4gICAgICBpZihlbGVtZW50LnR5cGUgPT09ICdCb29rJyl7XHJcbiAgICAgICAgaWYoZWxlbWVudFsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSl7XHJcbiAgICAgICAgICB2YXIgcWIgPSBKU09OLnBhcnNlKGVsZW1lbnRbJ3FiUmVmZXJlbmNlUXVlc3Rpb25zJ10pO1xyXG4gICAgICAgICAgaWYocWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlKXtcclxuICAgICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlID0gdHlwZW9mIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKCcnK3FiWydxdWVzdGlvbmJvb2snXS5zdHlsZSkgOiBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUgPSB0aGlzLnFiSXRlbS5zdHlsZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBCb29rIHR5cGUgcXVlc3Rpb24gc3R5bGluZ1xyXG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLmxhYmVsQ2xhc3MgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmxhYmVsQ2xhc3MgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmxhYmVsQ2xhc3MgOiBcIlwiO1xyXG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLmxhYmVsU3R5bGUgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmxhYmVsU3R5bGUgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmxhYmVsU3R5bGUgOiBcIlwiO1xyXG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLmxhYmVsVmFsdWVTdHlsZSA9IHFiWydxdWVzdGlvbmJvb2snXS5TdHlsZV9fPy5sYWJlbFZhbHVlU3R5bGUgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUubGFiZWxWYWx1ZVN0eWxlIDogXCJcIjtcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5pbnB1dENsYXNzID0gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5pbnB1dENsYXNzID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5pbnB1dENsYXNzIDogXCJcIjtcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5pbnB1dFN0eWxlID0gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5pbnB1dFN0eWxlID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5pbnB1dFN0eWxlIDogXCJcIjtcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5ib29rU3R5bGUgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmJvb2tTdHlsZSA/IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8uYm9va1N0eWxlIDogXCJcIjtcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5zaG93TGFiZWwgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LnNob3dMYWJlbCA/IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8uc2hvd0xhYmVsIDogdHJ1ZTtcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5xdWVzdGlvblN0eWxlID0gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5xdWVzdGlvblN0eWxlID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5xdWVzdGlvblN0eWxlIDogXCJcIjtcclxuICAgICAgICAgIHFiWydsYW5nRGlyZWN0aW9uJ10gPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUuZGlyZWN0aW9uID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5kaXJlY3Rpb24gOiB0aGlzLmxhbmdEaXJlY3Rpb247XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIExvb3AgZm9yIGVhY2ggcXVlc3Rpb24gaW4gdGhlIGJvb2tcclxuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdWJRdWVzdGlvbnMuZm9yRWFjaChxdWVzdGlvbkZyb21Cb29rID0+IHtcclxuICAgICAgICAgICAgcXVlc3Rpb25Gcm9tQm9vay5zdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlIDogcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlO1xyXG4gICAgICAgICAgICBxdWVzdGlvbkZyb21Cb29rLnN0eWxlLmxhYmVsQ2xhc3MgPSBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbENsYXNzID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8ubGFiZWxDbGFzcyA6IFwiXCI7XHJcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUubGFiZWxTdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmxhYmVsU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbFN0eWxlIDogXCJcIjtcclxuICAgICAgICAgICAgcXVlc3Rpb25Gcm9tQm9vay5zdHlsZS5sYWJlbFZhbHVlU3R5bGUgPSBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbFZhbHVlU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbFZhbHVlU3R5bGUgOiBcIlwiO1xyXG4gICAgICAgICAgICBxdWVzdGlvbkZyb21Cb29rLnN0eWxlLmlucHV0Q2xhc3MgPSBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5pbnB1dENsYXNzID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uaW5wdXRDbGFzcyA6IFwiXCI7XHJcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUuaW5wdXRTdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmlucHV0U3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5pbnB1dFN0eWxlIDogXCJcIjtcclxuICAgICAgICAgICAgcXVlc3Rpb25Gcm9tQm9vay5zdHlsZS5ib29rU3R5bGUgPSBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5ib29rU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5ib29rU3R5bGUgOiBcIlwiO1xyXG4gICAgICAgICAgICBxdWVzdGlvbkZyb21Cb29rLnN0eWxlLnNob3dMYWJlbCA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LnNob3dMYWJlbCA/IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LnNob3dMYWJlbCA6IHRydWU7XHJcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUucXVlc3Rpb25TdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LnF1ZXN0aW9uU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5xdWVzdGlvblN0eWxlIDogXCJcIjtcclxuICAgICAgICAgICAgcXVlc3Rpb25Gcm9tQm9va1snbGFuZ0RpcmVjdGlvbiddID0gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uZGlyZWN0aW9uID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uZGlyZWN0aW9uIDogdGhpcy5sYW5nRGlyZWN0aW9uO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBlbGVtZW50WydxYkl0ZW0nXSA9IHFiWydxdWVzdGlvbmJvb2snXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxlbWVudC5zdHlsZSA9IGVsZW1lbnQuc3R5bGUgPyB0eXBlb2YgZWxlbWVudC5zdHlsZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKCcnK2VsZW1lbnQ/LnN0eWxlKSA6IGVsZW1lbnQ/LnN0eWxlIDogdGhpcy5xYkl0ZW0/LnN0eWxlO1xyXG5cclxuICAgICAgZWxlbWVudC5zdHlsZS5sYWJlbENsYXNzID0gZWxlbWVudC5zdHlsZT8ubGFiZWxDbGFzcyA/IGVsZW1lbnQuc3R5bGU/LmxhYmVsQ2xhc3MgOiBcIlwiO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLmxhYmVsU3R5bGUgPSBlbGVtZW50LnN0eWxlPy5sYWJlbFN0eWxlID8gZWxlbWVudC5zdHlsZT8ubGFiZWxTdHlsZSA6IFwiXCI7XHJcbiAgICAgIGVsZW1lbnQuc3R5bGUubGFiZWxWYWx1ZVN0eWxlID0gZWxlbWVudC5zdHlsZT8ubGFiZWxWYWx1ZVN0eWxlID8gZWxlbWVudC5zdHlsZS5sYWJlbFZhbHVlU3R5bGUgOiBcIlwiO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLmlucHV0Q2xhc3MgPSBlbGVtZW50LnN0eWxlPy5pbnB1dENsYXNzID8gZWxlbWVudC5zdHlsZT8uaW5wdXRDbGFzcyA6IFwiXCI7XHJcbiAgICAgIGVsZW1lbnQuc3R5bGUuaW5wdXRTdHlsZSA9IGVsZW1lbnQuc3R5bGUuaW5wdXRTdHlsZSA/IGVsZW1lbnQuc3R5bGU/LmlucHV0U3R5bGUgOiBcIlwiO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLmJvb2tTdHlsZSA9IGVsZW1lbnQuc3R5bGU/LmJvb2tTdHlsZSA/IGVsZW1lbnQuc3R5bGU/LmJvb2tTdHlsZSA6IFwiXCI7XHJcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2hvd0xhYmVsID0gZWxlbWVudC5zdHlsZT8uc2hvd0xhYmVsID8gZWxlbWVudC5zdHlsZT8uc2hvd0xhYmVsIDogdHJ1ZTtcclxuICAgICAgZWxlbWVudC5zdHlsZS5xdWVzdGlvblN0eWxlID0gZWxlbWVudC5zdHlsZT8ucXVlc3Rpb25TdHlsZSA/IGVsZW1lbnQuc3R5bGU/LnF1ZXN0aW9uU3R5bGUgOiBcIlwiO1xyXG5cclxuICAgICAgZWxlbWVudFsnbGFuZ0RpcmVjdGlvbiddID0gZWxlbWVudC5zdHlsZT8uZGlyZWN0aW9uID8gZWxlbWVudC5zdHlsZT8uZGlyZWN0aW9uIDogdGhpcy5sYW5nRGlyZWN0aW9uO1xyXG5cclxuXHJcbiAgICAgIC8vVkQgMDJBdWcyNCBkZXBlbmRlbnQgZmllbGQgc2hvdy9oaWRlIGNoYW5nZXNcclxuICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcclxuICAgICAgaWYoZWxlbWVudC5yZWZlcmVuY2VGaWVsZCl7XHJcbiAgICAgICAgZWxlbWVudC5kZXBlbmRlbnRSZWYgPSBlbGVtZW50LnJlZmVyZW5jZUZpZWxkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGVsZW1lbnQuc3ViVGV4dCl7XHJcbiAgICAgICAgIGxldCBkZXBlbmRlbmN5T2JqOiBEZXBlbmRlbmN5TWV0YSA9IEpTT04ucGFyc2UoZWxlbWVudC5zdWJUZXh0KTtcclxuICAgICAgICAgaWYoZGVwZW5kZW5jeU9iai5pc0RlcGVuZGVudEZpZWxkKXtcclxuICAgICAgICAgICAgZWxlbWVudC5pc0hpZGRlbiA9IHRydWU7XHJcbiAgICAgICAgIH1cclxuICAgICAgICAvLyBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2VcclxuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgLy8gVkQgMjBBdWcyNCAtIGlzRGVwZW5kZW50RmllbGQgY2hhbmdlXHJcbiAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkICYmIGRlcGVuZGVuY3lPYmouaXNEZXBlbmRlbnRGaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUudmFsdWVPYmogIT0gdW5kZWZpbmVkICYmIGNoYW5nZVZhbHVlLmZyb21RdWVzdGlvbklkID09IGRlcGVuZGVuY3lPYmouc291cmNlUXVlc3Rpb25JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC5pc0hpZGRlbkZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgaWYoZGVwZW5kZW5jeU9iai5kZXBlbmRlbnRWYWx1ZSA9PSBjaGFuZ2VWYWx1ZS52YWx1ZU9iail7XHJcbiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5kZXBlbmRlbnRSZWYgPT0gY2hhbmdlVmFsdWUucmVmZXJlbmNlRmllbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZWZlcmVuY2VGaWVsZCA9IGNoYW5nZVZhbHVlLnJlZmVyZW5jZUZpZWxkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNIaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlRGVwZW5kZW50RWxlbWVudHMoZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZGVwZW5kZW50IHNlbGVjdGlvbiByZW1vdmUgdGhlIHJlZmVyZW5jZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQuZGVwZW5kZW50UmVmID09IGNoYW5nZVZhbHVlLnJlZmVyZW5jZUZpZWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZWZlcmVuY2VGaWVsZCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnVwZGF0ZShlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBzdW5kYXkgY29tbWVudFxyXG4gICAgICAvLyBpZiAoZWxlbWVudC50eXBlID09PSAnQ2FsZW5kYXInKSB7XHJcbiAgICAgIC8vICAgdGhpcy5vcGVuQ2FsZW5kYXJDb21wb25lbnQoZWxlbWVudCk7XHJcbiAgICAgIC8vIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdWJRdWVzdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuc2V0U3ViUXVlc3Rpb25zKHRoaXMucXVlc3Rpb25zKTtcclxuICAgIHRoaXMucHJvY2Vzc1RyYW5zbGF0ZWRRdWVzdGlvbnMoKTsgXHJcbiAgfVxyXG4vLyBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2VcclxuICBoaWRlRGVwZW5kZW50RWxlbWVudHMoZWxlbWVudElkKSB7XHJcbiAgICBsZXQgZWxlbWVudHNUb0hpZGUgPSB0aGlzLnF1ZXN0aW9ucy5maWx0ZXIoZWwgPT4ge1xyXG4gICAgICAgIGlmIChlbC5zdWJUZXh0KSB7XHJcbiAgICAgICAgICAgIGxldCBkZXBPYmogPSBKU09OLnBhcnNlKGVsLnN1YlRleHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGVwT2JqLnNvdXJjZVF1ZXN0aW9uSWQgPT0gZWxlbWVudElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlbGVtZW50c1RvSGlkZS5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgICBlbC5pc0hpZGRlbiA9IHRydWU7XHJcbiAgICAgICAgZWwuaW5wdXQgPSAnJztcclxuICAgICAgICBlbC5zZWxlY3RlZFZhbHVlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UudXBkYXRlKGVsKTtcclxuICAgICAgICAvLyBSZWN1cnNpdmVseSBoaWRlIGVsZW1lbnRzIGRlcGVuZGVudCBvbiB0aGlzIG9uZVxyXG4gICAgICAgIHRoaXMuaGlkZURlcGVuZGVudEVsZW1lbnRzKGVsLmlkKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4gIGNsZWFyU1FFcnJvcihxdWVzSWQpIHtcclxuICAgIHZhciBzcUxpc3QgPSB0aGlzLnN1YlF1ZXN0aW9ucz8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkID09IHF1ZXNJZCk7XHJcbiAgICBmb3IgKHZhciBzcSBvZiBzcUxpc3QpIHtcclxuICAgICAgc3EuZXJyb3IgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuIC8vIFZEIDExSnVuMjQgLSB0cmFuc2xhdGlvbiBjaGFuZ2VzXHJcbiAgcHJvY2Vzc1RyYW5zbGF0ZWRRdWVzdGlvbnMoKXtcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZWRRdWVzdGlvbnMgJiYgdGhpcy50cmFuc2xhdGVkUXVlc3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5xdWVzdGlvbnMuZm9yRWFjaCgob3JnUXVlc3Rpb246IGFueSk9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZWRRdWVzdGlvbnMuZm9yRWFjaCgodHJhbnNRdWVzdGlvbjphbnkpID0+IHtcclxuICAgICAgICAgICAgIGlmKG9yZ1F1ZXN0aW9uLnVuaXF1ZUlkZW50aWZpZXIgPT0gdHJhbnNRdWVzdGlvbi5pZGVudGlmaWVyKXtcclxuICAgICAgICAgICAgICAgb3JnUXVlc3Rpb24ucXVlc3Rpb25UZXh0ID0gdHJhbnNRdWVzdGlvbi5sYWJlbDtcclxuICAgICAgICAgICAgICAgb3JnUXVlc3Rpb24ucXVlc3Rpb24gPSB0cmFuc1F1ZXN0aW9uLnBsYWNlSG9sZGVyO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgLy8gIGNvbnNvbGUubG9nKCdvcmlnaW5hbFF1ZXN0aW9uJyArIHRoaXMucXVlc3Rpb25zKTtcclxuICAgIC8vICBjb25zb2xlLmxvZyh0aGlzLnF1ZXN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRTdWJRdWVzdGlvbnMocmVjb3Jkcykge1xyXG4gICAgdGhpcy5zdWJRdWVzdGlvbnMucHVzaChyZWNvcmRzKTtcclxuICB9XHJcblxyXG4gIC8vIENhcHR1cmUgYW5kIFByb2Nlc3MgQ2hpbGQgRXZlbnRcclxuICBjaGlsZEV2ZW50Q2FwdHVyZShldmVudCwgcXVlcz86YW55KSB7XHJcbiAgICBsZXQgZHJvcGRvd25EYXRhID0gIHt9O1xyXG4gICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLmFubm91bmNlQ2hhbmdlKGV2ZW50KTtcclxuICAgIGlmKHF1ZXMpe1xyXG4gICAgICBpZihxdWVzLnR5cGUgPT0gJ0Ryb3Bkb3duJyB8fHF1ZXMudHlwZSA9PSAnUmFkaW8nICkge1xyXG4gICAgICAgIC8vIEhBIDE5SkFOMjQgQ29ycmVjdGlvbiBvZiBkcm9wZG93biB2YWx1ZXNcclxuICAgICAgICBxdWVzLnNlbGVjdGVkT2JqID0gZXZlbnQudmFsdWVPYmogPyBldmVudC52YWx1ZU9iaiA6IG51bGw7XHJcbiAgICAgICAgcXVlcy5pbnB1dCA9IGV2ZW50LnNlbGVjdGVkT2JqID8gZXZlbnQuc2VsZWN0ZWRPYmogOiBldmVudC52YWx1ZU9iajtcclxuICAgICAgICBxdWVzLnNlbGVjdGVkVmFsdWUgPSBldmVudC52YWx1ZU9iaiA/IGV2ZW50LnZhbHVlT2JqIDogbnVsbDtcclxuICAgICAgICAvLyBlbWl0IHRoZSBkcm9wZG93biBkYXRhIHRvIHBhcmVudFxyXG4gICAgICAgIGRyb3Bkb3duRGF0YVsnZXZlbnQnXSA9IGV2ZW50LnZhbHVlT2JqO1xyXG4gICAgICAgIGRyb3Bkb3duRGF0YVsncXVlcyddID0gcXVlcztcclxuICAgICAgICBpZihkcm9wZG93bkRhdGFbJ2V2ZW50J10pe1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wRG93bi5lbWl0KGRyb3Bkb3duRGF0YSk7XHJcbiAgICAgICAgfSAgLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcclxuICAgICAgfSBlbHNlIGlmKHF1ZXMudHlwZSA9PSAnTG9jYXRpb24nKXtcclxuICAgICAgICBxdWVzLmlucHV0ID0gZXZlbnQudmFsdWVPYmo7XHJcbiAgICAgICAgcXVlcy5zZWxlY3RlZFZhbHVlID0gZXZlbnQudmFsdWVPYmouYWRkcmVzcztcclxuICAgICAgfWVsc2UgaWYocXVlcy50eXBlID09ICdGaWxlJyl7IFxyXG4gICAgICAgIHF1ZXMuaW5wdXQgPSB0aGlzLnNlbGVjdGVkRmlsZURhdGEgPSBldmVudDtcclxuICAgICAgfWVsc2UgaWYocXVlcy50eXBlID09ICdEYXRlJyB8fCBxdWVzLnR5cGUgPT0gJ0RhdGVUaW1lJyl7IC8vIEhBIDI0SkFOMjQgQ29udmVydGluZyBEYXRlIGFuZCBEYXRlVGltZSB0byBVVENcclxuICAgICAgICAgaWYoZXZlbnQudmFsdWUpe1xyXG4gICAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XHJcbiAgICAgICAgICBsZXQgdXRjU3RyaW5nID0gZD8udG9JU09TdHJpbmcoKTtcclxuICAgICAgICAgIHF1ZXMuaW5wdXQgPSB1dGNTdHJpbmc7XHJcbiAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgIHF1ZXMuaW5wdXQgPSAnJztcclxuICAgICAgICAgfVxyXG4gICAgICB9ZWxzZSBpZihxdWVzLnR5cGUgPT0gJ0xpc3QnKXtcclxuICAgICAgICAvLyBWRCAyMEF1ZzI0IGhhbmRsaW5nIHRoZSBsaXN0IHR5cGUgIGhhbmRsZSBtdWx0aXBsZSBvYmplY3QgdmFsdWVzXHJcbiAgICAgICAgcXVlcy5pbnB1dCA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoZXZlbnQudmFsdWVPYmosZXZlbnQuZmllbGQpO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBxdWVzLmlucHV0ID0gZXZlbnQ7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdmFsaWRhdGluZyAgIGVycm9yIG1lc3NhZ2VcclxuICAgICAgY29uc3QgaGFzRXJyb3IgPSBxdWVzLmVycm9yTWVzc2FnZSAmJiAoKHF1ZXMudHlwZSA9PT0gJ0ZpbGUnICYmIHF1ZXMuaW5wdXQubGVuZ3RoID09IDApIHx8IChxdWVzLnR5cGUgIT0gJ0ZpbGUnICYmICFxdWVzLmlucHV0KSk7XHJcbiAgICAgIHF1ZXMuZXJyb3IgPSBoYXNFcnJvciA/IG5ldyBFcnJvcldyYXBwZXIoKSA6IG51bGw7XHJcbiAgICAgIC8vIE9uY2UgdGhlIHJpZ2h0IHZhbHVlIGlzIHN0b3JlZCBpbiBxdWVzLmlucHV0IHN0b3JlIHRoZSBxdWVzICh3aXRoIGlucHV0KSBpbiBzdG9yYWdlU2VydmljZVxyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnVwZGF0ZShxdWVzKTtcclxuICAgICAgLy8gVkQgMTlKdWwwMSAtIGdldCB1cGRhdGVkIHF1ZXN0aW9uXHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlc3Rpb24uZW1pdChxdWVzKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGVsZXRlRmlsZShmaWxlRGF0YTphbnkpe1xyXG4gICAgY29uc29sZS5sb2coJ2ZpbGVEQVRBJyxmaWxlRGF0YSlcclxuICB9XHJcbiAgZ2V0RHJvcERvd24oZXZlbnQ6YW55KXtcclxuICAgIHRoaXMuaGFkbGVEcm9wRG93bkRlcGVuZGVudC5lbWl0KGV2ZW50KTtcclxuICB9XHJcbi8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xyXG4gIGdldEN1cnJlbnRDYWxlbmRhcihldmVudDphbnkpe1xyXG4gICAgdGhpcy5oYW5kbGVDYWxlbmRhckRhdGUuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXRDYWxlbmRhckV2ZW50KGV2ZW50OmFueSl7XHJcbiAgICBpZihldmVudCl7XHJcbiAgICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gLy8gVkQgMDZTZXAyNCByZW1vdmUgdGhlIHNwZWNpYWwgY2hhcmVjdGVycyBhbmQgdGFncyBcclxuICAvLyBmcm9tIHRoZSBxdWVzdGlvblRleHRcclxuICByZW1vdmVDaGFyYWN0ZXJzKHF1ZXN0aW9uVGV4dDpzdHJpbmcpe1xyXG4gICAgIGxldCB1cGRhdGVkVGV4dCA9IHF1ZXN0aW9uVGV4dD8ucmVwbGFjZSgvPFtePl0qPi9nLCAnJyk7XHJcbiAgICAgcmV0dXJuIHVwZGF0ZWRUZXh0O1xyXG4gIH1cclxuXHJcbi8vIHN1bmRheSBjb21tZW50XHJcbiAgLy8gb3BlbkNhbGVuZGFyQ29tcG9uZW50KHF1ZXMpIHtcclxuICAvLyAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLmR5bmFtaWNIb3N0LnZpZXdDb250YWluZXJSZWY7XHJcbiAgLy8gICBpZih2aWV3Q29udGFpbmVyUmVmKXtcclxuICAvLyAgICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG4gIC8vICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChDdXN0b21DYWxlbmRhckNvbXBvbmVudCk7XHJcbiAgLy8gICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5xdWVzdGlvbiA9IHF1ZXM7XHJcbiAgLy8gICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kYXRlU2VsZWN0ZWQuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLmdldEN1cnJlbnRDYWxlbmRhcihldmVudCkpO1xyXG4gIC8vICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuZXZlbnRTZWxlY3RlZC5zdWJzY3JpYmUoKGV2ZW50OmFueSkgPT4gdGhpcy5nZXRDYWxlbmRhckV2ZW50KGV2ZW50KSlcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGlzQ2FsZW5kYXJNb2RhbE9wZW4gPSBmYWxzZTtcclxuICBjYWxlbmRhck1vZGFsVGl0bGU6YW55O1xyXG4gIGNhbGVuZGFyTW9kYWxTaXplOmFueTtcclxuICBjYWxlbmRhclNhdmVCdXR0b25WYWx1ZTogYW55O1xyXG4gIHJlZmVyZW5jZVF1ZXN0aW9ucyA9IFtdO1xyXG4gIHFiUmVmcmVuY2VCb29rOmFueTtcclxuICBtb2RhbENhbGVuZGFyTW9kYWxGb290ZXI6YW55O1xyXG5cclxuICBvcGVuQ2FsZW5kYXJNb2RhbChldmVudCkge1xyXG4gICAgdGhpcy5pc0NhbGVuZGFyTW9kYWxPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMucWJSZWZyZW5jZUJvb2sgPSBldmVudC5xYlJlZnJlbmNlQm9vaztcclxuICAgIHRoaXMucmVmZXJlbmNlUXVlc3Rpb25zID0gZXZlbnQucmVmZXJlbmNlUXVlc3Rpb25zO1xyXG4gICAgdGhpcy5jYWxlbmRhck1vZGFsVGl0bGUgPSBldmVudC5tb2RhbFRpdGxlO1xyXG4gICAgdGhpcy5jYWxlbmRhck1vZGFsU2l6ZSA9IGV2ZW50Lm1vZGFsU2l6ZTtcclxuICAgIHRoaXMuY2FsZW5kYXJTYXZlQnV0dG9uVmFsdWUgPSBldmVudC5zYXZlQnV0dG9uVmFsdWU7XHJcbiAgICB0aGlzLm1vZGFsQ2FsZW5kYXJNb2RhbEZvb3RlciA9IGV2ZW50Lm1vZGFsRm9vdGVyO1xyXG4gIH1cclxuXHJcblxyXG4gIG9uQ2FsZW5kYXJNb2RhbFNhdmUoKXtcclxuICAgIHRoaXMuY2hhbmdlU2VydmljZS5kYXRhQ2hhbmdlcygnY2FsZW5kYXItbW9kYWwtc2F2ZScpO1xyXG4gIH1cclxuXHJcblxyXG4gIGhhbmRsZVF1ZXN0aW9uRXZlbnQoZXZlbnQpe1xyXG4gICAgY29uc29sZS5sb2coJ2hhbmRsZSBxdWVzdGlvbiBoZXJlJyk7XHJcbiAgfVxyXG4gXHJcbiAgY2xvc2VDYWxlbmRhck1vZGFsKGV2ZW50KXtcclxuICAgIHRoaXMuaXNDYWxlbmRhck1vZGFsT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPCEtLSBIQSAyMERFQzIzIEJvb2sgU3R5bGUgZnJvbSBzYWxlc2ZvcmNlIC0tPlxyXG48IS0tIEhBIDI4REVDMjMgIFJlbW92ZWQgSXNTaGVuZ2VsKHJlbW92YWwgb2Ygc2hlbmdlbCB2YWx1ZXMgYXBwbGllcyBmb3IgdGhpcyByZWFzb24pIGFuZCBkaXJlY3Qgc3R5bGluZyBvZiBib29rcyB0byBhdm9pZCBzdHlsaW5nIGlzc3Vlcy0tPlxyXG48IS0tIEhBIDE4SkFOMjQgIEFkZGVkIGNsYXNzIGZvciBzdHlsaW5nIC0tPlxyXG48ZGl2IFtzdHlsZV09XCJib29rU3R5bGVcIiBjbGFzcz1cImNvbnRlbnQtYm94IGZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gSEEgMjBERUMyMyBEaXJlY3RpdmUgYW5kIFF1ZXN0aW9uIFN0eWxlIGZyb20gc2FsZXNmb3JjZSAtLT5cclxuICAgICAgICA8IS0tIFJBMDlERUMyNCBDaGFuZ2VkIGtleXMtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIFtjbGFzc109XCInY29sLWxnLScgKyBxdWVzLnNpemUgKyAnIHBhZGRpbmdub25lJ1wiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBxdWVzIG9mIHF1ZXN0aW9ucztsZXQgaSA9IGluZGV4XCIgW2lkXT1cInF1ZXMuaWRcIiBbZGlyXT1cInF1ZXMubGFuZ0RpcmVjdGlvblwiIFtzdHlsZV09XCJxdWVzPy5zdHlsZT8ucXVlc3Rpb25TdHlsZVwiPlxyXG4gICAgICAgICAgICA8IS0tIFN1YiBRdWVzdGlvbiBMYWJlbCAtLT5cclxuICAgICAgICAgICAgPCEtLSBIQSAyMERFQzIzIExhYmVsIFN0eWxlIGZyb20gc2FsZXNmb3JjZSAtLT5cclxuICAgICAgICAgICAgPCEtLSBWRCAwOU1heTI0IGlzIGhpZGUgZmllbGQgY2hhbmdlLS0+XHJcbiAgICAgICAgIDxkaXYgKm5nSWY9XCIhcXVlcy5pc0hpZGRlblwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnRGF0ZVRpbWUnXCI+XHJcbiBcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gVkQgMjBKVU4yNCAtIGhlbHAgdGV4dCBjaGFuZ2VzLS0+XHJcbiAgICAgICAgICAgIDwhLS0gVkQgMDFBdWcyNCAtIHZhbGlkYXRpb24gY2hhbmdlLS0+XHJcbiAgICAgICAgICAgIDwhLS0gLy8gVkQgMDJBdWcyNCAtIGxhYmVsIHZhbHVlIHN0eWxlLS0+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyBkb3duMjogcWJJdGVtPy5wcm9ncmVzc0JhciB9XCIgKm5nSWY9XCJxdWVzLnN0eWxlPy5zaG93TGFiZWwgPyBxdWVzLnN0eWxlPy5zaG93TGFiZWwgOiB0cnVlXCIgW3N0eWxlXT1cInF1ZXMuc3R5bGU/LmxhYmVsU3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCInZGlzLWZsZXggc2hlbmdlbC1teXQtZm9udDMgbXl0LWZvbnQ3ICdcIiBbc3R5bGVdPVwicXVlcy5zdHlsZT8ubGFiZWxWYWx1ZVN0eWxlXCI+e3sgcmVtb3ZlQ2hhcmFjdGVycyhxdWVzPy5xdWVzdGlvblRleHQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJxdWVzLmlzT3B0aW9uYWxcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+KjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnF1ZXN0aW9uVGV4dCAmJiBxdWVzPy5oZWxwVGV4dFwiIGNsYXNzPVwiaWNvblwiIFttYXRUb29sdGlwXT1cInF1ZXM/LmhlbHBUZXh0XCI+aTwvZGl2Pjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZS0tPlxyXG4gICAgICAgICAgICA8IS0tIERhdGVUaW1lIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnRGF0ZVRpbWUnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1kYXRlLXBpY2tlciBbbWluRGF0ZV09XCJxdWVzLm1pbkRhdGVcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgW2RhdGVdPVwicXVlcy5pbnB1dFwiIChkYXRlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgIDwhLS0gRGF0ZS0tPlxyXG4gICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1kYXRlICBbZGF0ZV09XCJxdWVzLmlucHV0XCIgW2Vycm9yXT1cInF1ZXMuZXJyb3JcIiBbZXJyb3JNZXNzYWdlXT1cInF1ZXMuZXJyb3JNZXNzYWdlXCIgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiIChkYXRlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1kYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuIFxyXG4gICAgICAgICAgICAgPCEtLSBUaW1lLS0+XHJcbiAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnVGltZSdcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLXRpbWUgIFt0aW1lXT1cInF1ZXMuaW5wdXRcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgKHRpbWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLXRpbWU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwhLS0gY2FsZW5kYXIgIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnQ2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1jYWxlbmRhclxyXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cInF1ZXNcIlxyXG4gICAgICAgICAgICAgICAgKGV2ZW50U2VsZWN0ZWQpPVwiZ2V0Q2FsZW5kYXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0ZWQpPVwiZ2V0Q3VycmVudENhbGVuZGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKG9wZW5Nb2RhbCk9XCJvcGVuQ2FsZW5kYXJNb2RhbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChjbG9zZU1vZGFsKT1cImNsb3NlQ2FsZW5kYXJNb2RhbCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID48L2FwcC1jdXN0b20tY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIG1vZGVsIHVzZWQgaW4gY2FsZW5kYXIgY29tcG9uZW50IC0tPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tbW9kZWwgKm5nSWY9XCJpc0NhbGVuZGFyTW9kYWxPcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbbW9kYWxUaXRsZV09XCJjYWxlbmRhck1vZGFsVGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc01vZGFsT3Blbl09XCJpc0NhbGVuZGFyTW9kYWxPcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBbbW9kYWxTaXplXT1cImNhbGVuZGFyTW9kYWxTaXplXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2F2ZUJ1dHRvblZhbHVlXT1cImNhbGVuZGFyU2F2ZUJ1dHRvblZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbW9kYWxGb290ZXJdPVwibW9kYWxDYWxlbmRhck1vZGFsRm9vdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAoc2F2ZUJ1dHRvbkVtaXQpPVwib25DYWxlbmRhck1vZGFsU2F2ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2FuY2VsQnV0dG9uRW1pdCk9XCJjbG9zZUNhbGVuZGFyTW9kYWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uYm9vayAgW3FiSXRlbV09XCJxYlJlZnJlbmNlQm9va1wiIFtxdWVzdGlvbnNdPVwicmVmZXJlbmNlUXVlc3Rpb25zXCIgKGhhbmRsZVF1ZXN0aW9uKT1cImhhbmRsZVF1ZXN0aW9uRXZlbnQoJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1tb2RlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0gVGV4dCAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ1RleHQnIHx8IHF1ZXMudHlwZSA9PT0gJ0xpbmsnXCIgPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInF1ZXMuaW5wdXRcIiBbbmdDbGFzc1ZhbHVlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpcy1mbGV4IGR0LWxpbmUgZGF0ZS1saW5lIGJvb2tUZXh0IGJveG91dGxpbmUgbXl0LWZvbnQxJzogcWJJdGVtLnByb2dyZXNzQmFyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Qm94OiAhcWJJdGVtLnByb2dyZXNzQmFyXHJcbiAgICAgICAgICAgICAgICAgICAgfVwiIFtxdWVzdGlvbl09XCJxdWVzXCIgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiIFtpZFZhbHVlXT1cInF1ZXMudHJhY2tpbmdJZFwiIFtmb2N1c0V2ZW50XT1cImNsZWFyU1FFcnJvcihxdWVzLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cInF1ZXMuZXJyb3JcIiBbcGxhY2Vob2xkZXJdPVwicXVlcy5xdWVzdGlvblwiIChpbnB1dFZhbHVlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1pbnB1dD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgPCEtLSBmb3IgcGljayBsb2NhdGlvbiAtLT5cclxuICAgICAgICAgICAgPCEtLSAgIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnTG9jYXRpb24nXCI+XHJcbiAgICAgICAgICAgIDwhLS0gSEExMDAxMjAyNCBBZGRlZCBBcGkga2V5IGFzIGlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1waWNrLWxvY2F0aW9uIFthcGlLZXldPVwicWJJdGVtWydhcGlLZXknXVwiIFthZGRyZXNzXT1cInF1ZXMuc2VsZWN0ZWRWYWx1ZVwiIFtxdWVzdGlvbl09XCJxdWVzXCIgKGxvY2F0aW9uU2VsZWN0ZWQpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtcGljay1sb2NhdGlvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgPCEtLSBmb3IgIHRleHQgYXJlYSAgIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnVGV4dEFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS10ZXh0LWFyZWEgW3F1ZXN0aW9uXT1cInF1ZXNcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgW3ZhbHVlXT1cInF1ZXMuaW5wdXRcIiBbcm93c109XCIzXCIgW2Vycm9yXT1cInF1ZXMuZXJyb3JcIiBbcGxhY2Vob2xkZXJdPVwicXVlcy5xdWVzdGlvbiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICh0ZXh0YXJlYVZhbHVlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj48L2FwcC1jdXN0b20tdGV4dC1hcmVhPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuIFxyXG4gICAgICAgICAgICA8IS0tIEVtYWlsIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnRW1haWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgcmVhZE9ubHk9XCJxdWVzLmlzUmVhZE9ubHlcIiBbKG5nTW9kZWwpXT1cInF1ZXMuaW5wdXRcIiBbaWRdPVwicXVlcy5pZFwiIHJlcXVpcmVkPVwiXCIgKGZvY3VzKT1cImNsZWFyU1FFcnJvcihxdWVzLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyLWNvbG9yPVwie3sgcXVlcy5lcnJvciA/ICdyZWQnIDogJycgfX1cIiBwbGFjZWhvbGRlcj1cInt7IHF1ZXMucXVlc3Rpb24gfX1cIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuIFxyXG4gICAgICAgICAgICA8IS0tIFRhYmxlIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnVGFibGUnXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLXRhYmxlIFtxdWVzdGlvbl09XCJxdWVzXCIgW2FwaU1ldGFdPVwicXVlcy5zdWJUZXh0XCIgKHZhbHVlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcyk7IGNsZWFyU1FFcnJvcihxdWVzLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLXRhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuIFxyXG4gICAgICAgICAgICAgIDwhLS0gVGFibGUgQXBwZW5kaXggLS0+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ1RhYmxlQXBwZW5kaXgnXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtdGFibGUtYXBwZW5kaXggW3F1ZXN0aW9uXT1cInF1ZXNcIiAodmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKTsgY2xlYXJTUUVycm9yKHF1ZXMuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC10YWJsZS1hcHBlbmRpeD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8IS0tIGxpc3QgLS0+XHJcbiAgICAgICAgICAgICA8IS0tIFZEIDIwQXVnMjQgdXNlZCBjb3JyZWN0IGF0dHJpYnV0ZSAtLT5cclxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdMaXN0J1wiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8bGliLXNlYXJjaC1ib3ggW3F1ZXN0aW9uXT1cInF1ZXNcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgW2FwaU1ldGFdPVwicXVlcy5zdWJUZXh0XCIgW2lkXT1cInF1ZXMuaWRcIiBbcGxhY2VIb2xkZXJUZXh0XT1cInF1ZXMucXVlc3Rpb25cIiAgW2ZpbHRlck5hbWVdPVwicXVlcy5pbnB1dFwiIChzZWFyY2hWYWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2xpYi1zZWFyY2gtYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuIFxyXG4gICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICA8IS0tIEhBIDA5RkVCMjQgQWRkZWQgY29uZGl0aW9uIG9mIHNxT3B0aW9uIHRvIHRoZSBkcm9wZG93biAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXM/LnR5cGUgPT09ICdEcm9wZG93bicgJiYgcXVlcz8ub3B0aW9uc1wiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEhBIDIwREVDMjMgRm9yIFRyYW5zbGF0aW9uIC0tPiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tZHJvcGRvd24gW29wdGlvbnNdPVwicXVlcy5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICBbdG9rZW5dPVwidG9rZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcGlNZXRhXT1cInF1ZXMuc3ViVGV4dFwiIFtpZF09XCJxdWVzLmlkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZV09XCJxdWVzLnNlbGVjdGVkVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiLS0te3snc2VsZWN0JyB8IGkxOG46aTE4blNlcnZpY2UuY3VycmVudExhbmd1YWdlfX0tLS1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlZmVyZW5jZUZpZWxkXT1cInF1ZXMucmVmZXJlbmNlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJxdWVzLmlzUmVhZE9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKTsgY2xlYXJTUUVycm9yKHF1ZXMuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZWNrIFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwicXVlcz8uaW5wdXQ/Lmxlbmd0aCA+IDBcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIC8vIFZEIDAyQXVnMjQgY3VzdG9tLXJhZGlvIGNvbXBvbmVudCAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ1JhZGlvJyAmJiBxdWVzPy5vcHRpb25zXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLXJhZGlvIFtvcHRpb25zXT1cInF1ZXMub3B0aW9uc1wiIFt0b2tlbl09XCJ0b2tlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FwaU1ldGFdPVwicXVlcy5zdWJUZXh0XCIgW2lkXT1cInF1ZXMuaWRcIiBbc2VsZWN0ZWRWYWx1ZV09XCJxdWVzLnNlbGVjdGVkVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlZmVyZW5jZUZpZWxkXT1cInF1ZXMucmVmZXJlbmNlRmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJxdWVzLmlzUmVhZE9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpOyBjbGVhclNRRXJyb3IocXVlcy5pZClcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1yYWRpbz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiBcclxuICAgICAgICAgICAgPCEtLSBBdHRhY2htZW50IC8gRmlsZXMgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdGaWxlJ1wiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWZpbGUtdXBsb2FkIFtsaW1pdEZpbGVVcGxvYWRpbmddPVwiNVwiIFtlcnJvcl09XCJxdWVzLmVycm9yXCIgW3F1ZXN0aW9uXT1cInF1ZXNcIiBbYWxsRmlsZXNdPVwicXVlcy5pbnB1dFwiIFt0YWJsZUZpbGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkRmlsZURhdGEpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKVwiIChkZWxldGVkRmlsZURhdGEpPVwiZGVsZXRlRmlsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpc0RlbGV0ZUZpbGVCdXR0b25WaXNpYmxlXT1cInRydWVcIj48L2FwcC1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdQb3BVcE1lc3NhZ2UnXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtZGVwZW5kZW50LXRhYmxlIFthbGVydE1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWRlcGVuZGVudC10YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdMYWJlbCdcIiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tbGFiZWwgW2xhYmVsU3R5bGVdPVwicXVlcy50aXRsZVwiIFtsYWJlbFZhbHVlXT1cInF1ZXMucXVlc3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8IS0tIC8vIFZEIDAyQXVnMjQgaW1hZ2UgY29tcG9uZW50IC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnSW1hZ2UnXCIgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLWltYWdlIFtxdWVzdGlvbl09XCJxdWVzXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20taW1hZ2U+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIDA4Tk9WMjMgLSBidXR0b24gdHlwZSBxdWVzdGlvbiBhZGRlZCAtLT5cclxuICAgICAgICAgICAgIDwhLS0gQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnQnV0dG9uJ1wiIGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1idXR0b24gW2hlaWdodF09XCInNTBweCdcIlxyXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIicxNTBweCdcIlxyXG4gICAgICAgICAgICAgICAgW2J1dHRvblRleHRdPVwicXVlcz8ucXVlc3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInF1ZXM/LnF1ZXN0aW9uXCJcclxuICAgICAgICAgICAgICAgIChidXR0b25WYWx1ZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIEhBIDIwREVDMjMgIFRoaXMgaXMgdG8gbG9hZCBib29rIHR5cGUgcXVlc3Rpb25zLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdCb29rJ1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgLS0+XHJcbiAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uYm9vayBbcWJJdGVtXT1cInF1ZXMucWJJdGVtXCIgW2xhYmVsVmFsdWVdPVwibGFiZWxWYWx1ZVwiIFtxdWVzdGlvbnNdPVwicXVlcy5xYkl0ZW0/LnN1YlF1ZXN0aW9uc1wiICAoaGFuZGxlRHJvcERvd24pPVwiZ2V0RHJvcERvd24oJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPCEtLSAwNi0wOS0yNCBmb3IgY2FsZW5kYXIgdHlwZS0tPlxyXG48IS0tIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ29tcG9uZW50SG9zdD48L25nLXRlbXBsYXRlPiAtLT4iXX0=
1
+ import { Component, Input, Output, EventEmitter, Inject } from '@angular/core';
2
+ import { ErrorWrapper } from '../../model/errorWrapper';
3
+ import { DOCUMENT } from '@angular/common';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/salesforce.service";
7
+ import * as i2 from "../../services/data.service";
8
+ import * as i3 from "../../services/change.service";
9
+ import * as i4 from "../../services/storage.service";
10
+ import * as i5 from "../../i18n.service";
11
+ import * as i6 from "@angular/common";
12
+ import * as i7 from "@angular/forms";
13
+ import * as i8 from "@angular/material/tooltip";
14
+ import * as i9 from "@angular/cdk/bidi";
15
+ import * as i10 from "../../components/pick-location/pick-location.component";
16
+ import * as i11 from "../../components/custom-input/custom-input.component";
17
+ import * as i12 from "../../components/custom-text-area/custom-text-area.component";
18
+ import * as i13 from "../../components/custom-table/custom-table.component";
19
+ import * as i14 from "../../components/custom-calendar/custom-calendar.component";
20
+ import * as i15 from "../../components/custom-date-picker/custom-date-picker.component";
21
+ import * as i16 from "../../components/custom-dropdown/custom-dropdown.component";
22
+ import * as i17 from "../../components/search-box/search-box.component";
23
+ import * as i18 from "../../components/file-upload/file-upload.component";
24
+ import * as i19 from "../../components/dependent-table/dependent-table.component";
25
+ import * as i20 from "../../components/custom-label/custom-label.component";
26
+ import * as i21 from "../../components/table-appendix/table-appendix.component";
27
+ import * as i22 from "../../components/custom-date/custom-date.component";
28
+ import * as i23 from "../../components/custom-time/custom-time.component";
29
+ import * as i24 from "../../components/custom-button/custom-button.component";
30
+ import * as i25 from "../../components/custom-model/custom-model.component";
31
+ import * as i26 from "../../components/custom-image/custom-image.component";
32
+ import * as i27 from "../../components/custom-radio/custom-radio.component";
33
+ import * as i28 from "../../i18n.pipe";
34
+ export class QuestionbookComponent {
35
+ sfService;
36
+ dataService;
37
+ changeService;
38
+ storageService;
39
+ i18nService;
40
+ cdr;
41
+ document;
42
+ qbItem;
43
+ questionItem;
44
+ translatedQuestions = []; // VD 11Jun24 - translation changes
45
+ questions;
46
+ errorFieldId;
47
+ labelValue;
48
+ token; // VD 19JAN24 - getting token as input
49
+ handleDropDown = new EventEmitter();
50
+ handleQuestion = new EventEmitter(); // VD 19Jul01 - get updated question
51
+ dropDownData;
52
+ //@ViewChild(ComponenthostDirective, { static: true }) dynamicHost: ComponenthostDirective;
53
+ subQuestions;
54
+ selectedFileData = [];
55
+ loadComponent$ = new BehaviorSubject(false);
56
+ // HA 28DEC23 Added styling and logics to load the book type questions
57
+ qbRef;
58
+ // HA 19DEC23 Declaration for Salesforce Styling
59
+ style;
60
+ langDirection = 'ltr';
61
+ bookStyle;
62
+ subscription;
63
+ hadleDropDownDependent = new EventEmitter();
64
+ // VD 06Sep24 calendar changes
65
+ handleCalendarDate = new EventEmitter();
66
+ handleCalendarEvent = new EventEmitter();
67
+ bookQuestionsMap = new Map();
68
+ constructor(sfService, dataService, changeService, storageService, i18nService, cdr, document) {
69
+ this.sfService = sfService;
70
+ this.dataService = dataService;
71
+ this.changeService = changeService;
72
+ this.storageService = storageService;
73
+ this.i18nService = i18nService;
74
+ this.cdr = cdr;
75
+ this.document = document;
76
+ }
77
+ ngOnInit() {
78
+ // VD 13Sep24 changes
79
+ this.processData();
80
+ // VD sep1324 changes - process data when databind value change
81
+ this.subscription = this.changeService.customChange$.subscribe((changeValue) => {
82
+ if (changeValue == 'dataBind') {
83
+ this.processData();
84
+ }
85
+ });
86
+ }
87
+ // VD 13Sep24 changes
88
+ // RS 09DEC24 Changed keys
89
+ processData() {
90
+ // HA 19DEC23 Logic for Question Book Styling(Slaesforce)
91
+ // HA 09FEB24 Added ternary
92
+ if (this.qbItem?.style) {
93
+ // HA 28DEC23 Added styling and logics to load the book type questions
94
+ this.qbItem.style = typeof this.qbItem.style === 'string' ? JSON.parse('' + this.qbItem?.style) : this.qbItem.style;
95
+ this.qbItem.style.labelClass = this.qbItem.style?.labelClass ? this.qbItem.style?.labelClass : "";
96
+ this.qbItem.style.labelStyle = this.qbItem.style?.labelStyle ? this.qbItem.style?.labelStyle : "";
97
+ this.qbItem.style.labelValueStyle = this.qbItem.style?.labelValueStyle ? this.qbItem.style?.labelValueStyle : "";
98
+ this.qbItem.style.inputClass = this.qbItem.style?.inputClass ? this.qbItem.style?.inputClass : "";
99
+ this.qbItem.style.inputStyle = this.qbItem.style.inputStyle ? this.qbItem.style?.inputStyle : "";
100
+ this.qbItem.style.bookStyle = this.qbItem.style?.bookStyle ? this.qbItem.style?.bookStyle : "";
101
+ this.qbItem.style.showLabel = this.qbItem.style?.showLabel ? this.qbItem.style?.showLabel : true;
102
+ }
103
+ else {
104
+ if (this.qbItem) {
105
+ this.qbItem.style = {
106
+ "labelClass": "",
107
+ "labelStyle": "",
108
+ "labelValueStyle": "",
109
+ "inputClass": "",
110
+ "inputStyle": "",
111
+ "bookStyle": "",
112
+ "showLabel": true,
113
+ "direction": "ltr",
114
+ "questionStyle": ""
115
+ };
116
+ }
117
+ }
118
+ this.qbItem.style.questionStyle = this.qbItem?.style?.questionStyle ? this.qbItem?.style.questionStyle : "";
119
+ this.langDirection = this.qbItem.style.direction = this.qbItem?.style?.direction ? this.qbItem?.style?.direction : 'ltr';
120
+ this.bookStyle = this.qbItem?.style?.bookStyle;
121
+ this.questions.forEach(element => {
122
+ var htmlElement = element?.questionText;
123
+ var textOnly = htmlElement?.replace(/<[^>]*>/g, '');
124
+ element.questionText = textOnly;
125
+ // HA 19DEC23 Logic for Question Styling(Slaesforce)
126
+ // HA 28DEC23 Added styling and logics to load the book type questions
127
+ if (element.type === 'Book') {
128
+ if (element['qbReferenceQuestions']) {
129
+ var qb = JSON.parse(element['qbReferenceQuestions']);
130
+ if (qb['questionbook'].style) {
131
+ qb['questionbook'].style = typeof qb['questionbook'].style === 'string' ? JSON.parse('' + qb['questionbook'].style) : qb['questionbook'].style;
132
+ }
133
+ else {
134
+ qb['questionbook'].style = this.qbItem.style;
135
+ }
136
+ // Book type question styling
137
+ qb['questionbook'].style.labelClass = qb['questionbook'].style?.labelClass ? qb['questionbook'].style?.labelClass : "";
138
+ qb['questionbook'].style.labelStyle = qb['questionbook'].style?.labelStyle ? qb['questionbook'].style?.labelStyle : "";
139
+ qb['questionbook'].style.labelValueStyle = qb['questionbook'].Style__?.labelValueStyle ? qb['questionbook'].style.labelValueStyle : "";
140
+ qb['questionbook'].style.inputClass = qb['questionbook'].style?.inputClass ? qb['questionbook'].style?.inputClass : "";
141
+ qb['questionbook'].style.inputStyle = qb['questionbook'].style?.inputStyle ? qb['questionbook'].style?.inputStyle : "";
142
+ qb['questionbook'].style.bookStyle = qb['questionbook'].style?.bookStyle ? qb['questionbook'].style?.bookStyle : "";
143
+ qb['questionbook'].style.showLabel = qb['questionbook'].style?.showLabel ? qb['questionbook'].style?.showLabel : true;
144
+ qb['questionbook'].style.questionStyle = qb['questionbook'].style?.questionStyle ? qb['questionbook'].style?.questionStyle : "";
145
+ qb['langDirection'] = qb['questionbook'].style.direction ? qb['questionbook'].style?.direction : this.langDirection;
146
+ // Loop for each question in the book
147
+ qb['questionbook'].subQuestions.forEach(questionFromBook => {
148
+ questionFromBook.style = questionFromBook.style ? questionFromBook.style : qb['questionbook'].style;
149
+ questionFromBook.style.labelClass = questionFromBook.style?.labelClass ? questionFromBook.style?.labelClass : "";
150
+ questionFromBook.style.labelStyle = questionFromBook.style?.labelStyle ? questionFromBook.style?.labelStyle : "";
151
+ questionFromBook.style.labelValueStyle = questionFromBook.style?.labelValueStyle ? questionFromBook.style?.labelValueStyle : "";
152
+ questionFromBook.style.inputClass = questionFromBook.style?.inputClass ? questionFromBook.style?.inputClass : "";
153
+ questionFromBook.style.inputStyle = questionFromBook.style?.inputStyle ? questionFromBook.style?.inputStyle : "";
154
+ questionFromBook.style.bookStyle = questionFromBook.style?.bookStyle ? questionFromBook.style?.bookStyle : "";
155
+ questionFromBook.style.showLabel = questionFromBook.style?.showLabel ? questionFromBook.style?.showLabel : true;
156
+ questionFromBook.style.questionStyle = questionFromBook.style?.questionStyle ? questionFromBook.style?.questionStyle : "";
157
+ questionFromBook['langDirection'] = questionFromBook.style?.direction ? questionFromBook.style?.direction : this.langDirection;
158
+ });
159
+ element['qbItem'] = qb['questionbook'];
160
+ }
161
+ }
162
+ element.style = element.style ? typeof element.style === 'string' ? JSON.parse('' + element?.style) : element?.style : this.qbItem?.style;
163
+ element.style.labelClass = element.style?.labelClass ? element.style?.labelClass : "";
164
+ element.style.labelStyle = element.style?.labelStyle ? element.style?.labelStyle : "";
165
+ element.style.labelValueStyle = element.style?.labelValueStyle ? element.style.labelValueStyle : "";
166
+ element.style.inputClass = element.style?.inputClass ? element.style?.inputClass : "";
167
+ element.style.inputStyle = element.style.inputStyle ? element.style?.inputStyle : "";
168
+ element.style.bookStyle = element.style?.bookStyle ? element.style?.bookStyle : "";
169
+ element.style.showLabel = element.style?.showLabel ? element.style?.showLabel : true;
170
+ element.style.questionStyle = element.style?.questionStyle ? element.style?.questionStyle : "";
171
+ element['langDirection'] = element.style?.direction ? element.style?.direction : this.langDirection;
172
+ //VD 02Aug24 dependent field show/hide changes
173
+ // RS 09DEC24 Changed keys
174
+ if (element.referenceField) {
175
+ element.dependentRef = element.referenceField;
176
+ }
177
+ if (element.subText) {
178
+ let dependencyObj = JSON.parse(element.subText);
179
+ if (dependencyObj.isDependentField) {
180
+ element.isHidden = true;
181
+ }
182
+ // VD 07Aug24 - isDependentField change
183
+ this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
184
+ // VD 20Aug24 - isDependentField change
185
+ if (changeValue != undefined && dependencyObj.isDependentField) {
186
+ if (changeValue.valueObj != undefined && changeValue.fromQuestionId == dependencyObj.sourceQuestionId) {
187
+ // element.isHiddenField = true;
188
+ if (dependencyObj.dependentValue == changeValue.valueObj) {
189
+ element.isHidden = false;
190
+ element.input = '';
191
+ element.selectedValue = undefined;
192
+ if (element.dependentRef == changeValue.referenceField) {
193
+ element.referenceField = changeValue.referenceField;
194
+ }
195
+ }
196
+ else {
197
+ element.isHidden = true;
198
+ element.input = '';
199
+ element.selectedValue = undefined;
200
+ this.hideDependentElements(element.id);
201
+ // if there is no dependent selection remove the reference
202
+ if (element.dependentRef == changeValue.referenceField) {
203
+ element.referenceField = '';
204
+ }
205
+ }
206
+ }
207
+ }
208
+ });
209
+ this.storageService.update(element);
210
+ }
211
+ // sunday comment
212
+ // if (element.type === 'Calendar') {
213
+ // this.openCalendarComponent(element);
214
+ // }
215
+ });
216
+ this.subQuestions = [];
217
+ this.setSubQuestions(this.questions);
218
+ this.processTranslatedQuestions();
219
+ }
220
+ // VD 07Aug24 - isDependentField change
221
+ hideDependentElements(elementId) {
222
+ let elementsToHide = this.questions.filter(el => {
223
+ if (el.subText) {
224
+ let depObj = JSON.parse(el.subText);
225
+ return depObj.sourceQuestionId == elementId;
226
+ }
227
+ return false;
228
+ });
229
+ elementsToHide.forEach(el => {
230
+ el.isHidden = true;
231
+ el.input = '';
232
+ el.selectedValue = undefined;
233
+ this.storageService.update(el);
234
+ // Recursively hide elements dependent on this one
235
+ this.hideDependentElements(el.id);
236
+ });
237
+ }
238
+ clearSQError(quesId) {
239
+ var sqList = this.subQuestions?.filter((item) => item.id == quesId);
240
+ for (var sq of sqList) {
241
+ sq.error = null;
242
+ }
243
+ }
244
+ // VD 11Jun24 - translation changes
245
+ processTranslatedQuestions() {
246
+ if (this.translatedQuestions && this.translatedQuestions.length > 0) {
247
+ this.questions.forEach((orgQuestion) => {
248
+ this.translatedQuestions.forEach((transQuestion) => {
249
+ if (orgQuestion.uniqueIdentifier == transQuestion.identifier) {
250
+ orgQuestion.questionText = transQuestion.label;
251
+ orgQuestion.question = transQuestion.placeHolder;
252
+ }
253
+ });
254
+ });
255
+ // console.log('originalQuestion' + this.questions);
256
+ // console.log(this.questions);
257
+ }
258
+ }
259
+ setSubQuestions(records) {
260
+ this.subQuestions.push(records);
261
+ }
262
+ // Capture and Process Child Event
263
+ childEventCapture(event, ques) {
264
+ let dropdownData = {};
265
+ this.changeService.announceChange(event);
266
+ if (ques) {
267
+ if (ques.type == 'Dropdown' || ques.type == 'Radio') {
268
+ // HA 19JAN24 Correction of dropdown values
269
+ ques.selectedObj = event.valueObj ? event.valueObj : null;
270
+ ques.input = event.selectedObj ? event.selectedObj : event.valueObj;
271
+ ques.selectedValue = event.valueObj ? event.valueObj : null;
272
+ // emit the dropdown data to parent
273
+ dropdownData['event'] = event.valueObj;
274
+ dropdownData['ques'] = ques;
275
+ if (dropdownData['event']) {
276
+ this.handleDropDown.emit(dropdownData);
277
+ } // VD 21DEC23 - dependent field change
278
+ }
279
+ else if (ques.type == 'Location') {
280
+ ques.input = event.valueObj;
281
+ ques.selectedValue = event.valueObj.address;
282
+ }
283
+ else if (ques.type == 'File') {
284
+ ques.input = this.selectedFileData = event;
285
+ // Handle file validation errors
286
+ if (Array.isArray(event) && event.length === 0) {
287
+ // No files uploaded when required
288
+ ques.error = ques.Error_Message__c ? new ErrorWrapper() : null;
289
+ }
290
+ else if (Array.isArray(event) && event.length > 0) {
291
+ // Files were successfully uploaded
292
+ ques.error = null;
293
+ }
294
+ // If there were validation errors from the file upload component
295
+ if (event.validationErrors && event.validationErrors.length > 0) {
296
+ ques.error = new ErrorWrapper();
297
+ ques.error.message = event.validationErrors[0]; // Use the first validation error
298
+ }
299
+ }
300
+ else if (ques.type == 'Date' || ques.type == 'DateTime') { // HA 24JAN24 Converting Date and DateTime to UTC
301
+ if (event.value) {
302
+ let d = new Date(event.value);
303
+ let utcString = d?.toISOString();
304
+ ques.input = utcString;
305
+ }
306
+ else {
307
+ ques.input = '';
308
+ }
309
+ }
310
+ else if (ques.type == 'List') {
311
+ // VD 20Aug24 handling the list type handle multiple object values
312
+ ques.input = this.dataService.getValue(event.valueObj, event.field);
313
+ } //RS 06JAN25
314
+ // else if (ques.type === 'RichTextArea') {
315
+ // console.log('RichTextArea event:', event);
316
+ // ques.input = event || '';
317
+ // }
318
+ else {
319
+ ques.input = event;
320
+ }
321
+ //RS 06JAN25
322
+ // Validate error message - modified to handle rich text
323
+ const hasError = ques.Error_Message__c && ((ques.type === 'File' && ques.input.length === 0)
324
+ // ||
325
+ // (ques.type === 'RichTextArea' && (!ques.input || ques.input.trim() === '')) ||
326
+ // (ques.type !== 'File' && ques.Type__c !== 'RichTextArea' && !ques.input)
327
+ );
328
+ ques.error = hasError ? new ErrorWrapper() : null;
329
+ ques.error = hasError ? new ErrorWrapper() : null;
330
+ // Once the right value is stored in ques.input store the ques (with input) in storageService
331
+ this.storageService.update(ques);
332
+ // VD 19Jul01 - get updated question
333
+ this.handleQuestion.emit(ques);
334
+ }
335
+ }
336
+ deleteFile(fileData) {
337
+ console.log('fileDATA', fileData);
338
+ }
339
+ getDropDown(event) {
340
+ this.hadleDropDownDependent.emit(event);
341
+ }
342
+ // VD 06Sep24 calendar changes
343
+ getCurrentCalendar(event) {
344
+ this.handleCalendarDate.emit(event);
345
+ }
346
+ getCalendarEvent(event) {
347
+ if (event) {
348
+ this.handleCalendarEvent.emit(event);
349
+ }
350
+ }
351
+ // VD 06Sep24 remove the special charecters and tags
352
+ // from the questionText
353
+ removeCharacters(questionText) {
354
+ let updatedText = questionText?.replace(/<[^>]*>/g, '');
355
+ return updatedText;
356
+ }
357
+ // sunday comment
358
+ // openCalendarComponent(ques) {
359
+ // const viewContainerRef = this.dynamicHost.viewContainerRef;
360
+ // if(viewContainerRef){
361
+ // viewContainerRef.clear();
362
+ // const componentRef = viewContainerRef.createComponent(CustomCalendarComponent);
363
+ // componentRef.instance.question = ques;
364
+ // componentRef.instance.dateSelected.subscribe((event: any) => this.getCurrentCalendar(event));
365
+ // componentRef.instance.eventSelected.subscribe((event:any) => this.getCalendarEvent(event))
366
+ // }
367
+ // }
368
+ isCalendarModalOpen = false;
369
+ calendarModalTitle;
370
+ calendarModalSize;
371
+ calendarSaveButtonValue;
372
+ referenceQuestions = [];
373
+ qbRefrenceBook;
374
+ modalCalendarModalFooter;
375
+ openCalendarModal(event) {
376
+ this.isCalendarModalOpen = true;
377
+ this.qbRefrenceBook = event.qbRefrenceBook;
378
+ this.referenceQuestions = event.referenceQuestions;
379
+ this.calendarModalTitle = event.modalTitle;
380
+ this.calendarModalSize = event.modalSize;
381
+ this.calendarSaveButtonValue = event.saveButtonValue;
382
+ this.modalCalendarModalFooter = event.modalFooter;
383
+ }
384
+ onCalendarModalSave() {
385
+ this.changeService.dataChanges('calendar-modal-save');
386
+ }
387
+ handleQuestionEvent(event) {
388
+ console.log('handle question here');
389
+ }
390
+ closeCalendarModal(event) {
391
+ this.isCalendarModalOpen = false;
392
+ }
393
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuestionbookComponent, deps: [{ token: i1.SalesforceService }, { token: i2.DataService }, { token: i3.ChangeService }, { token: i4.StorageService }, { token: i5.I18nService }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
394
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: QuestionbookComponent, selector: "lib-questionbook", inputs: { qbItem: "qbItem", questionItem: "questionItem", translatedQuestions: "translatedQuestions", questions: "questions", errorFieldId: "errorFieldId", labelValue: "labelValue", token: "token", dropDownData: "dropDownData" }, outputs: { handleDropDown: "handleDropDown", handleQuestion: "handleQuestion", hadleDropDownDependent: "hadleDropDownDependent", handleCalendarDate: "handleCalendarDate", handleCalendarEvent: "handleCalendarEvent" }, ngImport: i0, template: "<!-- HA 20DEC23 Book Style from salesforce -->\n<!-- HA 28DEC23 Removed IsShengel(removal of shengel values applies for this reason) and direct styling of books to avoid styling issues-->\n<!-- HA 18JAN24 Added class for styling -->\n<div [style]=\"bookStyle\" class=\"content-box form-group\">\n <div class=\"form-row\">\n <!-- HA 20DEC23 Directive and Question Style from salesforce -->\n <!-- RA09DEC24 Changed keys-->\n <div\n [class]=\"'col-lg-' + ques.size + ' paddingnone'\"\n *ngFor=\"let ques of questions;let i = index\" [id]=\"ques.id\" [dir]=\"ques.langDirection\" [style]=\"ques?.style?.questionStyle\">\n <!-- Sub Question Label -->\n <!-- HA 20DEC23 Label Style from salesforce -->\n <!-- VD 09May24 is hide field change-->\n <div *ngIf=\"!ques.isHidden\">\n <div *ngIf=\"ques.type === 'DateTime'\">\n \n </div>\n <!-- VD 20JUN24 - help text changes-->\n <!-- VD 01Aug24 - validation change-->\n <!-- // VD 02Aug24 - label value style-->\n <div [ngClass]=\"{ down2: qbItem?.progressBar }\" *ngIf=\"ques.style?.showLabel ? ques.style?.showLabel : true\" [style]=\"ques.style?.labelStyle\">\n <span [class]=\"'dis-flex shengel-myt-font3 myt-font7 '\" [style]=\"ques.style?.labelValueStyle\">{{ removeCharacters(ques?.questionText) }}\n <div *ngIf=\"ques.isOptional\" style=\"color: red;\">*</div>\n <div *ngIf=\"ques.questionText && ques?.helpText\" class=\"icon\" [matTooltip]=\"ques?.helpText\">i</div></span>\n </div>\n <!-- // VD 12Jun24 - readonly change-->\n <!-- DateTime -->\n <div *ngIf=\"ques.type === 'DateTime'\">\n <app-custom-date-picker [minDate]=\"ques.minDate\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" [date]=\"ques.input\" (dateChange)=\"childEventCapture($event, ques)\">\n </app-custom-date-picker>\n </div>\n \n <!-- Date-->\n <div *ngIf=\"ques.type === 'Date'\">\n <app-custom-date [date]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (dateChange)=\"childEventCapture($event, ques)\">\n </app-custom-date>\n </div>\n \n <!-- Time-->\n <div *ngIf=\"ques.type === 'Time'\">\n <app-custom-time [time]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (timeChange)=\"childEventCapture($event, ques)\">\n </app-custom-time>\n </div>\n <!-- calendar -->\n <div *ngIf=\"ques.type === 'Calendar'\">\n <app-custom-calendar\n [question]=\"ques\"\n (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\"\n (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"\n ></app-custom-calendar>\n <!-- model used in calendar component -->\n <app-custom-model *ngIf=\"isCalendarModalOpen\"\n [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\"\n [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\"\n [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\"\n (cancelButtonEmit)=\"closeCalendarModal($event)\"\n >\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model>\n </div>\n <!-- Text -->\n <div *ngIf=\"ques.type === 'Text' || ques.type === 'Link'\" >\n <app-custom-input [value]=\"ques.input\" [ngClassValue]=\"{\n 'dis-flex dt-line date-line bookText boxoutline myt-font1': qbItem.progressBar,\n textBox: !qbItem.progressBar\n }\" [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [idValue]=\"ques.trackingId\" [focusEvent]=\"clearSQError(ques.id)\"\n [error]=\"ques.error\" [placeholder]=\"ques.question\" (inputValue)=\"childEventCapture($event, ques)\">\n </app-custom-input>\n </div>\n \n <!-- for pick location -->\n <!-- VD 21DEC23 - dependent field change -->\n <div *ngIf=\"ques.type === 'Location'\">\n <!-- HA10012024 Added Api key as input -->\n <app-pick-location [apiKey]=\"qbItem['apiKey']\" [address]=\"ques.selectedValue\" [question]=\"ques\" (locationSelected)=\"childEventCapture($event, ques)\">\n </app-pick-location>\n </div>\n \n <!-- for text area -->\n <div *ngIf=\"ques.type === 'TextArea'\">\n <app-custom-text-area [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [value]=\"ques.input\" [rows]=\"3\" [error]=\"ques.error\" [placeholder]=\"ques.question \"\n (textareaValueChange)=\"childEventCapture($event, ques)\"></app-custom-text-area>\n </div>\n <!-- RS 06JAN25 -->\n <!-- for rich text editor -->\n <!-- // Changes commented out due to Angular version compatibility; will apply after upgrade. -->\n<!-- <div *ngIf=\"ques.type === 'RichTextArea'\">\n <app-custom-rich-text \n [question]=\"ques\"\n [readOnly]=\"ques.isReadOnly\"\n [value]=\"ques.input || ''\"\n [error]=\"ques.error\"\n [placeholder]=\"ques.question\"\n (textValueChange)=\"childEventCapture($event, ques)\">\n </app-custom-rich-text>\n</div> -->\n\n <!-- Email -->\n <div *ngIf=\"ques.type === 'Email'\">\n <input type=\"email\" readOnly=\"ques.isReadOnly\" [(ngModel)]=\"ques.input\" [id]=\"ques.id\" required=\"\" (focus)=\"clearSQError(ques.id)\"\n style.border-color=\"{{ ques.error ? 'red' : '' }}\" placeholder=\"{{ ques.question }}\" />\n </div>\n \n <!-- Table -->\n <div *ngIf=\"ques.type === 'Table'\" class=\"\">\n <app-custom-table [question]=\"ques\" [apiMeta]=\"ques.subText\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-table>\n </div>\n \n <!-- Table Appendix -->\n <div *ngIf=\"ques.type === 'TableAppendix'\" class=\"\">\n <app-table-appendix [question]=\"ques\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-table-appendix>\n </div>\n <!-- list -->\n <!-- VD 20Aug24 used correct attribute -->\n <div *ngIf=\"ques.type === 'List'\" class=\"\">\n <lib-search-box [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [placeHolderText]=\"ques.question\" [filterName]=\"ques.input\" (searchValueChange)=\"childEventCapture($event, ques)\">\n </lib-search-box>\n </div>\n \n <!-- Dropdown -->\n <!-- HA 09FEB24 Added condition of sqOption to the dropdown -->\n <div *ngIf=\"ques?.type === 'Dropdown' && ques?.options\" class=\"\">\n <!-- HA 20DEC23 For Translation --> <!-- VD 19JAN24 - getting token as input -->\n <app-custom-dropdown [options]=\"ques.options\"\n [token]=\"token\"\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\"\n [selectedValue]=\"ques.selectedValue\"\n placeholder=\"---{{'select' | i18n:i18nService.currentLanguage}}---\"\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\n [referenceField]=\"ques.referenceField\"\n [readOnly]=\"ques.isReadOnly\"\n [question]=\"ques\"\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-dropdown>\n <i class=\"fa fa-check \" aria-hidden=\"true\" *ngIf=\"ques?.input?.length > 0\"></i>\n </div>\n <!-- // VD 02Aug24 custom-radio component -->\n <div *ngIf=\"ques.type === 'Radio' && ques?.options\" class=\"\">\n <app-custom-radio [options]=\"ques.options\" [token]=\"token\"\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [selectedValue]=\"ques.selectedValue\"\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\n [referenceField]=\"ques.referenceField\"\n [readOnly]=\"ques.isReadOnly\"\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-radio>\n </div>\n \n <!-- Attachment / Files -->\n <div *ngIf=\"ques.type === 'File'\" class=\"\">\n <app-file-upload [limitFileUploading]=\"5\" [error]=\"ques.error\" [question]=\"ques\" [allFiles]=\"ques.input\" [tableFile]=\"false\"\n (selectedFileData)=\"childEventCapture($event, ques)\" (deletedFileData)=\"deleteFile($event)\"\n [isDeleteFileButtonVisible]=\"true\"></app-file-upload>\n </div>\n <div *ngIf=\"ques.type === 'PopUpMessage'\" class=\"\">\n <app-dependent-table [alertMessage]=\"ques.errorMessage\">\n </app-dependent-table>\n </div>\n <div *ngIf=\"ques.type === 'Label'\" class=\"\">\n <app-custom-label [labelStyle]=\"ques.title\" [labelValue]=\"ques.question\">\n </app-custom-label>\n </div>\n <!-- // VD 02Aug24 image component -->\n <div *ngIf=\"ques.type === 'Image'\" class=\"\">\n <app-custom-image [question]=\"ques\">\n </app-custom-image>\n </div>\n <!-- 08NOV23 - button type question added -->\n <!-- Button -->\n <div *ngIf=\"ques.type === 'Button'\" class=\"\">\n <app-custom-button [height]=\"'50px'\"\n [width]=\"'150px'\"\n [buttonText]=\"ques?.question\"\n [value]=\"ques?.question\"\n (buttonValue)=\"childEventCapture($event, ques)\"\n >\n </app-custom-button>\n </div>\n <!-- HA 20DEC23 This is to load book type questions-->\n <div *ngIf=\"ques.type === 'Book'\">\n <!-- HA 09FEB24 Added ternary operator -->\n <lib-questionbook [qbItem]=\"ques.qbItem\" [labelValue]=\"labelValue\" [questions]=\"ques.qbItem?.subQuestions\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </div>\n </div>\n <!-- 06-09-24 for calendar type-->\n<!-- <ng-template dynamicComponentHost></ng-template> -->", styles: [".col-lg-6{width:100%}.myt-font7{display:flex;justify-content:flex-start;align-items:center}.icon{display:inline-block;width:15px;height:15px;border-radius:50%;background-color:#08010177;color:#fff;text-align:center;line-height:16px;font-size:11px;font-family:Arial,sans-serif;font-weight:700;margin-left:5px}@media (min-width: 1200px){.col-lg-6{width:50%!important}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i9.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "component", type: i10.PickLocationComponent, selector: "app-pick-location", inputs: ["address", "question", "apiKey"], outputs: ["locationSelected"] }, { kind: "component", type: i11.CustomInputComponent, selector: "app-custom-input", inputs: ["value", "question", "disabled", "placeholder", "error", "fromShengel", "readOnly", "ngClassValue", "idValue", "focusEvent"], outputs: ["inputValue"] }, { kind: "component", type: i12.CustomTextAreaComponent, selector: "app-custom-text-area", inputs: ["value", "placeholder", "rows", "error", "question", "readOnly"], outputs: ["textareaValueChange"] }, { kind: "component", type: i13.CustomTableComponent, selector: "app-custom-table", inputs: ["question", "apiMeta"], outputs: ["valueChange"] }, { kind: "component", type: i14.CustomCalendarComponent, selector: "app-custom-calendar", inputs: ["allEvents", "question", "nxtId"], outputs: ["eventSelected", "dateSelected", "openModal", "closeModal"] }, { kind: "component", type: i15.CustomDatePickerComponent, selector: "app-custom-date-picker", inputs: ["date", "minDate", "maxDate", "error", "errorMessage", "readOnly"], outputs: ["dateChange"] }, { kind: "component", type: i16.CustomDropdownComponent, selector: "app-custom-dropdown", inputs: ["options", "placeholder", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "question", "referenceField", "token"], outputs: ["valueChange"] }, { kind: "component", type: i17.SearchBoxComponent, selector: "lib-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "filterName"], outputs: ["searchValueChange"] }, { kind: "component", type: QuestionbookComponent, selector: "lib-questionbook", inputs: ["qbItem", "questionItem", "translatedQuestions", "questions", "errorFieldId", "labelValue", "token", "dropDownData"], outputs: ["handleDropDown", "handleQuestion", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "component", type: i18.FileUploadComponent, selector: "app-file-upload", inputs: ["allFiles", "limitFileUploading", "isDeleteFileButtonVisible", "isShowNoFileIcon", "tableFile", "question", "error"], outputs: ["selectedFileData", "deletedFileData"] }, { kind: "component", type: i19.DependentTableComponent, selector: "app-dependent-table", inputs: ["alertMessage"] }, { kind: "component", type: i20.CustomLabelComponent, selector: "app-custom-label", inputs: ["labelValue", "labelStyle"] }, { kind: "component", type: i21.TableAppendixComponent, selector: "app-table-appendix", inputs: ["question"], outputs: ["valueChange"] }, { kind: "component", type: i22.CustomDateComponent, selector: "app-custom-date", inputs: ["date", "readOnly", "error", "errorMessage"], outputs: ["dateChange"] }, { kind: "component", type: i23.CustomTimeComponent, selector: "app-custom-time", inputs: ["time", "readOnly", "error", "errorMessage"], outputs: ["timeChange"] }, { kind: "component", type: i24.CustomButtonComponent, selector: "app-custom-button", inputs: ["height", "width", "textColor", "buttonText", "value", "backgroundColor"], outputs: ["buttonValue"] }, { kind: "component", type: i25.CustomModelComponent, selector: "app-custom-model", inputs: ["modalTitle", "isModalOpen", "modalSize", "saveButtonValue", "modalFooter"], outputs: ["saveButtonEmit", "cancelButtonEmit"] }, { kind: "component", type: i26.CustomImageComponent, selector: "app-custom-image", inputs: ["alt", "src", "imageStyle", "question"] }, { kind: "component", type: i27.CustomRadioComponent, selector: "app-custom-radio", inputs: ["options", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "referenceField", "token"], outputs: ["valueChange"] }, { kind: "pipe", type: i28.I18nPipe, name: "i18n" }] });
395
+ }
396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuestionbookComponent, decorators: [{
397
+ type: Component,
398
+ args: [{ selector: 'lib-questionbook', template: "<!-- HA 20DEC23 Book Style from salesforce -->\n<!-- HA 28DEC23 Removed IsShengel(removal of shengel values applies for this reason) and direct styling of books to avoid styling issues-->\n<!-- HA 18JAN24 Added class for styling -->\n<div [style]=\"bookStyle\" class=\"content-box form-group\">\n <div class=\"form-row\">\n <!-- HA 20DEC23 Directive and Question Style from salesforce -->\n <!-- RA09DEC24 Changed keys-->\n <div\n [class]=\"'col-lg-' + ques.size + ' paddingnone'\"\n *ngFor=\"let ques of questions;let i = index\" [id]=\"ques.id\" [dir]=\"ques.langDirection\" [style]=\"ques?.style?.questionStyle\">\n <!-- Sub Question Label -->\n <!-- HA 20DEC23 Label Style from salesforce -->\n <!-- VD 09May24 is hide field change-->\n <div *ngIf=\"!ques.isHidden\">\n <div *ngIf=\"ques.type === 'DateTime'\">\n \n </div>\n <!-- VD 20JUN24 - help text changes-->\n <!-- VD 01Aug24 - validation change-->\n <!-- // VD 02Aug24 - label value style-->\n <div [ngClass]=\"{ down2: qbItem?.progressBar }\" *ngIf=\"ques.style?.showLabel ? ques.style?.showLabel : true\" [style]=\"ques.style?.labelStyle\">\n <span [class]=\"'dis-flex shengel-myt-font3 myt-font7 '\" [style]=\"ques.style?.labelValueStyle\">{{ removeCharacters(ques?.questionText) }}\n <div *ngIf=\"ques.isOptional\" style=\"color: red;\">*</div>\n <div *ngIf=\"ques.questionText && ques?.helpText\" class=\"icon\" [matTooltip]=\"ques?.helpText\">i</div></span>\n </div>\n <!-- // VD 12Jun24 - readonly change-->\n <!-- DateTime -->\n <div *ngIf=\"ques.type === 'DateTime'\">\n <app-custom-date-picker [minDate]=\"ques.minDate\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" [date]=\"ques.input\" (dateChange)=\"childEventCapture($event, ques)\">\n </app-custom-date-picker>\n </div>\n \n <!-- Date-->\n <div *ngIf=\"ques.type === 'Date'\">\n <app-custom-date [date]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (dateChange)=\"childEventCapture($event, ques)\">\n </app-custom-date>\n </div>\n \n <!-- Time-->\n <div *ngIf=\"ques.type === 'Time'\">\n <app-custom-time [time]=\"ques.input\" [error]=\"ques.error\" [errorMessage]=\"ques.errorMessage\" [readOnly]=\"ques.isReadOnly\" (timeChange)=\"childEventCapture($event, ques)\">\n </app-custom-time>\n </div>\n <!-- calendar -->\n <div *ngIf=\"ques.type === 'Calendar'\">\n <app-custom-calendar\n [question]=\"ques\"\n (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\"\n (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"\n ></app-custom-calendar>\n <!-- model used in calendar component -->\n <app-custom-model *ngIf=\"isCalendarModalOpen\"\n [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\"\n [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\"\n [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\"\n (cancelButtonEmit)=\"closeCalendarModal($event)\"\n >\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\" (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model>\n </div>\n <!-- Text -->\n <div *ngIf=\"ques.type === 'Text' || ques.type === 'Link'\" >\n <app-custom-input [value]=\"ques.input\" [ngClassValue]=\"{\n 'dis-flex dt-line date-line bookText boxoutline myt-font1': qbItem.progressBar,\n textBox: !qbItem.progressBar\n }\" [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [idValue]=\"ques.trackingId\" [focusEvent]=\"clearSQError(ques.id)\"\n [error]=\"ques.error\" [placeholder]=\"ques.question\" (inputValue)=\"childEventCapture($event, ques)\">\n </app-custom-input>\n </div>\n \n <!-- for pick location -->\n <!-- VD 21DEC23 - dependent field change -->\n <div *ngIf=\"ques.type === 'Location'\">\n <!-- HA10012024 Added Api key as input -->\n <app-pick-location [apiKey]=\"qbItem['apiKey']\" [address]=\"ques.selectedValue\" [question]=\"ques\" (locationSelected)=\"childEventCapture($event, ques)\">\n </app-pick-location>\n </div>\n \n <!-- for text area -->\n <div *ngIf=\"ques.type === 'TextArea'\">\n <app-custom-text-area [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [value]=\"ques.input\" [rows]=\"3\" [error]=\"ques.error\" [placeholder]=\"ques.question \"\n (textareaValueChange)=\"childEventCapture($event, ques)\"></app-custom-text-area>\n </div>\n <!-- RS 06JAN25 -->\n <!-- for rich text editor -->\n <!-- // Changes commented out due to Angular version compatibility; will apply after upgrade. -->\n<!-- <div *ngIf=\"ques.type === 'RichTextArea'\">\n <app-custom-rich-text \n [question]=\"ques\"\n [readOnly]=\"ques.isReadOnly\"\n [value]=\"ques.input || ''\"\n [error]=\"ques.error\"\n [placeholder]=\"ques.question\"\n (textValueChange)=\"childEventCapture($event, ques)\">\n </app-custom-rich-text>\n</div> -->\n\n <!-- Email -->\n <div *ngIf=\"ques.type === 'Email'\">\n <input type=\"email\" readOnly=\"ques.isReadOnly\" [(ngModel)]=\"ques.input\" [id]=\"ques.id\" required=\"\" (focus)=\"clearSQError(ques.id)\"\n style.border-color=\"{{ ques.error ? 'red' : '' }}\" placeholder=\"{{ ques.question }}\" />\n </div>\n \n <!-- Table -->\n <div *ngIf=\"ques.type === 'Table'\" class=\"\">\n <app-custom-table [question]=\"ques\" [apiMeta]=\"ques.subText\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-table>\n </div>\n \n <!-- Table Appendix -->\n <div *ngIf=\"ques.type === 'TableAppendix'\" class=\"\">\n <app-table-appendix [question]=\"ques\" (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-table-appendix>\n </div>\n <!-- list -->\n <!-- VD 20Aug24 used correct attribute -->\n <div *ngIf=\"ques.type === 'List'\" class=\"\">\n <lib-search-box [question]=\"ques\" [readOnly]=\"ques.isReadOnly\" [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [placeHolderText]=\"ques.question\" [filterName]=\"ques.input\" (searchValueChange)=\"childEventCapture($event, ques)\">\n </lib-search-box>\n </div>\n \n <!-- Dropdown -->\n <!-- HA 09FEB24 Added condition of sqOption to the dropdown -->\n <div *ngIf=\"ques?.type === 'Dropdown' && ques?.options\" class=\"\">\n <!-- HA 20DEC23 For Translation --> <!-- VD 19JAN24 - getting token as input -->\n <app-custom-dropdown [options]=\"ques.options\"\n [token]=\"token\"\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\"\n [selectedValue]=\"ques.selectedValue\"\n placeholder=\"---{{'select' | i18n:i18nService.currentLanguage}}---\"\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\n [referenceField]=\"ques.referenceField\"\n [readOnly]=\"ques.isReadOnly\"\n [question]=\"ques\"\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-dropdown>\n <i class=\"fa fa-check \" aria-hidden=\"true\" *ngIf=\"ques?.input?.length > 0\"></i>\n </div>\n <!-- // VD 02Aug24 custom-radio component -->\n <div *ngIf=\"ques.type === 'Radio' && ques?.options\" class=\"\">\n <app-custom-radio [options]=\"ques.options\" [token]=\"token\"\n [apiMeta]=\"ques.subText\" [id]=\"ques.id\" [selectedValue]=\"ques.selectedValue\"\n [errorMessage]=\"ques.errorMessage\" [error]=\"ques.error\"\n [referenceField]=\"ques.referenceField\"\n [readOnly]=\"ques.isReadOnly\"\n (valueChange)=\"childEventCapture($event, ques); clearSQError(ques.id)\">\n </app-custom-radio>\n </div>\n \n <!-- Attachment / Files -->\n <div *ngIf=\"ques.type === 'File'\" class=\"\">\n <app-file-upload [limitFileUploading]=\"5\" [error]=\"ques.error\" [question]=\"ques\" [allFiles]=\"ques.input\" [tableFile]=\"false\"\n (selectedFileData)=\"childEventCapture($event, ques)\" (deletedFileData)=\"deleteFile($event)\"\n [isDeleteFileButtonVisible]=\"true\"></app-file-upload>\n </div>\n <div *ngIf=\"ques.type === 'PopUpMessage'\" class=\"\">\n <app-dependent-table [alertMessage]=\"ques.errorMessage\">\n </app-dependent-table>\n </div>\n <div *ngIf=\"ques.type === 'Label'\" class=\"\">\n <app-custom-label [labelStyle]=\"ques.title\" [labelValue]=\"ques.question\">\n </app-custom-label>\n </div>\n <!-- // VD 02Aug24 image component -->\n <div *ngIf=\"ques.type === 'Image'\" class=\"\">\n <app-custom-image [question]=\"ques\">\n </app-custom-image>\n </div>\n <!-- 08NOV23 - button type question added -->\n <!-- Button -->\n <div *ngIf=\"ques.type === 'Button'\" class=\"\">\n <app-custom-button [height]=\"'50px'\"\n [width]=\"'150px'\"\n [buttonText]=\"ques?.question\"\n [value]=\"ques?.question\"\n (buttonValue)=\"childEventCapture($event, ques)\"\n >\n </app-custom-button>\n </div>\n <!-- HA 20DEC23 This is to load book type questions-->\n <div *ngIf=\"ques.type === 'Book'\">\n <!-- HA 09FEB24 Added ternary operator -->\n <lib-questionbook [qbItem]=\"ques.qbItem\" [labelValue]=\"labelValue\" [questions]=\"ques.qbItem?.subQuestions\" (handleDropDown)=\"getDropDown($event)\"></lib-questionbook>\n </div>\n </div>\n </div>\n </div>\n <!-- 06-09-24 for calendar type-->\n<!-- <ng-template dynamicComponentHost></ng-template> -->", styles: [".col-lg-6{width:100%}.myt-font7{display:flex;justify-content:flex-start;align-items:center}.icon{display:inline-block;width:15px;height:15px;border-radius:50%;background-color:#08010177;color:#fff;text-align:center;line-height:16px;font-size:11px;font-family:Arial,sans-serif;font-weight:700;margin-left:5px}@media (min-width: 1200px){.col-lg-6{width:50%!important}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}}\n"] }]
399
+ }], ctorParameters: () => [{ type: i1.SalesforceService }, { type: i2.DataService }, { type: i3.ChangeService }, { type: i4.StorageService }, { type: i5.I18nService }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
400
+ type: Inject,
401
+ args: [DOCUMENT]
402
+ }] }], propDecorators: { qbItem: [{
403
+ type: Input
404
+ }], questionItem: [{
405
+ type: Input
406
+ }], translatedQuestions: [{
407
+ type: Input
408
+ }], questions: [{
409
+ type: Input
410
+ }], errorFieldId: [{
411
+ type: Input
412
+ }], labelValue: [{
413
+ type: Input
414
+ }], token: [{
415
+ type: Input
416
+ }], handleDropDown: [{
417
+ type: Output
418
+ }], handleQuestion: [{
419
+ type: Output
420
+ }], dropDownData: [{
421
+ type: Input
422
+ }], hadleDropDownDependent: [{
423
+ type: Output
424
+ }], handleCalendarDate: [{
425
+ type: Output
426
+ }], handleCalendarEvent: [{
427
+ type: Output
428
+ }] } });
429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlc3Rpb25ib29rLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9wYWdlcy9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUE2RCxNQUFNLGVBQWUsQ0FBQztBQU9sSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQTRCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRakUsTUFBTSxPQUFPLHFCQUFxQjtJQTJCWjtJQUNWO0lBQ0E7SUFDQTtJQUNEO0lBQ0M7SUFDa0I7SUFoQ25CLE1BQU0sQ0FBZTtJQUNyQixZQUFZLENBQVc7SUFDdkIsbUJBQW1CLEdBQVcsRUFBRSxDQUFBLENBQUUsbUNBQW1DO0lBQ3JFLFNBQVMsQ0FBYTtJQUN0QixZQUFZLENBQUs7SUFDakIsVUFBVSxDQUFRO0lBQ2xCLEtBQUssQ0FBUSxDQUFDLHNDQUFzQztJQUNuRCxjQUFjLEdBQXFCLElBQUksWUFBWSxFQUFPLENBQUM7SUFDM0QsY0FBYyxHQUFxQixJQUFJLFlBQVksRUFBTyxDQUFDLENBQUMsb0NBQW9DO0lBQ2pHLFlBQVksQ0FBSztJQUMxQiwyRkFBMkY7SUFDM0YsWUFBWSxDQUFhO0lBQ3pCLGdCQUFnQixHQUFVLEVBQUUsQ0FBQztJQUM3QixjQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDckQsdUVBQXVFO0lBQ3ZFLEtBQUssQ0FBZTtJQUNwQixpREFBaUQ7SUFDakQsS0FBSyxDQUFNO0lBQ1gsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixTQUFTLENBQU07SUFDZixZQUFZLENBQWU7SUFDakIsc0JBQXNCLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUM7SUFDeEUsOEJBQThCO0lBQ3BCLGtCQUFrQixHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzFELG1CQUFtQixHQUFxQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzlELGdCQUFnQixHQUFRLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekMsWUFBb0IsU0FBNEIsRUFDdEMsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDL0IsV0FBd0IsRUFDdkIsR0FBc0IsRUFDSixRQUFrQjtRQU4xQixjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDL0IsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDSixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBRTlDLENBQUM7SUFFRCxRQUFRO1FBQ04scUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQiwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQzVELENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDWixJQUFHLFdBQVcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDTCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFQSxxQkFBcUI7SUFDckIsMEJBQTBCO0lBQzNCLFdBQVc7UUFDVCwwREFBMEQ7UUFDMUQsMkJBQTJCO1FBQzNCLElBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQztZQUNyQix1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2xILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxD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Q0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ3BHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNqSCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDakgsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2hJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNqSCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDakgsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQzlHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO3dCQUNoSCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDMUgsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDakksQ0FBQyxDQUFDLENBQUM7b0JBQ0gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFFeEksT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckYsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkYsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckYsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFL0YsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUs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cUIsdWZDbkJsQyxpcFdBaU15RCxrbUhEOUs1QyxxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkFxQ3pCLE1BQU07MkJBQUMsUUFBUTt5Q0FoQ1QsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSztnQkFZSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgU2ltcGxlQ2hhbmdlcywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBRdWVzdGlvbiwgUXVlc3Rpb25Cb29rIH0gZnJvbSAnLi4vLi4vd3JhcHBlcic7XG5pbXBvcnQgeyBTYWxlc2ZvcmNlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zYWxlc2ZvcmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEVycm9yV3JhcHBlciB9IGZyb20gJy4uLy4uL21vZGVsL2Vycm9yV3JhcHBlcic7XG4vLyBIQSAxOURFQzIzIGltcG9ydGVkIHRyYW5zbGF0aW9uIHNlcnZpY2VcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZXBlbmRlbmN5TWV0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZGVwZW5kZW5jeU1ldGEnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcXVlc3Rpb25ib29rJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3F1ZXN0aW9uYm9vay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3F1ZXN0aW9uYm9vay5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25ib29rQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcWJJdGVtOiBRdWVzdGlvbkJvb2s7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uSXRlbTogUXVlc3Rpb247XG4gIEBJbnB1dCgpIHRyYW5zbGF0ZWRRdWVzdGlvbnMgOiBhbnlbXSA9IFtdICAvLyBWRCAxMUp1bjI0IC0gdHJhbnNsYXRpb24gY2hhbmdlc1xuICBASW5wdXQoKSBxdWVzdGlvbnM6IFF1ZXN0aW9uW107XG4gIEBJbnB1dCgpIGVycm9yRmllbGRJZDphbnk7XG4gIEBJbnB1dCgpIGxhYmVsVmFsdWU6c3RyaW5nOyBcbiAgQElucHV0KCkgdG9rZW46c3RyaW5nOyAvLyBWRCAxOUpBTjI0IC0gZ2V0dGluZyB0b2tlbiBhcyBpbnB1dFxuICBAT3V0cHV0KCkgaGFuZGxlRHJvcERvd246RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGhhbmRsZVF1ZXN0aW9uOkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7IC8vIFZEIDE5SnVsMDEgLSBnZXQgdXBkYXRlZCBxdWVzdGlvblxuICBASW5wdXQoKSBkcm9wRG93bkRhdGE6YW55O1xuICAvL0BWaWV3Q2hpbGQoQ29tcG9uZW50aG9zdERpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY0hvc3Q6IENvbXBvbmVudGhvc3REaXJlY3RpdmU7XG4gIHN1YlF1ZXN0aW9uczogUXVlc3Rpb25bXTtcbiAgc2VsZWN0ZWRGaWxlRGF0YTogYW55W10gPSBbXTtcbiAgbG9hZENvbXBvbmVudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLy8gSEEgMjhERUMyMyBBZGRlZCBzdHlsaW5nIGFuZCBsb2dpY3MgdG8gbG9hZCB0aGUgYm9vayB0eXBlIHF1ZXN0aW9ucyBcbiAgcWJSZWY6IFF1ZXN0aW9uQm9vaztcbiAgLy8gIEhBIDE5REVDMjMgRGVjbGFyYXRpb24gZm9yIFNhbGVzZm9yY2UgU3R5bGluZ1xuICBzdHlsZTogYW55O1xuICBsYW5nRGlyZWN0aW9uID0gJ2x0cic7XG4gIGJvb2tTdHlsZTogYW55O1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6RXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8vIFZEIDA2U2VwMjQgY2FsZW5kYXIgY2hhbmdlc1xuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJEYXRlOkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaGFuZGxlQ2FsZW5kYXJFdmVudDpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgcHVibGljIGJvb2tRdWVzdGlvbnNNYXA6IGFueSA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZlNlcnZpY2U6IFNhbGVzZm9yY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlU2VydmljZTogQ2hhbmdlU2VydmljZSwgXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2UsXG4gICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHsgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBWRCAxM1NlcDI0IGNoYW5nZXNcbiAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gICAgLy8gVkQgc2VwMTMyNCBjaGFuZ2VzIC0gcHJvY2VzcyBkYXRhIHdoZW4gZGF0YWJpbmQgdmFsdWUgY2hhbmdlXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY3VzdG9tQ2hhbmdlJC5zdWJzY3JpYmUoXG4gICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICBpZihjaGFuZ2VWYWx1ZSA9PSAnZGF0YUJpbmQnKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAgLy8gVkQgMTNTZXAyNCBjaGFuZ2VzXG4gICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xuICBwcm9jZXNzRGF0YSgpe1xuICAgIC8vICBIQSAxOURFQzIzIExvZ2ljIGZvciBRdWVzdGlvbiBCb29rIFN0eWxpbmcoU2xhZXNmb3JjZSlcbiAgICAvLyBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnlcbiAgICBpZih0aGlzLnFiSXRlbT8uc3R5bGUpe1xuICAgICAgLy8gSEEgMjhERUMyMyBBZGRlZCBzdHlsaW5nIGFuZCBsb2dpY3MgdG8gbG9hZCB0aGUgYm9vayB0eXBlIHF1ZXN0aW9ucyBcbiAgICAgIHRoaXMucWJJdGVtLnN0eWxlID0gdHlwZW9mIHRoaXMucWJJdGVtLnN0eWxlID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoJycrdGhpcy5xYkl0ZW0/LnN0eWxlKSA6IHRoaXMucWJJdGVtLnN0eWxlO1xuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUubGFiZWxDbGFzcyA9IHRoaXMucWJJdGVtLnN0eWxlPy5sYWJlbENsYXNzID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmxhYmVsQ2xhc3MgOiBcIlwiO1xuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUubGFiZWxTdHlsZSA9IHRoaXMucWJJdGVtLnN0eWxlPy5sYWJlbFN0eWxlID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmxhYmVsU3R5bGUgOiBcIlwiO1xuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUubGFiZWxWYWx1ZVN0eWxlID0gdGhpcy5xYkl0ZW0uc3R5bGU/LmxhYmVsVmFsdWVTdHlsZSA/IHRoaXMucWJJdGVtLnN0eWxlPy5sYWJlbFZhbHVlU3R5bGUgOiBcIlwiO1xuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUuaW5wdXRDbGFzcyA9IHRoaXMucWJJdGVtLnN0eWxlPy5pbnB1dENsYXNzID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmlucHV0Q2xhc3MgOiBcIlwiO1xuICAgICAgdGhpcy5xYkl0ZW0uc3R5bGUuaW5wdXRTdHlsZSA9IHRoaXMucWJJdGVtLnN0eWxlLmlucHV0U3R5bGUgPyB0aGlzLnFiSXRlbS5zdHlsZT8uaW5wdXRTdHlsZSA6IFwiXCI7XG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZS5ib29rU3R5bGUgPSB0aGlzLnFiSXRlbS5zdHlsZT8uYm9va1N0eWxlID8gdGhpcy5xYkl0ZW0uc3R5bGU/LmJvb2tTdHlsZSA6IFwiXCI7XG4gICAgICB0aGlzLnFiSXRlbS5zdHlsZS5zaG93TGFiZWwgPSB0aGlzLnFiSXRlbS5zdHlsZT8uc2hvd0xhYmVsID8gdGhpcy5xYkl0ZW0uc3R5bGU/LnNob3dMYWJlbCA6IHRydWU7XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICBpZih0aGlzLnFiSXRlbSl7XG4gICAgICAgIHRoaXMucWJJdGVtLnN0eWxlID0ge1xuICAgICAgICAgIFwibGFiZWxDbGFzc1wiIDogXCJcIixcbiAgICAgICAgICBcImxhYmVsU3R5bGVcIiA6IFwiXCIsXG4gICAgICAgICAgXCJsYWJlbFZhbHVlU3R5bGVcIiA6IFwiXCIsXG4gICAgICAgICAgXCJpbnB1dENsYXNzXCIgOiBcIlwiLFxuICAgICAgICAgIFwiaW5wdXRTdHlsZVwiIDogXCJcIixcbiAgICAgICAgICBcImJvb2tTdHlsZVwiIDogXCJcIixcbiAgICAgICAgICBcInNob3dMYWJlbFwiOiB0cnVlLFxuICAgICAgICAgIFwiZGlyZWN0aW9uXCIgOiBcImx0clwiLFxuICAgICAgICAgIFwicXVlc3Rpb25TdHlsZVwiOiBcIlwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucWJJdGVtLnN0eWxlLnF1ZXN0aW9uU3R5bGUgPSB0aGlzLnFiSXRlbT8uc3R5bGU/LnF1ZXN0aW9uU3R5bGUgPyB0aGlzLnFiSXRlbT8uc3R5bGUucXVlc3Rpb25TdHlsZSA6IFwiXCI7XG4gICAgdGhpcy5sYW5nRGlyZWN0aW9uID0gdGhpcy5xYkl0ZW0uc3R5bGUuZGlyZWN0aW9uID0gdGhpcy5xYkl0ZW0/LnN0eWxlPy5kaXJlY3Rpb24gPyB0aGlzLnFiSXRlbT8uc3R5bGU/LmRpcmVjdGlvbiA6ICdsdHInO1xuICAgIHRoaXMuYm9va1N0eWxlID0gdGhpcy5xYkl0ZW0/LnN0eWxlPy5ib29rU3R5bGU7XG4gICAgdGhpcy5xdWVzdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIHZhciBodG1sRWxlbWVudCA9IGVsZW1lbnQ/LnF1ZXN0aW9uVGV4dCA7XG4gICAgICB2YXIgdGV4dE9ubHkgPSBodG1sRWxlbWVudD8ucmVwbGFjZSgvPFtePl0qPi9nLCAnJylcbiAgICAgIGVsZW1lbnQucXVlc3Rpb25UZXh0ID0gdGV4dE9ubHk7XG4gICAgICAvLyAgSEEgMTlERUMyMyBMb2dpYyBmb3IgUXVlc3Rpb24gU3R5bGluZyhTbGFlc2ZvcmNlKVxuICAgICAgLy8gSEEgMjhERUMyMyBBZGRlZCBzdHlsaW5nIGFuZCBsb2dpY3MgdG8gbG9hZCB0aGUgYm9vayB0eXBlIHF1ZXN0aW9ucyBcbiAgICAgIGlmKGVsZW1lbnQudHlwZSA9PT0gJ0Jvb2snKXtcbiAgICAgICAgaWYoZWxlbWVudFsncWJSZWZlcmVuY2VRdWVzdGlvbnMnXSl7XG4gICAgICAgICAgdmFyIHFiID0gSlNPTi5wYXJzZShlbGVtZW50WydxYlJlZmVyZW5jZVF1ZXN0aW9ucyddKTtcbiAgICAgICAgICBpZihxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUpe1xuICAgICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlID0gdHlwZW9mIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKCcnK3FiWydxdWVzdGlvbmJvb2snXS5zdHlsZSkgOiBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUgPSB0aGlzLnFiSXRlbS5zdHlsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBCb29rIHR5cGUgcXVlc3Rpb24gc3R5bGluZ1xuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5sYWJlbENsYXNzID0gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5sYWJlbENsYXNzID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5sYWJlbENsYXNzIDogXCJcIjtcbiAgICAgICAgICBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUubGFiZWxTdHlsZSA9IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8ubGFiZWxTdHlsZSA/IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8ubGFiZWxTdHlsZSA6IFwiXCI7XG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLmxhYmVsVmFsdWVTdHlsZSA9IHFiWydxdWVzdGlvbmJvb2snXS5TdHlsZV9fPy5sYWJlbFZhbHVlU3R5bGUgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUubGFiZWxWYWx1ZVN0eWxlIDogXCJcIjtcbiAgICAgICAgICBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUuaW5wdXRDbGFzcyA9IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8uaW5wdXRDbGFzcyA/IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8uaW5wdXRDbGFzcyA6IFwiXCI7XG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLmlucHV0U3R5bGUgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmlucHV0U3R5bGUgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmlucHV0U3R5bGUgOiBcIlwiO1xuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZS5ib29rU3R5bGUgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LmJvb2tTdHlsZSA/IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZT8uYm9va1N0eWxlIDogXCJcIjtcbiAgICAgICAgICBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUuc2hvd0xhYmVsID0gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5zaG93TGFiZWwgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LnNob3dMYWJlbCA6IHRydWU7XG4gICAgICAgICAgcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlLnF1ZXN0aW9uU3R5bGUgPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LnF1ZXN0aW9uU3R5bGUgPyBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGU/LnF1ZXN0aW9uU3R5bGUgOiBcIlwiO1xuICAgICAgICAgIHFiWydsYW5nRGlyZWN0aW9uJ10gPSBxYlsncXVlc3Rpb25ib29rJ10uc3R5bGUuZGlyZWN0aW9uID8gcWJbJ3F1ZXN0aW9uYm9vayddLnN0eWxlPy5kaXJlY3Rpb24gOiB0aGlzLmxhbmdEaXJlY3Rpb247XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9vcCBmb3IgZWFjaCBxdWVzdGlvbiBpbiB0aGUgYm9va1xuICAgICAgICAgIHFiWydxdWVzdGlvbmJvb2snXS5zdWJRdWVzdGlvbnMuZm9yRWFjaChxdWVzdGlvbkZyb21Cb29rID0+IHtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUgPSBxdWVzdGlvbkZyb21Cb29rLnN0eWxlID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZSA6IHFiWydxdWVzdGlvbmJvb2snXS5zdHlsZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUubGFiZWxDbGFzcyA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmxhYmVsQ2xhc3MgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbENsYXNzIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUubGFiZWxTdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmxhYmVsU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5sYWJlbFN0eWxlIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUubGFiZWxWYWx1ZVN0eWxlID0gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8ubGFiZWxWYWx1ZVN0eWxlID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8ubGFiZWxWYWx1ZVN0eWxlIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUuaW5wdXRDbGFzcyA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmlucHV0Q2xhc3MgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5pbnB1dENsYXNzIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUuaW5wdXRTdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmlucHV0U3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5pbnB1dFN0eWxlIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUuYm9va1N0eWxlID0gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uYm9va1N0eWxlID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uYm9va1N0eWxlIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUuc2hvd0xhYmVsID0gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uc2hvd0xhYmVsID8gcXVlc3Rpb25Gcm9tQm9vay5zdHlsZT8uc2hvd0xhYmVsIDogdHJ1ZTtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2suc3R5bGUucXVlc3Rpb25TdHlsZSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LnF1ZXN0aW9uU3R5bGUgPyBxdWVzdGlvbkZyb21Cb29rLnN0eWxlPy5xdWVzdGlvblN0eWxlIDogXCJcIjtcbiAgICAgICAgICAgIHF1ZXN0aW9uRnJvbUJvb2tbJ2xhbmdEaXJlY3Rpb24nXSA9IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmRpcmVjdGlvbiA/IHF1ZXN0aW9uRnJvbUJvb2suc3R5bGU/LmRpcmVjdGlvbiA6IHRoaXMubGFuZ0RpcmVjdGlvbjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlbGVtZW50WydxYkl0ZW0nXSA9IHFiWydxdWVzdGlvbmJvb2snXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxlbWVudC5zdHlsZSA9IGVsZW1lbnQuc3R5bGUgPyB0eXBlb2YgZWxlbWVudC5zdHlsZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKCcnK2VsZW1lbnQ/LnN0eWxlKSA6IGVsZW1lbnQ/LnN0eWxlIDogdGhpcy5xYkl0ZW0/LnN0eWxlO1xuXG4gICAgICBlbGVtZW50LnN0eWxlLmxhYmVsQ2xhc3MgPSBlbGVtZW50LnN0eWxlPy5sYWJlbENsYXNzID8gZWxlbWVudC5zdHlsZT8ubGFiZWxDbGFzcyA6IFwiXCI7XG4gICAgICBlbGVtZW50LnN0eWxlLmxhYmVsU3R5bGUgPSBlbGVtZW50LnN0eWxlPy5sYWJlbFN0eWxlID8gZWxlbWVudC5zdHlsZT8ubGFiZWxTdHlsZSA6IFwiXCI7XG4gICAgICBlbGVtZW50LnN0eWxlLmxhYmVsVmFsdWVTdHlsZSA9IGVsZW1lbnQuc3R5bGU/LmxhYmVsVmFsdWVTdHlsZSA/IGVsZW1lbnQuc3R5bGUubGFiZWxWYWx1ZVN0eWxlIDogXCJcIjtcbiAgICAgIGVsZW1lbnQuc3R5bGUuaW5wdXRDbGFzcyA9IGVsZW1lbnQuc3R5bGU/LmlucHV0Q2xhc3MgPyBlbGVtZW50LnN0eWxlPy5pbnB1dENsYXNzIDogXCJcIjtcbiAgICAgIGVsZW1lbnQuc3R5bGUuaW5wdXRTdHlsZSA9IGVsZW1lbnQuc3R5bGUuaW5wdXRTdHlsZSA/IGVsZW1lbnQuc3R5bGU/LmlucHV0U3R5bGUgOiBcIlwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5ib29rU3R5bGUgPSBlbGVtZW50LnN0eWxlPy5ib29rU3R5bGUgPyBlbGVtZW50LnN0eWxlPy5ib29rU3R5bGUgOiBcIlwiO1xuICAgICAgZWxlbWVudC5zdHlsZS5zaG93TGFiZWwgPSBlbGVtZW50LnN0eWxlPy5zaG93TGFiZWwgPyBlbGVtZW50LnN0eWxlPy5zaG93TGFiZWwgOiB0cnVlO1xuICAgICAgZWxlbWVudC5zdHlsZS5xdWVzdGlvblN0eWxlID0gZWxlbWVudC5zdHlsZT8ucXVlc3Rpb25TdHlsZSA/IGVsZW1lbnQuc3R5bGU/LnF1ZXN0aW9uU3R5bGUgOiBcIlwiO1xuXG4gICAgICBlbGVtZW50WydsYW5nRGlyZWN0aW9uJ10gPSBlbGVtZW50LnN0eWxlPy5kaXJlY3Rpb24gPyBlbGVtZW50LnN0eWxlPy5kaXJlY3Rpb24gOiB0aGlzLmxhbmdEaXJlY3Rpb247XG5cblxuICAgICAgLy9WRCAwMkF1ZzI0IGRlcGVuZGVudCBmaWVsZCBzaG93L2hpZGUgY2hhbmdlc1xuICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcbiAgICAgIGlmKGVsZW1lbnQucmVmZXJlbmNlRmllbGQpe1xuICAgICAgICBlbGVtZW50LmRlcGVuZGVudFJlZiA9IGVsZW1lbnQucmVmZXJlbmNlRmllbGQ7XG4gICAgICB9XG4gICAgICBpZihlbGVtZW50LnN1YlRleHQpe1xuICAgICAgICAgbGV0IGRlcGVuZGVuY3lPYmo6IERlcGVuZGVuY3lNZXRhID0gSlNPTi5wYXJzZShlbGVtZW50LnN1YlRleHQpO1xuICAgICAgICAgaWYoZGVwZW5kZW5jeU9iai5pc0RlcGVuZGVudEZpZWxkKXtcbiAgICAgICAgICAgIGVsZW1lbnQuaXNIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgfVxuICAgICAgICAvLyBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2VcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jaGFuZ2VBbm5vdW5jZWQkLnN1YnNjcmliZShcbiAgICAgICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgLy8gVkQgMjBBdWcyNCAtIGlzRGVwZW5kZW50RmllbGQgY2hhbmdlXG4gICAgICAgICAgICAgIGlmKGNoYW5nZVZhbHVlICE9IHVuZGVmaW5lZCAmJiBkZXBlbmRlbmN5T2JqLmlzRGVwZW5kZW50RmllbGQpIHtcbiAgICAgICAgICAgICAgICBpZihjaGFuZ2VWYWx1ZS52YWx1ZU9iaiAhPSB1bmRlZmluZWQgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgPT0gZGVwZW5kZW5jeU9iai5zb3VyY2VRdWVzdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC5pc0hpZGRlbkZpZWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGlmKGRlcGVuZGVuY3lPYmouZGVwZW5kZW50VmFsdWUgPT0gY2hhbmdlVmFsdWUudmFsdWVPYmope1xuICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbnB1dCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50LmRlcGVuZGVudFJlZiA9PSBjaGFuZ2VWYWx1ZS5yZWZlcmVuY2VGaWVsZCl7XG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZWZlcmVuY2VGaWVsZCA9IGNoYW5nZVZhbHVlLnJlZmVyZW5jZUZpZWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaXNIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlucHV0ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlRGVwZW5kZW50RWxlbWVudHMoZWxlbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGRlcGVuZGVudCBzZWxlY3Rpb24gcmVtb3ZlIHRoZSByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC5kZXBlbmRlbnRSZWYgPT0gY2hhbmdlVmFsdWUucmVmZXJlbmNlRmllbGQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZWZlcmVuY2VGaWVsZCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS51cGRhdGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgICAvLyBzdW5kYXkgY29tbWVudFxuICAgICAgLy8gaWYgKGVsZW1lbnQudHlwZSA9PT0gJ0NhbGVuZGFyJykge1xuICAgICAgLy8gICB0aGlzLm9wZW5DYWxlbmRhckNvbXBvbmVudChlbGVtZW50KTtcbiAgICAgIC8vIH1cbiAgICB9KTtcbiAgICB0aGlzLnN1YlF1ZXN0aW9ucyA9IFtdO1xuICAgIHRoaXMuc2V0U3ViUXVlc3Rpb25zKHRoaXMucXVlc3Rpb25zKTtcbiAgICB0aGlzLnByb2Nlc3NUcmFuc2xhdGVkUXVlc3Rpb25zKCk7IFxuICB9XG4vLyBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2VcbiAgaGlkZURlcGVuZGVudEVsZW1lbnRzKGVsZW1lbnRJZCkge1xuICAgIGxldCBlbGVtZW50c1RvSGlkZSA9IHRoaXMucXVlc3Rpb25zLmZpbHRlcihlbCA9PiB7XG4gICAgICAgIGlmIChlbC5zdWJUZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGVwT2JqID0gSlNPTi5wYXJzZShlbC5zdWJUZXh0KTtcbiAgICAgICAgICAgIHJldHVybiBkZXBPYmouc291cmNlUXVlc3Rpb25JZCA9PSBlbGVtZW50SWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgZWxlbWVudHNUb0hpZGUuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGVsLmlzSGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgZWwuaW5wdXQgPSAnJztcbiAgICAgICAgZWwuc2VsZWN0ZWRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS51cGRhdGUoZWwpO1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBoaWRlIGVsZW1lbnRzIGRlcGVuZGVudCBvbiB0aGlzIG9uZVxuICAgICAgICB0aGlzLmhpZGVEZXBlbmRlbnRFbGVtZW50cyhlbC5pZCk7XG4gICAgfSk7XG59XG5cbiAgY2xlYXJTUUVycm9yKHF1ZXNJZCkge1xuICAgIHZhciBzcUxpc3QgPSB0aGlzLnN1YlF1ZXN0aW9ucz8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkID09IHF1ZXNJZCk7XG4gICAgZm9yICh2YXIgc3Egb2Ygc3FMaXN0KSB7XG4gICAgICBzcS5lcnJvciA9IG51bGw7XG4gICAgfVxuICB9XG4gLy8gVkQgMTFKdW4yNCAtIHRyYW5zbGF0aW9uIGNoYW5nZXNcbiAgcHJvY2Vzc1RyYW5zbGF0ZWRRdWVzdGlvbnMoKXtcbiAgICBpZiAodGhpcy50cmFuc2xhdGVkUXVlc3Rpb25zICYmIHRoaXMudHJhbnNsYXRlZFF1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9ucy5mb3JFYWNoKChvcmdRdWVzdGlvbjogYW55KT0+IHtcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZWRRdWVzdGlvbnMuZm9yRWFjaCgodHJhbnNRdWVzdGlvbjphbnkpID0+IHtcbiAgICAgICAgICAgICBpZihvcmdRdWVzdGlvbi51bmlxdWVJZGVudGlmaWVyID09IHRyYW5zUXVlc3Rpb24uaWRlbnRpZmllcil7XG4gICAgICAgICAgICAgICBvcmdRdWVzdGlvbi5xdWVzdGlvblRleHQgPSB0cmFuc1F1ZXN0aW9uLmxhYmVsO1xuICAgICAgICAgICAgICAgb3JnUXVlc3Rpb24ucXVlc3Rpb24gPSB0cmFuc1F1ZXN0aW9uLnBsYWNlSG9sZGVyO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIC8vICBjb25zb2xlLmxvZygnb3JpZ2luYWxRdWVzdGlvbicgKyB0aGlzLnF1ZXN0aW9ucyk7XG4gICAgLy8gIGNvbnNvbGUubG9nKHRoaXMucXVlc3Rpb25zKTtcbiAgICB9XG4gIH1cblxuICBzZXRTdWJRdWVzdGlvbnMocmVjb3Jkcykge1xuICAgIHRoaXMuc3ViUXVlc3Rpb25zLnB1c2gocmVjb3Jkcyk7XG4gIH1cblxuICAvLyBDYXB0dXJlIGFuZCBQcm9jZXNzIENoaWxkIEV2ZW50XG4gIGNoaWxkRXZlbnRDYXB0dXJlKGV2ZW50LCBxdWVzPzphbnkpIHtcbiAgICBsZXQgZHJvcGRvd25EYXRhID0gIHt9O1xuICAgIHRoaXMuY2hhbmdlU2VydmljZS5hbm5vdW5jZUNoYW5nZShldmVudCk7XG4gICAgaWYocXVlcyl7XG4gICAgICBpZihxdWVzLnR5cGUgPT0gJ0Ryb3Bkb3duJyB8fHF1ZXMudHlwZSA9PSAnUmFkaW8nICkge1xuICAgICAgICAvLyBIQSAxOUpBTjI0IENvcnJlY3Rpb24gb2YgZHJvcGRvd24gdmFsdWVzXG4gICAgICAgIHF1ZXMuc2VsZWN0ZWRPYmogPSBldmVudC52YWx1ZU9iaiA/IGV2ZW50LnZhbHVlT2JqIDogbnVsbDtcbiAgICAgICAgcXVlcy5pbnB1dCA9IGV2ZW50LnNlbGVjdGVkT2JqID8gZXZlbnQuc2VsZWN0ZWRPYmogOiBldmVudC52YWx1ZU9iajtcbiAgICAgICAgcXVlcy5zZWxlY3RlZFZhbHVlID0gZXZlbnQudmFsdWVPYmogPyBldmVudC52YWx1ZU9iaiA6IG51bGw7XG4gICAgICAgIC8vIGVtaXQgdGhlIGRyb3Bkb3duIGRhdGEgdG8gcGFyZW50XG4gICAgICAgIGRyb3Bkb3duRGF0YVsnZXZlbnQnXSA9IGV2ZW50LnZhbHVlT2JqO1xuICAgICAgICBkcm9wZG93bkRhdGFbJ3F1ZXMnXSA9IHF1ZXM7XG4gICAgICAgIGlmKGRyb3Bkb3duRGF0YVsnZXZlbnQnXSl7XG4gICAgICAgICAgdGhpcy5oYW5kbGVEcm9wRG93bi5lbWl0KGRyb3Bkb3duRGF0YSk7XG4gICAgICAgIH0gIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXG4gICAgICB9IGVsc2UgaWYocXVlcy50eXBlID09ICdMb2NhdGlvbicpe1xuICAgICAgICBxdWVzLmlucHV0ID0gZXZlbnQudmFsdWVPYmo7XG4gICAgICAgIHF1ZXMuc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50LnZhbHVlT2JqLmFkZHJlc3M7XG4gICAgICB9ZWxzZSBpZihxdWVzLnR5cGUgPT0gJ0ZpbGUnKXsgXG4gICAgICAgIHF1ZXMuaW5wdXQgPSB0aGlzLnNlbGVjdGVkRmlsZURhdGEgPSBldmVudDtcblxuXG4gLy8gSGFuZGxlIGZpbGUgdmFsaWRhdGlvbiBlcnJvcnNcbiBpZiAoQXJyYXkuaXNBcnJheShldmVudCkgJiYgZXZlbnQubGVuZ3RoID09PSAwKSB7XG4gIC8vIE5vIGZpbGVzIHVwbG9hZGVkIHdoZW4gcmVxdWlyZWRcbiAgcXVlcy5lcnJvciA9IHF1ZXMuRXJyb3JfTWVzc2FnZV9fYyA/IG5ldyBFcnJvcldyYXBwZXIoKSA6IG51bGw7XG59IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpICYmIGV2ZW50Lmxlbmd0aCA+IDApIHtcbiAgLy8gRmlsZXMgd2VyZSBzdWNjZXNzZnVsbHkgdXBsb2FkZWRcbiAgcXVlcy5lcnJvciA9IG51bGw7XG59XG5cbi8vIElmIHRoZXJlIHdlcmUgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSB0aGUgZmlsZSB1cGxvYWQgY29tcG9uZW50XG5pZiAoZXZlbnQudmFsaWRhdGlvbkVycm9ycyAmJiBldmVudC52YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgcXVlcy5lcnJvciA9IG5ldyBFcnJvcldyYXBwZXIoKTtcbiAgcXVlcy5lcnJvci5tZXNzYWdlID0gZXZlbnQudmFsaWRhdGlvbkVycm9yc1swXTsgLy8gVXNlIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGVycm9yXG59XG5cbiAgICAgIH1lbHNlIGlmKHF1ZXMudHlwZSA9PSAnRGF0ZScgfHwgcXVlcy50eXBlID09ICdEYXRlVGltZScpeyAvLyBIQSAyNEpBTjI0IENvbnZlcnRpbmcgRGF0ZSBhbmQgRGF0ZVRpbWUgdG8gVVRDXG4gICAgICAgICBpZihldmVudC52YWx1ZSl7XG4gICAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZShldmVudC52YWx1ZSk7XG4gICAgICAgICAgbGV0IHV0Y1N0cmluZyA9IGQ/LnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgcXVlcy5pbnB1dCA9IHV0Y1N0cmluZztcbiAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICBxdWVzLmlucHV0ID0gJyc7XG4gICAgICAgICB9XG4gICAgICB9ZWxzZSBpZihxdWVzLnR5cGUgPT0gJ0xpc3QnKXtcbiAgICAgICAgLy8gVkQgMjBBdWcyNCBoYW5kbGluZyB0aGUgbGlzdCB0eXBlICBoYW5kbGUgbXVsdGlwbGUgb2JqZWN0IHZhbHVlc1xuICAgICAgICBxdWVzLmlucHV0ID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShldmVudC52YWx1ZU9iaixldmVudC5maWVsZCk7XG4gICAgICB9Ly9SUyAwNkpBTjI1XG4gICAgLy8gICBlbHNlIGlmIChxdWVzLnR5cGUgPT09ICdSaWNoVGV4dEFyZWEnKSB7ICAgICAgICAgXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKCdSaWNoVGV4dEFyZWEgZXZlbnQ6JywgZXZlbnQpO1xuICAgIC8vICAgICBxdWVzLmlucHV0ID0gZXZlbnQgfHwgJyc7XG4gICAgLy8gfVxuICAgICAgZWxzZXtcbiAgICAgICAgcXVlcy5pbnB1dCA9IGV2ZW50O1xuICAgICAgfVxuICAgICAgLy9SUyAwNkpBTjI1XG4gICAgICAvLyBWYWxpZGF0ZSBlcnJvciBtZXNzYWdlIC0gbW9kaWZpZWQgdG8gaGFuZGxlIHJpY2ggdGV4dFxuICAgICAgICAgIGNvbnN0IGhhc0Vycm9yID0gcXVlcy5FcnJvcl9NZXNzYWdlX19jICYmIChcbiAgICAgICAgICAgIChxdWVzLnR5cGUgPT09ICdGaWxlJyAmJiBxdWVzLmlucHV0Lmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICAvLyB8fFxuICAgICAgICAgICAgLy8gKHF1ZXMudHlwZSA9PT0gJ1JpY2hUZXh0QXJlYScgJiYgKCFxdWVzLmlucHV0IHx8IHF1ZXMuaW5wdXQudHJpbSgpID09PSAnJykpIHx8XG4gICAgICAgICAgICAvLyAocXVlcy50eXBlICE9PSAnRmlsZScgJiYgcXVlcy5UeXBlX19jICE9PSAnUmljaFRleHRBcmVhJyAmJiAhcXVlcy5pbnB1dClcbiAgICAgICAgICApO1xuICAgICAgICAgIHF1ZXMuZXJyb3IgPSBoYXNFcnJvciA/IG5ldyBFcnJvcldyYXBwZXIoKSA6IG51bGw7XG4gICAgICBxdWVzLmVycm9yID0gaGFzRXJyb3IgPyBuZXcgRXJyb3JXcmFwcGVyKCkgOiBudWxsO1xuICAgICAgLy8gT25jZSB0aGUgcmlnaHQgdmFsdWUgaXMgc3RvcmVkIGluIHF1ZXMuaW5wdXQgc3RvcmUgdGhlIHF1ZXMgKHdpdGggaW5wdXQpIGluIHN0b3JhZ2VTZXJ2aWNlXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnVwZGF0ZShxdWVzKTtcbiAgICAgIC8vIFZEIDE5SnVsMDEgLSBnZXQgdXBkYXRlZCBxdWVzdGlvblxuICAgICAgdGhpcy5oYW5kbGVRdWVzdGlvbi5lbWl0KHF1ZXMpO1xuICAgIH1cbiAgfVxuICBkZWxldGVGaWxlKGZpbGVEYXRhOmFueSl7XG4gICAgY29uc29sZS5sb2coJ2ZpbGVEQVRBJyxmaWxlRGF0YSlcbiAgfVxuICBnZXREcm9wRG93bihldmVudDphbnkpe1xuICAgIHRoaXMuaGFkbGVEcm9wRG93bkRlcGVuZGVudC5lbWl0KGV2ZW50KTtcbiAgfVxuLy8gVkQgMDZTZXAyNCBjYWxlbmRhciBjaGFuZ2VzXG4gIGdldEN1cnJlbnRDYWxlbmRhcihldmVudDphbnkpe1xuICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJEYXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgZ2V0Q2FsZW5kYXJFdmVudChldmVudDphbnkpe1xuICAgIGlmKGV2ZW50KXtcbiAgICAgIHRoaXMuaGFuZGxlQ2FsZW5kYXJFdmVudC5lbWl0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuIC8vIFZEIDA2U2VwMjQgcmVtb3ZlIHRoZSBzcGVjaWFsIGNoYXJlY3RlcnMgYW5kIHRhZ3MgXG4gIC8vIGZyb20gdGhlIHF1ZXN0aW9uVGV4dFxuICByZW1vdmVDaGFyYWN0ZXJzKHF1ZXN0aW9uVGV4dDpzdHJpbmcpe1xuICAgICBsZXQgdXBkYXRlZFRleHQgPSBxdWVzdGlvblRleHQ/LnJlcGxhY2UoLzxbXj5dKj4vZywgJycpO1xuICAgICByZXR1cm4gdXBkYXRlZFRleHQ7XG4gIH1cblxuLy8gc3VuZGF5IGNvbW1lbnRcbiAgLy8gb3BlbkNhbGVuZGFyQ29tcG9uZW50KHF1ZXMpIHtcbiAgLy8gICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gdGhpcy5keW5hbWljSG9zdC52aWV3Q29udGFpbmVyUmVmO1xuICAvLyAgIGlmKHZpZXdDb250YWluZXJSZWYpe1xuICAvLyAgICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAvLyAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoQ3VzdG9tQ2FsZW5kYXJDb21wb25lbnQpO1xuICAvLyAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLnF1ZXN0aW9uID0gcXVlcztcbiAgLy8gICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5kYXRlU2VsZWN0ZWQuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB0aGlzLmdldEN1cnJlbnRDYWxlbmRhcihldmVudCkpO1xuICAvLyAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmV2ZW50U2VsZWN0ZWQuc3Vic2NyaWJlKChldmVudDphbnkpID0+IHRoaXMuZ2V0Q2FsZW5kYXJFdmVudChldmVudCkpXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgaXNDYWxlbmRhck1vZGFsT3BlbiA9IGZhbHNlO1xuICBjYWxlbmRhck1vZGFsVGl0bGU6YW55O1xuICBjYWxlbmRhck1vZGFsU2l6ZTphbnk7XG4gIGNhbGVuZGFyU2F2ZUJ1dHRvblZhbHVlOiBhbnk7XG4gIHJlZmVyZW5jZVF1ZXN0aW9ucyA9IFtdO1xuICBxYlJlZnJlbmNlQm9vazphbnk7XG4gIG1vZGFsQ2FsZW5kYXJNb2RhbEZvb3Rlcjphbnk7XG5cbiAgb3BlbkNhbGVuZGFyTW9kYWwoZXZlbnQpIHtcbiAgICB0aGlzLmlzQ2FsZW5kYXJNb2RhbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucWJSZWZyZW5jZUJvb2sgPSBldmVudC5xYlJlZnJlbmNlQm9vaztcbiAgICB0aGlzLnJlZmVyZW5jZVF1ZXN0aW9ucyA9IGV2ZW50LnJlZmVyZW5jZVF1ZXN0aW9ucztcbiAgICB0aGlzLmNhbGVuZGFyTW9kYWxUaXRsZSA9IGV2ZW50Lm1vZGFsVGl0bGU7XG4gICAgdGhpcy5jYWxlbmRhck1vZGFsU2l6ZSA9IGV2ZW50Lm1vZGFsU2l6ZTtcbiAgICB0aGlzLmNhbGVuZGFyU2F2ZUJ1dHRvblZhbHVlID0gZXZlbnQuc2F2ZUJ1dHRvblZhbHVlO1xuICAgIHRoaXMubW9kYWxDYWxlbmRhck1vZGFsRm9vdGVyID0gZXZlbnQubW9kYWxGb290ZXI7XG4gIH1cblxuXG4gIG9uQ2FsZW5kYXJNb2RhbFNhdmUoKXtcbiAgICB0aGlzLmNoYW5nZVNlcnZpY2UuZGF0YUNoYW5nZXMoJ2NhbGVuZGFyLW1vZGFsLXNhdmUnKTtcbiAgfVxuXG5cbiAgaGFuZGxlUXVlc3Rpb25FdmVudChldmVudCl7XG4gICAgY29uc29sZS5sb2coJ2hhbmRsZSBxdWVzdGlvbiBoZXJlJyk7XG4gIH1cbiBcbiAgY2xvc2VDYWxlbmRhck1vZGFsKGV2ZW50KXtcbiAgICB0aGlzLmlzQ2FsZW5kYXJNb2RhbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG59XG4iLCI8IS0tIEhBIDIwREVDMjMgQm9vayBTdHlsZSBmcm9tIHNhbGVzZm9yY2UgLS0+XG48IS0tIEhBIDI4REVDMjMgIFJlbW92ZWQgSXNTaGVuZ2VsKHJlbW92YWwgb2Ygc2hlbmdlbCB2YWx1ZXMgYXBwbGllcyBmb3IgdGhpcyByZWFzb24pIGFuZCBkaXJlY3Qgc3R5bGluZyBvZiBib29rcyB0byBhdm9pZCBzdHlsaW5nIGlzc3Vlcy0tPlxuPCEtLSBIQSAxOEpBTjI0ICBBZGRlZCBjbGFzcyBmb3Igc3R5bGluZyAtLT5cbjxkaXYgW3N0eWxlXT1cImJvb2tTdHlsZVwiIGNsYXNzPVwiY29udGVudC1ib3ggZm9ybS1ncm91cFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8IS0tIEhBIDIwREVDMjMgRGlyZWN0aXZlIGFuZCBRdWVzdGlvbiBTdHlsZSBmcm9tIHNhbGVzZm9yY2UgLS0+XG4gICAgICAgIDwhLS0gUkEwOURFQzI0IENoYW5nZWQga2V5cy0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBbY2xhc3NdPVwiJ2NvbC1sZy0nICsgcXVlcy5zaXplICsgJyBwYWRkaW5nbm9uZSdcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHF1ZXMgb2YgcXVlc3Rpb25zO2xldCBpID0gaW5kZXhcIiBbaWRdPVwicXVlcy5pZFwiIFtkaXJdPVwicXVlcy5sYW5nRGlyZWN0aW9uXCIgW3N0eWxlXT1cInF1ZXM/LnN0eWxlPy5xdWVzdGlvblN0eWxlXCI+XG4gICAgICAgICAgICA8IS0tIFN1YiBRdWVzdGlvbiBMYWJlbCAtLT5cbiAgICAgICAgICAgIDwhLS0gSEEgMjBERUMyMyBMYWJlbCBTdHlsZSBmcm9tIHNhbGVzZm9yY2UgLS0+XG4gICAgICAgICAgICA8IS0tIFZEIDA5TWF5MjQgaXMgaGlkZSBmaWVsZCBjaGFuZ2UtLT5cbiAgICAgICAgIDxkaXYgKm5nSWY9XCIhcXVlcy5pc0hpZGRlblwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0RhdGVUaW1lJ1wiPlxuIFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFZEIDIwSlVOMjQgLSBoZWxwIHRleHQgY2hhbmdlcy0tPlxuICAgICAgICAgICAgPCEtLSBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2UtLT5cbiAgICAgICAgICAgIDwhLS0gLy8gVkQgMDJBdWcyNCAtIGxhYmVsIHZhbHVlIHN0eWxlLS0+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsgZG93bjI6IHFiSXRlbT8ucHJvZ3Jlc3NCYXIgfVwiICpuZ0lmPVwicXVlcy5zdHlsZT8uc2hvd0xhYmVsID8gcXVlcy5zdHlsZT8uc2hvd0xhYmVsIDogdHJ1ZVwiIFtzdHlsZV09XCJxdWVzLnN0eWxlPy5sYWJlbFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIidkaXMtZmxleCBzaGVuZ2VsLW15dC1mb250MyBteXQtZm9udDcgJ1wiIFtzdHlsZV09XCJxdWVzLnN0eWxlPy5sYWJlbFZhbHVlU3R5bGVcIj57eyByZW1vdmVDaGFyYWN0ZXJzKHF1ZXM/LnF1ZXN0aW9uVGV4dCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJxdWVzLmlzT3B0aW9uYWxcIiBzdHlsZT1cImNvbG9yOiByZWQ7XCI+KjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy5xdWVzdGlvblRleHQgJiYgcXVlcz8uaGVscFRleHRcIiBjbGFzcz1cImljb25cIiBbbWF0VG9vbHRpcF09XCJxdWVzPy5oZWxwVGV4dFwiPmk8L2Rpdj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZS0tPlxuICAgICAgICAgICAgPCEtLSBEYXRlVGltZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdEYXRlVGltZSdcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1kYXRlLXBpY2tlciBbbWluRGF0ZV09XCJxdWVzLm1pbkRhdGVcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgW2RhdGVdPVwicXVlcy5pbnB1dFwiIChkYXRlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiBcbiAgICAgICAgICAgICA8IS0tIERhdGUtLT5cbiAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnRGF0ZSdcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1kYXRlICBbZGF0ZV09XCJxdWVzLmlucHV0XCIgW2Vycm9yXT1cInF1ZXMuZXJyb3JcIiBbZXJyb3JNZXNzYWdlXT1cInF1ZXMuZXJyb3JNZXNzYWdlXCIgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiIChkYXRlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tZGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuIFxuICAgICAgICAgICAgIDwhLS0gVGltZS0tPlxuICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdUaW1lJ1wiPlxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLXRpbWUgIFt0aW1lXT1cInF1ZXMuaW5wdXRcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgKHRpbWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS10aW1lPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgIDwhLS0gY2FsZW5kYXIgIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0NhbGVuZGFyJ1wiPlxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cInF1ZXNcIlxuICAgICAgICAgICAgICAgIChldmVudFNlbGVjdGVkKT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGRhdGVTZWxlY3RlZCk9XCJnZXRDdXJyZW50Q2FsZW5kYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5Nb2RhbCk9XCJvcGVuQ2FsZW5kYXJNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xvc2VNb2RhbCk9XCJjbG9zZUNhbGVuZGFyTW9kYWwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvYXBwLWN1c3RvbS1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICA8IS0tIG1vZGVsIHVzZWQgaW4gY2FsZW5kYXIgY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLW1vZGVsICpuZ0lmPVwiaXNDYWxlbmRhck1vZGFsT3BlblwiXG4gICAgICAgICAgICAgICAgICAgIFttb2RhbFRpdGxlXT1cImNhbGVuZGFyTW9kYWxUaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpc01vZGFsT3Blbl09XCJpc0NhbGVuZGFyTW9kYWxPcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgW21vZGFsU2l6ZV09XCJjYWxlbmRhck1vZGFsU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzYXZlQnV0dG9uVmFsdWVdPVwiY2FsZW5kYXJTYXZlQnV0dG9uVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbbW9kYWxGb290ZXJdPVwibW9kYWxDYWxlbmRhck1vZGFsRm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKHNhdmVCdXR0b25FbWl0KT1cIm9uQ2FsZW5kYXJNb2RhbFNhdmUoKVwiXG4gICAgICAgICAgICAgICAgICAgIChjYW5jZWxCdXR0b25FbWl0KT1cImNsb3NlQ2FsZW5kYXJNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgIFtxYkl0ZW1dPVwicWJSZWZyZW5jZUJvb2tcIiBbcXVlc3Rpb25zXT1cInJlZmVyZW5jZVF1ZXN0aW9uc1wiIChoYW5kbGVRdWVzdGlvbik9XCJoYW5kbGVRdWVzdGlvbkV2ZW50KCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLW1vZGVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIFRleHQgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnVGV4dCcgfHwgcXVlcy50eXBlID09PSAnTGluaydcIiA+XG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20taW5wdXQgW3ZhbHVlXT1cInF1ZXMuaW5wdXRcIiBbbmdDbGFzc1ZhbHVlXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICdkaXMtZmxleCBkdC1saW5lIGRhdGUtbGluZSBib29rVGV4dCBib3hvdXRsaW5lIG15dC1mb250MSc6IHFiSXRlbS5wcm9ncmVzc0JhcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCb3g6ICFxYkl0ZW0ucHJvZ3Jlc3NCYXJcbiAgICAgICAgICAgICAgICAgICAgfVwiIFtxdWVzdGlvbl09XCJxdWVzXCIgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiIFtpZFZhbHVlXT1cInF1ZXMudHJhY2tpbmdJZFwiIFtmb2N1c0V2ZW50XT1cImNsZWFyU1FFcnJvcihxdWVzLmlkKVwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJxdWVzLmVycm9yXCIgW3BsYWNlaG9sZGVyXT1cInF1ZXMucXVlc3Rpb25cIiAoaW5wdXRWYWx1ZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgPC9kaXY+XG4gXG4gICAgICAgICAgICA8IS0tIGZvciBwaWNrIGxvY2F0aW9uIC0tPlxuICAgICAgICAgICAgPCEtLSAgIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0xvY2F0aW9uJ1wiPlxuICAgICAgICAgICAgPCEtLSBIQTEwMDEyMDI0IEFkZGVkIEFwaSBrZXkgYXMgaW5wdXQgLS0+XG4gICAgICAgICAgICAgICAgPGFwcC1waWNrLWxvY2F0aW9uIFthcGlLZXldPVwicWJJdGVtWydhcGlLZXknXVwiIFthZGRyZXNzXT1cInF1ZXMuc2VsZWN0ZWRWYWx1ZVwiIFtxdWVzdGlvbl09XCJxdWVzXCIgKGxvY2F0aW9uU2VsZWN0ZWQpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXBpY2stbG9jYXRpb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiBcbiAgICAgICAgICAgIDwhLS0gZm9yICB0ZXh0IGFyZWEgICAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdUZXh0QXJlYSdcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS10ZXh0LWFyZWEgW3F1ZXN0aW9uXT1cInF1ZXNcIiBbcmVhZE9ubHldPVwicXVlcy5pc1JlYWRPbmx5XCIgW3ZhbHVlXT1cInF1ZXMuaW5wdXRcIiBbcm93c109XCIzXCIgW2Vycm9yXT1cInF1ZXMuZXJyb3JcIiBbcGxhY2Vob2xkZXJdPVwicXVlcy5xdWVzdGlvbiBcIlxuICAgICAgICAgICAgICAgICAgICAodGV4dGFyZWFWYWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpXCI+PC9hcHAtY3VzdG9tLXRleHQtYXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBSUyAwNkpBTjI1IC0tPlxuICAgICAgICAgICA8IS0tIGZvciByaWNoIHRleHQgZWRpdG9yIC0tPlxuICAgICAgICAgICA8IS0tIC8vIENoYW5nZXMgY29tbWVudGVkIG91dCBkdWUgdG8gQW5ndWxhciB2ZXJzaW9uIGNvbXBhdGliaWxpdHk7IHdpbGwgYXBwbHkgYWZ0ZXIgdXBncmFkZS4gLS0+XG48IS0tIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdSaWNoVGV4dEFyZWEnXCI+XG4gICAgPGFwcC1jdXN0b20tcmljaC10ZXh0IFxuICAgICAgICBbcXVlc3Rpb25dPVwicXVlc1wiXG4gICAgICAgIFtyZWFkT25seV09XCJxdWVzLmlzUmVhZE9ubHlcIlxuICAgICAgICBbdmFsdWVdPVwicXVlcy5pbnB1dCB8fCAnJ1wiXG4gICAgICAgIFtlcnJvcl09XCJxdWVzLmVycm9yXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInF1ZXMucXVlc3Rpb25cIlxuICAgICAgICAodGV4dFZhbHVlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cbiAgICA8L2FwcC1jdXN0b20tcmljaC10ZXh0PlxuPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICA8IS0tIEVtYWlsIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0VtYWlsJ1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiByZWFkT25seT1cInF1ZXMuaXNSZWFkT25seVwiIFsobmdNb2RlbCldPVwicXVlcy5pbnB1dFwiIFtpZF09XCJxdWVzLmlkXCIgcmVxdWlyZWQ9XCJcIiAoZm9jdXMpPVwiY2xlYXJTUUVycm9yKHF1ZXMuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyLWNvbG9yPVwie3sgcXVlcy5lcnJvciA/ICdyZWQnIDogJycgfX1cIiBwbGFjZWhvbGRlcj1cInt7IHF1ZXMucXVlc3Rpb24gfX1cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gXG4gICAgICAgICAgICA8IS0tIFRhYmxlIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tdGFibGUgW3F1ZXN0aW9uXT1cInF1ZXNcIiBbYXBpTWV0YV09XCJxdWVzLnN1YlRleHRcIiAodmFsdWVDaGFuZ2UpPVwiY2hpbGRFdmVudENhcHR1cmUoJGV2ZW50LCBxdWVzKTsgY2xlYXJTUUVycm9yKHF1ZXMuaWQpXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLXRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gXG4gICAgICAgICAgICAgIDwhLS0gVGFibGUgQXBwZW5kaXggLS0+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzLnR5cGUgPT09ICdUYWJsZUFwcGVuZGl4J1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGFwcC10YWJsZS1hcHBlbmRpeCBbcXVlc3Rpb25dPVwicXVlc1wiICh2YWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpOyBjbGVhclNRRXJyb3IocXVlcy5pZClcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC10YWJsZS1hcHBlbmRpeD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDwhLS0gbGlzdCAtLT5cbiAgICAgICAgICAgICA8IS0tIFZEIDIwQXVnMjQgdXNlZCBjb3JyZWN0IGF0dHJpYnV0ZSAtLT5cbiAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnTGlzdCdcIiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDxsaWItc2VhcmNoLWJveCBbcXVlc3Rpb25dPVwicXVlc1wiIFtyZWFkT25seV09XCJxdWVzLmlzUmVhZE9ubHlcIiBbYXBpTWV0YV09XCJxdWVzLnN1YlRleHRcIiBbaWRdPVwicXVlcy5pZFwiIFtwbGFjZUhvbGRlclRleHRdPVwicXVlcy5xdWVzdGlvblwiICBbZmlsdGVyTmFtZV09XCJxdWVzLmlucHV0XCIgKHNlYXJjaFZhbHVlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIj5cbiAgICAgICAgICAgICAgICA8L2xpYi1zZWFyY2gtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gXG4gICAgICAgICAgICA8IS0tIERyb3Bkb3duIC0tPlxuICAgICAgICAgICAgPCEtLSBIQSAwOUZFQjI0IEFkZGVkIGNvbmRpdGlvbiBvZiBzcU9wdGlvbiB0byB0aGUgZHJvcGRvd24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcz8udHlwZSA9PT0gJ0Ryb3Bkb3duJyAmJiBxdWVzPy5vcHRpb25zXCIgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEhBIDIwREVDMjMgRm9yIFRyYW5zbGF0aW9uIC0tPiA8IS0tIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0IC0tPlxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLWRyb3Bkb3duIFtvcHRpb25zXT1cInF1ZXMub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFt0b2tlbl09XCJ0b2tlblwiXG4gICAgICAgICAgICAgICAgICAgIFthcGlNZXRhXT1cInF1ZXMuc3ViVGV4dFwiIFtpZF09XCJxdWVzLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwicXVlcy5zZWxlY3RlZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCItLS17eydzZWxlY3QnIHwgaTE4bjppMThuU2VydmljZS5jdXJyZW50TGFuZ3VhZ2V9fS0tLVwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VGaWVsZF09XCJxdWVzLnJlZmVyZW5jZUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcyk7IGNsZWFyU1FFcnJvcihxdWVzLmlkKVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZWNrIFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiICpuZ0lmPVwicXVlcz8uaW5wdXQ/Lmxlbmd0aCA+IDBcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gLy8gVkQgMDJBdWcyNCBjdXN0b20tcmFkaW8gY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ1JhZGlvJyAmJiBxdWVzPy5vcHRpb25zXCIgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1yYWRpbyBbb3B0aW9uc109XCJxdWVzLm9wdGlvbnNcIiBbdG9rZW5dPVwidG9rZW5cIlxuICAgICAgICAgICAgICAgICAgICBbYXBpTWV0YV09XCJxdWVzLnN1YlRleHRcIiBbaWRdPVwicXVlcy5pZFwiIFtzZWxlY3RlZFZhbHVlXT1cInF1ZXMuc2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtlcnJvck1lc3NhZ2VdPVwicXVlcy5lcnJvck1lc3NhZ2VcIiBbZXJyb3JdPVwicXVlcy5lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VGaWVsZF09XCJxdWVzLnJlZmVyZW5jZUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cInF1ZXMuaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpOyBjbGVhclNRRXJyb3IocXVlcy5pZClcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tcmFkaW8+XG4gICAgICAgICAgICA8L2Rpdj5cbiBcbiAgICAgICAgICAgIDwhLS0gQXR0YWNobWVudCAvIEZpbGVzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0ZpbGUnXCIgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWZpbGUtdXBsb2FkIFtsaW1pdEZpbGVVcGxvYWRpbmddPVwiNVwiIFtlcnJvcl09XCJxdWVzLmVycm9yXCIgW3F1ZXN0aW9uXT1cInF1ZXNcIiBbYWxsRmlsZXNdPVwicXVlcy5pbnB1dFwiIFt0YWJsZUZpbGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZEZpbGVEYXRhKT1cImNoaWxkRXZlbnRDYXB0dXJlKCRldmVudCwgcXVlcylcIiAoZGVsZXRlZEZpbGVEYXRhKT1cImRlbGV0ZUZpbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2lzRGVsZXRlRmlsZUJ1dHRvblZpc2libGVdPVwidHJ1ZVwiPjwvYXBwLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlcy50eXBlID09PSAnUG9wVXBNZXNzYWdlJ1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGFwcC1kZXBlbmRlbnQtdGFibGUgW2FsZXJ0TWVzc2FnZV09XCJxdWVzLmVycm9yTWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLWRlcGVuZGVudC10YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0xhYmVsJ1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tbGFiZWwgW2xhYmVsU3R5bGVdPVwicXVlcy50aXRsZVwiIFtsYWJlbFZhbHVlXT1cInF1ZXMucXVlc3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8IS0tIC8vIFZEIDAyQXVnMjQgaW1hZ2UgY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0ltYWdlJ1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgPGFwcC1jdXN0b20taW1hZ2UgW3F1ZXN0aW9uXT1cInF1ZXNcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20taW1hZ2U+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gMDhOT1YyMyAtIGJ1dHRvbiB0eXBlIHF1ZXN0aW9uIGFkZGVkIC0tPlxuICAgICAgICAgICAgIDwhLS0gQnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0J1dHRvbidcIiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLWJ1dHRvbiBbaGVpZ2h0XT1cIic1MHB4J1wiXG4gICAgICAgICAgICAgICAgW3dpZHRoXT1cIicxNTBweCdcIlxuICAgICAgICAgICAgICAgIFtidXR0b25UZXh0XT1cInF1ZXM/LnF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicXVlcz8ucXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgIChidXR0b25WYWx1ZSk9XCJjaGlsZEV2ZW50Q2FwdHVyZSgkZXZlbnQsIHF1ZXMpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSBIQSAyMERFQzIzICBUaGlzIGlzIHRvIGxvYWQgYm9vayB0eXBlIHF1ZXN0aW9ucy0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXMudHlwZSA9PT0gJ0Jvb2snXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBIQSAwOUZFQjI0IEFkZGVkIHRlcm5hcnkgb3BlcmF0b3IgLS0+XG4gICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxdWVzLnFiSXRlbVwiIFtsYWJlbFZhbHVlXT1cImxhYmVsVmFsdWVcIiBbcXVlc3Rpb25zXT1cInF1ZXMucWJJdGVtPy5zdWJRdWVzdGlvbnNcIiAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPCEtLSAwNi0wOS0yNCBmb3IgY2FsZW5kYXIgdHlwZS0tPlxuPCEtLSA8bmctdGVtcGxhdGUgZHluYW1pY0NvbXBvbmVudEhvc3Q+PC9uZy10ZW1wbGF0ZT4gLS0+Il19