@rangertechnologies/ngnxt 2.1.240 → 2.1.242-beta

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 (90) hide show
  1. package/fesm2022/rangertechnologies-ngnxt.mjs +172 -206
  2. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  3. package/lib/components/image-cropper/component/image-cropper.component.d.ts +1 -1
  4. package/lib/components/pick-location/pick-location.component.d.ts +0 -1
  5. package/package.json +4 -6
  6. package/rangertechnologies-ngnxt-2.1.242-beta.tgz +0 -0
  7. package/esm2022/environments/version.mjs +0 -15
  8. package/esm2022/lib/ar.i18n.mjs +0 -29
  9. package/esm2022/lib/components/button/nxt-button.component.mjs +0 -165
  10. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +0 -371
  11. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +0 -274
  12. package/esm2022/lib/components/custom-model/custom-model.component.mjs +0 -51
  13. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +0 -156
  14. package/esm2022/lib/components/datatable/datatable.component.mjs +0 -1625
  15. package/esm2022/lib/components/file-upload/file-upload.component.mjs +0 -283
  16. package/esm2022/lib/components/icon-selector/icon-selector.component.mjs +0 -104
  17. package/esm2022/lib/components/image-cropper/component/cropper.state.mjs +0 -208
  18. package/esm2022/lib/components/image-cropper/component/image-cropper.component.mjs +0 -562
  19. package/esm2022/lib/components/image-cropper/interfaces/basic-event.interface.mjs +0 -2
  20. package/esm2022/lib/components/image-cropper/interfaces/cropper-options.interface.mjs +0 -2
  21. package/esm2022/lib/components/image-cropper/interfaces/cropper-position.interface.mjs +0 -2
  22. package/esm2022/lib/components/image-cropper/interfaces/dimensions.interface.mjs +0 -2
  23. package/esm2022/lib/components/image-cropper/interfaces/exif-transform.interface.mjs +0 -2
  24. package/esm2022/lib/components/image-cropper/interfaces/image-cropped-event.interface.mjs +0 -2
  25. package/esm2022/lib/components/image-cropper/interfaces/image-transform.interface.mjs +0 -2
  26. package/esm2022/lib/components/image-cropper/interfaces/index.mjs +0 -2
  27. package/esm2022/lib/components/image-cropper/interfaces/loaded-image.interface.mjs +0 -2
  28. package/esm2022/lib/components/image-cropper/interfaces/move-start.interface.mjs +0 -8
  29. package/esm2022/lib/components/image-cropper/services/crop.service.mjs +0 -139
  30. package/esm2022/lib/components/image-cropper/services/load-image.service.mjs +0 -194
  31. package/esm2022/lib/components/image-cropper/utils/cropper-position.utils.mjs +0 -239
  32. package/esm2022/lib/components/image-cropper/utils/exif.utils.mjs +0 -79
  33. package/esm2022/lib/components/image-cropper/utils/keyboard.utils.mjs +0 -40
  34. package/esm2022/lib/components/image-cropper/utils/percentage.utils.mjs +0 -4
  35. package/esm2022/lib/components/image-cropper/utils/resize.utils.mjs +0 -75
  36. package/esm2022/lib/components/list-view-filter/list-view-filter.component.mjs +0 -403
  37. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +0 -2925
  38. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -101
  39. package/esm2022/lib/components/pick-location/pick-location.component.mjs +0 -234
  40. package/esm2022/lib/components/search-box/search-box.component.mjs +0 -415
  41. package/esm2022/lib/country.json +0 -43237
  42. package/esm2022/lib/en.i18n.mjs +0 -29
  43. package/esm2022/lib/i18n-config.service.mjs +0 -4
  44. package/esm2022/lib/i18n.component.mjs +0 -47
  45. package/esm2022/lib/i18n.module.mjs +0 -38
  46. package/esm2022/lib/i18n.pipe.mjs +0 -26
  47. package/esm2022/lib/i18n.service.mjs +0 -56
  48. package/esm2022/lib/interfaces/actionMeta.mjs +0 -2
  49. package/esm2022/lib/interfaces/apimeta.mjs +0 -2
  50. package/esm2022/lib/interfaces/dependencyMeta.mjs +0 -2
  51. package/esm2022/lib/model/bookletWrapper.mjs +0 -9
  52. package/esm2022/lib/model/changeWrapper.mjs +0 -11
  53. package/esm2022/lib/model/errorWrapper.mjs +0 -6
  54. package/esm2022/lib/nxt-app.component.mjs +0 -22
  55. package/esm2022/lib/nxt-app.module.mjs +0 -139
  56. package/esm2022/lib/nxt-app.service.mjs +0 -14
  57. package/esm2022/lib/pages/booklet/booklet.component.mjs +0 -675
  58. package/esm2022/lib/pages/builder/element/element.component.mjs +0 -466
  59. package/esm2022/lib/pages/builder/form/form.component.mjs +0 -45
  60. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +0 -89
  61. package/esm2022/lib/pages/builder/properties/properties.component.mjs +0 -1021
  62. package/esm2022/lib/pages/builder/templates/templates.component.mjs +0 -34
  63. package/esm2022/lib/pages/pdfDesigner/pdf-designer/pdf-designer.component.mjs +0 -676
  64. package/esm2022/lib/pages/pdfDesigner/pdf-properties/pdf-properties.component.mjs +0 -1126
  65. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +0 -841
  66. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +0 -2405
  67. package/esm2022/lib/pipe/custom-translate.pipe.mjs +0 -27
  68. package/esm2022/lib/pipe/date/date.pipe.mjs +0 -28
  69. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +0 -28
  70. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +0 -20
  71. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +0 -20
  72. package/esm2022/lib/pipe/get-value.pipe.mjs +0 -48
  73. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +0 -39
  74. package/esm2022/lib/pipe/time/time.pipe.mjs +0 -26
  75. package/esm2022/lib/sample.mjs +0 -3715
  76. package/esm2022/lib/services/change.service.mjs +0 -50
  77. package/esm2022/lib/services/country.service.mjs +0 -135
  78. package/esm2022/lib/services/data.service.mjs +0 -103
  79. package/esm2022/lib/services/form-builder.service.mjs +0 -375
  80. package/esm2022/lib/services/pdf-designer.service.mjs +0 -401
  81. package/esm2022/lib/services/salesforce.service.mjs +0 -46
  82. package/esm2022/lib/services/shared.service.mjs +0 -100
  83. package/esm2022/lib/services/storage.service.mjs +0 -44
  84. package/esm2022/lib/services/template.service.mjs +0 -351
  85. package/esm2022/lib/services/translation.service.mjs +0 -62
  86. package/esm2022/lib/tam.i18n.mjs +0 -29
  87. package/esm2022/lib/wrapper.mjs +0 -175
  88. package/esm2022/public-api.mjs +0 -25
  89. package/esm2022/rangertechnologies-ngnxt.mjs +0 -5
  90. package/rangertechnologies-ngnxt-2.1.240.tgz +0 -0
@@ -1,466 +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 { QuestionbookComponent } from "../../questionbook/questionbook.component";
5
- import { CommonModule } from "@angular/common";
6
- import { FormsModule } from "@angular/forms";
7
- import { BookletComponent } from "../../booklet/booklet.component";
8
- import { NxtDatatable } from "../../../components/datatable/datatable.component";
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../../../services/form-builder.service";
11
- import * as i2 from "@angular/common";
12
- import * as i3 from "@angular/forms";
13
- export class ElementComponent {
14
- formBuilderService;
15
- bookletJSON;
16
- bookletId;
17
- templateMode = new EventEmitter();
18
- field;
19
- formElements = [];
20
- elements = [];
21
- bookId;
22
- sections = {
23
- basic: true, // Basic Elements open by default
24
- advanced: true, // Advanced Elements closed by default
25
- };
26
- basicElements = [];
27
- advancedElements = [];
28
- //elementDisabledArray: any;
29
- version = VERSION.version; //SKS10MAR25 get version from environment/version.ts
30
- book;
31
- selectedElement = null;
32
- isSelectTablePopup = false;
33
- currentType;
34
- addTable = true;
35
- dots = Array(6);
36
- draggedIndex = null;
37
- templateSelected = false;
38
- constructor(formBuilderService) {
39
- this.formBuilderService = formBuilderService;
40
- }
41
- // AP-06MAR25 Basic elements updated (RichTextArea, Date added)
42
- ngOnInit() {
43
- this.basicElements = [
44
- { type: "Text", img: "Text", label: "Text" },
45
- { type: "Number", img: "Number", label: "Number" },
46
- { type: "Label", img: "Label", label: "Label" },
47
- { type: "Email", img: "Email", label: "Email" },
48
- { type: "Date", img: "Date", label: "Date" },
49
- { type: "Time", img: "Time", label: "Time" },
50
- { type: "DateTime", img: "DateTime", label: "DateTime" },
51
- { type: "Calendar", img: "Calendar", label: "Calendar" },
52
- { type: "File", img: "File", label: "Files" },
53
- { type: "Image", img: "Image", label: "Image" },
54
- { type: "Checkbox", img: "CheckBox", label: "Checkbox" },
55
- { type: "Radio", img: "Radio", label: "Radio" },
56
- { type: "Dropdown", img: "Drop", label: "Dropdown" },
57
- { type: "TextArea", img: "TextArea", label: "Text Area" },
58
- { type: "RichTextArea", img: "RichText", label: "Rich Text" },
59
- ];
60
- this.advancedElements = [
61
- { type: "Icon", img: "Icon", label: "Icon" }, //MSM10JUL25 icon selector component
62
- { type: "Line", img: "line", label: "Line" },
63
- { type: "Space", img: "space", label: "Space" },
64
- { type: "Boolean", img: "Boolean", label: "Boolean" },
65
- { type: "Book", img: "Search", label: "Book" },
66
- { type: "List", img: "Search", label: "List" },
67
- { type: "Table", img: "Table", label: "Table" },
68
- { type: "Button", img: "Button", label: "Button" },
69
- ];
70
- // this.elementDisabledArray = {
71
- // Table: [
72
- // 'Book', 'Calendar',"Boolean", 'List', 'Table', 'Checkbox', 'Radio',
73
- // 'Dropdown', 'TextArea', 'RichTextArea', 'Number', 'Label', 'Image',
74
- // 'Email', 'Date', 'Time', 'DateTime', 'Line', 'Space'
75
- // ]
76
- // };
77
- this.formBuilderService.formElements$.subscribe((elements) => {
78
- setTimeout(() => {
79
- this.formElements = elements.map((field) => ({ ...field }));
80
- }, 0);
81
- });
82
- if (this.bookletJSON && this.bookletJSON !== "") {
83
- this.initializeForm();
84
- }
85
- else {
86
- this.formBuilderService.newBook();
87
- }
88
- // AP-12MAR25 - Added to handle bookletId
89
- if (this.bookletId) {
90
- localStorage.setItem("unique_id", this.bookletId);
91
- }
92
- this.book = this.formBuilderService.getBook();
93
- this.formBuilderService.selectedElement$.subscribe((index) => {
94
- const elements = this.formBuilderService.getElements();
95
- if (index >= 0) {
96
- this.selectedElement = elements[index];
97
- }
98
- // SKS19MAR25 for fieldMeta checking
99
- if (this.selectedElement?.type === "Table") {
100
- this.selectedElement["fieldsMeta"] =
101
- typeof this.selectedElement.fieldsMeta === "string"
102
- ? this.selectedElement.fieldsMeta
103
- : JSON.stringify(this.selectedElement["fieldsMeta"] || []);
104
- }
105
- // this.formElements = [...elements]
106
- });
107
- this.formBuilderService.addElementWithId();
108
- }
109
- // Add these methods
110
- toggleSection(section) {
111
- this.sections[section] = !this.sections[section];
112
- }
113
- isSectionOpen(section) {
114
- return this.sections[section];
115
- }
116
- // AP - 26FEB25 - Added ngOnChanges to handle changes in bookletJSON
117
- ngOnChanges(changes) {
118
- if (changes["bookletJSON"] && changes["bookletJSON"].currentValue) {
119
- if (this.bookletJSON && this.bookletJSON !== "") {
120
- // AP-28MAY25 - Check and transform `action` if it's in Existing format
121
- if (this.bookletJSON.questionbook &&
122
- this.bookletJSON.questionbook.action &&
123
- typeof this.bookletJSON.questionbook.action === "string") {
124
- try {
125
- const parsedActions = JSON.parse(this.bookletJSON.questionbook.action);
126
- // AP-28MAY25 Assign specific positionPercent based on action name
127
- const newActions = parsedActions.map((item, index) => {
128
- const positionPercent = item.name === "Cancel"
129
- ? 3
130
- : item.name === "Save"
131
- ? 14
132
- : 10 + index * 10;
133
- return {
134
- ...item,
135
- positionPercent: positionPercent,
136
- width: 100,
137
- textColor: "#ffffff",
138
- borderRadius: 6,
139
- id: index + 1,
140
- };
141
- });
142
- // AP-28MAY25 Replace the old action string with the newly formatted array
143
- this.bookletJSON.questionbook.action = newActions;
144
- }
145
- catch (e) {
146
- console.error("Error parsing action JSON string:", e);
147
- }
148
- }
149
- this.initializeForm();
150
- }
151
- else {
152
- this.formBuilderService.newBook();
153
- }
154
- }
155
- }
156
- // AP-08APR25 Template is selected, update form elements and emit template mode
157
- onTemplateSelected(event) {
158
- this.formBuilderService.clearElements();
159
- event.elements.forEach((el) => this.formBuilderService.addElement(el));
160
- // Emit template mode to parent
161
- this.templateMode.emit(true);
162
- }
163
- initializeForm() {
164
- if (!this.bookletJSON || !this.bookletJSON.bookQuestionsMap) {
165
- console.warn("Invalid bookletJSON structure");
166
- return;
167
- }
168
- this.formElements = [];
169
- this.formBuilderService.clearElements();
170
- this.formBuilderService.intializeBook(this.bookletJSON);
171
- const bookQuestionsMap = this.bookletJSON.bookQuestionsMap;
172
- const bookQuestionsMapKeys = Object.keys(bookQuestionsMap);
173
- if (bookQuestionsMapKeys.length === 0)
174
- return;
175
- for (const key of bookQuestionsMapKeys) {
176
- const subQuestions = bookQuestionsMap[key]?.subQuestions;
177
- if (Array.isArray(subQuestions)) {
178
- subQuestions.forEach((subQuestion) => {
179
- // AP-04APR24 If subQuestion.style exists as a string and is empty, replace it with a default style object
180
- if (typeof subQuestion.style === "string" &&
181
- subQuestion.style.trim() === "") {
182
- subQuestion.style = {
183
- labelClass: null,
184
- labelStyle: null,
185
- labelValueStyle: null,
186
- inputClass: null,
187
- inputStyle: null,
188
- showLabel: true,
189
- bookStyle: null,
190
- direction: "ltr",
191
- questionStyle: null,
192
- };
193
- }
194
- });
195
- }
196
- }
197
- this.formElements = this.formBuilderService.getElements();
198
- }
199
- // Add this method to handle element selection
200
- selectElement(index) {
201
- this.selectedFieldIndex = index; // element is selected
202
- this.formBuilderService.setSelectedElement(index);
203
- this.book = this.formBuilderService.getBook();
204
- }
205
- selectedFieldIndex = null; // element is cleared
206
- selectHeading(event) {
207
- this.formBuilderService.selectHeading(event); //AP-10MAR25 Updates the selected heading in the service
208
- this.book = this.formBuilderService.getBook(); //AP-10MAR25 Retrieves the updated book/form data
209
- }
210
- // AP-17APR25 generateUiId
211
- generateUiId() {
212
- return this.formBuilderService.addElementWithId();
213
- }
214
- addElement(type) {
215
- const unique_id = this.generateUiId();
216
- this.currentType = type;
217
- if (this.selectedElement?.type === "Table" && this.addTable) {
218
- this.isSelectTablePopup = true;
219
- }
220
- else {
221
- const newElement = {
222
- action: null,
223
- id: unique_id,
224
- type,
225
- name: null,
226
- questionText: null,
227
- question: null,
228
- helpText: null,
229
- errorMessage: null,
230
- isReadOnly: false,
231
- isHidden: false,
232
- required: false,
233
- referenceField: null,
234
- additionalRichContent: null,
235
- groupName: null,
236
- isDateBackward: false,
237
- title: null,
238
- subTitle: null,
239
- size: 12,
240
- isDateForward: false,
241
- isOptional: false,
242
- isTitle: false,
243
- nextQuestion: null,
244
- allowedFileExtensions: null,
245
- questionNumber: this.formBuilderService.getElements().length + 1,
246
- order: this.formElements.length + 1,
247
- questionBookId: this.bookletId,
248
- fieldsMeta: [],
249
- trackingId: null,
250
- recordId: null,
251
- qbReference: null,
252
- qbReferenceQuestions: null,
253
- primaryKey: false,
254
- style: {
255
- labelClass: null,
256
- labelStyle: null,
257
- labelValueStyle: null,
258
- inputClass: null,
259
- inputStyle: null,
260
- showLabel: true,
261
- bookStyle: null,
262
- direction: "ltr",
263
- questionStyle: null,
264
- },
265
- subText: this.getDefaultSubText(),
266
- imageData: null,
267
- boolean: false,
268
- options: type === "Dropdown" || type === "Radio" || type === "Checkbox"
269
- ? []
270
- : null,
271
- imageSize: type === "Image" ? { width: 150, height: 150 } : null,
272
- tableConfig: type === "Table"
273
- ? {
274
- isNosIndicator: true,
275
- addInlineRecord: true,
276
- isPagination: true,
277
- actionButton: true,
278
- isDeleteRow: true,
279
- isEditRow: true,
280
- searchBar: true,
281
- isButtons: true,
282
- itemsPerPage: 10,
283
- }
284
- : null,
285
- };
286
- this.formBuilderService.addElement(newElement);
287
- this.formElements = this.formBuilderService.getElements();
288
- // SKS19MAR25 fieldsmeta check
289
- this.formElements = this.updateTableFieldsMeta(this.formElements);
290
- this.addTable = true;
291
- }
292
- }
293
- // AP-07MAY25 - Added to handle default subText
294
- getDefaultSubText() {
295
- const defaultData = {
296
- endpoint: null,
297
- variable: null,
298
- field: null,
299
- defaultField: null,
300
- sourceQuestionId: null,
301
- valueField: null,
302
- labelField: null,
303
- isDependentField: false,
304
- dependentValue: null,
305
- queryField: null,
306
- queryValue: null,
307
- queryValueReference: null,
308
- uniqueKey: null,
309
- };
310
- const isEmpty = Object.values(defaultData).every((val) => val === null || val === false);
311
- return isEmpty ? null : defaultData;
312
- }
313
- // Remove an element by index
314
- removeElement(field, index) {
315
- this.formBuilderService.removeElementComponent(field.id);
316
- this.formElements = this.formBuilderService.getElements();
317
- // SKS19MAR25 fieldsmeta check
318
- this.formElements = this.updateTableFieldsMeta(this.formElements);
319
- }
320
- onDragStart(event, index) {
321
- this.draggedIndex = index;
322
- event.dataTransfer?.setData("text/plain", index.toString());
323
- }
324
- // Allow dropping by preventing default
325
- onDragOver(event, index) {
326
- event.preventDefault();
327
- }
328
- // Handle drop event
329
- onDrop(event, dropIndex) {
330
- event.preventDefault();
331
- if (this.draggedIndex === null || this.draggedIndex === dropIndex)
332
- return;
333
- const draggedItem = this.formElements[this.draggedIndex];
334
- // Remove dragged item from old position and insert it in new position
335
- this.formElements.splice(this.draggedIndex, 1);
336
- this.formElements.splice(dropIndex, 0, draggedItem);
337
- //AP-28MAR25 Update questionNumber dynamically based on new order
338
- this.formElements.forEach((element, index) => {
339
- element.questionNumber = index + 1;
340
- });
341
- // Reset dragged index
342
- this.draggedIndex = null;
343
- // Notify service about the update
344
- this.formBuilderService.updateElementsOrder(this.formElements);
345
- }
346
- toggleBoolean(field) {
347
- field.boolean = !field.boolean;
348
- }
349
- getBaseStyles(field, includeBorderStyle = false) {
350
- const styles = {
351
- "font-family": field?.font || "Helvetica Neue",
352
- "font-weight": field?.fontWeight || "400",
353
- "font-size": field?.fontSize || "14px",
354
- "width": field?.size ? `${(field.size / 12) * 100}%` : "100%",
355
- "text-align": field?.textAlign || "left",
356
- "border-radius": "5px",
357
- "border-width": field?.lineWidth ? `${field.lineWidth}px` : "1px",
358
- "color": field?.fontColor || "#000000",
359
- "margin-top": field?.paddingTop ? `${field.paddingTop}px` : "0px",
360
- "margin-bottom": field?.paddingBottom ? `${field.paddingBottom}px` : "10px",
361
- "border-color": field?.color || "#EFF8FF",
362
- };
363
- if (includeBorderStyle) {
364
- styles["border-style"] = field?.lineStyle?.toLowerCase() || "solid";
365
- }
366
- return styles;
367
- }
368
- getFontStyles(field) {
369
- return this.getBaseStyles(field, false);
370
- }
371
- getLineStyles(field) {
372
- return this.getBaseStyles(field, true);
373
- }
374
- // SKS13MAR25 table popup conformation based element add
375
- onClose() {
376
- this.isSelectTablePopup = false;
377
- this.addTable = false;
378
- this.addElement(this.currentType);
379
- }
380
- // SKS13MAR25 column element add inside a table
381
- addOnTable() {
382
- this.addTable = true;
383
- this.isSelectTablePopup = false;
384
- const elements = [...this.formBuilderService.getElements()];
385
- // Find the element and update its columns
386
- const index = elements.findIndex((el) => el.id === this.selectedElement.id);
387
- const rowNum = this.formElements[index].columns
388
- ? this.formElements[index].columns?.length
389
- : 0;
390
- const unique_id = this.generateUiId();
391
- const tableElement = {
392
- label: `HEADER LABEL ${rowNum}`,
393
- fieldName: `FIELD NAME${rowNum}`,
394
- type: this.currentType,
395
- id: unique_id,
396
- };
397
- this.formBuilderService.addTableElement(tableElement, this.selectedFieldIndex);
398
- this.formElements = this.formBuilderService.getElements();
399
- // SKS19MAR25 fieldsmeta checking
400
- this.formElements = this.updateTableFieldsMeta(this.formElements);
401
- }
402
- updateTableFieldsMeta(elements) {
403
- return elements.map((ele) => {
404
- if (ele.type === "Table") {
405
- ele.fieldsMeta =
406
- typeof ele.fieldsMeta === "string"
407
- ? ele.fieldsMeta
408
- : JSON.stringify(ele.fieldsMeta || []);
409
- }
410
- return ele;
411
- });
412
- }
413
- columnSelected(event) {
414
- // SKS19MAR25 table column update
415
- this.formBuilderService.setSelectedTableElement(this.selectedFieldIndex, event);
416
- }
417
- removeColumn(event) {
418
- this.formBuilderService.removeSelectedTableElement(this.selectedFieldIndex, event);
419
- }
420
- // SKS25MAR25 image add
421
- async fileChangeEvent(index, event) {
422
- const file = event.target.files[0];
423
- if (file) {
424
- try {
425
- const imageData = await this.readFileAsDataURL(file);
426
- this.formElements[index].imageData = imageData;
427
- this.formElements[index].orgImageData = imageData;
428
- // Initialize logo size if not already set
429
- if (!this.formElements[index].imageSize) {
430
- this.formElements[index].imageSize = { width: 150, height: 150 };
431
- }
432
- await this.formBuilderService.elementUpdate(index, this.formElements[index]);
433
- }
434
- catch (error) {
435
- console.error("Error reading file:", error);
436
- }
437
- }
438
- }
439
- readFileAsDataURL(file) {
440
- return new Promise((resolve, reject) => {
441
- const reader = new FileReader();
442
- reader.onload = () => resolve(reader.result);
443
- reader.onerror = (error) => reject(error);
444
- reader.readAsDataURL(file);
445
- });
446
- }
447
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, deps: [{ token: i1.FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
448
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ElementComponent, isStandalone: true, selector: "app-element", inputs: { bookletJSON: "bookletJSON", bookletId: "bookletId" }, 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</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</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 class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;display: flex;justify-content: center;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px;\">\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 </div>\n\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n\n <!-- TextBox -->\n <div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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]=\"getLineStyles(field)\" />\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]=\"getFontStyles(field)\">\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' }}</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</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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 </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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}\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.value }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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.value }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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.value\n }} </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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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 (columnSelected)=columnSelected($event) (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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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...\" [readonly]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\" [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>These element want to add a table</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">Yes</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">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: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.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: i3.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.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", "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"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "NxtTableEmit"] }] });
449
- }
450
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ElementComponent, decorators: [{
451
- type: Component,
452
- args: [{ selector: "app-element", standalone: true, imports: [
453
- QuestionbookComponent,
454
- CommonModule,
455
- FormsModule,
456
- BookletComponent,
457
- NxtDatatable,
458
- ], 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</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</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 class=\"field-container\"\n style=\"width: 100%;background-color: #EFF8FF; border: 1px solid #E6F3FF;display: flex;justify-content: center;margin-bottom:10px\"\n (click)=\"selectHeading('Header')\">\n <div class=\"label-container\" style=\"padding: 10px;\">\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 </div>\n\n <ng-container *ngFor=\"let field of formElements; let i = index\" getProperties().elementProps>\n\n <!-- TextBox -->\n <div *ngIf=\"field.type === 'Text'\" class=\"field-container\" (click)=\"selectElement(i)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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]=\"getLineStyles(field)\" />\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]=\"getFontStyles(field)\">\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' }}</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</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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 </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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'}}</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\" [placeholder]=\"field.question || '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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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'\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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}\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.value }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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.value }}</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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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.value\n }} </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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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 (columnSelected)=columnSelected($event) (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)\"\n [ngStyle]=\"getFontStyles(field)\" [class.highlight]=\"selectedFieldIndex === i\" draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\" (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' }}</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...\" [readonly]=\"field.isReadOnly\"\n [class.hidden]=\"field.isHidden\" [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>These element want to add a table</p>\n <div class=\"button-container-fb\">\n <button class=\"yes-btn-fb\" (click)=\"addOnTable()\">Yes</button>\n <button class=\"no-btn-fb\" (click)=\"onClose()\">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"] }]
459
- }], ctorParameters: () => [{ type: i1.FormBuilderService }], propDecorators: { bookletJSON: [{
460
- type: Input
461
- }], bookletId: [{
462
- type: Input
463
- }], templateMode: [{
464
- type: Output
465
- }] } });
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9lbGVtZW50L2VsZW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvZWxlbWVudC9lbGVtZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7Ozs7QUFlakYsTUFBTSxPQUFPLGdCQUFnQjtJQXdCUDtJQXZCWCxXQUFXLENBQU07SUFDakIsU0FBUyxDQUFNO0lBQ2QsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDckQsS0FBSyxDQUFNO0lBQ1gsWUFBWSxHQUFVLEVBQUUsQ0FBQztJQUN6QixRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQ3JCLE1BQU0sQ0FBUztJQUNmLFFBQVEsR0FBRztRQUNULEtBQUssRUFBRSxJQUFJLEVBQUUsaUNBQWlDO1FBQzlDLFFBQVEsRUFBRSxJQUFJLEVBQUUsc0NBQXNDO0tBQ3ZELENBQUM7SUFDRixhQUFhLEdBQVUsRUFBRSxDQUFDO0lBQzFCLGdCQUFnQixHQUFVLEVBQUUsQ0FBQztJQUM3Qiw0QkFBNEI7SUFDNUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxvREFBb0Q7SUFDL0UsSUFBSSxDQUFNO0lBQ1YsZUFBZSxHQUFRLElBQUksQ0FBQztJQUM1QixrQkFBa0IsR0FBWSxLQUFLLENBQUM7SUFDcEMsV0FBVyxDQUFTO0lBQ3BCLFFBQVEsR0FBWSxJQUFJLENBQUM7SUFDekIsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixZQUFZLEdBQWtCLElBQUksQ0FBQztJQUNuQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsWUFBb0Isa0JBQXNDO1FBQXRDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7SUFBRyxDQUFDO0lBQ2hFLCtEQUErRDtJQUM3RCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQzVDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDbEQsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUMvQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQy9DLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDNUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM1QyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ3hELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDeEQsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUM3QyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQy9DLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDeEQsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUMvQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ3BELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7WUFDekQsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRTtTQUM5RCxDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHO1lBQ3RCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxvQ0FBb0M7WUFDbEYsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM1QyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQy9DLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDckQsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM5QyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7WUFDL0MsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtTQUNuRCxDQUFDO1FBQ0YsZ0NBQWdDO1FBQ2hDLGFBQWE7UUFDYiwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLDJEQUEyRDtRQUMzRCxNQUFNO1FBQ04sS0FBSztRQUVMLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDM0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5RCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxDQUFDO1FBQ0QseUNBQXlDO1FBQ3pDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2RCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxDQUFDO1lBQ0Qsb0NBQW9DO1lBQ3BDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO29CQUNoQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxLQUFLLFFBQVE7d0JBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVU7d0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELG9DQUFvQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsYUFBYSxDQUFDLE9BQTZCO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxhQUFhLENBQUMsT0FBZTtRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELG9FQUFvRTtJQUNwRSxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xFLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUNoRCx1RUFBdUU7Z0JBQ3ZFLElBQ0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZO29CQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNO29CQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQ3hELENBQUM7b0JBQ0QsSUFBSSxDQUFDO3dCQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDckMsQ0FBQzt3QkFFRixrRUFBa0U7d0JBQ2xFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsS0FBYSxFQUFFLEVBQUU7NEJBQ2hFLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVE7Z0NBQ3BCLENBQUMsQ0FBQyxDQUFDO2dDQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU07b0NBQ3RCLENBQUMsQ0FBQyxFQUFFO29DQUNKLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQzs0QkFFdEIsT0FBTztnQ0FDTCxHQUFHLElBQUk7Z0NBQ1AsZUFBZSxFQUFFLGVBQWU7Z0NBQ2hDLEtBQUssRUFBRSxHQUFHO2dDQUNWLFNBQVMsRUFBRSxTQUFTO2dDQUNwQixZQUFZLEVBQUUsQ0FBQztnQ0FDZixFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUM7NkJBQ2QsQ0FBQzt3QkFDSixDQUFDLENBQUMsQ0FBQzt3QkFDSCwwRUFBMEU7d0JBQzFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQ3BELENBQUM7b0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN4RCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsK0VBQStFO0lBQy9FLGtCQUFrQixDQUFDLEtBQWlEO1FBQ2xFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN4QyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZFLCtCQUErQjtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM1RCxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDO1FBQzNELE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRTNELElBQUksb0JBQW9CLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBRTlDLEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUM7WUFFekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbkMsMEdBQTBHO29CQUMxRyxJQUNFLE9BQU8sV0FBVyxDQUFDLEtBQUssS0FBSyxRQUFRO3dCQUNyQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDL0IsQ0FBQzt3QkFDRCxXQUFXLENBQUMsS0FBSyxHQUFHOzRCQUNsQixVQUFVLEVBQUUsSUFBSTs0QkFDaEIsVUFBVSxFQUFFLElBQUk7NEJBQ2hCLGVBQWUsRUFBRSxJQUFJOzRCQUNyQixVQUFVLEVBQUUsSUFBSTs0QkFDaEIsVUFBVSxFQUFFLElBQUk7NEJBQ2hCLFNBQVMsRUFBRSxJQUFJOzRCQUNmLFNBQVMsRUFBRSxJQUFJOzRCQUNmLFNBQVMsRUFBRSxLQUFLOzRCQUNoQixhQUFhLEVBQUUsSUFBSTt5QkFDcEIsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0I7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFDRCxrQkFBa0IsR0FBa0IsSUFBSSxDQUFDLENBQUMscUJBQXFCO0lBRS9ELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyx3REFBd0Q7UUFDdEcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxpREFBaUQ7SUFDbEcsQ0FBQztJQUNELDBCQUEwQjtJQUMxQixZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVk7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEVBQUUsRUFBRSxTQUFTO2dCQUNiLElBQUk7Z0JBQ0osSUFBSSxFQUFFLElBQUk7Z0JBQ1YsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsS0FBSztnQkFDakIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLHFCQUFxQixFQUFFLElBQUk7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJO2dCQUNmLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxJQUFJLEVBQUUsRUFBRTtnQkFDUixhQUFhLEVBQUUsS0FBSztnQkFDcEIsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRSxJQUFJO2dCQUNsQixxQkFBcUIsRUFBRSxJQUFJO2dCQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUNoRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUM5QixVQUFVLEVBQUUsRUFBRTtnQkFDZCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLG9CQUFvQixFQUFFLElBQUk7Z0JBQzFCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixlQUFlLEVBQUUsSUFBSTtvQkFDckIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixTQUFTLEVBQUUsSUFBSTtvQkFDZixTQUFTLEVBQUUsSUFBSTtvQkFDZixTQUFTLEVBQUUsS0FBSztvQkFDaEIsYUFBYSxFQUFFLElBQUk7aUJBQ3BCO2dCQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFDTCxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLFVBQVU7b0JBQzVELENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxJQUFJO2dCQUNWLFNBQVMsRUFBRSxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNoRSxXQUFXLEVBQ1QsSUFBSSxLQUFLLE9BQU87b0JBQ2QsQ0FBQyxDQUFDO3dCQUNFLGNBQWMsRUFBRSxJQUFJO3dCQUNwQixlQUFlLEVBQUUsSUFBSTt3QkFDckIsWUFBWSxFQUFFLElBQUk7d0JBQ2xCLFlBQVksRUFBRSxJQUFJO3dCQUNsQixXQUFXLEVBQUUsSUFBSTt3QkFDakIsU0FBUyxFQUFFLElBQUk7d0JBQ2YsU0FBUyxFQUFFLElBQUk7d0JBQ2YsU0FBUyxFQUFFLElBQUk7d0JBQ2YsWUFBWSxFQUFFLEVBQUU7cUJBQ2pCO29CQUNILENBQUMsQ0FBQyxJQUFJO2FBQ1gsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUQsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUNELCtDQUErQztJQUMvQyxpQkFBaUI7UUFDZixNQUFNLFdBQVcsR0FBRztZQUNsQixRQUFRLEVBQUUsSUFBSTtZQUNkLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLElBQUk7WUFDWCxZQUFZLEVBQUUsSUFBSTtZQUNsQixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsY0FBYyxFQUFFLElBQUk7WUFDcEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDO1FBRUYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQ3ZDLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUNELDZCQUE2QjtJQUM3QixhQUFhLENBQUMsS0FBVSxFQUFFLEtBQWE7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBZ0IsRUFBRSxLQUFhO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLFVBQVUsQ0FBQyxLQUFnQixFQUFFLEtBQWE7UUFDeEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsTUFBTSxDQUFDLEtBQWdCLEVBQUUsU0FBaUI7UUFDeEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUUxRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV6RCxzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXBELGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMzQyxPQUFPLENBQUMsY0FBYyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7UUFFSCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxhQUFhLENBQUMsS0FBVSxFQUFFLHFCQUE4QixLQUFLO1FBQzNELE1BQU0sTUFBTSxHQUFRO1lBQ2xCLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLGdCQUFnQjtZQUM5QyxhQUFhLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLO1lBQ3pDLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLE1BQU07WUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzdELFlBQVksRUFBRSxLQUFLLEVBQUUsU0FBUyxJQUFJLE1BQU07WUFDeEMsZUFBZSxFQUFFLEtBQUs7WUFDdEIsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxJQUFJLFNBQVM7WUFDdEMsWUFBWSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ2pFLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUMzRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxTQUFTO1NBQzFDLENBQUM7UUFDRixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksT0FBTyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVU7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELE9BQU87UUFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCwrQ0FBK0M7SUFDL0MsVUFBVTtRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTVELDBDQUEwQztRQUMxQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPO1lBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNO1lBQzFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUc7WUFDbkIsS0FBSyxFQUFFLGdCQUFnQixNQUFNLEVBQUU7WUFDL0IsU0FBUyxFQUFFLGFBQWEsTUFBTSxFQUFFO1lBQ2hDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVztZQUN0QixFQUFFLEVBQUUsU0FBUztTQUNkLENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUNyQyxZQUFZLEVBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1FBQ0YsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUQsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QscUJBQXFCLENBQUMsUUFBZTtRQUNuQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMxQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxVQUFVO29CQUNaLE9BQU8sR0FBRyxDQUFDLFVBQVUsS0FBSyxRQUFRO3dCQUNoQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVU7d0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsY0FBYyxDQUFDLEtBQVU7UUFDdkIsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FDN0MsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFDRCxZQUFZLENBQUMsS0FBVTtRQUNyQixJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQ2hELElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBVSxFQUFFLEtBQVU7UUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7Z0JBQ2xELDBDQUEwQztnQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQ25FLENBQUM7Z0JBRUQsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUN6QyxLQUFLLEVBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FDekIsQ0FBQztZQUNKLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBVTtRQUNsQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBbGVVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLHVNQzdCN0IscW8rQkFxbEJNLHc4TERoa0JGLFlBQVksb1ZBQ1osV0FBVywrZ0NBQ1gsZ0JBQWdCLDhZQUNoQixZQUFZOzs0RkFLSCxnQkFBZ0I7a0JBYjVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUDt3QkFDUCxxQkFBcUI7d0JBQ3JCLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxnQkFBZ0I7d0JBQ2hCLFlBQVk7cUJBQ2I7dUZBS1EsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBUCAyMkpBTjI1IC0gZm9ybSBwcmV2aWV3IGFuZCBBbGwgZm9ybSBlbGVtZW50c1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQnVpbGRlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvZm9ybS1idWlsZGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tIFwiLi4vLi4vLi4vLi4vZW52aXJvbm1lbnRzL3ZlcnNpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uYm9va0NvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmJvb2svcXVlc3Rpb25ib29rLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEJvb2tsZXRDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYm9va2xldC9ib29rbGV0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTnh0RGF0YXRhYmxlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnRcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1lbGVtZW50XCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBRdWVzdGlvbmJvb2tDb21wb25lbnQsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEJvb2tsZXRDb21wb25lbnQsXG4gICAgTnh0RGF0YXRhYmxlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogXCIuL2VsZW1lbnQuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2VsZW1lbnQuY29tcG9uZW50LmNzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgRWxlbWVudENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGJvb2tsZXRKU09OOiBhbnk7XG4gIEBJbnB1dCgpIGJvb2tsZXRJZDogYW55O1xuICBAT3V0cHV0KCkgdGVtcGxhdGVNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBmaWVsZDogYW55O1xuICBmb3JtRWxlbWVudHM6IGFueVtdID0gW107XG4gIGVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICBib29rSWQ6IHN0cmluZztcbiAgc2VjdGlvbnMgPSB7XG4gICAgYmFzaWM6IHRydWUsIC8vIEJhc2ljIEVsZW1lbnRzIG9wZW4gYnkgZGVmYXVsdFxuICAgIGFkdmFuY2VkOiB0cnVlLCAvLyBBZHZhbmNlZCBFbGVtZW50cyBjbG9zZWQgYnkgZGVmYXVsdFxuICB9O1xuICBiYXNpY0VsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICBhZHZhbmNlZEVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuICAvL2VsZW1lbnREaXNhYmxlZEFycmF5OiBhbnk7XG4gIHZlcnNpb24gPSBWRVJTSU9OLnZlcnNpb247IC8vU0tTMTBNQVIyNSBnZXQgdmVyc2lvbiBmcm9tIGVudmlyb25tZW50L3ZlcnNpb24udHNcbiAgYm9vazogYW55O1xuICBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IG51bGw7XG4gIGlzU2VsZWN0VGFibGVQb3B1cDogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50VHlwZTogc3RyaW5nO1xuICBhZGRUYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGRvdHMgPSBBcnJheSg2KTtcbiAgZHJhZ2dlZEluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgdGVtcGxhdGVTZWxlY3RlZCA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyU2VydmljZTogRm9ybUJ1aWxkZXJTZXJ2aWNlKSB7fVxuLy8gQVAtMDZNQVIyNSBCYXNpYyBlbGVtZW50cyB1cGRhdGVkIChSaWNoVGV4dEFyZWEsIERhdGUgYWRkZWQpXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYmFzaWNFbGVtZW50cyA9IFtcbiAgICAgIHsgdHlwZTogXCJUZXh0XCIsIGltZzogXCJUZXh0XCIsIGxhYmVsOiBcIlRleHRcIiB9LFxuICAgICAgeyB0eXBlOiBcIk51bWJlclwiLCBpbWc6IFwiTnVtYmVyXCIsIGxhYmVsOiBcIk51bWJlclwiIH0sXG4gICAgICB7IHR5cGU6IFwiTGFiZWxcIiwgaW1nOiBcIkxhYmVsXCIsIGxhYmVsOiBcIkxhYmVsXCIgfSxcbiAgICAgIHsgdHlwZTogXCJFbWFpbFwiLCBpbWc6IFwiRW1haWxcIiwgbGFiZWw6IFwiRW1haWxcIiB9LFxuICAgICAgeyB0eXBlOiBcIkRhdGVcIiwgaW1nOiBcIkRhdGVcIiwgbGFiZWw6IFwiRGF0ZVwiIH0sXG4gICAgICB7IHR5cGU6IFwiVGltZVwiLCBpbWc6IFwiVGltZVwiLCBsYWJlbDogXCJUaW1lXCIgfSxcbiAgICAgIHsgdHlwZTogXCJEYXRlVGltZVwiLCBpbWc6IFwiRGF0ZVRpbWVcIiwgbGFiZWw6IFwiRGF0ZVRpbWVcIiB9LFxuICAgICAgeyB0eXBlOiBcIkNhbGVuZGFyXCIsIGltZzogXCJDYWxlbmRhclwiLCBsYWJlbDogXCJDYWxlbmRhclwiIH0sXG4gICAgICB7IHR5cGU6IFwiRmlsZVwiLCBpbWc6IFwiRmlsZVwiLCBsYWJlbDogXCJGaWxlc1wiIH0sXG4gICAgICB7IHR5cGU6IFwiSW1hZ2VcIiwgaW1nOiBcIkltYWdlXCIsIGxhYmVsOiBcIkltYWdlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJDaGVja2JveFwiLCBpbWc6IFwiQ2hlY2tCb3hcIiwgbGFiZWw6IFwiQ2hlY2tib3hcIiB9LFxuICAgICAgeyB0eXBlOiBcIlJhZGlvXCIsIGltZzogXCJSYWRpb1wiLCBsYWJlbDogXCJSYWRpb1wiIH0sXG4gICAgICB7IHR5cGU6IFwiRHJvcGRvd25cIiwgaW1nOiBcIkRyb3BcIiwgbGFiZWw6IFwiRHJvcGRvd25cIiB9LFxuICAgICAgeyB0eXBlOiBcIlRleHRBcmVhXCIsIGltZzogXCJUZXh0QXJlYVwiLCBsYWJlbDogXCJUZXh0IEFyZWFcIiB9LFxuICAgICAgeyB0eXBlOiBcIlJpY2hUZXh0QXJlYVwiLCBpbWc6IFwiUmljaFRleHRcIiwgbGFiZWw6IFwiUmljaCBUZXh0XCIgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5hZHZhbmNlZEVsZW1lbnRzID0gW1xuICAgICAgeyB0eXBlOiBcIkljb25cIiwgaW1nOiBcIkljb25cIiwgbGFiZWw6IFwiSWNvblwiIH0sIC8vTVNNMTBKVUwyNSBpY29uIHNlbGVjdG9yIGNvbXBvbmVudFxuICAgICAgeyB0eXBlOiBcIkxpbmVcIiwgaW1nOiBcImxpbmVcIiwgbGFiZWw6IFwiTGluZVwiIH0sXG4gICAgICB7IHR5cGU6IFwiU3BhY2VcIiwgaW1nOiBcInNwYWNlXCIsIGxhYmVsOiBcIlNwYWNlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJCb29sZWFuXCIsIGltZzogXCJCb29sZWFuXCIsIGxhYmVsOiBcIkJvb2xlYW5cIiB9LFxuICAgICAgeyB0eXBlOiBcIkJvb2tcIiwgaW1nOiBcIlNlYXJjaFwiLCBsYWJlbDogXCJCb29rXCIgfSxcbiAgICAgIHsgdHlwZTogXCJMaXN0XCIsIGltZzogXCJTZWFyY2hcIiwgbGFiZWw6IFwiTGlzdFwiIH0sXG4gICAgICB7IHR5cGU6IFwiVGFibGVcIiwgaW1nOiBcIlRhYmxlXCIsIGxhYmVsOiBcIlRhYmxlXCIgfSxcbiAgICAgIHsgdHlwZTogXCJCdXR0b25cIiwgaW1nOiBcIkJ1dHRvblwiLCBsYWJlbDogXCJCdXR0b25cIiB9LFxuICAgIF07XG4gICAgLy8gdGhpcy5lbGVtZW50RGlzYWJsZWRBcnJheSA9IHtcbiAgICAvLyAgIFRhYmxlOiBbXG4gICAgLy8gICAgICdCb29rJywgJ0NhbGVuZGFyJyxcIkJvb2xlYW5cIiwgJ0xpc3QnLCAnVGFibGUnLCAnQ2hlY2tib3gnLCAnUmFkaW8nLFxuICAgIC8vICAgICAnRHJvcGRvd24nLCAnVGV4dEFyZWEnLCAnUmljaFRleHRBcmVhJywgJ051bWJlcicsICdMYWJlbCcsICdJbWFnZScsXG4gICAgLy8gICAgICdFbWFpbCcsICdEYXRlJywgJ1RpbWUnLCAnRGF0ZVRpbWUnLCAnTGluZScsICdTcGFjZSdcbiAgICAvLyAgIF1cbiAgICAvLyB9O1xuXG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZm9ybUVsZW1lbnRzJC5zdWJzY3JpYmUoKGVsZW1lbnRzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtRWxlbWVudHMgPSBlbGVtZW50cy5tYXAoKGZpZWxkKSA9PiAoeyAuLi5maWVsZCB9KSk7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5ib29rbGV0SlNPTiAmJiB0aGlzLmJvb2tsZXRKU09OICE9PSBcIlwiKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLm5ld0Jvb2soKTtcbiAgICB9XG4gICAgLy8gQVAtMTJNQVIyNSAtIEFkZGVkIHRvIGhhbmRsZSBib29rbGV0SWRcbiAgICBpZiAodGhpcy5ib29rbGV0SWQpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidW5pcXVlX2lkXCIsIHRoaXMuYm9va2xldElkKTtcbiAgICB9XG4gICAgdGhpcy5ib29rID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0Qm9vaygpO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNlbGVjdGVkRWxlbWVudCQuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICAvLyBTS1MxOU1BUjI1IGZvciBmaWVsZE1ldGEgY2hlY2tpbmdcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudD8udHlwZSA9PT0gXCJUYWJsZVwiKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50W1wiZmllbGRzTWV0YVwiXSA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuc2VsZWN0ZWRFbGVtZW50LmZpZWxkc01ldGEgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gdGhpcy5zZWxlY3RlZEVsZW1lbnQuZmllbGRzTWV0YVxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRWxlbWVudFtcImZpZWxkc01ldGFcIl0gfHwgW10pO1xuICAgICAgfVxuICAgICAgLy8gdGhpcy5mb3JtRWxlbWVudHMgPSBbLi4uZWxlbWVudHNdXG4gICAgfSk7XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkRWxlbWVudFdpdGhJZCgpO1xuICB9XG5cbiAgLy8gQWRkIHRoZXNlIG1ldGhvZHNcbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBcImJhc2ljXCIgfCBcImFkdmFuY2VkXCIpIHtcbiAgICB0aGlzLnNlY3Rpb25zW3NlY3Rpb25dID0gIXRoaXMuc2VjdGlvbnNbc2VjdGlvbl07XG4gIH1cblxuICBpc1NlY3Rpb25PcGVuKHNlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3NlY3Rpb25dO1xuICB9XG5cbiAgLy8gQVAgLSAyNkZFQjI1IC0gQWRkZWQgbmdPbkNoYW5nZXMgdG8gaGFuZGxlIGNoYW5nZXMgaW4gYm9va2xldEpTT05cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzW1wiYm9va2xldEpTT05cIl0gJiYgY2hhbmdlc1tcImJvb2tsZXRKU09OXCJdLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMuYm9va2xldEpTT04gJiYgdGhpcy5ib29rbGV0SlNPTiAhPT0gXCJcIikge1xuICAgICAgICAvLyBBUC0yOE1BWTI1IC0gQ2hlY2sgYW5kIHRyYW5zZm9ybSBgYWN0aW9uYCBpZiBpdCdzIGluIEV4aXN0aW5nIGZvcm1hdFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2sgJiZcbiAgICAgICAgICB0aGlzLmJvb2tsZXRKU09OLnF1ZXN0aW9uYm9vay5hY3Rpb24gJiZcbiAgICAgICAgICB0eXBlb2YgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2suYWN0aW9uID09PSBcInN0cmluZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRBY3Rpb25zID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgdGhpcy5ib29rbGV0SlNPTi5xdWVzdGlvbmJvb2suYWN0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBBUC0yOE1BWTI1IEFzc2lnbiBzcGVjaWZpYyBwb3NpdGlvblBlcmNlbnQgYmFzZWQgb24gYWN0aW9uIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IG5ld0FjdGlvbnMgPSBwYXJzZWRBY3Rpb25zLm1hcCgoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uUGVyY2VudCA9XG4gICAgICAgICAgICAgICAgaXRlbS5uYW1lID09PSBcIkNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICA/IDNcbiAgICAgICAgICAgICAgICAgIDogaXRlbS5uYW1lID09PSBcIlNhdmVcIlxuICAgICAgICAgICAgICAgICAgPyAxNFxuICAgICAgICAgICAgICAgICAgOiAxMCArIGluZGV4ICogMTA7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uUGVyY2VudDogcG9zaXRpb25QZXJjZW50LFxuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgICAgICAgdGV4dENvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDYsXG4gICAgICAgICAgICAgICAgaWQ6IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQVAtMjhNQVkyNSBSZXBsYWNlIHRoZSBvbGQgYWN0aW9uIHN0cmluZyB3aXRoIHRoZSBuZXdseSBmb3JtYXR0ZWQgYXJyYXlcbiAgICAgICAgICAgIHRoaXMuYm9va2xldEpTT04ucXVlc3Rpb25ib29rLmFjdGlvbiA9IG5ld0FjdGlvbnM7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhcnNpbmcgYWN0aW9uIEpTT04gc3RyaW5nOlwiLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5uZXdCb29rKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFQLTA4QVBSMjUgVGVtcGxhdGUgaXMgc2VsZWN0ZWQsIHVwZGF0ZSBmb3JtIGVsZW1lbnRzIGFuZCBlbWl0IHRlbXBsYXRlIG1vZGVcbiAgb25UZW1wbGF0ZVNlbGVjdGVkKGV2ZW50OiB7IHNlbGVjdGVkVGVtcGxhdGU6IGFueTsgZWxlbWVudHM6IGFueVtdIH0pIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5jbGVhckVsZW1lbnRzKCk7XG4gICAgZXZlbnQuZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnQoZWwpKTtcblxuICAgIC8vIEVtaXQgdGVtcGxhdGUgbW9kZSB0byBwYXJlbnRcbiAgICB0aGlzLnRlbXBsYXRlTW9kZS5lbWl0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuYm9va2xldEpTT04gfHwgIXRoaXMuYm9va2xldEpTT04uYm9va1F1ZXN0aW9uc01hcCkge1xuICAgICAgY29uc29sZS53YXJuKFwiSW52YWxpZCBib29rbGV0SlNPTiBzdHJ1Y3R1cmVcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gW107XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuY2xlYXJFbGVtZW50cygpO1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmludGlhbGl6ZUJvb2sodGhpcy5ib29rbGV0SlNPTik7XG5cbiAgICBjb25zdCBib29rUXVlc3Rpb25zTWFwID0gdGhpcy5ib29rbGV0SlNPTi5ib29rUXVlc3Rpb25zTWFwO1xuICAgIGNvbnN0IGJvb2tRdWVzdGlvbnNNYXBLZXlzID0gT2JqZWN0LmtleXMoYm9va1F1ZXN0aW9uc01hcCk7XG5cbiAgICBpZiAoYm9va1F1ZXN0aW9uc01hcEtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBib29rUXVlc3Rpb25zTWFwS2V5cykge1xuICAgICAgY29uc3Qgc3ViUXVlc3Rpb25zID0gYm9va1F1ZXN0aW9uc01hcFtrZXldPy5zdWJRdWVzdGlvbnM7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHN1YlF1ZXN0aW9ucykpIHtcbiAgICAgICAgc3ViUXVlc3Rpb25zLmZvckVhY2goKHN1YlF1ZXN0aW9uKSA9PiB7XG4gICAgICAgICAgLy8gQVAtMDRBUFIyNCBJZiBzdWJRdWVzdGlvbi5zdHlsZSBleGlzdHMgYXMgYSBzdHJpbmcgYW5kIGlzIGVtcHR5LCByZXBsYWNlIGl0IHdpdGggYSBkZWZhdWx0IHN0eWxlIG9iamVjdFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBzdWJRdWVzdGlvbi5zdHlsZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgc3ViUXVlc3Rpb24uc3R5bGUudHJpbSgpID09PSBcIlwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzdWJRdWVzdGlvbi5zdHlsZSA9IHtcbiAgICAgICAgICAgICAgbGFiZWxDbGFzczogbnVsbCxcbiAgICAgICAgICAgICAgbGFiZWxTdHlsZTogbnVsbCxcbiAgICAgICAgICAgICAgbGFiZWxWYWx1ZVN0eWxlOiBudWxsLFxuICAgICAgICAgICAgICBpbnB1dENsYXNzOiBudWxsLFxuICAgICAgICAgICAgICBpbnB1dFN0eWxlOiBudWxsLFxuICAgICAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgICAgICAgIGJvb2tTdHlsZTogbnVsbCxcbiAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImx0clwiLFxuICAgICAgICAgICAgICBxdWVzdGlvblN0eWxlOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCk7XG4gIH1cblxuICAvLyBBZGQgdGhpcyBtZXRob2QgdG8gaGFuZGxlIGVsZW1lbnQgc2VsZWN0aW9uXG4gIHNlbGVjdEVsZW1lbnQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4ID0gaW5kZXg7IC8vIGVsZW1lbnQgaXMgc2VsZWN0ZWRcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZXRTZWxlY3RlZEVsZW1lbnQoaW5kZXgpO1xuICAgIHRoaXMuYm9vayA9IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEJvb2soKTtcbiAgfVxuICBzZWxlY3RlZEZpZWxkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBlbGVtZW50IGlzIGNsZWFyZWRcblxuICBzZWxlY3RIZWFkaW5nKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5zZWxlY3RIZWFkaW5nKGV2ZW50KTsgLy9BUC0xME1BUjI1IFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGhlYWRpbmcgaW4gdGhlIHNlcnZpY2VcbiAgICB0aGlzLmJvb2sgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRCb29rKCk7IC8vQVAtMTBNQVIyNSBSZXRyaWV2ZXMgdGhlIHVwZGF0ZWQgYm9vay9mb3JtIGRhdGFcbiAgfVxuICAvLyBBUC0xN0FQUjI1IGdlbmVyYXRlVWlJZFxuICBnZW5lcmF0ZVVpSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmFkZEVsZW1lbnRXaXRoSWQoKTtcbiAgfVxuXG4gIGFkZEVsZW1lbnQodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdW5pcXVlX2lkID0gdGhpcy5nZW5lcmF0ZVVpSWQoKTtcbiAgICB0aGlzLmN1cnJlbnRUeXBlID0gdHlwZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnR5cGUgPT09IFwiVGFibGVcIiAmJiB0aGlzLmFkZFRhYmxlKSB7XG4gICAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB7XG4gICAgICAgIGFjdGlvbjogbnVsbCxcbiAgICAgICAgaWQ6IHVuaXF1ZV9pZCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgcXVlc3Rpb25UZXh0OiBudWxsLFxuICAgICAgICBxdWVzdGlvbjogbnVsbCxcbiAgICAgICAgaGVscFRleHQ6IG51bGwsXG4gICAgICAgIGVycm9yTWVzc2FnZTogbnVsbCxcbiAgICAgICAgaXNSZWFkT25seTogZmFsc2UsXG4gICAgICAgIGlzSGlkZGVuOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICByZWZlcmVuY2VGaWVsZDogbnVsbCxcbiAgICAgICAgYWRkaXRpb25hbFJpY2hDb250ZW50OiBudWxsLFxuICAgICAgICBncm91cE5hbWU6IG51bGwsXG4gICAgICAgIGlzRGF0ZUJhY2t3YXJkOiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IG51bGwsXG4gICAgICAgIHN1YlRpdGxlOiBudWxsLFxuICAgICAgICBzaXplOiAxMixcbiAgICAgICAgaXNEYXRlRm9yd2FyZDogZmFsc2UsXG4gICAgICAgIGlzT3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICBpc1RpdGxlOiBmYWxzZSxcbiAgICAgICAgbmV4dFF1ZXN0aW9uOiBudWxsLFxuICAgICAgICBhbGxvd2VkRmlsZUV4dGVuc2lvbnM6IG51bGwsXG4gICAgICAgIHF1ZXN0aW9uTnVtYmVyOiB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpLmxlbmd0aCArIDEsXG4gICAgICAgIG9yZGVyOiB0aGlzLmZvcm1FbGVtZW50cy5sZW5ndGggKyAxLFxuICAgICAgICBxdWVzdGlvbkJvb2tJZDogdGhpcy5ib29rbGV0SWQsXG4gICAgICAgIGZpZWxkc01ldGE6IFtdLFxuICAgICAgICB0cmFja2luZ0lkOiBudWxsLFxuICAgICAgICByZWNvcmRJZDogbnVsbCxcbiAgICAgICAgcWJSZWZlcmVuY2U6IG51bGwsXG4gICAgICAgIHFiUmVmZXJlbmNlUXVlc3Rpb25zOiBudWxsLFxuICAgICAgICBwcmltYXJ5S2V5OiBmYWxzZSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBsYWJlbENsYXNzOiBudWxsLFxuICAgICAgICAgIGxhYmVsU3R5bGU6IG51bGwsXG4gICAgICAgICAgbGFiZWxWYWx1ZVN0eWxlOiBudWxsLFxuICAgICAgICAgIGlucHV0Q2xhc3M6IG51bGwsXG4gICAgICAgICAgaW5wdXRTdHlsZTogbnVsbCxcbiAgICAgICAgICBzaG93TGFiZWw6IHRydWUsXG4gICAgICAgICAgYm9va1N0eWxlOiBudWxsLFxuICAgICAgICAgIGRpcmVjdGlvbjogXCJsdHJcIixcbiAgICAgICAgICBxdWVzdGlvblN0eWxlOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICBzdWJUZXh0OiB0aGlzLmdldERlZmF1bHRTdWJUZXh0KCksXG4gICAgICAgIGltYWdlRGF0YTogbnVsbCxcbiAgICAgICAgYm9vbGVhbjogZmFsc2UsXG4gICAgICAgIG9wdGlvbnM6XG4gICAgICAgICAgdHlwZSA9PT0gXCJEcm9wZG93blwiIHx8IHR5cGUgPT09IFwiUmFkaW9cIiB8fCB0eXBlID09PSBcIkNoZWNrYm94XCJcbiAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgaW1hZ2VTaXplOiB0eXBlID09PSBcIkltYWdlXCIgPyB7IHdpZHRoOiAxNTAsIGhlaWdodDogMTUwIH0gOiBudWxsLFxuICAgICAgICB0YWJsZUNvbmZpZzpcbiAgICAgICAgICB0eXBlID09PSBcIlRhYmxlXCJcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGlzTm9zSW5kaWNhdG9yOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFkZElubGluZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1BhZ2luYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzRGVsZXRlUm93OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzRWRpdFJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZWFyY2hCYXI6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNCdXR0b25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZTogMTAsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgIH07XG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5hZGRFbGVtZW50KG5ld0VsZW1lbnQpO1xuICAgICAgdGhpcy5mb3JtRWxlbWVudHMgPSB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5nZXRFbGVtZW50cygpO1xuICAgICAgLy8gU0tTMTlNQVIyNSBmaWVsZHNtZXRhIGNoZWNrXG4gICAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMudXBkYXRlVGFibGVGaWVsZHNNZXRhKHRoaXMuZm9ybUVsZW1lbnRzKTtcbiAgICAgIHRoaXMuYWRkVGFibGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICAvLyBBUC0wN01BWTI1IC0gQWRkZWQgdG8gaGFuZGxlIGRlZmF1bHQgc3ViVGV4dFxuICBnZXREZWZhdWx0U3ViVGV4dCgpIHtcbiAgICBjb25zdCBkZWZhdWx0RGF0YSA9IHtcbiAgICAgIGVuZHBvaW50OiBudWxsLFxuICAgICAgdmFyaWFibGU6IG51bGwsXG4gICAgICBmaWVsZDogbnVsbCxcbiAgICAgIGRlZmF1bHRGaWVsZDogbnVsbCxcbiAgICAgIHNvdXJjZVF1ZXN0aW9uSWQ6IG51bGwsXG4gICAgICB2YWx1ZUZpZWxkOiBudWxsLFxuICAgICAgbGFiZWxGaWVsZDogbnVsbCxcbiAgICAgIGlzRGVwZW5kZW50RmllbGQ6IGZhbHNlLFxuICAgICAgZGVwZW5kZW50VmFsdWU6IG51bGwsXG4gICAgICBxdWVyeUZpZWxkOiBudWxsLFxuICAgICAgcXVlcnlWYWx1ZTogbnVsbCxcbiAgICAgIHF1ZXJ5VmFsdWVSZWZlcmVuY2U6IG51bGwsXG4gICAgICB1bmlxdWVLZXk6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IGlzRW1wdHkgPSBPYmplY3QudmFsdWVzKGRlZmF1bHREYXRhKS5ldmVyeShcbiAgICAgICh2YWwpID0+IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IGZhbHNlXG4gICAgKTtcblxuICAgIHJldHVybiBpc0VtcHR5ID8gbnVsbCA6IGRlZmF1bHREYXRhO1xuICB9XG4gIC8vIFJlbW92ZSBhbiBlbGVtZW50IGJ5IGluZGV4XG4gIHJlbW92ZUVsZW1lbnQoZmllbGQ6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnJlbW92ZUVsZW1lbnRDb21wb25lbnQoZmllbGQuaWQpO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAvLyBTS1MxOU1BUjI1IGZpZWxkc21ldGEgY2hlY2tcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMudXBkYXRlVGFibGVGaWVsZHNNZXRhKHRoaXMuZm9ybUVsZW1lbnRzKTtcbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGV2ZW50LmRhdGFUcmFuc2Zlcj8uc2V0RGF0YShcInRleHQvcGxhaW5cIiwgaW5kZXgudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvLyBBbGxvdyBkcm9wcGluZyBieSBwcmV2ZW50aW5nIGRlZmF1bHRcbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBkcm9wIGV2ZW50XG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBkcm9wSW5kZXg6IG51bWJlcikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggPT09IG51bGwgfHwgdGhpcy5kcmFnZ2VkSW5kZXggPT09IGRyb3BJbmRleCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHJhZ2dlZEl0ZW0gPSB0aGlzLmZvcm1FbGVtZW50c1t0aGlzLmRyYWdnZWRJbmRleF07XG5cbiAgICAvLyBSZW1vdmUgZHJhZ2dlZCBpdGVtIGZyb20gb2xkIHBvc2l0aW9uIGFuZCBpbnNlcnQgaXQgaW4gbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5mb3JtRWxlbWVudHMuc3BsaWNlKHRoaXMuZHJhZ2dlZEluZGV4LCAxKTtcbiAgICB0aGlzLmZvcm1FbGVtZW50cy5zcGxpY2UoZHJvcEluZGV4LCAwLCBkcmFnZ2VkSXRlbSk7XG5cbiAgICAvL0FQLTI4TUFSMjUgVXBkYXRlIHF1ZXN0aW9uTnVtYmVyIGR5bmFtaWNhbGx5IGJhc2VkIG9uIG5ldyBvcmRlclxuICAgIHRoaXMuZm9ybUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICBlbGVtZW50LnF1ZXN0aW9uTnVtYmVyID0gaW5kZXggKyAxO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzZXQgZHJhZ2dlZCBpbmRleFxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcblxuICAgIC8vIE5vdGlmeSBzZXJ2aWNlIGFib3V0IHRoZSB1cGRhdGVcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50c09yZGVyKHRoaXMuZm9ybUVsZW1lbnRzKTtcbiAgfVxuXG4gIHRvZ2dsZUJvb2xlYW4oZmllbGQ6IGFueSk6IHZvaWQge1xuICAgIGZpZWxkLmJvb2xlYW4gPSAhZmllbGQuYm9vbGVhbjtcbiAgfVxuICBnZXRCYXNlU3R5bGVzKGZpZWxkOiBhbnksIGluY2x1ZGVCb3JkZXJTdHlsZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcbiAgICBjb25zdCBzdHlsZXM6IGFueSA9IHtcbiAgICAgIFwiZm9udC1mYW1pbHlcIjogZmllbGQ/LmZvbnQgfHwgXCJIZWx2ZXRpY2EgTmV1ZVwiLFxuICAgICAgXCJmb250LXdlaWdodFwiOiBmaWVsZD8uZm9udFdlaWdodCB8fCBcIjQwMFwiLFxuICAgICAgXCJmb250LXNpemVcIjogZmllbGQ/LmZvbnRTaXplIHx8IFwiMTRweFwiLFxuICAgICAgXCJ3aWR0aFwiOiBmaWVsZD8uc2l6ZSA/IGAkeyhmaWVsZC5zaXplIC8gMTIpICogMTAwfSVgIDogXCIxMDAlXCIsXG4gICAgICBcInRleHQtYWxpZ25cIjogZmllbGQ/LnRleHRBbGlnbiB8fCBcImxlZnRcIixcbiAgICAgIFwiYm9yZGVyLXJhZGl1c1wiOiBcIjVweFwiLFxuICAgICAgXCJib3JkZXItd2lkdGhcIjogZmllbGQ/LmxpbmVXaWR0aCA/IGAke2ZpZWxkLmxpbmVXaWR0aH1weGAgOiBcIjFweFwiLFxuICAgICAgXCJjb2xvclwiOiBmaWVsZD8uZm9udENvbG9yIHx8IFwiIzAwMDAwMFwiLFxuICAgICAgXCJtYXJnaW4tdG9wXCI6IGZpZWxkPy5wYWRkaW5nVG9wID8gYCR7ZmllbGQucGFkZGluZ1RvcH1weGAgOiBcIjBweFwiLFxuICAgICAgXCJtYXJnaW4tYm90dG9tXCI6IGZpZWxkPy5wYWRkaW5nQm90dG9tID8gYCR7ZmllbGQucGFkZGluZ0JvdHRvbX1weGAgOiBcIjEwcHhcIixcbiAgICAgIFwiYm9yZGVyLWNvbG9yXCI6IGZpZWxkPy5jb2xvciB8fCBcIiNFRkY4RkZcIixcbiAgICB9O1xuICAgIGlmIChpbmNsdWRlQm9yZGVyU3R5bGUpIHtcbiAgICAgIHN0eWxlc1tcImJvcmRlci1zdHlsZVwiXSA9IGZpZWxkPy5saW5lU3R5bGU/LnRvTG93ZXJDYXNlKCkgfHwgXCJzb2xpZFwiO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzO1xuICB9XG5cbiAgZ2V0Rm9udFN0eWxlcyhmaWVsZDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRCYXNlU3R5bGVzKGZpZWxkLCBmYWxzZSk7XG4gIH1cblxuICBnZXRMaW5lU3R5bGVzKGZpZWxkOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldEJhc2VTdHlsZXMoZmllbGQsIHRydWUpO1xuICB9XG5cbiAgLy8gU0tTMTNNQVIyNSB0YWJsZSBwb3B1cCBjb25mb3JtYXRpb24gYmFzZWQgZWxlbWVudCBhZGRcbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlO1xuICAgIHRoaXMuYWRkVGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFkZEVsZW1lbnQodGhpcy5jdXJyZW50VHlwZSk7XG4gIH1cbiAgLy8gU0tTMTNNQVIyNSBjb2x1bW4gZWxlbWVudCBhZGQgaW5zaWRlIGEgdGFibGVcbiAgYWRkT25UYWJsZSgpIHtcbiAgICB0aGlzLmFkZFRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmlzU2VsZWN0VGFibGVQb3B1cCA9IGZhbHNlO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLnRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmdldEVsZW1lbnRzKCldO1xuXG4gICAgLy8gRmluZCB0aGUgZWxlbWVudCBhbmQgdXBkYXRlIGl0cyBjb2x1bW5zXG4gICAgY29uc3QgaW5kZXggPSBlbGVtZW50cy5maW5kSW5kZXgoKGVsKSA9PiBlbC5pZCA9PT0gdGhpcy5zZWxlY3RlZEVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IHJvd051bSA9IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5jb2x1bW5zXG4gICAgICA/IHRoaXMuZm9ybUVsZW1lbnRzW2luZGV4XS5jb2x1bW5zPy5sZW5ndGhcbiAgICAgIDogMDtcbiAgICBjb25zdCB1bmlxdWVfaWQgPSB0aGlzLmdlbmVyYXRlVWlJZCgpO1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IHtcbiAgICAgIGxhYmVsOiBgSEVBREVSIExBQkVMICR7cm93TnVtfWAsXG4gICAgICBmaWVsZE5hbWU6IGBGSUVMRCBOQU1FJHtyb3dOdW19YCxcbiAgICAgIHR5cGU6IHRoaXMuY3VycmVudFR5cGUsXG4gICAgICBpZDogdW5pcXVlX2lkLFxuICAgIH07XG4gICAgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuYWRkVGFibGVFbGVtZW50KFxuICAgICAgdGFibGVFbGVtZW50LFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXhcbiAgICApO1xuICAgIHRoaXMuZm9ybUVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAvLyBTS1MxOU1BUjI1IGZpZWxkc21ldGEgY2hlY2tpbmdcbiAgICB0aGlzLmZvcm1FbGVtZW50cyA9IHRoaXMudXBkYXRlVGFibGVGaWVsZHNNZXRhKHRoaXMuZm9ybUVsZW1lbnRzKTtcbiAgfVxuICB1cGRhdGVUYWJsZUZpZWxkc01ldGEoZWxlbWVudHM6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZSkgPT4ge1xuICAgICAgaWYgKGVsZS50eXBlID09PSBcIlRhYmxlXCIpIHtcbiAgICAgICAgZWxlLmZpZWxkc01ldGEgPVxuICAgICAgICAgIHR5cGVvZiBlbGUuZmllbGRzTWV0YSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBlbGUuZmllbGRzTWV0YVxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShlbGUuZmllbGRzTWV0YSB8fCBbXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlO1xuICAgIH0pO1xuICB9ICBcbiAgY29sdW1uU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuICAgIC8vIFNLUzE5TUFSMjUgdGFibGUgY29sdW1uIHVwZGF0ZVxuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNldFNlbGVjdGVkVGFibGVFbGVtZW50KFxuICAgICAgdGhpcy5zZWxlY3RlZEZpZWxkSW5kZXgsXG4gICAgICBldmVudFxuICAgICk7XG4gIH1cbiAgcmVtb3ZlQ29sdW1uKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS5yZW1vdmVTZWxlY3RlZFRhYmxlRWxlbWVudChcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWVsZEluZGV4LFxuICAgICAgZXZlbnRcbiAgICApO1xuICB9XG5cbiAgLy8gU0tTMjVNQVIyNSBpbWFnZSBhZGRcbiAgYXN5bmMgZmlsZUNoYW5nZUV2ZW50KGluZGV4OiBhbnksIGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0uaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICB0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0ub3JnSW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICAvLyBJbml0aWFsaXplIGxvZ28gc2l6ZSBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1FbGVtZW50c1tpbmRleF0uaW1hZ2VTaXplKSB7XG4gICAgICAgICAgdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdLmltYWdlU2l6ZSA9IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLmVsZW1lbnRVcGRhdGUoXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgdGhpcy5mb3JtRWxlbWVudHNbaW5kZXhdXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyBmaWxlOlwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gU0tTMkFQUjI1IGRpc2FibGVkIGVsZW1lbnRcbiAgLy8gaXNFbGVtZW50RGlzYWJsZWQoZWxlbWVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyAgIGlmKHRoaXMuc2VsZWN0ZWRFbGVtZW50KXtcbiAgLy8gICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5lbGVtZW50RGlzYWJsZWRBcnJheVt0aGlzLnNlbGVjdGVkRWxlbWVudC50eXBlXVxuICAvLyAgICAgaWYoZWxlbWVudHMpe1xuICAvLyAgICAgICByZXR1cm4gZWxlbWVudHMuaW5jbHVkZXMoZWxlbWVudFR5cGUpO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gZmFsc2U7XG4gIC8vIH1cbn1cbiIsIjwhLS0gQVAgMjJKQU4yNSAtIGZvcm0gcHJldmlldyBhbmQgQWxsIGZvcm0gZWxlbWVudHMgLS0+XG48IS0tIEFQIDI1RkVCMjUgLSBBbGwgZWxlbWVudHMgdXBkYXRlIC0tPlxuPGRpdiBjbGFzcz1cImNlbnRlci1mcmFtZVwiPlxuICA8IS0tIEZvcm0gQnVpbGRlciBTZWN0aW9uIEFsbCBFbGVtZW50cyAtLT5cbiAgPGRpdiBjbGFzcz1cImZvcm0tYnVpbGRlclwiPlxuICAgIDwhLS0gQmFzaWMgRWxlbWVudHMgVG9nZ2xlIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJ0b2dnbGUtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlY3Rpb24oJ2Jhc2ljJylcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkLWVsZW1lbnRzXCI+QmFzaWMgRWxlbWVudHM8L2Rpdj5cbiAgICAgIDxpbWcgW3NyY109XCJzZWN0aW9ucy5iYXNpYyA/ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctZG93bi5zdmcnIDogJy4uL2Fzc2V0cy9pY29ucy9hcnJvdy1yaWdodC5zdmcnXCJcbiAgICAgICAgYWx0PVwiVG9nZ2xlIEFycm93XCIgY2xhc3M9XCJhcnJvdy1pY29uXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwic2VjdGlvbnMuYmFzaWNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgYmFzaWNFbGVtZW50c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZWxlbWVudFwiIChjbGljayk9XCJhZGRFbGVtZW50KGVsZW1lbnQudHlwZSlcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy97eyBlbGVtZW50LmltZyB9fS5zdmdcIiBjbGFzcz1cImVsZW1lbnQtaWNvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJob3Zlci1sYWJlbFwiPnt7IGVsZW1lbnQubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1kb3RzXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG90XCIgKm5nRm9yPVwibGV0IGRvdCBvZiBkb3RzXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFkdmFuY2VkIEVsZW1lbnRzIFRvZ2dsZSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidG9nZ2xlLWhlYWRlclwiIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKCdhZHZhbmNlZCcpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGVhZC1lbGVtZW50c1wiPkFkdmFuY2VkIEVsZW1lbnRzPC9kaXY+XG4gICAgICA8aW1nIFtzcmNdPVwic2VjdGlvbnMuYWR2YW5jZWQgPyAnLi4vYXNzZXRzL2ljb25zL2Fycm93LWRvd24uc3ZnJyA6ICcuLi9hc3NldHMvaWNvbnMvYXJyb3ctcmlnaHQuc3ZnJ1wiXG4gICAgICAgIGFsdD1cIlRvZ2dsZSBBcnJvd1wiIGNsYXNzPVwiYXJyb3ctaWNvblwiPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cInNlY3Rpb25zLmFkdmFuY2VkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGFkdmFuY2VkRWxlbWVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVsZW1lbnRcIiAoY2xpY2spPVwiYWRkRWxlbWVudChlbGVtZW50LnR5cGUpXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMve3sgZWxlbWVudC5pbWcgfX0uc3ZnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhvdmVyLWxhYmVsXCI+e3sgZWxlbWVudC5sYWJlbCB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWRvdHNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb3RcIiAqbmdGb3I9XCJsZXQgZG90IG9mIGRvdHNcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgIDwhLS0gQVAtMDhBUFIyNSBBZGQgVGVtcGxhdGVzIENvbXBvbmVudCAtLT5cbiAgICA8IS0tIDxhcHAtdGVtcGxhdGVzICh0ZW1wbGF0ZVNlbGVjdGVkKT1cIm9uVGVtcGxhdGVTZWxlY3RlZCgkZXZlbnQpXCI+PC9hcHAtdGVtcGxhdGVzPiAtLT5cblxuICAgIDwhLS0gU0tTMTBNQVIyNSBmb290ZXIgdmVyc2lvbiBzaG93IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJzdGlja3ktZm9vdGVyLXZlcnNpb25cIj5cbiAgICAgIHt7dmVyc2lvbn19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8IS0tIEFQLTI3TUFSMjUgUmVtb3ZlIENESyBkcmFnIGFuZCBkcm9wIHJlcGxhY2UgZHJhZ2dhYmxlIGZ1bmN0aW9uICAtLT5cbiAgPGRpdiBjbGFzcz1cImZvcm0tcHJldmlld1wiPlxuICAgIDwhLS0gQVAtMTBNQVIyNSBIZWFkaW5nIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIlxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiAjRUZGOEZGOyBib3JkZXI6IDFweCBzb2xpZCAjRTZGM0ZGO2Rpc3BsYXk6IGZsZXg7anVzdGlmeS1jb250ZW50OiBjZW50ZXI7bWFyZ2luLWJvdHRvbToxMHB4XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RIZWFkaW5nKCdIZWFkZXInKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiIHN0eWxlPVwicGFkZGluZzogMTBweDtcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImJvb2s/LnJlY29yZHNcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYm9vay5yZWNvcmRzWzBdLnRpdGxlID09ICcnXCIgc3R5bGU9XCJjb2xvcjojM2Y0YTUyNWNcIj5IZWFkaW5nPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImJvb2sucmVjb3Jkc1swXS50aXRsZSAhPT0gJydcIj57e2Jvb2sucmVjb3Jkc1swXS50aXRsZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+ICAgIFxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZm9ybUVsZW1lbnRzOyBsZXQgaSA9IGluZGV4XCIgZ2V0UHJvcGVydGllcygpLmVsZW1lbnRQcm9wcz5cblxuICAgICAgPCEtLSBUZXh0Qm94IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdUZXh0J1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAnRW50ZXIgdGV4dCdcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJycgXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgIDwhLS0gTVNNLTA5SlVMMjUgSWNvbi1zZWxlY3RpciBFbGVtZW50IC0tPlxuICAgICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdJY29uJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc1JlcXVpcmVkXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnQ2hvb3NlIEljb24nXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hvb3NlLWljb24tcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBUC0xOU1BUjI1IExpbmUgRWxlbWVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnTGluZSdcIiBjbGFzcz1cImxpbmUtZmllbGRcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGluZS1lbGVtZW50XCI+XG4gICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxociBjbGFzcz1cImN1c3RvbS1saW5lXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleFwiIFtuZ1N0eWxlXT1cImdldExpbmVTdHlsZXMoZmllbGQpXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tU0tTMjVNQVIyNSBJbWFnZSBVcGxvYWQgRWxlbWVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnSW1hZ2UnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiXG4gICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdVcGxvYWQgSW1hZ2UnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBMb2dvIHByZXZpZXcgYXJlYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9nby1wcmV2aWV3XCIgKm5nSWY9XCJmaWVsZC5pbWFnZURhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJmaWVsZC5pbWFnZURhdGFcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBVcGxvYWQgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmllbGQuaW1hZ2VEYXRhXCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLXt7aX19XCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9JbWFnZS5zdmdcIiBhbHQ9XCJVcGxvYWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5VcGxvYWQgSW1hZ2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGFjY2VwdD1cImltYWdlLypcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChpLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3BhY2UgRWxlbWVudCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnU3BhY2UnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCIgc3R5bGU9XCJoZWlnaHQ6OTNweFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIiBzdHlsZT1cIm1hcmdpbjogLTExcHggLTExcHggMCAwO1wiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQm9vbGVhbiBFbGVtZW50IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdCb29sZWFuJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57eyBmaWVsZC5xdWVzdGlvblRleHRcbiAgICAgICAgICAgICAgICA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdCb29sZWFuJ319PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImZpZWxkLmJvb2xlYW5cIiAoY2hhbmdlKT1cInRvZ2dsZUJvb2xlYW4oZmllbGQpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0NhbGVuZGFyJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnU2VsZWN0IERhdGUnXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFQIC0xMk1BUjI1IERhdGUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0RhdGUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdTZWxlY3QgRGF0ZSdcbiAgICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVAtMjFNQVIyNSBBZGQgVGltZSBlbGVtZW50IC0tPlxuICAgICAgPCEtLSBUaW1lIEZpZWxkIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdUaW1lJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCI+e3sgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ1RpbWUnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRpbWVcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQVAtMjhNQVIyNSBEYXRlVGltZSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnRGF0ZVRpbWUnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdTZWxlY3QgRGF0ZSAmIFRpbWUnXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBjbGFzcz1cImN1c3RvbS1pbnB1dFwiIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0VtYWlsJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCI+IHt7IGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdMYWJlbCcgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgY2xhc3M9XCJjdXN0b20taW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwiZmllbGQucXVlc3Rpb24gfHwgJ0VudGVyIGVtYWlsJ1wiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5pc1JlYWRPbmx5XCIgW2NsYXNzLmhpZGRlbl09XCJmaWVsZC5pc0hpZGRlblwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJmaWVsZC5kZWZhdWx0VmFsdWUgPyBmaWVsZC5kZWZhdWx0VmFsdWUgOiAnJ1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTnVtYmVycyAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnTnVtYmVyJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnF1ZXN0aW9uIHx8ICdFbnRlciBudW1iZXInXCJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImZpZWxkLmRlZmF1bHRWYWx1ZSA/IGZpZWxkLmRlZmF1bHRWYWx1ZSA6ICcnXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUZXh0QXJlYSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnVGV4dEFyZWEnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdFbnRlciB5b3VyIHRleHQnfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAnRW50ZXIgZGV0YWlsZWQgdGV4dCBoZXJlLi4uJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZmllbGQuc2l6ZSB8fCAxMDBcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJpY2hUZXh0IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdSaWNoVGV4dEFyZWEnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdFbnRlciB5b3VyIHRleHQnfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImN1c3RvbS10ZXh0YXJlYVwiIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5xdWVzdGlvbiB8fCAnRW50ZXIgZGV0YWlsZWQgdGV4dCBoZXJlLi4uJ1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiZmllbGQuc2l6ZSB8fCAxMDBcIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIExhYmVsIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdMYWJlbCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ0xhYmVsJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cblxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJvb2sgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0Jvb2snXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkLnF1ZXN0aW9uVGV4dCA/IGZpZWxkLnF1ZXN0aW9uVGV4dCA6ICdMYWJlbCcgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcC1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL2RyYWctZG90cy5zdmdcIiBhbHQ9XCJEcmFnXCIgY2xhc3M9XCJkcmFnLWRvdFwiIC8+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGliLWJvb2tsZXQgW2Jvb2tsZXRKU09OXT1cImZpZWxkLnFiUmVmZXJlbmNlUXVlc3Rpb25zXCI+PC9saWItYm9va2xldD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGaWxlIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImZpZWxkLnR5cGUgPT09ICdGaWxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnVXBsb2FkIEZpbGUnXG4gICAgICAgICAgICAgICAgICB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgW3JlYWRvbmx5XT1cImZpZWxkLmlzUmVhZE9ubHlcIiBbY2xhc3MuaGlkZGVuXT1cImZpZWxkLmlzSGlkZGVuXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDaGVja0JveCAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnQ2hlY2tib3gnXCIgY2xhc3M9XCJmaWVsZC1jb250YWluZXJcIiAoY2xpY2spPVwic2VsZWN0RWxlbWVudChpKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldEZvbnRTdHlsZXMoZmllbGQpXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJzZWxlY3RlZEZpZWxkSW5kZXggPT09IGlcIiBkcmFnZ2FibGU9XCJ0cnVlXCJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCIgKGRyYWdvdmVyKT1cIm9uRHJhZ092ZXIoJGV2ZW50LCBpKVwiIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQsIGkpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2NsYXNzLnJlcXVpcmVkXT1cImZpZWxkLmlzT3B0aW9uYWxcIiAqbmdJZj1cImZpZWxkLnN0eWxlPy5zaG93TGFiZWwgIT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVFbGVtZW50KGZpZWxkLCBpKVwiIGNsYXNzPVwiZGVsZXRlLWljb25cIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtb3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBjbGFzcz1cImNoZWNrYm94LW9wdGlvblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwib3B0aW9uLnZhbHVlICsgaVwiIFtuYW1lXT1cImZpZWxkLmlkXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWUgfHwgZmllbGQuZGVmYXVsdFZhbHVlXCIgY2xhc3M9XCJjaGVja2JveC1pbnB1dFwiIFtkaXNhYmxlZF09XCJmaWVsZC5pc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJvcHRpb24udmFsdWUgKyBpXCIgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPnt7IG9wdGlvbi52YWx1ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmFkaW8gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1JhZGlvJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tb3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbaWRdPVwiJ3JhZGlvLScgKyBmaWVsZC5pZCArICctJyArIGpcIiBbbmFtZV09XCIncmFkaW8tZ3JvdXAtJyArIGZpZWxkLmlkXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWUgfHwgZmllbGQuZGVmYXVsdFZhbHVlXCIgWyhuZ01vZGVsKV09XCJmaWVsZC5zZWxlY3RlZFZhbHVlXCIgY2xhc3M9XCJyYWRpby1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCIncmFkaW8tJyArIGZpZWxkLmlkICsgJy0nICsgalwiIGNsYXNzPVwicmFkaW8tbGFiZWxcIj4ge3sgb3B0aW9uLnZhbHVlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gRHJvcGRvd24gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ0Ryb3Bkb3duJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGxhYmVsIFtjbGFzcy5yZXF1aXJlZF09XCJmaWVsZC5pc09wdGlvbmFsXCIgKm5nSWY9XCJmaWVsZC5zdHlsZT8uc2hvd0xhYmVsICE9PSBmYWxzZVwiPnt7XG4gICAgICAgICAgICAgICAgICBmaWVsZC5xdWVzdGlvblRleHQgPyBmaWVsZC5xdWVzdGlvblRleHQgOiAnTGFiZWwnIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3AtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9kcmFnLWRvdHMuc3ZnXCIgYWx0PVwiRHJhZ1wiIGNsYXNzPVwiZHJhZy1kb3RcIiAvPlxuXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvVHJhc2guc3ZnXCIgKGNsaWNrKT1cInJlbW92ZUVsZW1lbnQoZmllbGQsIGkpXCIgY2xhc3M9XCJkZWxldGUtaWNvblwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwib3B0aW9uc1wiIGNsYXNzPVwiZHJvcGRvd25cIiBbZGlzYWJsZWRdPVwiZmllbGQuaXNSZWFkT25seVwiIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIj5cbiAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpZWxkLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlIHx8IGZpZWxkLmRlZmF1bHRWYWx1ZVwiPiB7eyBvcHRpb24udmFsdWVcbiAgICAgICAgICAgICAgICB9fSA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tICBUYWJsZSAgLS0+XG4gICAgICA8IS0tIEFQLTA2TUFSMjUgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZmllbGQudHlwZSA9PT0gJ1RhYmxlJ1wiIGNsYXNzPVwiZmllbGQtY29udGFpbmVyXCIgKGNsaWNrKT1cInNlbGVjdEVsZW1lbnQoaSlcIlxuICAgICAgICBbbmdTdHlsZV09XCJnZXRGb250U3R5bGVzKGZpZWxkKVwiIFtjbGFzcy5oaWdobGlnaHRdPVwic2VsZWN0ZWRGaWVsZEluZGV4ID09PSBpXCIgZHJhZ2dhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChkcmFnc3RhcnQpPVwib25EcmFnU3RhcnQoJGV2ZW50LCBpKVwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIiAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50LCBpKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtd3JhcHBlclwiIHN0eWxlPVwib3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ0xhYmVsJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJueHQtdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxueHQtZGF0YXRhYmxlICBpc0J1dHRvbnMgW3F1ZXN0aW9uXT1cImZpZWxkXCIgZnJvbT1cImZvcm1CdWlsZGVyXCIgW21vZGVdPVwiJ2VkaXQnXCIgW2FwaU1ldGFdPVwiZmllbGQuc3ViVGV4dFwiXG4gICAgICAgICAgICAgICAgW3RhYmxlQ29uZmlnXT1cImZpZWxkLnRhYmxlQ29uZmlnXCIgdGFibGVJZD1cIlwiIGRpcmVjdGlvbj1cImx0clwiIHRhYmxlV2lkdGg9XCJhdXRvXCIgaXNFZGl0YWJsZT10cnVlXG4gICAgICAgICAgICAgICAgKGNvbHVtblNlbGVjdGVkKT1jb2x1bW5TZWxlY3RlZCgkZXZlbnQpIChyZW1vdmVDb2x1bW4pPXJlbW92ZUNvbHVtbigkZXZlbnQpPlxuICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBMaXN0IC0tPlxuICAgICAgPCEtLSBBUC0wNk1BUjI1IC0gTGlzdCBkYXRhIHNob3ctLT5cbiAgICAgIDxkaXYgKm5nSWY9XCJmaWVsZC50eXBlID09PSAnTGlzdCdcIiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lclwiIChjbGljayk9XCJzZWxlY3RFbGVtZW50KGkpXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Rm9udFN0eWxlcyhmaWVsZClcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cInNlbGVjdGVkRmllbGRJbmRleCA9PT0gaVwiIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ1N0YXJ0KCRldmVudCwgaSlcIiAoZHJhZ292ZXIpPVwib25EcmFnT3ZlcigkZXZlbnQsIGkpXCIgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3MucmVxdWlyZWRdPVwiZmllbGQuaXNPcHRpb25hbFwiICpuZ0lmPVwiZmllbGQuc3R5bGU/LnNob3dMYWJlbCAhPT0gZmFsc2VcIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGQucXVlc3Rpb25UZXh0ID8gZmllbGQucXVlc3Rpb25UZXh0IDogJ0xhYmVsJyB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIuLi9hc3NldHMvaWNvbnMvZHJhZy1kb3RzLnN2Z1wiIGFsdD1cIkRyYWdcIiBjbGFzcz1cImRyYWctZG90XCIgLz5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9UcmFzaC5zdmdcIiAoY2xpY2spPVwicmVtb3ZlRWxlbWVudChmaWVsZCwgaSlcIiBjbGFzcz1cImRlbGV0ZS1pY29uXCIgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiY3VzdG9tLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBbcmVhZG9ubHldPVwiZmllbGQuaXNSZWFkT25seVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiZmllbGQuaXNIaWRkZW5cIiBbdmFsdWVdPVwiZmllbGQuZGVmYXVsdFZhbHVlID8gZmllbGQuZGVmYXVsdFZhbHVlIDogJydcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIFNLUzEzTUFSMjUgcG9wdXAgY29uZm9ybWF0aW9uIGJveCAtLT5cbjxkaXYgY2xhc3M9XCJkaWFsb2ctb3ZlcmxheVwiICpuZ0lmPVwiaXNTZWxlY3RUYWJsZVBvcHVwXCI+XG4gIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm94XCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ0bi1mYlwiIChjbGljayk9XCJvbkNsb3NlKClcIj7inJU8L2J1dHRvbj5cbiAgICA8cD5UaGVzZSBlbGVtZW50IHdhbnQgdG8gYWRkIGEgdGFibGU8L3A+XG4gICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXItZmJcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ5ZXMtYnRuLWZiXCIgKGNsaWNrKT1cImFkZE9uVGFibGUoKVwiPlllczwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cIm5vLWJ0bi1mYlwiIChjbGljayk9XCJvbkNsb3NlKClcIj5ObzwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==