@rangertechnologies/ngnxt 2.1.254 → 2.1.255

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 (78) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +138 -169
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  4. package/package.json +4 -6
  5. package/rangertechnologies-ngnxt-2.1.255.tgz +0 -0
  6. package/esm2022/environments/version.mjs +0 -15
  7. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -154
  8. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -360
  9. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -263
  10. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -53
  11. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -158
  12. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1744
  13. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -292
  14. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -106
  15. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  16. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  17. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  18. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  19. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  27. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  28. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  29. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  30. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  31. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  32. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  33. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  34. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -392
  35. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2972
  36. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -105
  37. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -220
  38. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -470
  39. package/esm2022/lib/country.json +0 -43237
  40. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  41. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  42. package/esm2022/lib/model/bookletWrapper.mjs +0 -7
  43. package/esm2022/lib/model/changeWrapper.mjs +0 -10
  44. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  45. package/esm2022/lib/nxt-app.component.mjs +0 -22
  46. package/esm2022/lib/nxt-app.module.mjs +0 -115
  47. package/esm2022/lib/nxt-app.service.mjs +0 -14
  48. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -616
  49. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -483
  50. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -48
  51. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -97
  52. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1121
  53. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -35
  54. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -639
  55. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1114
  56. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -784
  57. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2206
  58. package/esm2022/lib/pipe/button-styles.pipe.mjs +0 -26
  59. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -37
  60. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -54
  61. package/esm2022/lib/pipe/question-by-row.pipe.mjs +0 -51
  62. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -40
  63. package/esm2022/lib/pipe/svg/svg.pipe.mjs +0 -26
  64. package/esm2022/lib/sample.mjs +0 -3715
  65. package/esm2022/lib/services/change/change.service.mjs +0 -46
  66. package/esm2022/lib/services/country/country.service.mjs +0 -135
  67. package/esm2022/lib/services/data/data.service.mjs +0 -100
  68. package/esm2022/lib/services/form-builder/form-builder.service.mjs +0 -474
  69. package/esm2022/lib/services/pdf-designer/pdf-designer.service.mjs +0 -395
  70. package/esm2022/lib/services/salesforce/salesforce.service.mjs +0 -41
  71. package/esm2022/lib/services/shared/shared.service.mjs +0 -100
  72. package/esm2022/lib/services/storage/storage.service.mjs +0 -59
  73. package/esm2022/lib/services/template/template.service.mjs +0 -335
  74. package/esm2022/lib/services/translation/translation.service.mjs +0 -121
  75. package/esm2022/lib/wrapper.mjs +0 -175
  76. package/esm2022/public-api.mjs +0 -22
  77. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  78. package/rangertechnologies-ngnxt-2.1.254.tgz +0 -0
@@ -1,483 +0,0 @@
1
- // AP 22JAN25 - form preview and All form elements
2
- import { Component, EventEmitter, Input, Output, } from "@angular/core";
3
- import { VERSION } from "../../../../environments/version";
4
- import { CommonModule } from "@angular/common";
5
- import { FormsModule } from "@angular/forms";
6
- import { BookletComponent } from "../../booklet/booklet.component";
7
- import { NxtDatatable } from "../../../components/datatable/datatable.component";
8
- import { CustomDropdownComponent } from "../../../components/custom-dropdown/custom-dropdown.component";
9
- import { NxtCustomTranslatePipe } from "../../../pipe/custom-translate.pipe";
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../../services/form-builder/form-builder.service";
12
- import * as i2 from "../../../services/translation/translation.service";
13
- import * as i3 from "@angular/common";
14
- import * as i4 from "@angular/forms";
15
- export class ElementComponent {
16
- cdRef;
17
- formBuilderService;
18
- translationService;
19
- bookletJSON;
20
- bookletId;
21
- langOption;
22
- languageCode = 'en';
23
- templateMode = new EventEmitter();
24
- field;
25
- formElements = [];
26
- elements = [];
27
- bookId;
28
- sections = {
29
- basic: true, // Basic Elements open by default
30
- advanced: true, // Advanced Elements closed by default
31
- };
32
- basicElements = [];
33
- advancedElements = [];
34
- //elementDisabledArray: any;
35
- version = VERSION.version; //SKS10MAR25 get version from environment/version.ts
36
- book;
37
- selectedElement = null;
38
- isSelectTablePopup = false;
39
- currentType;
40
- addTable = true;
41
- dots = Array(6);
42
- draggedIndex = null;
43
- templateSelected = false;
44
- isHeaderSelect = false;
45
- selectedColumn;
46
- constructor(cdRef, formBuilderService, translationService) {
47
- this.cdRef = cdRef;
48
- this.formBuilderService = formBuilderService;
49
- this.translationService = translationService;
50
- }
51
- // AP-06MAR25 Basic elements updated (RichTextArea, Date added)
52
- ngOnInit() {
53
- this.basicElements = [
54
- { type: "Text", img: "Text", label: "Text" },
55
- { type: "Number", img: "Number", label: "Number" },
56
- { type: "Label", img: "Label", label: "Label" },
57
- { type: "Email", img: "Email", label: "Email" },
58
- { type: "Date", img: "Date", label: "Date" },
59
- { type: "Time", img: "Time", label: "Time" },
60
- { type: "DateTime", img: "DateTime", label: "DateTime" },
61
- { type: "Calendar", img: "Calendar", label: "Calendar" },
62
- { type: "File", img: "File", label: "Files" },
63
- { type: "Image", img: "Image", label: "Image" },
64
- { type: "Checkbox", img: "CheckBox", label: "Checkbox" },
65
- { type: "Radio", img: "Radio", label: "Radio" },
66
- { type: "Dropdown", img: "Drop", label: "Dropdown" },
67
- { type: "TextArea", img: "TextArea", label: "Text Area" },
68
- { type: "RichTextArea", img: "RichText", label: "Rich Text" },
69
- ];
70
- this.advancedElements = [
71
- { type: "Icon", img: "Icon", label: "Icon" }, //MSM10JUL25 icon selector component
72
- { type: "Line", img: "line", label: "Line" },
73
- { type: "Space", img: "space", label: "Space" },
74
- { type: "Boolean", img: "Boolean", label: "Boolean" },
75
- { type: "Book", img: "Search", label: "Book" },
76
- { type: "List", img: "Search", label: "List" },
77
- { type: "Table", img: "Table", label: "Table" },
78
- { type: "Button", img: "Button", label: "Button" },
79
- ];
80
- // this.elementDisabledArray = {
81
- // Table: [
82
- // 'Book', 'Calendar',"Boolean", 'List', 'Table', 'Checkbox', 'Radio',
83
- // 'Dropdown', 'TextArea', 'RichTextArea', 'Number', 'Label', 'Image',
84
- // 'Email', 'Date', 'Time', 'DateTime', 'Line', 'Space'
85
- // ]
86
- // };
87
- this.formBuilderService.formElements$.subscribe((elements) => {
88
- setTimeout(() => {
89
- this.formElements = elements.map((field) => ({ ...field }));
90
- }, 0);
91
- });
92
- if (this.bookletJSON && this.bookletJSON !== "") {
93
- this.initializeForm();
94
- }
95
- else {
96
- this.formBuilderService.newBook();
97
- }
98
- // AP-12MAR25 - Added to handle bookletId
99
- if (this.bookletId) {
100
- localStorage.setItem("unique_id", this.bookletId);
101
- }
102
- this.book = this.formBuilderService.getBook();
103
- this.formBuilderService.selectedElement$.subscribe((index) => {
104
- const elements = this.formBuilderService.getElements();
105
- if (index >= 0) {
106
- this.selectedElement = elements[index];
107
- }
108
- // SKS19MAR25 for fieldMeta checking
109
- if (this.selectedElement?.type === "Table") {
110
- this.selectedElement["fieldsMeta"] =
111
- typeof this.selectedElement.fieldsMeta === "string"
112
- ? this.selectedElement.fieldsMeta
113
- : JSON.stringify(this.selectedElement["fieldsMeta"] || []);
114
- }
115
- // this.formElements = [...elements]
116
- });
117
- this.formBuilderService.addElementWithId();
118
- this.translationService.formBuilderTranslationsLoaded$.subscribe(() => {
119
- this.cdRef.detectChanges(); // Force pipe re-evaluation
120
- });
121
- }
122
- // Add these methods
123
- toggleSection(section) {
124
- this.sections[section] = !this.sections[section];
125
- }
126
- isSectionOpen(section) {
127
- return this.sections[section];
128
- }
129
- // AP - 26FEB25 - Added ngOnChanges to handle changes in bookletJSON
130
- ngOnChanges(changes) {
131
- if (changes["bookletJSON"] && changes["bookletJSON"].currentValue) {
132
- if (this.bookletJSON && this.bookletJSON !== "") {
133
- // AP-28MAY25 - Check and transform `action` if it's in Existing format
134
- if (this.bookletJSON.questionbook &&
135
- this.bookletJSON.questionbook.action &&
136
- typeof this.bookletJSON.questionbook.action === "string") {
137
- try {
138
- const parsedActions = JSON.parse(this.bookletJSON.questionbook.action);
139
- // AP-28MAY25 Assign specific positionPercent based on action name
140
- const newActions = parsedActions.map((item, index) => {
141
- const positionPercent = item.name === "Cancel"
142
- ? 3
143
- : item.name === "Save"
144
- ? 14
145
- : 10 + index * 10;
146
- return {
147
- ...item,
148
- positionPercent: positionPercent,
149
- width: 100,
150
- textColor: "#ffffff",
151
- borderRadius: 6,
152
- id: index + 1,
153
- };
154
- });
155
- // AP-28MAY25 Replace the old action string with the newly formatted array
156
- this.bookletJSON.questionbook.action = newActions;
157
- }
158
- catch (e) {
159
- console.error("Error parsing action JSON string:", e);
160
- }
161
- }
162
- this.initializeForm();
163
- }
164
- else {
165
- this.formBuilderService.newBook();
166
- }
167
- }
168
- }
169
- // AP-08APR25 Template is selected, update form elements and emit template mode
170
- onTemplateSelected(event) {
171
- this.formBuilderService.clearElements();
172
- event.elements.forEach((el) => this.formBuilderService.addElement(el));
173
- // Emit template mode to parent
174
- this.templateMode.emit(true);
175
- }
176
- initializeForm() {
177
- if (!this.bookletJSON || !this.bookletJSON.bookQuestionsMap) {
178
- console.warn("Invalid bookletJSON structure");
179
- return;
180
- }
181
- this.formElements = [];
182
- this.formBuilderService.clearElements();
183
- this.formBuilderService.intializeBook(this.bookletJSON);
184
- this.formElements = this.formBuilderService.getElements();
185
- }
186
- // Add this method to handle element selection
187
- selectElement(index) {
188
- this.isHeaderSelect = false;
189
- this.selectedColumn = null;
190
- this.selectedFieldIndex = index; // element is selected
191
- this.formBuilderService.setSelectedElement(index);
192
- this.book = this.formBuilderService.getBook();
193
- }
194
- selectedFieldIndex = null; // element is cleared
195
- selectHeading(event) {
196
- this.isHeaderSelect = true;
197
- this.selectedFieldIndex = null;
198
- this.selectedColumn = null;
199
- this.formBuilderService.selectHeading(event); //AP-10MAR25 Updates the selected heading in the service
200
- this.book = this.formBuilderService.getBook(); //AP-10MAR25 Retrieves the updated book/form data
201
- }
202
- // AP-17APR25 generateUiId
203
- generateUiId() {
204
- return this.formBuilderService.addElementWithId();
205
- }
206
- addElement(type) {
207
- const unique_id = this.generateUiId();
208
- this.currentType = type;
209
- if (this.selectedElement?.type === "Table" && this.addTable) {
210
- this.isSelectTablePopup = true;
211
- }
212
- else {
213
- const newElement = {
214
- action: null,
215
- id: unique_id,
216
- type,
217
- name: null,
218
- questionText: null,
219
- question: null,
220
- helpText: null,
221
- errorMessage: null,
222
- isReadOnly: false,
223
- isHidden: false,
224
- required: false,
225
- referenceField: null,
226
- additionalRichContent: null,
227
- groupName: null,
228
- isDateBackward: false,
229
- title: null,
230
- subTitle: null,
231
- size: 12,
232
- isDateForward: false,
233
- isOptional: false,
234
- isTitle: false,
235
- nextQuestion: null,
236
- allowedFileExtensions: null,
237
- questionNumber: this.formBuilderService.getElements().length + 1,
238
- order: this.formElements.length + 1,
239
- questionBookId: this.bookletId,
240
- fieldsMeta: [],
241
- trackingId: null,
242
- recordId: null,
243
- qbReference: null,
244
- qbReferenceQuestions: null,
245
- primaryKey: false,
246
- style: {
247
- labelClass: null,
248
- labelStyle: null,
249
- labelValueStyle: null,
250
- inputClass: null,
251
- inputStyle: null,
252
- showLabel: true,
253
- bookStyle: null,
254
- direction: "ltr",
255
- questionStyle: null,
256
- },
257
- subText: {
258
- endpoint: null,
259
- variable: null,
260
- field: null,
261
- defaultField: null,
262
- sourceQuestionId: null,
263
- valueField: null,
264
- labelField: null,
265
- isDependentField: false,
266
- dependentValue: null,
267
- queryField: null,
268
- queryValue: null,
269
- queryValueReference: null,
270
- uniqueKey: null,
271
- },
272
- imageData: null,
273
- boolean: false,
274
- options: type === "Dropdown" || type === "TableColumn" || type === "Radio" || type === "Checkbox"
275
- ? []
276
- : null,
277
- imageSize: type === "Image" ? { width: 150, height: 150 } : null,
278
- tableConfig: type === "Table"
279
- ? {
280
- isNosIndicator: true,
281
- addInlineRecord: true,
282
- isPagination: true,
283
- actionButton: true,
284
- isDeleteRow: true,
285
- isEditRow: true,
286
- searchBar: true,
287
- isButtons: true,
288
- itemsPerPage: 10,
289
- }
290
- : null,
291
- };
292
- this.formBuilderService.addElement(newElement);
293
- this.formElements = this.formBuilderService.getElements();
294
- // SKS19MAR25 fieldsmeta check
295
- this.formElements = this.updateTableFieldsMeta(this.formElements);
296
- this.addTable = true;
297
- }
298
- }
299
- // Remove an element by index
300
- removeElement(field, index) {
301
- this.formBuilderService.removeElementComponent(field.id);
302
- this.formElements = this.formBuilderService.getElements();
303
- // SKS19MAR25 fieldsmeta check
304
- this.formElements = this.updateTableFieldsMeta(this.formElements);
305
- }
306
- onDragStart(event, index) {
307
- this.draggedIndex = index;
308
- event.dataTransfer?.setData("text/plain", index.toString());
309
- }
310
- // Allow dropping by preventing default
311
- onDragOver(event, index) {
312
- event.preventDefault();
313
- }
314
- // Handle drop event
315
- onDrop(event, dropIndex) {
316
- event.preventDefault();
317
- if (this.draggedIndex === null || this.draggedIndex === dropIndex)
318
- return;
319
- const draggedItem = this.formElements[this.draggedIndex];
320
- // Remove dragged item from old position and insert it in new position
321
- this.formElements.splice(this.draggedIndex, 1);
322
- this.formElements.splice(dropIndex, 0, draggedItem);
323
- //AP-28MAR25 Update questionNumber dynamically based on new order
324
- this.formElements.forEach((element, index) => {
325
- element.questionNumber = index + 1;
326
- });
327
- // Reset dragged index
328
- this.draggedIndex = null;
329
- // Notify service about the update
330
- this.formBuilderService.updateElementsOrder(this.formElements);
331
- }
332
- toggleBoolean(field) {
333
- field.boolean = !field.boolean;
334
- }
335
- // SKS13MAR25 table popup conformation based element add
336
- onClose() {
337
- this.isSelectTablePopup = false;
338
- this.addTable = false;
339
- this.addElement(this.currentType);
340
- }
341
- // SKS13MAR25 column element add inside a table
342
- addOnTable() {
343
- this.addTable = true;
344
- this.isSelectTablePopup = false;
345
- const elements = [...this.formBuilderService.getElements()];
346
- // Find the element and update its columns
347
- const index = elements.findIndex((el) => el.id === this.selectedElement.id);
348
- const rowNum = this.formElements[index].fieldsMeta
349
- ? this.formElements[index].fieldsMeta?.length
350
- : 0;
351
- const unique_id = this.generateUiId();
352
- const tableElement = {
353
- label: `HEADER LABEL ${rowNum}`,
354
- fieldName: `FIELD NAME ${rowNum}`,
355
- type: this.currentType,
356
- id: unique_id,
357
- };
358
- this.formBuilderService.addTableElement(tableElement, this.selectedFieldIndex);
359
- this.formElements = this.formBuilderService.getElements();
360
- // SKS19MAR25 fieldsmeta checking
361
- this.formElements = this.updateTableFieldsMeta(this.formElements);
362
- }
363
- updateTableFieldsMeta(elements) {
364
- return elements.map((ele) => {
365
- if (ele.type === "Table") {
366
- ele.fieldsMeta =
367
- typeof ele.fieldsMeta === "string"
368
- ? ele.fieldsMeta
369
- : JSON.stringify(ele.fieldsMeta || []);
370
- }
371
- return ele;
372
- });
373
- }
374
- columnSelected(event) {
375
- // SKS19MAR25 table column update
376
- this.formElements.forEach((ele, index) => {
377
- if (ele.type === 'Table' && Array.isArray(ele.fieldsMeta)) {
378
- const matchedField = ele.fieldsMeta.find((field) => field.uniqueIdentifier === event?.uniqueIdentifier);
379
- if (matchedField) {
380
- this.formBuilderService.setSelectedElement(index);
381
- this.selectedFieldIndex = index;
382
- }
383
- }
384
- });
385
- this.formBuilderService.setSelectedTableElement(this.selectedFieldIndex, event);
386
- this.selectedColumn = event?.uniqueIdentifier;
387
- }
388
- removeColumn(event) {
389
- this.formBuilderService.removeSelectedTableElement(this.selectedFieldIndex, event);
390
- this.selectedColumn = null;
391
- }
392
- // SKS25MAR25 image add
393
- async fileChangeEvent(index, event) {
394
- const file = event.target.files[0];
395
- if (file) {
396
- try {
397
- const imageData = await this.readFileAsDataURL(file);
398
- this.formElements[index].imageData = imageData;
399
- this.formElements[index].orgImageData = imageData;
400
- // Initialize logo size if not already set
401
- if (!this.formElements[index].imageSize) {
402
- this.formElements[index].imageSize = { width: 150, height: 150 };
403
- }
404
- await this.formBuilderService.elementUpdate(index, this.formElements[index]);
405
- }
406
- catch (error) {
407
- console.error("Error reading file:", error);
408
- }
409
- }
410
- }
411
- readFileAsDataURL(file) {
412
- return new Promise((resolve, reject) => {
413
- const reader = new FileReader();
414
- reader.onload = () => resolve(reader.result);
415
- reader.onerror = (error) => reject(error);
416
- reader.readAsDataURL(file);
417
- });
418
- }
419
- // SKS28JUL25 formbuilder language code change
420
- langChangeEmit(event) {
421
- this.languageCode = event.valueObj;
422
- this.book = this.formBuilderService.getBook();
423
- this.translationService.setFormBuilderTranslations(this.book.translationMap);
424
- const unique_id = Object.keys(this.book.bookQuestionsMap)[0];
425
- const keysToTranslate = ['questionText', 'helpText', 'question', 'label'];
426
- this.book.bookQuestionsMap[unique_id]?.subQuestions?.forEach(element => {
427
- keysToTranslate.forEach(key => {
428
- element[key] = this.translationService.formBuilderTranslate(`${element.id}.${key}`, this.languageCode) ? this.translationService.formBuilderTranslate(`${element.id}.${key}`, this.languageCode) : null;
429
- });
430
- if (element?.['options'] !== undefined && element?.['options'] !== null && Array.isArray(element['options'])) {
431
- element['options'].forEach(opt => {
432
- opt.label = this.translationService.formBuilderTranslate(`${opt.id}.label`, this.languageCode) ? this.translationService.formBuilderTranslate(`${opt.id}.label`, this.languageCode) : null;
433
- });
434
- }
435
- if (element.type === 'Table' && element?.fieldsMeta) {
436
- if (!Array.isArray(element?.fieldsMeta) && typeof element?.fieldsMeta === 'string') {
437
- element.fieldsMeta = JSON.parse(element?.fieldsMeta);
438
- }
439
- element?.fieldsMeta?.forEach(field => {
440
- keysToTranslate.forEach(key => {
441
- if (key !== 'question')
442
- field[key] = this.translationService.formBuilderTranslate(`${field.uniqueIdentifier}.${key}`, this.languageCode) ? this.translationService.formBuilderTranslate(`${field.uniqueIdentifier}.${key}`, this.languageCode) : null;
443
- });
444
- if (field?.question?.['options'] !== undefined && field?.question?.['options'] !== null && Array.isArray(field?.question?.['options'])) {
445
- field.question['options'].forEach(opt => {
446
- opt.label = this.translationService.formBuilderTranslate(`${opt.id}.label`, this.languageCode) ? this.translationService.formBuilderTranslate(`${opt.id}.label`, this.languageCode) : null;
447
- });
448
- }
449
- });
450
- }
451
- });
452
- this.book?.questionbook?.action?.forEach((act) => {
453
- act.name = this.translationService.formBuilderTranslate(`${act.id}.name`, this.languageCode);
454
- });
455
- this.formElements = [...this.book.bookQuestionsMap[unique_id]?.subQuestions];
456
- this.formBuilderService.updateBook(this.book);
457
- this.translationService.setFormBuilderLanguage(this.languageCode);
458
- }
459
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormBuilderService }, { token: i2.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
460
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ElementComponent, isStandalone: true, selector: "app-element", inputs: { bookletJSON: "bookletJSON", bookletId: "bookletId", langOption: "langOption", languageCode: "languageCode" }, outputs: { templateMode: "templateMode" }, usesOnChanges: true, ngImport: i0, template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"center-frame\">\n <!-- Form Builder Section All Elements -->\n <div class=\"form-builder\">\n <!-- Basic Elements Toggle -->\n <div class=\"toggle-header\" (click)=\"toggleSection('basic')\">\n <div class=\"head-elements\">{{ 'BASIC_ELEMENTS' | nxtCustomTranslate : 'Basic Elements' }}</div>\n <img [src]=\"sections.basic ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"sections.basic\">\n <ng-container *ngFor=\"let element of basicElements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Advanced Elements Toggle -->\n <div class=\"toggle-header\" (click)=\"toggleSection('advanced')\">\n <div class=\"head-elements\">{{ 'ADVANCED_ELEMENTS' | nxtCustomTranslate : 'Advanced Elements' }}</div>\n <img [src]=\"sections.advanced ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"sections.advanced\">\n <ng-container *ngFor=\"let element of advancedElements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n <!-- AP-08APR25 Add Templates Component -->\n <!-- <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div style=\" display: flex; justify-content: space-between; width: 100%; gap: 10px;\">\n <div class=\"label-container field-container\"\n style=\"padding: 10px; width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;display: flex;justify-content: center;margin-bottom:10px; border-radius: 5px;\"\n [class.highlight]=\"isHeaderSelect\" (click)=\"selectHeading('Header')\">\n <div *ngIf=\"book?.records\">\n <div *ngIf=\"book.records[0].title == ''\" style=\"color:#3f4a525c\">Heading</div>\n <div *ngIf=\"book.records[0].title !== ''\">{{book.records[0].title}}</div>\n </div>\n </div>\n <app-custom-dropdown [options]=\"langOption\" [selectedValue]=\"languageCode\" [from]=\"'normalDropDown'\"\n [mode]=\"'edit'\" (valueChange)=\"langChangeEmit($event.value)\"\n style=\"margin-bottom: 10px; background: #eff8ff; border-radius: 5px;\">\n </app-custom-dropdown>\n </div>\n\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n <!-- TextBox -->\n <div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"text\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_TEXT' | nxtCustomTranslate : 'Enter text')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : '' \" />\n </div>\n </div>\n </div>\n\n <!-- MSM-09JUL25 Icon-selectir Element -->\n <div *ngIf=\"field.type === 'Icon'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isRequired\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('CHOOSE_ICON' | nxtCustomTranslate : 'Choose Icon')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"choose-icon-placeholder\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field.type === 'Line'\" class=\"line-field\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF',\n 'border-style': field?.lineStyle?.toLowerCase() || 'solid'\n}\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field.type === 'Image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(i, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isOptional\"></label>\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Boolean Element -->\n <div *ngIf=\"field.type === 'Boolean'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{ field.questionText\n ? field.questionText : ('BOOLEAN' | nxtCustomTranslate : 'Boolean')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"checkbox\" [checked]=\"field.boolean\" (change)=\"toggleBoolean(field)\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n\n <!-- Calendar -->\n <div *ngIf=\"field.type === 'Calendar'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE' | nxtCustomTranslate : 'Select Date')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP -12MAR25 Date -->\n <div *ngIf=\"field.type === 'Date'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE' | nxtCustomTranslate : 'Select Date')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP-21MAR25 Add Time element -->\n <!-- Time Field -->\n <div *ngIf=\"field.type === 'Time'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isOptional\">{{ field.questionText ? field.questionText : ('TIME' |\n nxtCustomTranslate : 'Time') }}</label>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"time\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP-28MAR25 DateTime -->\n <div *ngIf=\"field.type === 'DateTime'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE_TIME' | nxtCustomTranslate : 'Select Date &\n Time')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"datetime-local\" class=\"custom-input\" [readonly]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n </div>\n\n <!-- Email -->\n <div *ngIf=\"field.type === 'Email'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\"> {{ field.questionText ? field.questionText : ('LABEL' |\n nxtCustomTranslate : 'Label') }}\n </label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"email\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_EMAIL' | nxtCustomTranslate : 'Enter email')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- Numbers -->\n <div *ngIf=\"field.type === 'Number'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"number\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_NUMBER' | nxtCustomTranslate : 'Enter number')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field.type === 'TextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('ENTER_YOUR_TEXT' | nxtCustomTranslate : 'Enter your\n text')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"field.question || ('ENTER_DETAILED_TEXT' | nxtCustomTranslate : 'Enter detailed text here...')\"\n [style.height.px]=\"field.size || 100\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\"></textarea>\n </div>\n </div>\n </div>\n\n <!-- RichText -->\n <div *ngIf=\"field.type === 'RichTextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('ENTER_YOUR_TEXT' | nxtCustomTranslate : 'Enter your\n text')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"field.question ||('ENTER_DETAILED_TEXT' | nxtCustomTranslate : 'Enter detailed text here...')\"\n [style.height.px]=\"field.size || 100\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\"></textarea>\n </div>\n </div>\n </div>\n\n <!-- Label -->\n <div *ngIf=\"field.type === 'Label'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Book -->\n <div *ngIf=\"field.type === 'Book'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <lib-booklet [bookletJSON]=\"field.qbReferenceQuestions\"></lib-booklet>\n </div>\n </div>\n </div>\n\n <!-- File -->\n <div *ngIf=\"field.type === 'File'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('UPLOAD_FILE' | nxtCustomTranslate : 'Upload File')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"file\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n </div>\n\n <!-- CheckBox -->\n <div *ngIf=\"field.type === 'Checkbox'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n }\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">\n {{ field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}\n </label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n\n <div class=\"checkbox-options-container\">\n <div *ngFor=\"let option of field.options\" class=\"checkbox-option\">\n <input type=\"checkbox\" [id]=\"option.value + i\" [name]=\"field.id\"\n [value]=\"option.value || field.defaultValue\" class=\"checkbox-input\" [disabled]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\">\n <label [for]=\"option.value + i\" class=\"checkbox-label\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngIf=\"field.type === 'Radio'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"radio-options-container\">\n <div *ngFor=\"let option of field.options; let j = index\" class=\"radio-option\">\n <input type=\"radio\" [id]=\"'radio-' + field.id + '-' + j\" [name]=\"'radio-group-' + field.id\"\n [value]=\"option.value || field.defaultValue\" [(ngModel)]=\"field.selectedValue\" class=\"radio-input\"\n [disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <label [for]=\"'radio-' + field.id + '-' + j\" class=\"radio-label\"> {{ option.label }}</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Dropdown -->\n <div *ngIf=\"field.type === 'Dropdown'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <select id=\"options\" class=\"dropdown\" [disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <option *ngFor=\"let option of field.options\" [value]=\"option.value || field.defaultValue\"> {{ option.label }} </option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"'edit'\" [apiMeta]=\"field.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\" isEditable=true\n [selectedColumn]=\"selectedColumn\" (columnSelected)=columnSelected($event)\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n <!-- List -->\n <!-- AP-06MAR25 - List data show-->\n <div *ngIf=\"field.type === 'List'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"text\" class=\"custom-input\" [placeholder]=\"('SEARCH' | nxtCustomTranslate : 'Search...')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n</div>\n<!-- SKS13MAR25 popup conformation box -->\n<div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element:hover img{filter:invert(1)}.form-builder .element:hover .hover-label{color:#fff}.form-builder .element:hover .dot{background-color:#ffffffb3}.form-builder .element .drag-dots:active{cursor:grabbing}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.drag-dot{height:13px}.field-wrapper,.line-field{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.line-field{width:100%;margin:10px 0;padding:3px}.field-container{padding:0 5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right{opacity:1;visibility:visible}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:space-between;align-items:center}.label-container:hover .delete-icon{opacity:1;visibility:visible}.label-container label{font-size:15px;font-weight:400}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin:-10px -10px 0 0;background-color:#d7edff;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s,visibility .1s}.custom-input,.custom-textarea,.dropdown{width:100%;padding:8px;border:1px solid #ccc;background-color:#fff;border-radius:5px;outline:none}.custom-input{border-color:#dddbda}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.custom-textarea{min-height:100px;resize:vertical}.dropdown{font-size:14px;color:#333;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.checkbox-options-container,.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;border-radius:6px;outline:none;width:100%}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.form-preview{width:100%;height:fit-content;max-height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px}.required:after{content:\" *\";color:red;margin-left:5px}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.delete-icon{width:19px;height:19px;margin-top:-5px}.element.disabled{opacity:.5;cursor:not-allowed}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;inset:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-container{display:flex;flex-direction:column;padding:10px;border:1px dashed #ccc;border-radius:5px;background-color:#f9f9f9}.logo-preview{position:relative;border:1px solid #e0e0e0;background-color:#fff;overflow:hidden}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.choose-icon-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:150px;border:2px dashed #ccc;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: BookletComponent, selector: "lib-booklet", inputs: ["bookletId", "serv", "tkn", "bookletJSON", "allIcons", "themeColor", "cdnIconURL", "dropdownDependentData", "labelValue", "token", "languageCode", "fieldRestrictions", "from", "apiUrl", "isEdit", "direction", "dataBind"], outputs: ["handleBookletActionEvent", "handlePage", "hadleDropDownDependent", "handleCalendarDate", "handleCalendarEvent"] }, { kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "component", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: ["options", "placeholder", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "question", "referenceField", "token", "mode", "from"], outputs: ["valueChange"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
461
- }
462
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, decorators: [{
463
- type: Component,
464
- args: [{ selector: "app-element", standalone: true, imports: [
465
- CommonModule,
466
- FormsModule,
467
- BookletComponent,
468
- NxtDatatable,
469
- CustomDropdownComponent,
470
- NxtCustomTranslatePipe
471
- ], template: "<!-- AP 22JAN25 - form preview and All form elements -->\n<!-- AP 25FEB25 - All elements update -->\n<div class=\"center-frame\">\n <!-- Form Builder Section All Elements -->\n <div class=\"form-builder\">\n <!-- Basic Elements Toggle -->\n <div class=\"toggle-header\" (click)=\"toggleSection('basic')\">\n <div class=\"head-elements\">{{ 'BASIC_ELEMENTS' | nxtCustomTranslate : 'Basic Elements' }}</div>\n <img [src]=\"sections.basic ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"sections.basic\">\n <ng-container *ngFor=\"let element of basicElements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\" class=\"element-icon\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Advanced Elements Toggle -->\n <div class=\"toggle-header\" (click)=\"toggleSection('advanced')\">\n <div class=\"head-elements\">{{ 'ADVANCED_ELEMENTS' | nxtCustomTranslate : 'Advanced Elements' }}</div>\n <img [src]=\"sections.advanced ? '../assets/icons/arrow-down.svg' : '../assets/icons/arrow-right.svg'\"\n alt=\"Toggle Arrow\" class=\"arrow-icon\">\n </div>\n\n <div *ngIf=\"sections.advanced\">\n <ng-container *ngFor=\"let element of advancedElements\">\n <div class=\"element\" (click)=\"addElement(element.type)\">\n <img src=\"../assets/icons/{{ element.img }}.svg\">\n <div class=\"hover-label\">{{ element.label }}</div>\n <div class=\"drag-dots\">\n <div class=\"dot\" *ngFor=\"let dot of dots\"></div>\n </div>\n </div>\n </ng-container>\n </div>\n <!-- AP-08APR25 Add Templates Component -->\n <!-- <app-templates (templateSelected)=\"onTemplateSelected($event)\"></app-templates> -->\n\n <!-- SKS10MAR25 footer version show -->\n <div class=\"sticky-footer-version\">\n {{version}}\n </div>\n </div>\n <!-- AP-27MAR25 Remove CDK drag and drop replace draggable function -->\n <div class=\"form-preview\">\n <!-- AP-10MAR25 Heading -->\n <div style=\" display: flex; justify-content: space-between; width: 100%; gap: 10px;\">\n <div class=\"label-container field-container\"\n style=\"padding: 10px; width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;display: flex;justify-content: center;margin-bottom:10px; border-radius: 5px;\"\n [class.highlight]=\"isHeaderSelect\" (click)=\"selectHeading('Header')\">\n <div *ngIf=\"book?.records\">\n <div *ngIf=\"book.records[0].title == ''\" style=\"color:#3f4a525c\">Heading</div>\n <div *ngIf=\"book.records[0].title !== ''\">{{book.records[0].title}}</div>\n </div>\n </div>\n <app-custom-dropdown [options]=\"langOption\" [selectedValue]=\"languageCode\" [from]=\"'normalDropDown'\"\n [mode]=\"'edit'\" (valueChange)=\"langChangeEmit($event.value)\"\n style=\"margin-bottom: 10px; background: #eff8ff; border-radius: 5px;\">\n </app-custom-dropdown>\n </div>\n\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n <!-- TextBox -->\n <div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"text\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_TEXT' | nxtCustomTranslate : 'Enter text')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : '' \" />\n </div>\n </div>\n </div>\n\n <!-- MSM-09JUL25 Icon-selectir Element -->\n <div *ngIf=\"field.type === 'Icon'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isRequired\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('CHOOSE_ICON' | nxtCustomTranslate : 'Choose Icon')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"choose-icon-placeholder\">\n </div>\n </div>\n </div>\n </div>\n\n <!-- AP-19MAR25 Line Element -->\n <div *ngIf=\"field.type === 'Line'\" class=\"line-field\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"line-element\">\n <div></div>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n <hr class=\"custom-line\" style=\"display: inline-flex\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF',\n 'border-style': field?.lineStyle?.toLowerCase() || 'solid'\n}\" />\n </div>\n\n <!--SKS25MAR25 Image Upload Element -->\n <div *ngIf=\"field.type === 'Image'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div>\n <div class=\"logo-container\">\n <!-- Logo preview area -->\n <div class=\"logo-preview\" *ngIf=\"field.imageData\">\n <img [src]=\"field.imageData\" />\n </div>\n\n <!-- Upload button -->\n <div *ngIf=\"!field.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>{{ 'UPLOAD_IMAGE' | nxtCustomTranslate : 'Upload Image' }}</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\" (change)=\"fileChangeEvent(i, $event)\"\n style=\"display: none;\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Space Element -->\n <div *ngIf=\"field.type === 'Space'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"height:93px\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isOptional\"></label>\n <div class=\"top-right\" style=\"margin: -11px -11px 0 0;\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Boolean Element -->\n <div *ngIf=\"field.type === 'Boolean'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{ field.questionText\n ? field.questionText : ('BOOLEAN' | nxtCustomTranslate : 'Boolean')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"checkbox\" [checked]=\"field.boolean\" (change)=\"toggleBoolean(field)\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n\n <!-- Calendar -->\n <div *ngIf=\"field.type === 'Calendar'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE' | nxtCustomTranslate : 'Select Date')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP -12MAR25 Date -->\n <div *ngIf=\"field.type === 'Date'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE' | nxtCustomTranslate : 'Select Date')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n\n </div>\n <input type=\"date\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP-21MAR25 Add Time element -->\n <!-- Time Field -->\n <div *ngIf=\"field.type === 'Time'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <label [class.required]=\"field.isOptional\">{{ field.questionText ? field.questionText : ('TIME' |\n nxtCustomTranslate : 'Time') }}</label>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"time\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- AP-28MAR25 DateTime -->\n <div *ngIf=\"field.type === 'DateTime'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('SELECT_DATE_TIME' | nxtCustomTranslate : 'Select Date &\n Time')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"datetime-local\" class=\"custom-input\" [readonly]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n </div>\n\n <!-- Email -->\n <div *ngIf=\"field.type === 'Email'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\"> {{ field.questionText ? field.questionText : ('LABEL' |\n nxtCustomTranslate : 'Label') }}\n </label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"email\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_EMAIL' | nxtCustomTranslate : 'Enter email')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- Numbers -->\n <div *ngIf=\"field.type === 'Number'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"number\" class=\"custom-input\"\n [placeholder]=\"field.question || ('ENTER_NUMBER' | nxtCustomTranslate : 'Enter number')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n <!-- TextArea -->\n <div *ngIf=\"field.type === 'TextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('ENTER_YOUR_TEXT' | nxtCustomTranslate : 'Enter your\n text')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"field.question || ('ENTER_DETAILED_TEXT' | nxtCustomTranslate : 'Enter detailed text here...')\"\n [style.height.px]=\"field.size || 100\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\"></textarea>\n </div>\n </div>\n </div>\n\n <!-- RichText -->\n <div *ngIf=\"field.type === 'RichTextArea'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('ENTER_YOUR_TEXT' | nxtCustomTranslate : 'Enter your\n text')}}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <textarea class=\"custom-textarea\"\n [placeholder]=\"field.question ||('ENTER_DETAILED_TEXT' | nxtCustomTranslate : 'Enter detailed text here...')\"\n [style.height.px]=\"field.size || 100\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\"></textarea>\n </div>\n </div>\n </div>\n\n <!-- Label -->\n <div *ngIf=\"field.type === 'Label'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Book -->\n <div *ngIf=\"field.type === 'Book'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <lib-booklet [bookletJSON]=\"field.qbReferenceQuestions\"></lib-booklet>\n </div>\n </div>\n </div>\n\n <!-- File -->\n <div *ngIf=\"field.type === 'File'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('UPLOAD_FILE' | nxtCustomTranslate : 'Upload File')\n }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"file\" class=\"custom-input\" [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\" />\n </div>\n </div>\n </div>\n\n <!-- CheckBox -->\n <div *ngIf=\"field.type === 'Checkbox'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n }\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">\n {{ field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}\n </label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n\n <div class=\"checkbox-options-container\">\n <div *ngFor=\"let option of field.options\" class=\"checkbox-option\">\n <input type=\"checkbox\" [id]=\"option.value + i\" [name]=\"field.id\"\n [value]=\"option.value || field.defaultValue\" class=\"checkbox-input\" [disabled]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\">\n <label [for]=\"option.value + i\" class=\"checkbox-label\">{{ option.label }}</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Radio -->\n <div *ngIf=\"field.type === 'Radio'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"radio-options-container\">\n <div *ngFor=\"let option of field.options; let j = index\" class=\"radio-option\">\n <input type=\"radio\" [id]=\"'radio-' + field.id + '-' + j\" [name]=\"'radio-group-' + field.id\"\n [value]=\"option.value || field.defaultValue\" [(ngModel)]=\"field.selectedValue\" class=\"radio-input\"\n [disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <label [for]=\"'radio-' + field.id + '-' + j\" class=\"radio-label\"> {{ option.label }}</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Dropdown -->\n <div *ngIf=\"field.type === 'Dropdown'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <select id=\"options\" class=\"dropdown\" [disabled]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\">\n <option *ngFor=\"let option of field.options\" [value]=\"option.value || field.defaultValue\"> {{ option.label }} </option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Table -->\n <!-- AP-06MAR25 -->\n <div *ngIf=\"field.type === 'Table'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\" style=\"overflow: hidden;\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <div class=\"nxt-table-container\">\n <nxt-datatable isButtons [question]=\"field\" from=\"formBuilder\" [mode]=\"'edit'\" [apiMeta]=\"field.subText\"\n [tableConfig]=\"field.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\" isEditable=true\n [selectedColumn]=\"selectedColumn\" (columnSelected)=columnSelected($event)\n (removeColumn)=removeColumn($event)>\n </nxt-datatable>\n </div>\n </div>\n </div>\n </div>\n\n <!-- List -->\n <!-- AP-06MAR25 - List data show-->\n <div *ngIf=\"field.type === 'List'\" class=\"field-container\" (click)=\"selectElement(i)\" [ngStyle]=\"{\n 'font-family': field?.font || 'Helvetica Neue',\n 'font-weight': field?.fontWeight || '400',\n 'font-size': field?.fontSize || '14px',\n 'width': field?.size ? (field.size / 12 * 100) + '%' : '100%',\n 'text-align': field?.textAlign || 'left',\n 'border-radius': '5px',\n 'border-width': field?.lineWidth ? field.lineWidth + 'px' : '1px',\n 'color': field?.fontColor || '#000000',\n 'margin-top': field?.paddingTop ? field.paddingTop + 'px' : '0px',\n 'margin-bottom': field?.paddingBottom ? field.paddingBottom + 'px' : '10px',\n 'border-color': field?.color || '#EFF8FF'\n}\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\" (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\" (drop)=\"onDrop($event, i)\">\n <div class=\"field-wrapper\">\n <div class=\"field-content\">\n <div class=\"label-container\">\n <div>\n <label [class.required]=\"field.isOptional\" *ngIf=\"field.style?.showLabel !== false\">{{\n field.questionText ? field.questionText : ('LABEL' | nxtCustomTranslate : 'Label') }}</label>\n </div>\n <div class=\"top-right\">\n <img src=\"../assets/icons/drag-dots.svg\" alt=\"Drag\" class=\"drag-dot\" />\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeElement(field, i)\" class=\"delete-icon\" />\n </div>\n </div>\n <input type=\"text\" class=\"custom-input\" [placeholder]=\"('SEARCH' | nxtCustomTranslate : 'Search...')\"\n [readonly]=\"field.isReadOnly\" [class.hidden]=\"field.isHidden\"\n [value]=\"field.defaultValue ? field.defaultValue : ''\" />\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n</div>\n<!-- SKS13MAR25 popup conformation box -->\n<div class=\"dialog-overlay\" *ngIf=\"isSelectTablePopup\">\n <div class=\"dialog-box\">\n <button class=\"close-btn-fb\" (click)=\"onClose()\">\u2715</button>\n <p>{{ 'ADD_TABLE_CONFIRMATION' | nxtCustomTranslate : 'These element want to add a table' }}</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">{{ 'YES' | nxtCustomTranslate : 'Yes' }}</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">{{ 'NO' | nxtCustomTranslate : 'No' }}</button>\n </div>\n </div>\n</div>", styles: [".center-frame{display:flex;border-right-width:0}.head-elements{font-size:17px;font-weight:600}.form-builder{width:33.33%;height:calc(100vh - 20px);overflow-y:auto;background-color:#fff;padding:10px;border-right:10px solid #86A8CD;box-shadow:2px 2px 10px #0000001a}.form-builder .element{display:flex;align-items:center;gap:15px;margin-top:10px;padding:10px;border-radius:5px;background:#f8fafc;cursor:pointer;border-left:10px solid #E2F1FF;position:relative;color:#000}.form-builder .element:hover{background:#0250d9;color:#fff;border-left:10px solid #234465}.form-builder .element:hover img{filter:invert(1)}.form-builder .element:hover .hover-label{color:#fff}.form-builder .element:hover .dot{background-color:#ffffffb3}.form-builder .element .drag-dots:active{cursor:grabbing}.form-builder .element img{width:20px;height:20px;transition:filter .3s ease}.form-builder .hover-label{font-size:15px;font-weight:400;color:#000;transition:color .3s ease}.form-builder .section-title{font-weight:700;font-size:16px;margin-top:10px;padding:5px;border-bottom:1px solid #ddd;color:#000;display:flex;justify-content:space-between;align-items:center}.form-builder .section-title:after{content:\"\\25bc\";font-size:12px;color:#555}.form-builder .section{margin-bottom:10px}.toggle-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;padding:10px}.arrow-icon{width:19px;height:23px;transition:transform .3s ease}.toggle-header:hover .arrow-icon{transform:scale(1.1)}.drag-dots{display:grid;grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(3,1fr);gap:3px;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.dot{width:5px;height:5px;border-radius:50%;background-color:#cbd5e1;transition:background-color .3s ease}.drag-dot{height:13px}.field-wrapper,.line-field{background-color:#eff8ff;border:1px solid #E6F3FF;border-radius:5px;padding:10px}.line-field{width:100%;margin:10px 0;padding:3px}.field-container{padding:0 5px;transition:background .2s}.field-container:hover .top-right,.field-container.highlight .top-right{opacity:1;visibility:visible}.field-content{display:flex;flex-direction:column;gap:5px}.label-container{display:flex;justify-content:space-between;align-items:center}.label-container:hover .delete-icon{opacity:1;visibility:visible}.label-container label{font-size:15px;font-weight:400}.top-right{display:flex;gap:10px;padding:6px;border:1px solid #d7edff;margin:-10px -10px 0 0;background-color:#d7edff;opacity:0;visibility:hidden;cursor:grab;transition:opacity .1s,visibility .1s}.custom-input,.custom-textarea,.dropdown{width:100%;padding:8px;border:1px solid #ccc;background-color:#fff;border-radius:5px;outline:none}.custom-input{border-color:#dddbda}.custom-input:focus{border-color:#00008b;box-shadow:0 0 5px #0000ff80}.custom-textarea{min-height:100px;resize:vertical}.dropdown{font-size:14px;color:#333;cursor:pointer}.dropdown:focus{border-color:#007bff;box-shadow:0 0 5px #007bff80}.checkbox-options-container,.radio-options-container{display:flex;flex-direction:column;gap:5px;padding:8px;min-height:38px;border:1px solid #DDDBDA;background-color:#fff;border-radius:6px;outline:none;width:100%}.checkbox-option,.radio-option{display:flex;align-items:center;gap:8px;padding:8px;background-color:#fff;border-radius:4px;transition:background-color .2s ease}.checkbox-option:hover{background-color:#f1f3f5}.checkbox-input,.radio-input{width:18px;height:18px;accent-color:#4dabf7;cursor:pointer}.checkbox-label,.radio-label{font-size:14px;color:#495057;cursor:pointer;-webkit-user-select:none;user-select:none}.radio-input:checked{border-color:#007bff;background-color:#007bff}.radio-input:checked:after{content:\"\";width:8px;height:8px;background:#fff;border-radius:50%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.form-preview{width:100%;height:fit-content;max-height:calc(100vh - 20px);overflow-y:auto;display:flex;flex-wrap:wrap;align-items:flex-start;padding:10px}.required:after{content:\" *\";color:red;margin-left:5px}.highlight{border:2px solid #5592FD!important;background-color:#eff8ff}.delete-icon{width:19px;height:19px;margin-top:-5px}.element.disabled{opacity:.5;cursor:not-allowed}.table-container label{font-size:14px;font-weight:700;margin-bottom:5px;display:block}.nxt-table-container{display:flex;justify-content:center;align-items:center;width:100%}nxt-datatable{width:100%!important;table-layout:fixed;max-width:100%}.dialog-overlay{position:fixed;inset:0;background:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000}.dialog-box{background:#fff;padding:20px;border-radius:5px;text-align:center;width:300px;position:relative}.close-btn-fb{position:absolute;top:4px;right:4px;background:#ff4242;color:#fff;border:none;border-radius:50%;width:20px;height:20px;font-size:10px;cursor:pointer}.button-container-fb{display:flex;justify-content:flex-end;gap:10px}.yes-btn-fb{background:green;color:#fff;border:none;padding:0 12px;border-radius:5px;cursor:pointer}.no-btn-fb{background:gray;color:#fff;border:none;padding:8px 15px;border-radius:5px;cursor:pointer}.line-element{width:100%;display:flex;justify-content:space-between;align-items:center}.custom-line{width:100%;border:1px solid #000}.logo-container{display:flex;flex-direction:column;padding:10px;border:1px dashed #ccc;border-radius:5px;background-color:#f9f9f9}.logo-preview{position:relative;border:1px solid #e0e0e0;background-color:#fff;overflow:hidden}.logo-upload-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:150px;height:150px;border:2px dashed #ccc;cursor:pointer}.logo-upload-label{display:flex;flex-direction:column;align-items:center;cursor:pointer;color:#666}.logo-upload-label img{width:32px;height:32px;margin-bottom:8px}.sticky-footer-version{position:fixed;bottom:0;padding:10px;text-align:center}.choose-icon-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;width:48px;height:150px;border:2px dashed #ccc;cursor:pointer}\n"] }]
472
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.FormBuilderService }, { type: i2.TranslationService }], propDecorators: { bookletJSON: [{
473
- type: Input
474
- }], bookletId: [{
475
- type: Input
476
- }], langOption: [{
477
- type: Input
478
- }], languageCode: [{
479
- type: Input
480
- }], templateMode: [{
481
- type: Output
482
- }] } });
483
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9lbGVtZW50L2VsZW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNqRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUd4RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7O0FBZ0I3RSxNQUFNLE9BQU8sZ0JBQWdCO0lBNEJQO0lBQWtDO0lBQWdEO0lBM0I3RixXQUFXLENBQU07SUFDakIsU0FBUyxDQUFNO0lBQ2YsVUFBVSxDQUFNO0lBQ2hCLFlBQVksR0FBTyxJQUFJLENBQUM7SUFDdkIsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDckQsS0FBSyxDQUFNO0lBQ1gsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLE1B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SSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQzt3R0EvZFUsZ0JBQWdCOzRGQUFoQixnQkFBZ0IsK1BDakM3Qix5dTZDQXkxQk0sdzhMRGwwQkYsWUFBWSxvVkFDWixXQUFXLCtnQ0FDWCxnQkFBZ0IsMlpBQ2hCLFlBQVksKzdCQUNaLHVCQUF1QixxUkFDdkIsc0JBQXNCOzs0RkFLYixnQkFBZ0I7a0JBZDVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLHVCQUF1Qjt3QkFDdkIsc0JBQXNCO3FCQUN6Qjt3SkFLVSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBUCAyMkpBTjI1IC0gZm9ybSBwcmV2aWV3IGFuZCBBbGwgZm9ybSBlbGVtZW50c1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvdmVyc2lvblwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEJvb2tsZXRDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYm9va2xldC9ib29rbGV0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTnh0RGF0YXRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnRcIjtcbmltcG9ydCB7IEN1c3RvbURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2NvbXBvbmVudHMvY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnRcIjtcbmltcG9ydCB7IEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLWJ1aWxkZXIvZm9ybS1idWlsZGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi90cmFuc2xhdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOeHRDdXN0b21UcmFuc2xhdGVQaXBlIH0gZnJvbSBcIi4uLy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcHAtZWxlbWVudFwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEJvb2tsZXRDb21wb25lbnQsXG4gICAgTnh0RGF0YXRhYmxlLFxuICAgIEN1c3RvbURyb3Bkb3duQ29tcG9uZW50LFxuICAgIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGVcbl0sXG4gIHRlbXBsYXRlVXJsOiBcIi4vZWxlbWVudC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZWxlbWVudC5jb21wb25lbnQuY3NzXCJdLFxufSlcbmV4cG9ydCBjbGFzcyBFbGVtZW50Q29tcG9uZW50IHtcbiAgQElucHV0KCkgYm9va2xldEpTT046IGFueTtcbiAgQElucHV0KCkgYm9va2xldElkOiBhbnk7XG4gIEBJbnB1dCgpIGxhbmdPcHRpb246IGFueTtcbiAgQElucHV0KCkgbGFuZ3VhZ2VDb2RlOiBhbnkgPSdlbic7XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZU1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIGZpZWxkOiBhbnk7XG4gIGZvcm1FbGVtZW50czogYW55W10gPSBbXTtcbiAgZWxlbWVudHM6IGFueVtdID0gW107XG4gIGJvb2tJZDogc3RyaW5nO1xuICBzZWN0aW9ucyA9IHtcbiAgICBiYXNpYzogdHJ1ZSwgLy8gQmFzaWMgRWxlbWVudHMgb3BlbiBieSBkZWZhdWx0XG4gICAgYWR2YW5jZWQ6IHRydWUsIC8vIEFkdmFuY2VkIEVsZW1lbnRzIGNsb3NlZCBieSBkZWZhdWx0XG4gIH07XG4gIGJhc2ljRWxlbWVudHM6IGFueVtdID0gW107XG4gIGFkdmFuY2VkRWxlbWVudHM6IGFueVtdID0gW107XG4gIC8vZWxlbWVudERpc2FibGVkQXJyYXk6IGFueTtcbiAgdmVyc2lvbiA9IFZFUlNJT04udmVyc2lvbjsgLy9TS1MxME1BUjI1IGdldCB2ZXJzaW9uIGZyb20gZW52aXJvbm1lbnQvdmVyc2lvbi50c1xuICBib29rOiBhbnk7XG4gIHNlbGVjdGVkRWxlbWVudDogYW55ID0gbnVsbDtcbiAgaXNTZWxlY3RUYWJsZVBvcHVwOiBib29sZWFuID0gZmFsc2U7XG4gIGN1cnJlbnRUeXBlOiBzdHJpbmc7XG4gIGFkZFRhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgZG90cyA9IEFycmF5KDYpO1xuICBkcmFnZ2VkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICB0ZW1wbGF0ZVNlbGVjdGVkID0gZmFsc2U7XG4gIGlzSGVhZGVyU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkQ29sdW1uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGZvcm1CdWlsZGVyU2VydmljZTogRm9ybUJ1aWxkZXJTZXJ2aWNlLCBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlKSB7fVxuLy8gQVAtMDZNQVIyNSBCYXNpYyBlbGVtZW50cyB1cGRhdGVkIChSaWNoVGV4dEFyZWEsIERhdGUgYWRkZWQpXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYmFzaWNFbGVtZW50cyA9IFtcbiAgICAgIHsgdHlwZTogXCJUZXh0XCIsIGltZzogXCJUZXh0XCIsIGxhYmVsOiBcIlRleHRcIiB9LFxuICAgICAgeyB0eXBlOiBcIk51bWJlclwiLCBpbWc6IFwiTnVtYmVyXCIsIGxhYmVsOiBcIk51bWJlclwiIH0sXG4gICAgICB7IHR5cGU6IFwiTGFiZWxcIiwgaW1nOiBcIkxhYmVsXCIsIGxhYmVsOiBcIkxhYmVsXCIgfSxcbiAgICAgIHsgdHlwZTogXCJFbWFpbFwiLCBpbWc6IFwiRW1haWxcIiwgbGFiZWw6IFwiRW1haWxcIiB9LFxuICAgICAgeyB0eXBlOiBcIkRhdGVcIiwgaW1nOiBcIkRhdGVcIiwgbGFiZWw6IFwiRGF0ZVwiIH0sXG4gICAgICB7IHR5cGU6IFwiVGltZVwiLCBpbWc6IFwiVGltZVwiLCBsYWJlbDogXCJUaW1lXCIgfSxcbiAgICAgIHsgdHlwZTogXCJEYXRlVGltZVwiLCBpbWc6IFwiRGF0ZVRpbWVcIiwgbGFiZWw6IFwiRGF0ZVRpbWVcIiB9LFxuICAgICAgeyB0eXBlOiBcIkNhbGVuZGFyXCIsIGltZzogXCJDYWxlbmRhclwiLCBsYWJlbDogXCJDYWxlbmRhclwiIH0sXG4gICAgICB7IHR5cGU6IFwiRmlsZVwiLCBpbWc6IFwiRmlsZVwiLCBsYWJlbDogXCJGaWxlc1wiIH0sXG4gICAgICB7IHR5cGU6IFwiSW1hZ2VcIiwgaW1nOiBcIkltYWdlXCIsIGxhYmVsOiBcIkltYWdlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJDaGVja2JveFwiLCBpbWc6IFwiQ2hlY2tCb3hcIiwgbGFiZWw6IFwiQ2hlY2tib3hcIiB9LFxuICAgICAgeyB0eXBlOiBcIlJhZGlvXCIsIGltZzogXCJSYWRpb1wiLCBsYWJlbDogXCJSYWRpb1wiIH0sXG4gICAgICB7IHR5cGU6IFwiRHJvcGRvd25cIiwgaW1nOiBcIkRyb3BcIiwgbGFiZWw6IFwiRHJvcGRvd25cIiB9LFxuICAgICAgeyB0eXBlOiBcIlRleHRBcmVhXCIsIGltZzogXCJUZXh0QXJlYVwiLCBsYWJlbDogXCJUZXh0IEFyZWFcIiB9LFxuICAgICAgeyB0eXBlOiBcIlJpY2hUZXh0QXJlYVwiLCBpbWc6IFwiUmljaFRleHRcIiwgbGFiZWw6IFwiUmljaCBUZXh0XCIgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5hZHZhbmNlZEVsZW1lbnRzID0gW1xuICAgICAgeyB0eXBlOiBcIkljb25cIiwgaW1nOiBcIkljb25cIiwgbGFiZWw6IFwiSWNvblwiIH0sIC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudFxuICAgICAgeyB0eXBlOiBcIkxpbmVcIiwgaW1nOiBcImxpbmVcIiwgbGFiZWw6IFwiTGluZVwiIH0sXG4gICAgICB7IHR5cGU6IFwiU3BhY2VcIiwgaW1nOiBcInNwYWNlXCIsIGxhYmVsOiBcIlNwYWNlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJCb29sZWFuXCIsIGltZzogXCJCb29sZWFuXCIsIGxhYmVsOiBcIkJvb2xlYW5cIiB9LFxuICAgICAgeyB0eXBlOiBcIkJvb2tcIiwgaW1nOiBcIlNlYXJjaFwiLCBsYWJlbDogXCJCb29rXCIgfSxcbiAgICAgIHsgdHlwZTogXCJMaXN0XCIsIGltZzogXCJTZWFyY2hcIiwgbGFiZWw6IFwiTGlzdFwiIH0sXG4gICAgICB7IHR5cGU6IFwiVGFibGVcIiwgaW1nOiBcIlRhYmxlXCIsIGxhYmVsOiBcIlRhYmxlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJCdXR0b25cIiwgaW1nOiBcIkJ1dHRvblwiLCBsYWJlbDogXCJCdXR0b25cIiB9LFxuICAgIF07XG4gICAgLy8gdGhpcy5lbGVtZW50RGlzYWJsZWRBcnJheSA9IHtcbiAgICAvLyAgIFRhYmxlOiBbXG4gICAgLy8gICAgICdCb29rJywgJ0NhbGVuZGFyJyxcIkJvb2xlYW5cIiwgJ0xpc3QnLCAnVGFibGUnLCAnQ2hlY2tib3gnLCAnUmFkaW8nLFxuICAgIC8vICAgICAnRHJvcGRvd24nLCAnVGV4dEFyZWEnLCAnUmljaFRleHRBcmVhJywgJ051bWJlcicsICdMYWJlbCcsICdJbWFnZScsXG4gICAgLy8gICAgICdFbWFpbCcsICdEYXRlJywgJ1RpbWUnLCAnRGF0ZVRpbWUnLCAnTGluZScsICdTcGFjZSdcbiAgICAvLyAgIF1cbiAgICAvLyB9O1xuXG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZm9ybUVsZW1lbnRzJC5zdWJzY3JpYmUoKGVsZW1lbnRzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtRWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGZpZWxkKSA9PiAoeyAuLi5maWVsZCB9KSk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5ib29rbGV0SlNPTiAmJiB0aGlzLmJvb2tsZXRKU09OICE9PSBcIlwiKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLm5ld0Jvb2soKTtcbiAgICB9XG4gICAgLy8gQVAtMTJNQVIyNSAtIEFkZGVkIHRvIGhhbmRsZSBib29rbGV0SWRcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidW5pcXVlX2lkXCIsIHRoaXMuYm9va2xldElkKTtcbiAgICB9XG4gICAgdGhpcy5ib29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNlbGVjdGVkRWxlbWVudCQuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICAvLyBTS1MxOU1BUjI1IGZvciBmaWVsZE1ldGEgY2hlY2tpbmdcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gXCJUYWJsZVwiKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50W1wiZmllbGRzTWV0YVwiXSA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmZpZWxkc01ldGEgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEVsZW1lbnQuZmllbGRzTWV0YVxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRWxlbWVudFtcImZpZWxkc01ldGFcIl0gfHwgW10pO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy5mb3JtRWxlbWVudHMgPSBbLi4uZWxlbWVudHNdXG4gICAgfSk7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudFdpdGhJZCgpO1xuICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmZvcm1CdWlsZGVyVHJhbnNsYXRpb25zTG9hZGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIHBpcGUgcmUtZXZhbHVhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWRkIHRoZXNlIG1ldGhvZHNcbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBcImJhc2ljXCIgfCBcImFkdmFuY2VkXCIpIHtcbiAgICB0aGlzLnNlY3Rpb25zW3NlY3Rpb25dID0gIXRoaXMuc2VjdGlvbnNbc2VjdGlvbl07XG4gIH1cblxuICBpc1NlY3Rpb25PcGVuKHNlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3NlY3Rpb25dO1xuICB9XG5cbiAgLy8gQVAgLSAyNkZFQjI1IC0gQWRkZWQgbmdPbkNoYW5nZXMgdG8gaGFuZGxlIGNoYW5nZXMgaW4gYm9va2xldEpTT05cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzW1wiYm9va2xldEpTT05cIl0gJiYgY2hhbmdlc1tcImJvb2tsZXRKU09OXCJdLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04gJiYgdGhpcy5ib29rbGV0SlNPTiAhPT0gXCJcIikge1xuICAgICAgICAvLyBBUC0yOE1BWTI1IC0gQ2hlY2sgYW5kIHRyYW5zZm9ybSBgYWN0aW9uYCBpZiBpdCdzIGluIEV4aXN0aW5nIGZvcm1hdFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2sgJiZcbiAgICAgICAgICB0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vay5hY3Rpb24gJiZcbiAgICAgICAgICB0eXBlb2YgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2suYWN0aW9uID09PSBcInN0cmluZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBY3Rpb25zID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2suYWN0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBUC0yOE1BWTI1IEFzc2lnbiBzcGVjaWZpYyBwb3NpdGlvblBlcmNlbnQgYmFzZWQgb24gYWN0aW9uIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IG5ld0FjdGlvbnMgPSBwYXJzZWRBY3Rpb25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uUGVyY2VudCA9XG4gICAgICAgICAgICAgICAgaXRlbS5uYW1lID09PSBcIkNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgIDogaXRlbS5uYW1lID09PSBcIlNhdmVcIlxuICAgICAgICAgICAgICAgICAgPyAxNFxuICAgICAgICAgICAgICAgICAgOiAxMCArIGluZGV4ICogMTA7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uUGVyY2VudDogcG9zaXRpb25QZXJjZW50LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgdGV4dENvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDYsXG4gICAgICAgICAgICAgICAgaWQ6IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQVAtMjhNQVkyNSBSZXBsYWNlIHRoZSBvbGQgYWN0aW9uIHN0cmluZyB3aXRoIHRoZSBuZXdseSBmb3JtYXR0ZWQgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rLmFjdGlvbiA9IG5ld0FjdGlvbnM7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhcnNpbmcgYWN0aW9uIEpTT04gc3RyaW5nOlwiLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5uZXdCb29rKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFQLTA4QVBSMjUgVGVtcGxhdGUgaXMgc2VsZWN0ZWQsIHVwZGF0ZSBmb3JtIGVsZW1lbnRzIGFuZCBlbWl0IHRlbXBsYXRlIG1vZGVcbiAgb25UZW1wbGF0ZVNlbGVjdGVkKGV2ZW50OiB7IHNlbGVjdGVkVGVtcGxhdGU6IGFueTsgZWxlbWVudHM6IGFueVtdIH0pIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5jbGVhckVsZW1lbnRzKCk7XG4gICAgZXZlbnQuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnQoZWwpKTtcblxuICAgIC8vIEVtaXQgdGVtcGxhdGUgbW9kZSB0byBwYXJlbnRcbiAgICB0aGlzLnRlbXBsYXRlTW9kZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuYm9va2xldEpTT04gfHwgIXRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgY29uc29sZS53YXJuKFwiSW52YWxpZCBib29rbGV0SlNPTiBzdHJ1Y3R1cmVcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuY2xlYXJFbGVtZW50cygpO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmludGlhbGl6ZUJvb2sodGhpcy5ib29rbGV0SlNPTik7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICB9XG5cbiAgLy8gQWRkIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBlbGVtZW50IHNlbGVjdGlvblxuICBzZWxlY3RFbGVtZW50KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmlzSGVhZGVyU2VsZWN0ID0gZmFsc2VcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uID0gbnVsbFxuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4ID0gaW5kZXg7IC8vIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXgpO1xuICAgIHRoaXMuYm9vayA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgfVxuICBzZWxlY3RlZEZpZWxkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBlbGVtZW50IGlzIGNsZWFyZWRcblxuICBzZWxlY3RIZWFkaW5nKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmlzSGVhZGVyU2VsZWN0ID0gdHJ1ZVxuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1uID0gbnVsbFxuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNlbGVjdEhlYWRpbmcoZXZlbnQpOyAvL0FQLTEwTUFSMjUgVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaGVhZGluZyBpbiB0aGUgc2VydmljZVxuICAgIHRoaXMuYm9vayA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTsgLy9BUC0xME1BUjI1IFJldHJpZXZlcyB0aGUgdXBkYXRlZCBib29rL2Zvcm0gZGF0YVxuICB9XG4gIC8vIEFQLTE3QVBSMjUgZ2VuZXJhdGVVaUlkXG4gIGdlbmVyYXRlVWlJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudFdpdGhJZCgpO1xuICB9XG5cbiAgYWRkRWxlbWVudCh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIHRoaXMuY3VycmVudFR5cGUgPSB0eXBlO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gXCJUYWJsZVwiICYmIHRoaXMuYWRkVGFibGUpIHtcbiAgICAgIHRoaXMuaXNTZWxlY3RUYWJsZVBvcHVwID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHtcbiAgICAgICAgYWN0aW9uOiBudWxsLFxuICAgICAgICBpZDogdW5pcXVlX2lkLFxuICAgICAgICB0eXBlLFxuICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICBxdWVzdGlvblRleHQ6IG51bGwsXG4gICAgICAgIHF1ZXN0aW9uOiBudWxsLFxuICAgICAgICBoZWxwVGV4dDogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsLFxuICAgICAgICBpc1JlYWRPbmx5OiBmYWxzZSxcbiAgICAgICAgaXNIaWRkZW46IGZhbHNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIHJlZmVyZW5jZUZpZWxkOiBudWxsLFxuICAgICAgICBhZGRpdGlvbmFsUmljaENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGdyb3VwTmFtZTogbnVsbCxcbiAgICAgICAgaXNEYXRlQmFja3dhcmQ6IGZhbHNlLFxuICAgICAgICB0aXRsZTogbnVsbCxcbiAgICAgICAgc3ViVGl0bGU6IG51bGwsXG4gICAgICAgIHNpemU6IDEyLFxuICAgICAgICBpc0RhdGVGb3J3YXJkOiBmYWxzZSxcbiAgICAgICAgaXNPcHRpb25hbDogZmFsc2UsXG4gICAgICAgIGlzVGl0bGU6IGZhbHNlLFxuICAgICAgICBuZXh0UXVlc3Rpb246IG51bGwsXG4gICAgICAgIGFsbG93ZWRGaWxlRXh0ZW5zaW9uczogbnVsbCxcbiAgICAgICAgcXVlc3Rpb25OdW1iZXI6IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCkubGVuZ3RoICsgMSxcbiAgICAgICAgb3JkZXI6IHRoaXMuZm9ybUVsZW1lbnRzLmxlbmd0aCArIDEsXG4gICAgICAgIHF1ZXN0aW9uQm9va0lkOiB0aGlzLmJvb2tsZXRJZCxcbiAgICAgICAgZmllbGRzTWV0YTogW10sXG4gICAgICAgIHRyYWNraW5nSWQ6IG51bGwsXG4gICAgICAgIHJlY29yZElkOiBudWxsLFxuICAgICAgICBxYlJlZmVyZW5jZTogbnVsbCxcbiAgICAgICAgcWJSZWZlcmVuY2VRdWVzdGlvbnM6IG51bGwsXG4gICAgICAgIHByaW1hcnlLZXk6IGZhbHNlLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGxhYmVsQ2xhc3M6IG51bGwsXG4gICAgICAgICAgbGFiZWxTdHlsZTogbnVsbCxcbiAgICAgICAgICBsYWJlbFZhbHVlU3R5bGU6IG51bGwsXG4gICAgICAgICAgaW5wdXRDbGFzczogbnVsbCxcbiAgICAgICAgICBpbnB1dFN0eWxlOiBudWxsLFxuICAgICAgICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICAgICAgICBib29rU3R5bGU6IG51bGwsXG4gICAgICAgICAgZGlyZWN0aW9uOiBcImx0clwiLFxuICAgICAgICAgIHF1ZXN0aW9uU3R5bGU6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHN1YlRleHQ6IHtcbiAgICAgICAgICBlbmRwb2ludDogbnVsbCxcbiAgICAgICAgICB2YXJpYWJsZTogbnVsbCxcbiAgICAgICAgICBmaWVsZDogbnVsbCxcbiAgICAgICAgICBkZWZhdWx0RmllbGQ6IG51bGwsXG4gICAgICAgICAgc291cmNlUXVlc3Rpb25JZDogbnVsbCxcbiAgICAgICAgICB2YWx1ZUZpZWxkOiBudWxsLFxuICAgICAgICAgIGxhYmVsRmllbGQ6IG51bGwsXG4gICAgICAgICAgaXNEZXBlbmRlbnRGaWVsZDogZmFsc2UsXG4gICAgICAgICAgZGVwZW5kZW50VmFsdWU6IG51bGwsXG4gICAgICAgICAgcXVlcnlGaWVsZDogbnVsbCxcbiAgICAgICAgICBxdWVyeVZhbHVlOiBudWxsLFxuICAgICAgICAgIHF1ZXJ5VmFsdWVSZWZlcmVuY2U6IG51bGwsXG4gICAgICAgICAgdW5pcXVlS2V5OiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICBpbWFnZURhdGE6IG51bGwsXG4gICAgICAgIGJvb2xlYW46IGZhbHNlLFxuICAgICAgICBvcHRpb25zOlxuICAgICAgICAgIHR5cGUgPT09IFwiRHJvcGRvd25cIiB8fCB0eXBlID09PSBcIlRhYmxlQ29sdW1uXCIgfHwgdHlwZSA9PT0gXCJSYWRpb1wiIHx8IHR5cGUgPT09IFwiQ2hlY2tib3hcIlxuICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBpbWFnZVNpemU6IHR5cGUgPT09IFwiSW1hZ2VcIiA/IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfSA6IG51bGwsXG4gICAgICAgIHRhYmxlQ29uZmlnOlxuICAgICAgICAgIHR5cGUgPT09IFwiVGFibGVcIlxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgaXNOb3NJbmRpY2F0b3I6IHRydWUsXG4gICAgICAgICAgICAgICAgYWRkSW5saW5lUmVjb3JkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzUGFnaW5hdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb25CdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgaXNEZWxldGVSb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNFZGl0Um93OiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlYXJjaEJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc0J1dHRvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlOiAxMCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnQobmV3RWxlbWVudCk7XG4gICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgICAvLyBTS1MxOU1BUjI1IGZpZWxkc21ldGEgY2hlY2tcbiAgICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gdGhpcy51cGRhdGVUYWJsZUZpZWxkc01ldGEodGhpcy5mb3JtRWxlbWVudHMpO1xuICAgICAgdGhpcy5hZGRUYWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIGFuIGVsZW1lbnQgYnkgaW5kZXhcbiAgcmVtb3ZlRWxlbWVudChmaWVsZDogYW55LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UucmVtb3ZlRWxlbWVudENvbXBvbmVudChmaWVsZC5pZCk7XG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgIC8vIFNLUzE5TUFSMjUgZmllbGRzbWV0YSBjaGVja1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gdGhpcy51cGRhdGVUYWJsZUZpZWxkc01ldGEodGhpcy5mb3JtRWxlbWVudHMpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXg7XG4gICAgZXZlbnQuZGF0YVRyYW5zZmVyPy5zZXREYXRhKFwidGV4dC9wbGFpblwiLCBpbmRleC50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8vIEFsbG93IGRyb3BwaW5nIGJ5IHByZXZlbnRpbmcgZGVmYXVsdFxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLy8gSGFuZGxlIGRyb3AgZXZlbnRcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQsIGRyb3BJbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmRyYWdnZWRJbmRleCA9PT0gZHJvcEluZGV4KSByZXR1cm47XG5cbiAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IHRoaXMuZm9ybUVsZW1lbnRzW3RoaXMuZHJhZ2dlZEluZGV4XTtcblxuICAgIC8vIFJlbW92ZSBkcmFnZ2VkIGl0ZW0gZnJvbSBvbGQgcG9zaXRpb24gYW5kIGluc2VydCBpdCBpbiBuZXcgcG9zaXRpb25cbiAgICB0aGlzLmZvcm1FbGVtZW50cy5zcGxpY2UodGhpcy5kcmFnZ2VkSW5kZXgsIDEpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzLnNwbGljZShkcm9wSW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcblxuICAgIC8vQVAtMjhNQVIyNSBVcGRhdGUgcXVlc3Rpb25OdW1iZXIgZHluYW1pY2FsbHkgYmFzZWQgb24gbmV3IG9yZGVyXG4gICAgdGhpcy5mb3JtRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGVsZW1lbnQucXVlc3Rpb25OdW1iZXIgPSBpbmRleCArIDE7XG4gICAgfSk7XG5cbiAgICAvLyBSZXNldCBkcmFnZ2VkIGluZGV4XG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBudWxsO1xuXG4gICAgLy8gTm90aWZ5IHNlcnZpY2UgYWJvdXQgdGhlIHVwZGF0ZVxuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZUVsZW1lbnRzT3JkZXIodGhpcy5mb3JtRWxlbWVudHMpO1xuICB9XG5cbiAgdG9nZ2xlQm9vbGVhbihmaWVsZDogYW55KTogdm9pZCB7XG4gICAgZmllbGQuYm9vbGVhbiA9ICFmaWVsZC5ib29sZWFuO1xuICB9XG5cbiAgLy8gU0tTMTNNQVIyNSB0YWJsZSBwb3B1cCBjb25mb3JtYXRpb24gYmFzZWQgZWxlbWVudCBhZGRcbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlO1xuICAgIHRoaXMuYWRkVGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFkZEVsZW1lbnQodGhpcy5jdXJyZW50VHlwZSk7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBjb2x1bW4gZWxlbWVudCBhZGQgaW5zaWRlIGEgdGFibGVcbiAgYWRkT25UYWJsZSgpIHtcbiAgICB0aGlzLmFkZFRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCldO1xuXG4gICAgLy8gRmluZCB0aGUgZWxlbWVudCBhbmQgdXBkYXRlIGl0cyBjb2x1bW5zXG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5maW5kSW5kZXgoKGVsKSA9PiBlbC5pZCA9PT0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IHJvd051bSA9IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhXG4gICAgICA/IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5maWVsZHNNZXRhPy5sZW5ndGhcbiAgICAgIDogMDtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHtcbiAgICAgIGxhYmVsOiBgSEVBREVSIExBQkVMICR7cm93TnVtfWAsXG4gICAgICBmaWVsZE5hbWU6IGBGSUVMRCBOQU1FICR7cm93TnVtfWAsXG4gICAgICB0eXBlOiB0aGlzLmN1cnJlbnRUeXBlLFxuICAgICAgaWQ6IHVuaXF1ZV9pZCxcbiAgICB9O1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZFRhYmxlRWxlbWVudChcbiAgICAgIHRhYmxlRWxlbWVudCxcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4XG4gICAgKTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gICAgLy8gU0tTMTlNQVIyNSBmaWVsZHNtZXRhIGNoZWNraW5nXG4gICAgdGhpcy5mb3JtRWxlbWVudHMgPSB0aGlzLnVwZGF0ZVRhYmxlRmllbGRzTWV0YSh0aGlzLmZvcm1FbGVtZW50cyk7XG4gIH1cbiAgdXBkYXRlVGFibGVGaWVsZHNNZXRhKGVsZW1lbnRzOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gZWxlbWVudHMubWFwKChlbGUpID0+IHtcbiAgICAgIGlmIChlbGUudHlwZSA9PT0gXCJUYWJsZVwiKSB7XG4gICAgICAgIGVsZS5maWVsZHNNZXRhID1cbiAgICAgICAgICB0eXBlb2YgZWxlLmZpZWxkc01ldGEgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gZWxlLmZpZWxkc01ldGFcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoZWxlLmZpZWxkc01ldGEgfHwgW10pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZTtcbiAgICB9KTtcbiAgfSAgXG4gIGNvbHVtblNlbGVjdGVkKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBTS1MxOU1BUjI1IHRhYmxlIGNvbHVtbiB1cGRhdGVcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5mb3JFYWNoKChlbGU6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGVsZS50eXBlID09PSAnVGFibGUnICYmIEFycmF5LmlzQXJyYXkoZWxlLmZpZWxkc01ldGEpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWVsZCA9IGVsZS5maWVsZHNNZXRhLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBhbnkpID0+IGZpZWxkLnVuaXF1ZUlkZW50aWZpZXIgPT09IGV2ZW50Py51bmlxdWVJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaGVkRmllbGQpIHtcbiAgICAgICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXgpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4ID0gaW5kZXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXgsXG4gICAgICBldmVudFxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IGV2ZW50Py51bmlxdWVJZGVudGlmaWVyXG4gIH1cbiAgcmVtb3ZlQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5yZW1vdmVTZWxlY3RlZFRhYmxlRWxlbWVudChcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4LFxuICAgICAgZXZlbnRcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW4gPSBudWxsXG4gIH1cblxuICAvLyBTS1MyNU1BUjI1IGltYWdlIGFkZFxuICBhc3luYyBmaWxlQ2hhbmdlRXZlbnQoaW5kZXg6IGFueSwgZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgIHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5vcmdJbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgICAgIC8vIEluaXRpYWxpemUgbG9nbyBzaXplIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICBpZiAoIXRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5pbWFnZVNpemUpIHtcbiAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0uaW1hZ2VTaXplID0geyB3aWR0aDogMTUwLCBoZWlnaHQ6IDE1MCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZWxlbWVudFVwZGF0ZShcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF1cbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9KTtcbiAgfVxuICAvLyBTS1MyOEpVTDI1IGZvcm1idWlsZGVyIGxhbmd1YWdlIGNvZGUgY2hhbmdlXG4gIGxhbmdDaGFuZ2VFbWl0KGV2ZW50KXtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IGV2ZW50LnZhbHVlT2JqXG4gICAgdGhpcy5ib29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldEZvcm1CdWlsZGVyVHJhbnNsYXRpb25zKHRoaXMuYm9vay50cmFuc2xhdGlvbk1hcClcbiAgICBjb25zdCB1bmlxdWVfaWQgPSBPYmplY3Qua2V5cyh0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcClbMF07XG4gICAgY29uc3Qga2V5c1RvVHJhbnNsYXRlID0gWydxdWVzdGlvblRleHQnLCAnaGVscFRleHQnLCAncXVlc3Rpb24nLCAnbGFiZWwnXTtcbiAgICB0aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcFt1bmlxdWVfaWRdPy5zdWJRdWVzdGlvbnM/LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBrZXlzVG9UcmFuc2xhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBlbGVtZW50W2tleV0gPSAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGUoYCR7ZWxlbWVudC5pZH0uJHtrZXl9YCwgdGhpcy5sYW5ndWFnZUNvZGUpID8gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGUoYCR7ZWxlbWVudC5pZH0uJHtrZXl9YCwgdGhpcy5sYW5ndWFnZUNvZGUpIDogbnVsbFxuICAgICAgfSk7XG4gICAgICBpZihlbGVtZW50Py5bJ29wdGlvbnMnXSAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQ/Llsnb3B0aW9ucyddICE9PSBudWxsICYmICBBcnJheS5pc0FycmF5KGVsZW1lbnRbJ29wdGlvbnMnXSkpe1xuICAgICAgICBlbGVtZW50WydvcHRpb25zJ10uZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgIG9wdC5sYWJlbCA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmZvcm1CdWlsZGVyVHJhbnNsYXRlKGAke29wdC5pZH0ubGFiZWxgLCB0aGlzLmxhbmd1YWdlQ29kZSkgPyB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5mb3JtQnVpbGRlclRyYW5zbGF0ZShgJHtvcHQuaWR9LmxhYmVsYCwgdGhpcy5sYW5ndWFnZUNvZGUpIDogbnVsbFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYoZWxlbWVudC50eXBlID09PSAnVGFibGUnICYmIGVsZW1lbnQ/LmZpZWxkc01ldGEpe1xuICAgICAgICBpZighQXJyYXkuaXNBcnJheShlbGVtZW50Py5maWVsZHNNZXRhKSAmJiB0eXBlb2YgZWxlbWVudD8uZmllbGRzTWV0YSA9PT0gJ3N0cmluZycpe1xuICAgICAgICAgIGVsZW1lbnQuZmllbGRzTWV0YSA9IEpTT04ucGFyc2UoZWxlbWVudD8uZmllbGRzTWV0YSlcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50Py5maWVsZHNNZXRhPy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICBrZXlzVG9UcmFuc2xhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYoa2V5ICE9PSAncXVlc3Rpb24nKSBmaWVsZFtrZXldID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGUoYCR7ZmllbGQudW5pcXVlSWRlbnRpZmllcn0uJHtrZXl9YCwgdGhpcy5sYW5ndWFnZUNvZGUpID8gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGUoYCR7ZmllbGQudW5pcXVlSWRlbnRpZmllcn0uJHtrZXl9YCwgdGhpcy5sYW5ndWFnZUNvZGUpIDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmKGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10gIT09IHVuZGVmaW5lZCAmJiBmaWVsZD8ucXVlc3Rpb24/Llsnb3B0aW9ucyddICE9PSBudWxsICYmICBBcnJheS5pc0FycmF5KGZpZWxkPy5xdWVzdGlvbj8uWydvcHRpb25zJ10pKXtcbiAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uWydvcHRpb25zJ10uZm9yRWFjaChvcHQgPT4ge1xuICAgICAgICAgICAgICBvcHQubGFiZWwgPSB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5mb3JtQnVpbGRlclRyYW5zbGF0ZShgJHtvcHQuaWR9LmxhYmVsYCwgdGhpcy5sYW5ndWFnZUNvZGUpID8gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuZm9ybUJ1aWxkZXJUcmFuc2xhdGUoYCR7b3B0LmlkfS5sYWJlbGAsIHRoaXMubGFuZ3VhZ2VDb2RlKSA6IG51bGxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmJvb2s/LnF1ZXN0aW9uYm9vaz8uYWN0aW9uPy5mb3JFYWNoKChhY3Q6IGFueSkgPT57XG4gICAgICBhY3QubmFtZSA9IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLmZvcm1CdWlsZGVyVHJhbnNsYXRlKGAke2FjdC5pZH0ubmFtZWAsIHRoaXMubGFuZ3VhZ2VDb2RlKSA7XG4gICAgfSlcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IFsuLi50aGlzLmJvb2suYm9va1F1ZXN0aW9uc01hcFt1bmlxdWVfaWRdPy5zdWJRdWVzdGlvbnNdXG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UudXBkYXRlQm9vayh0aGlzLmJvb2spXG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0Rm9ybUJ1aWxkZXJMYW5ndWFnZSh0aGlzLmxhbmd1YWdlQ29kZSk7XG4gIH1cbn1cbiIsIjwhLS0gQVAgMjJKQU4yNSAtIGZvcm0gcHJldmlldyBhbmQgQWxsIGZvcm0gZWxlbWVudHMgLS0+XG48IS0tIEFQIDI1RkVCMjUgLSBBbGwgZWxlbWVudHMgdXBkYXRlIC0tPlxuPGRpdiBjbGFzcz1cImNlbnRlci1mcmFtZVwiPlxuICA8IS0tIEZvcm0gQnVpbGRlciBTZWN0aW9uIEFsbCBFbGVtZW50cyAtLT5cbiAgPGRpdiBjbGFzcz1cImZvcm0tYnVpbGRlclwiPlxuICAgIDwhLS0gQmFzaWMgRWxlbWVudHMgVG9nZ2xlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2Jhc2ljJylcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkLWVsZW1lbnRzXCI+e3sgJ0JBU0lDX0VMRU1FTlRTJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdCYXNpYyBFbGVtZW50cycgfX08L2Rpdj5cbiAgICAgIDxpbWcgW3NyY109XCJzZWN0aW9ucy5iYXNpYyA/ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctZG93bi5zdmcnIDogJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1yaWdodC5zdmcnXCJcbiAgICAgICAgYWx0PVwiVG9nZ2xlIEFycm93XCIgY2xhc3M9XCJhcnJvdy1pY29uXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2VjdGlvbnMuYmFzaWNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgYmFzaWNFbGVtZW50c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWxlbWVudFwiIChjbGljayk9XCJhZGRFbGVtZW50KGVsZW1lbnQudHlwZSlcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy97eyBlbGVtZW50LmltZyB9fS5zdmdcIiBjbGFzcz1cImVsZW1lbnQtaWNvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3Zlci1sYWJlbFwiPnt7IGVsZW1lbnQubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1kb3RzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG90XCIgKm5nRm9yPVwibGV0IGRvdCBvZiBkb3RzXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFkdmFuY2VkIEVsZW1lbnRzIFRvZ2dsZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdhZHZhbmNlZCcpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPnt7ICdBRFZBTkNFRF9FTEVNRU5UUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWR2YW5jZWQgRWxlbWVudHMnIH19PC9kaXY+XG4gICAgICA8aW1nIFtzcmNdPVwic2VjdGlvbnMuYWR2YW5jZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNlY3Rpb25zLmFkdmFuY2VkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGFkdmFuY2VkRWxlbWVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVsZW1lbnRcIiAoY2xpY2spPVwiYWRkRWxlbWVudChlbGVtZW50LnR5cGUpXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMve3sgZWxlbWVudC5pbWcgfX0uc3ZnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhvdmVyLWxhYmVsXCI+e3sgZWxlbWVudC5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWRvdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3RcIiAqbmdGb3I9XCJsZXQgZG90IG9mIGRvdHNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIEFQLTA4QVBSMjUgQWRkIFRlbXBsYXRlcyBDb21wb25lbnQgLS0+XG4gICAgPCEtLSA8YXBwLXRlbXBsYXRlcyAodGVtcGxhdGVTZWxlY3RlZCk9XCJvblRlbXBsYXRlU2VsZWN0ZWQoJGV2ZW50KVwiPjwvYXBwLXRlbXBsYXRlcz4gLS0+XG5cbiAgICA8IS0tIFNLUzEwTUFSMjUgZm9vdGVyIHZlcnNpb24gc2hvdyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LWZvb3Rlci12ZXJzaW9uXCI+XG4gICAgICB7e3ZlcnNpb259fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPCEtLSBBUC0yN01BUjI1IFJlbW92ZSBDREsgZHJhZyBhbmQgZHJvcCByZXBsYWNlIGRyYWdnYWJsZSBmdW5jdGlvbiAgLS0+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLXByZXZpZXdcIj5cbiAgICA8IS0tIEFQLTEwTUFSMjUgSGVhZGluZyAtLT5cbiAgICA8ZGl2IHN0eWxlPVwiIGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjsgd2lkdGg6IDEwMCU7IGdhcDogMTBweDtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXIgZmllbGQtY29udGFpbmVyXCJcbiAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4OyB3aWR0aDogMTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiAjRUZGOEZGOyBib3JkZXI6IDFweCBzb2xpZCAjRTZGM0ZGO2Rpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7bWFyZ2luLWJvdHRvbToxMHB4OyBib3JkZXItcmFkaXVzOiA1cHg7XCJcbiAgICAgICAgW2NsYXNzLmhpZ2hsaWdodF09XCJpc0hlYWRlclNlbGVjdFwiIChjbGljayk9XCJzZWxlY3RIZWFkaW5nKCdIZWFkZXInKVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYm9vaz8ucmVjb3Jkc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJib29rLnJlY29yZHNbMF0udGl0bGUgPT0gJydcIiBzdHlsZT1cImNvbG9yOiMzZjRhNTI1Y1wiPkhlYWRpbmc8L2Rpdj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYm9vay5yZWNvcmRzWzBdLnRpdGxlICE9PSAnJ1wiPnt7Ym9vay5yZWNvcmRzWzBdLnRpdGxlfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxhcHAtY3VzdG9tLWRyb3Bkb3duIFtvcHRpb25zXT1cImxhbmdPcHRpb25cIiBbc2VsZWN0ZWRWYWx1ZV09XCJsYW5ndWFnZUNvZGVcIiBbZnJvbV09XCInbm9ybWFsRHJvcERvd24nXCJcbiAgICAgICAgW21vZGVdPVwiJ2VkaXQnXCIgKHZhbHVlQ2hhbmdlKT1cImxhbmdDaGFuZ2VFbWl0KCRldmVudC52YWx1ZSlcIlxuICAgICAgICBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEwcHg7IGJhY2tncm91bmQ6ICNlZmY4ZmY7IGJvcmRlci1yYWRpdXM6IDVweDtcIj5cbiAgICAgIDwvYXBwLWN1c3RvbS1kcm9wZG93bj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZvcm1FbGVtZW50czsgbGV0IGkgPSBpbmRleFwiIGdldFByb3BlcnRpZXMoKS5lbGVtZW50UHJvcHM+XG4gICAgICA8IS0tIFRleHRCb3ggLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1RleHQnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnTEFCRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0xhYmVsJykgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uIHx8ICgnRU5URVJfVEVYVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgdGV4dCcpXCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnIFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTVNNLTA5SlVMMjUgSWNvbi1zZWxlY3RpciBFbGVtZW50IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdJY29uJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc1JlcXVpcmVkXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0NIT09TRV9JQ09OJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdDaG9vc2UgSWNvbicpXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaG9vc2UtaWNvbi1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVAtMTlNQVIyNSBMaW5lIEVsZW1lbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0xpbmUnXCIgY2xhc3M9XCJsaW5lLWZpZWxkXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxpbmUtZWxlbWVudFwiPlxuICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aHIgY2xhc3M9XCJjdXN0b20tbGluZVwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXhcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJyxcbiAgJ2JvcmRlci1zdHlsZSc6IGZpZWxkPy5saW5lU3R5bGU/LnRvTG93ZXJDYXNlKCkgfHwgJ3NvbGlkJ1xufVwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLVNLUzI1TUFSMjUgSW1hZ2UgVXBsb2FkIEVsZW1lbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0ltYWdlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ1VQTE9BRF9JTUFHRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVXBsb2FkIEltYWdlJylcbiAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBMb2dvIHByZXZpZXcgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1wcmV2aWV3XCIgKm5nSWY9XCJmaWVsZC5pbWFnZURhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJmaWVsZC5pbWFnZURhdGFcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBVcGxvYWQgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmllbGQuaW1hZ2VEYXRhXCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLXt7aX19XCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9JbWFnZS5zdmdcIiBhbHQ9XCJVcGxvYWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnVVBMT0FEX0lNQUdFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdVcGxvYWQgSW1hZ2UnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQte3tpfX1cIiBhY2NlcHQ9XCJpbWFnZS8qXCIgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoaSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNwYWNlIEVsZW1lbnQgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1NwYWNlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwiaGVpZ2h0OjkzcHhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIj48L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCIgc3R5bGU9XCJtYXJnaW46IC0xMXB4IC0xMXB4IDAgMDtcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJvb2xlYW4gRWxlbWVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnQm9vbGVhbidcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwie1xuICAnZm9udC1mYW1pbHknOiBmaWVsZD8uZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAnZm9udC13ZWlnaHQnOiBmaWVsZD8uZm9udFdlaWdodCB8fCAnNDAwJyxcbiAgJ2ZvbnQtc2l6ZSc6IGZpZWxkPy5mb250U2l6ZSB8fCAnMTRweCcsXG4gICd3aWR0aCc6IGZpZWxkPy5zaXplID8gKGZpZWxkLnNpemUgLyAxMiAqIDEwMCkgKyAnJScgOiAnMTAwJScsXG4gICd0ZXh0LWFsaWduJzogZmllbGQ/LnRleHRBbGlnbiB8fCAnbGVmdCcsXG4gICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICdib3JkZXItd2lkdGgnOiBmaWVsZD8ubGluZVdpZHRoID8gZmllbGQubGluZVdpZHRoICsgJ3B4JyA6ICcxcHgnLFxuICAnY29sb3InOiBmaWVsZD8uZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgJ21hcmdpbi10b3AnOiBmaWVsZD8ucGFkZGluZ1RvcCA/IGZpZWxkLnBhZGRpbmdUb3AgKyAncHgnIDogJzBweCcsXG4gICdtYXJnaW4tYm90dG9tJzogZmllbGQ/LnBhZGRpbmdCb3R0b20gPyBmaWVsZC5wYWRkaW5nQm90dG9tICsgJ3B4JyA6ICcxMHB4JyxcbiAgJ2JvcmRlci1jb2xvcic6IGZpZWxkPy5jb2xvciB8fCAnI0VGRjhGRidcbn1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3sgZmllbGQucXVlc3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0JPT0xFQU4nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0Jvb2xlYW4nKX19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImZpZWxkLmJvb2xlYW5cIiAoY2hhbmdlKT1cInRvZ2dsZUJvb2xlYW4oZmllbGQpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0NhbGVuZGFyJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ1NFTEVDVF9EQVRFJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTZWxlY3QgRGF0ZScpXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQIC0xMk1BUjI1IERhdGUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0RhdGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnU0VMRUNUX0RBVEUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlbGVjdCBEYXRlJylcbiAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVAtMjFNQVIyNSBBZGQgVGltZSBlbGVtZW50IC0tPlxuICAgICAgPCEtLSBUaW1lIEZpZWxkIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdUaW1lJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCI+e3sgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogKCdUSU1FJyB8XG4gICAgICAgICAgICAgICAgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1RpbWUnKSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0aW1lXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQLTI4TUFSMjUgRGF0ZVRpbWUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0RhdGVUaW1lJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ1NFTEVDVF9EQVRFX1RJTUUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlbGVjdCBEYXRlICZcbiAgICAgICAgICAgICAgICAgIFRpbWUnKVxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVtYWlsIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdFbWFpbCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwie1xuICAnZm9udC1mYW1pbHknOiBmaWVsZD8uZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAnZm9udC13ZWlnaHQnOiBmaWVsZD8uZm9udFdlaWdodCB8fCAnNDAwJyxcbiAgJ2ZvbnQtc2l6ZSc6IGZpZWxkPy5mb250U2l6ZSB8fCAnMTRweCcsXG4gICd3aWR0aCc6IGZpZWxkPy5zaXplID8gKGZpZWxkLnNpemUgLyAxMiAqIDEwMCkgKyAnJScgOiAnMTAwJScsXG4gICd0ZXh0LWFsaWduJzogZmllbGQ/LnRleHRBbGlnbiB8fCAnbGVmdCcsXG4gICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICdib3JkZXItd2lkdGgnOiBmaWVsZD8ubGluZVdpZHRoID8gZmllbGQubGluZVdpZHRoICsgJ3B4JyA6ICcxcHgnLFxuICAnY29sb3InOiBmaWVsZD8uZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgJ21hcmdpbi10b3AnOiBmaWVsZD8ucGFkZGluZ1RvcCA/IGZpZWxkLnBhZGRpbmdUb3AgKyAncHgnIDogJzBweCcsXG4gICdtYXJnaW4tYm90dG9tJzogZmllbGQ/LnBhZGRpbmdCb3R0b20gPyBmaWVsZC5wYWRkaW5nQm90dG9tICsgJ3B4JyA6ICcxMHB4JyxcbiAgJ2JvcmRlci1jb2xvcic6IGZpZWxkPy5jb2xvciB8fCAnI0VGRjhGRidcbn1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiPiB7eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0xBQkVMJyB8XG4gICAgICAgICAgICAgICAgICBueHRDdXN0b21UcmFuc2xhdGUgOiAnTGFiZWwnKSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAoJ0VOVEVSX0VNQUlMJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciBlbWFpbCcpXCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOdW1iZXJzIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdOdW1iZXInXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnTEFCRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0xhYmVsJykgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucXVlc3Rpb24gfHwgKCdFTlRFUl9OVU1CRVInIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0VudGVyIG51bWJlcicpXCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUZXh0QXJlYSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnVGV4dEFyZWEnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnRU5URVJfWU9VUl9URVhUJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFbnRlciB5b3VyXG4gICAgICAgICAgICAgICAgICB0ZXh0Jyl9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cblxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiY3VzdG9tLXRleHRhcmVhXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uIHx8ICgnRU5URVJfREVUQUlMRURfVEVYVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgZGV0YWlsZWQgdGV4dCBoZXJlLi4uJylcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImZpZWxkLnNpemUgfHwgMTAwXCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSaWNoVGV4dCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnUmljaFRleHRBcmVhJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0VOVEVSX1lPVVJfVEVYVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgeW91clxuICAgICAgICAgICAgICAgICAgdGV4dCcpfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCgnRU5URVJfREVUQUlMRURfVEVYVCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRW50ZXIgZGV0YWlsZWQgdGV4dCBoZXJlLi4uJylcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImZpZWxkLnNpemUgfHwgMTAwXCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMYWJlbCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnTGFiZWwnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnTEFCRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0xhYmVsJykgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBCb29rIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdCb29rJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0xBQkVMJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdMYWJlbCcpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGxpYi1ib29rbGV0IFtib29rbGV0SlNPTl09XCJmaWVsZC5xYlJlZmVyZW5jZVF1ZXN0aW9uc1wiPjwvbGliLWJvb2tsZXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRmlsZSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnRmlsZSdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwie1xuICAnZm9udC1mYW1pbHknOiBmaWVsZD8uZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAnZm9udC13ZWlnaHQnOiBmaWVsZD8uZm9udFdlaWdodCB8fCAnNDAwJyxcbiAgJ2ZvbnQtc2l6ZSc6IGZpZWxkPy5mb250U2l6ZSB8fCAnMTRweCcsXG4gICd3aWR0aCc6IGZpZWxkPy5zaXplID8gKGZpZWxkLnNpemUgLyAxMiAqIDEwMCkgKyAnJScgOiAnMTAwJScsXG4gICd0ZXh0LWFsaWduJzogZmllbGQ/LnRleHRBbGlnbiB8fCAnbGVmdCcsXG4gICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICdib3JkZXItd2lkdGgnOiBmaWVsZD8ubGluZVdpZHRoID8gZmllbGQubGluZVdpZHRoICsgJ3B4JyA6ICcxcHgnLFxuICAnY29sb3InOiBmaWVsZD8uZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgJ21hcmdpbi10b3AnOiBmaWVsZD8ucGFkZGluZ1RvcCA/IGZpZWxkLnBhZGRpbmdUb3AgKyAncHgnIDogJzBweCcsXG4gICdtYXJnaW4tYm90dG9tJzogZmllbGQ/LnBhZGRpbmdCb3R0b20gPyBmaWVsZC5wYWRkaW5nQm90dG9tICsgJ3B4JyA6ICcxMHB4JyxcbiAgJ2JvcmRlci1jb2xvcic6IGZpZWxkPy5jb2xvciB8fCAnI0VGRjhGRidcbn1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogKCdVUExPQURfRklMRScgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVXBsb2FkIEZpbGUnKVxuICAgICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2hlY2tCb3ggLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0NoZWNrYm94J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAnZm9udC1mYW1pbHknOiBmaWVsZD8uZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICAgICAgICAgICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgICAgICAgICAgICd3aWR0aCc6IGZpZWxkPy5zaXplID8gKGZpZWxkLnNpemUgLyAxMiAqIDEwMCkgKyAnJScgOiAnMTAwJScsXG4gICAgICAgICAgICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAgICAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgICAgICAgICAgICdib3JkZXItd2lkdGgnOiBmaWVsZD8ubGluZVdpZHRoID8gZmllbGQubGluZVdpZHRoICsgJ3B4JyA6ICcxcHgnLFxuICAgICAgICAgICAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICAgICAgICAgICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgICAgICAgICAgICdtYXJnaW4tYm90dG9tJzogZmllbGQ/LnBhZGRpbmdCb3R0b20gPyBmaWVsZC5wYWRkaW5nQm90dG9tICsgJ3B4JyA6ICcxMHB4JyxcbiAgICAgICAgICAgICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG4gICAgICAgICAgfVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAge3sgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogKCdMQUJFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTGFiZWwnKSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LW9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWVsZC5vcHRpb25zXCIgY2xhc3M9XCJjaGVja2JveC1vcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIm9wdGlvbi52YWx1ZSArIGlcIiBbbmFtZV09XCJmaWVsZC5pZFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlIHx8IGZpZWxkLmRlZmF1bHRWYWx1ZVwiIGNsYXNzPVwiY2hlY2tib3gtaW5wdXRcIiBbZGlzYWJsZWRdPVwiZmllbGQuaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwib3B0aW9uLnZhbHVlICsgaVwiIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj57eyBvcHRpb24ubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJhZGlvIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdSYWRpbydcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCIgW25nU3R5bGVdPVwie1xuICAnZm9udC1mYW1pbHknOiBmaWVsZD8uZm9udCB8fCAnSGVsdmV0aWNhIE5ldWUnLFxuICAnZm9udC13ZWlnaHQnOiBmaWVsZD8uZm9udFdlaWdodCB8fCAnNDAwJyxcbiAgJ2ZvbnQtc2l6ZSc6IGZpZWxkPy5mb250U2l6ZSB8fCAnMTRweCcsXG4gICd3aWR0aCc6IGZpZWxkPy5zaXplID8gKGZpZWxkLnNpemUgLyAxMiAqIDEwMCkgKyAnJScgOiAnMTAwJScsXG4gICd0ZXh0LWFsaWduJzogZmllbGQ/LnRleHRBbGlnbiB8fCAnbGVmdCcsXG4gICdib3JkZXItcmFkaXVzJzogJzVweCcsXG4gICdib3JkZXItd2lkdGgnOiBmaWVsZD8ubGluZVdpZHRoID8gZmllbGQubGluZVdpZHRoICsgJ3B4JyA6ICcxcHgnLFxuICAnY29sb3InOiBmaWVsZD8uZm9udENvbG9yIHx8ICcjMDAwMDAwJyxcbiAgJ21hcmdpbi10b3AnOiBmaWVsZD8ucGFkZGluZ1RvcCA/IGZpZWxkLnBhZGRpbmdUb3AgKyAncHgnIDogJzBweCcsXG4gICdtYXJnaW4tYm90dG9tJzogZmllbGQ/LnBhZGRpbmdCb3R0b20gPyBmaWVsZC5wYWRkaW5nQm90dG9tICsgJ3B4JyA6ICcxMHB4JyxcbiAgJ2JvcmRlci1jb2xvcic6IGZpZWxkPy5jb2xvciB8fCAnI0VGRjhGRidcbn1cIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIiAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIlxuICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogKCdMQUJFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTGFiZWwnKSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cblxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLW9wdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWVsZC5vcHRpb25zOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgW2lkXT1cIidyYWRpby0nICsgZmllbGQuaWQgKyAnLScgKyBqXCIgW25hbWVdPVwiJ3JhZGlvLWdyb3VwLScgKyBmaWVsZC5pZFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlIHx8IGZpZWxkLmRlZmF1bHRWYWx1ZVwiIFsobmdNb2RlbCldPVwiZmllbGQuc2VsZWN0ZWRWYWx1ZVwiIGNsYXNzPVwicmFkaW8taW5wdXRcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3JhZGlvLScgKyBmaWVsZC5pZCArICctJyArIGpcIiBjbGFzcz1cInJhZGlvLWxhYmVsXCI+IHt7ICBvcHRpb24ubGFiZWwgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0Ryb3Bkb3duJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAoJ0xBQkVMJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdMYWJlbCcpIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwib3B0aW9uc1wiIGNsYXNzPVwiZHJvcGRvd25cIiBbZGlzYWJsZWRdPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlIHx8IGZpZWxkLmRlZmF1bHRWYWx1ZVwiPiB7eyAgb3B0aW9uLmxhYmVsICB9fSA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tICBUYWJsZSAgLS0+XG4gICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIiBbbmdTdHlsZV09XCJ7XG4gICdmb250LWZhbWlseSc6IGZpZWxkPy5mb250IHx8ICdIZWx2ZXRpY2EgTmV1ZScsXG4gICdmb250LXdlaWdodCc6IGZpZWxkPy5mb250V2VpZ2h0IHx8ICc0MDAnLFxuICAnZm9udC1zaXplJzogZmllbGQ/LmZvbnRTaXplIHx8ICcxNHB4JyxcbiAgJ3dpZHRoJzogZmllbGQ/LnNpemUgPyAoZmllbGQuc2l6ZSAvIDEyICogMTAwKSArICclJyA6ICcxMDAlJyxcbiAgJ3RleHQtYWxpZ24nOiBmaWVsZD8udGV4dEFsaWduIHx8ICdsZWZ0JyxcbiAgJ2JvcmRlci1yYWRpdXMnOiAnNXB4JyxcbiAgJ2JvcmRlci13aWR0aCc6IGZpZWxkPy5saW5lV2lkdGggPyBmaWVsZC5saW5lV2lkdGggKyAncHgnIDogJzFweCcsXG4gICdjb2xvcic6IGZpZWxkPy5mb250Q29sb3IgfHwgJyMwMDAwMDAnLFxuICAnbWFyZ2luLXRvcCc6IGZpZWxkPy5wYWRkaW5nVG9wID8gZmllbGQucGFkZGluZ1RvcCArICdweCcgOiAnMHB4JyxcbiAgJ21hcmdpbi1ib3R0b20nOiBmaWVsZD8ucGFkZGluZ0JvdHRvbSA/IGZpZWxkLnBhZGRpbmdCb3R0b20gKyAncHgnIDogJzEwcHgnLFxuICAnYm9yZGVyLWNvbG9yJzogZmllbGQ/LmNvbG9yIHx8ICcjRUZGOEZGJ1xufVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogKCdMQUJFTCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTGFiZWwnKSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJueHQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxueHQtZGF0YXRhYmxlIGlzQnV0dG9ucyBbcXVlc3Rpb25dPVwiZmllbGRcIiBmcm9tPVwiZm9ybUJ1aWxkZXJcIiBbbW9kZV09XCInZWRpdCdcIiBbYXBpTWV0YV09XCJmaWVsZC5zdWJUZXh0XCJcbiAgICAgICAgICAgICAgICBbdGFibGVDb25maWddPVwiZmllbGQudGFibGVDb25maWdcIiB0YWJsZUlkPVwiXCIgZGlyZWN0aW9uPVwibHRyXCIgdGFibGVXaWR0aD1cImF1dG9cIiBpc0VkaXRhYmxlPXRydWVcbiAgICAgICAgICAgICAgICBbc2VsZWN0ZWRDb2x1bW5dPVwic2VsZWN0ZWRDb2x1bW5cIiAoY29sdW1uU2VsZWN0ZWQpPWNvbHVtblNlbGVjdGVkKCRldmVudClcbiAgICAgICAgICAgICAgICAocmVtb3ZlQ29sdW1uKT1yZW1vdmVDb2x1bW4oJGV2ZW50KT5cbiAgICAgICAgICAgICAgPC9ueHQtZGF0YXRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTGlzdCAtLT5cbiAgICAgIDwhLS0gQVAtMDZNQVIyNSAtIExpc3QgZGF0YSBzaG93LS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0xpc3QnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiIFtuZ1N0eWxlXT1cIntcbiAgJ2ZvbnQtZmFtaWx5JzogZmllbGQ/LmZvbnQgfHwgJ0hlbHZldGljYSBOZXVlJyxcbiAgJ2ZvbnQtd2VpZ2h0JzogZmllbGQ/LmZvbnRXZWlnaHQgfHwgJzQwMCcsXG4gICdmb250LXNpemUnOiBmaWVsZD8uZm9udFNpemUgfHwgJzE0cHgnLFxuICAnd2lkdGgnOiBmaWVsZD8uc2l6ZSA/IChmaWVsZC5zaXplIC8gMTIgKiAxMDApICsgJyUnIDogJzEwMCUnLFxuICAndGV4dC1hbGlnbic6IGZpZWxkPy50ZXh0QWxpZ24gfHwgJ2xlZnQnLFxuICAnYm9yZGVyLXJhZGl1cyc6ICc1cHgnLFxuICAnYm9yZGVyLXdpZHRoJzogZmllbGQ/LmxpbmVXaWR0aCA/IGZpZWxkLmxpbmVXaWR0aCArICdweCcgOiAnMXB4JyxcbiAgJ2NvbG9yJzogZmllbGQ/LmZvbnRDb2xvciB8fCAnIzAwMDAwMCcsXG4gICdtYXJnaW4tdG9wJzogZmllbGQ/LnBhZGRpbmdUb3AgPyBmaWVsZC5wYWRkaW5nVG9wICsgJ3B4JyA6ICcwcHgnLFxuICAnbWFyZ2luLWJvdHRvbSc6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gZmllbGQucGFkZGluZ0JvdHRvbSArICdweCcgOiAnMTBweCcsXG4gICdib3JkZXItY29sb3InOiBmaWVsZD8uY29sb3IgfHwgJyNFRkY4RkYnXG59XCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCIgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgICAgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICgnTEFCRUwnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0xhYmVsJykgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtwbGFjZWhvbGRlcl09XCIoJ1NFQVJDSCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoLi4uJylcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIFNLUzEzTUFSMjUgcG9wdXAgY29uZm9ybWF0aW9uIGJveCAtLT5cbjxkaXYgY2xhc3M9XCJkaWFsb2ctb3ZlcmxheVwiICpuZ0lmPVwiaXNTZWxlY3RUYWJsZVBvcHVwXCI+XG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm94XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ0bi1mYlwiIChjbGljayk9XCJvbkNsb3NlKClcIj7inJU8L2J1dHRvbj5cbiAgICA8cD57eyAnQUREX1RBQkxFX0NPTkZJUk1BVElPTicgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnVGhlc2UgZWxlbWVudCB3YW50IHRvIGFkZCBhIHRhYmxlJyB9fTwvcD5cbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lci1mYlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInllcy1idG4tZmJcIiAoY2xpY2spPVwiYWRkT25UYWJsZSgpXCI+e3sgJ1lFUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWWVzJyB9fTwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5vLWJ0bi1mYlwiIChjbGljayk9XCJvbkNsb3NlKClcIj57eyAnTk8nIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ05vJyB9fTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==