tango-app-ui-analyse-trax 3.6.0 → 3.6.2-bulktask-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/esm2022/lib/components/action-centre/action-centre.component.mjs +3 -3
  2. package/esm2022/lib/components/activity-log-v2/activity-log-v2.component.mjs +3 -2
  3. package/esm2022/lib/components/activity-log-v2/log-view-popup/store-user-dropdown/store-user-dropdown.component.mjs +3 -3
  4. package/esm2022/lib/components/activity-log-v2/log-view-popup/view-action/view-action.component.mjs +3 -3
  5. package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +5 -3
  6. package/esm2022/lib/components/add-multitask/add-multitask.component.mjs +538 -0
  7. package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs +269 -0
  8. package/esm2022/lib/components/add-multitask/create-task.data.mjs +306 -0
  9. package/esm2022/lib/components/add-multitask/create-task.interface.mjs +2 -0
  10. package/esm2022/lib/components/add-multitask/unique-string-validator.mjs +10 -0
  11. package/esm2022/lib/components/add-multitask/whitespace-validator.mjs +10 -0
  12. package/esm2022/lib/components/add-task/add-task.component.mjs +3 -1
  13. package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +4 -4
  14. package/esm2022/lib/components/dashboard/dashboard.component.mjs +3 -3
  15. package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +1 -1
  16. package/esm2022/lib/components/disabled-select/disabled-select.component.mjs +158 -0
  17. package/esm2022/lib/components/export-gallery/export-gallery.component.mjs +7 -2
  18. package/esm2022/lib/components/eye-test-audit/eye-test/eye-test.component.mjs +11 -17
  19. package/esm2022/lib/components/eye-test-audit/group-select/group-select.component.mjs +3 -3
  20. package/esm2022/lib/components/eye-test-audit/reactive-select/reactive-select.component.mjs +3 -3
  21. package/esm2022/lib/components/flags/flags.component.mjs +1 -1
  22. package/esm2022/lib/components/flags-info/flags-info.component.mjs +1 -1
  23. package/esm2022/lib/components/gallery/gallery.component.mjs +324 -50
  24. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +6 -3
  25. package/esm2022/lib/components/task-configure/task-configure.component.mjs +6 -6
  26. package/esm2022/lib/components/task-info/task-info.component.mjs +1 -1
  27. package/esm2022/lib/services/trax.service.mjs +20 -2
  28. package/esm2022/lib/tango-analyse-trax.module.mjs +12 -5
  29. package/fesm2022/{tango-app-ui-analyse-trax-eye-test-audit.module-mp5zGDN4.mjs → tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs} +20 -26
  30. package/fesm2022/tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs.map +1 -0
  31. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DKvlR9IQ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs} +1820 -253
  32. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs.map +1 -0
  33. package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
  34. package/lib/components/activity-log-v2/activity-log-v2.component.d.ts +1 -0
  35. package/lib/components/add-multitask/add-multitask.component.d.ts +95 -0
  36. package/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.d.ts +42 -0
  37. package/lib/components/add-multitask/create-task.data.d.ts +244 -0
  38. package/lib/components/add-multitask/create-task.interface.d.ts +147 -0
  39. package/lib/components/add-multitask/unique-string-validator.d.ts +2 -0
  40. package/lib/components/add-multitask/whitespace-validator.d.ts +2 -0
  41. package/lib/components/disabled-select/disabled-select.component.d.ts +34 -0
  42. package/lib/components/eye-test-audit/eye-test-audit/start-audit/start-audit.component.d.ts +2 -2
  43. package/lib/components/flags/flags.component.d.ts +2 -2
  44. package/lib/components/flags-info/flags-info.component.d.ts +3 -3
  45. package/lib/components/flags-new/flags-new.component.d.ts +2 -2
  46. package/lib/components/gallery/gallery.component.d.ts +40 -2
  47. package/lib/components/manage-task/manage-task.component.d.ts +1 -1
  48. package/lib/components/orders/orders.component.d.ts +1 -1
  49. package/lib/components/reactive-select/reactive-select.component.d.ts +2 -2
  50. package/lib/components/reports/reports.component.d.ts +2 -2
  51. package/lib/components/task-configure/task-configure.component.d.ts +3 -3
  52. package/lib/services/trax.service.d.ts +6 -1
  53. package/lib/tango-analyse-trax.module.d.ts +11 -8
  54. package/package.json +1 -1
  55. package/fesm2022/tango-app-ui-analyse-trax-eye-test-audit.module-mp5zGDN4.mjs.map +0 -1
  56. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-DKvlR9IQ.mjs.map +0 -1
@@ -0,0 +1,538 @@
1
+ import { Component, HostListener, Input, ViewChild } from '@angular/core';
2
+ import { FormControl, Validators } from '@angular/forms';
3
+ import { date_question_template, descriptive_question_template, descriptiveImage_question_template, image_question_template, linearscale_question_template, multiplechoice_answer_template, multiplechoicemultiple_question_template, multiplechoicesingle_question_template, multipleImage_question_template, time_question_template, video_question_template, yesorno_question_template } from './create-task.data';
4
+ import { Subject, takeUntil } from "rxjs";
5
+ import dayjs from "dayjs";
6
+ import utc from 'dayjs/plugin/utc';
7
+ import { noWhitespaceValidator } from './whitespace-validator';
8
+ import { uniqueStringValidator } from './unique-string-validator';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/forms";
11
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
12
+ import * as i3 from "tango-app-ui-global";
13
+ import * as i4 from "../../services/trax.service";
14
+ import * as i5 from "@angular/router";
15
+ import * as i6 from "tango-app-ui-shared";
16
+ import * as i7 from "@angular/common";
17
+ import * as i8 from "ngx-daterangepicker-material";
18
+ import * as i9 from "../disabled-select/disabled-select.component";
19
+ dayjs.extend(utc);
20
+ export class AddMultitaskComponent {
21
+ fb;
22
+ activeModal;
23
+ gs;
24
+ traxService;
25
+ cd;
26
+ modalService;
27
+ router;
28
+ toastService;
29
+ taskForm;
30
+ type;
31
+ sourceCheckList_id;
32
+ filtertype;
33
+ showcomment;
34
+ excelData;
35
+ currentIndex = 0;
36
+ intervalId;
37
+ allowedStoreLocation = false;
38
+ restrictAttendance = false;
39
+ submitted = false;
40
+ headerData;
41
+ answerTypes = [
42
+ { label: 'Descriptive Answer', value: 'descriptive' },
43
+ { label: 'A/B Question', value: 'yes/no' },
44
+ { label: 'Multiple Choice Question - Single Answer', value: 'multiplechoicesingle' },
45
+ { label: 'Multiple Choice Question - Multiple Answer', value: 'multiplechoicemultiple' },
46
+ { label: 'Capture Image with Description', value: 'descriptiveImage' },
47
+ { label: 'Capture Image as answer', value: 'image' },
48
+ { label: 'Capture video as answer', value: 'video' },
49
+ { label: 'Capture Multiple Image', value: 'multipleImage' },
50
+ { label: 'Date - DD/MM/YYYY', value: 'date' },
51
+ { label: 'Linear Scale', value: 'linearscale' },
52
+ { label: 'Time', value: 'time' }
53
+ ];
54
+ validationTypes = [
55
+ { label: 'Capture Image', value: 'Capture Image' },
56
+ { label: 'Descriptive Answer', value: 'Descriptive Answer' },
57
+ { label: 'Capture Video', value: 'Capture Video' }
58
+ ];
59
+ environment;
60
+ taskContainer;
61
+ destroy$ = new Subject();
62
+ payload;
63
+ taskDetails;
64
+ checklistInfo;
65
+ clientId;
66
+ timeDetails = [{ id: '00:00', text: "00:00" }, { id: '00:30', text: "00:30" }, { id: '01:00', text: "01:00" }, { id: '01:30', text: "01:30" }, { id: '02:00', text: "02:00" }, { id: '02:30', text: "02:30" }, { id: '03:00', text: "03:00" }, { id: '03:30', text: "03:30" }, { id: '04:00', text: "04:00" }, { id: '04:30', text: "04:30" }, { id: '05:00', text: "05:00" }, { id: '05:30', text: "05:30" }, { id: '06:00', text: "06:00" }, { id: '06:30', text: "06:30" }, { id: '07:00', text: "07:00" }, { id: '07:30', text: "07:30" }, { id: '08:00', text: "08:00" }, { id: '08:30', text: "08:30" }, { id: '09:00', text: "09:00" }, { id: '09:30', text: "09:30" }, { id: '10:00', text: "10:00" }, { id: '10:30', text: "10:30" },
67
+ { id: '11:00', text: "11:00" }, { id: '11:30', text: "11:30" }, { id: '12:00', text: "12:00" }, { id: '12:30', text: "12:30" }, { id: '13:00', text: "13:00" }, { id: '13:30', text: "13:30" }, { id: '14:00', text: "14:00" }, { id: '14:30', text: "14:30" }, { id: '15:00', text: "15:00" }, { id: '15:30', text: "15:30" }, { id: '16:00', text: "16:00" }, { id: '16:30', text: "16:30" }, { id: '17:00', text: "17:00" }, { id: '17:30', text: "17:30" }, { id: '18:00', text: "18:00" }, { id: '18:30', text: "18:30" }, { id: '19:00', text: "19:00" }, { id: '19:30', text: "19:30" }, { id: '20:00', text: "20:00" }, { id: '20:30', text: "20:30" }, { id: '21:00', text: "21:00" }, { id: '21:30', text: "21:30" }, { id: '22:00', text: "22:00" }, { id: '22:30', text: "22:30" }, { id: '23:00', text: "23:00" }, { id: '23:30', text: "23:30" }, { id: '24:00', text: "24:00" }
68
+ ];
69
+ constructor(fb, activeModal, gs, traxService, cd, modalService, router, toastService) {
70
+ this.fb = fb;
71
+ this.activeModal = activeModal;
72
+ this.gs = gs;
73
+ this.traxService = traxService;
74
+ this.cd = cd;
75
+ this.modalService = modalService;
76
+ this.router = router;
77
+ this.toastService = toastService;
78
+ this.headerData = JSON.parse(localStorage.getItem('header-filters'));
79
+ }
80
+ ngOnInit() {
81
+ console.log(this.payload);
82
+ this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env) => {
83
+ if (env) {
84
+ this.environment = env;
85
+ }
86
+ });
87
+ if (this.headerData?.client) {
88
+ this.clientId = this.headerData?.client;
89
+ }
90
+ else {
91
+ let userinfo = JSON.parse(localStorage.getItem("user-info") || "");
92
+ if (userinfo && userinfo?.clientId) {
93
+ this.clientId = userinfo?.clientId;
94
+ }
95
+ }
96
+ this.createForm();
97
+ this.selectedDate.startDate = this.dayjs().utc().format("DD-MM-YYYY");
98
+ this.updateCurrentTime();
99
+ }
100
+ tasks = [1]; // List of task IDs
101
+ taskCounter = 1; // Counter to generate unique task IDs
102
+ updateForm() {
103
+ this.taskForm.patchValue({
104
+ checklistName: this.taskDetails?.checkListName ?? '',
105
+ checklistDescription: this.taskDetails?.checkListDescription ?? '',
106
+ });
107
+ for (let i = 0; i < this.taskDetails?.sections?.length; i++) {
108
+ this.addSectionForm(this.taskDetails.sections[i]);
109
+ for (let j = 0; j < this.taskDetails.sections[i]?.questions?.length; j++) {
110
+ this.addQuestionForm(this.taskDetails.sections[i]?.questions[j], i);
111
+ for (let k = 0; k < this.taskDetails.sections[i]?.questions[j]?.answers?.length; k++) {
112
+ this.addAnswerForm(this.taskDetails.sections[i]?.questions[j]?.answers[k], i, j);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ prevSlide() {
118
+ if (this.currentIndex > 0) {
119
+ this.currentIndex--;
120
+ }
121
+ }
122
+ nextSlide() {
123
+ if (this.currentIndex < this.payload.refImage.length - 1) {
124
+ this.currentIndex++;
125
+ }
126
+ }
127
+ goToSlide(index) {
128
+ if (index >= 0 && index < this.payload.refImage.length) {
129
+ this.currentIndex = index;
130
+ }
131
+ }
132
+ cancel() {
133
+ this.activeModal.close('close');
134
+ const triggerButton = document.querySelector('#triggerButtonId');
135
+ triggerButton?.focus();
136
+ }
137
+ onSubmit() {
138
+ this.submitted = true;
139
+ let response = this.taskForm.value.sections;
140
+ const time = dayjs(this.selectedItem, "HH:mm");
141
+ if (this.type === 'redo') {
142
+ let input = {
143
+ "clientId": this.clientId,
144
+ "payload": {
145
+ "coverage": this.payload.coverage,
146
+ "userEmail": this.payload.selectedUsers,
147
+ "storeName": this.payload.selectedStores,
148
+ "section_id": this.payload.sectionInfo.section_id,
149
+ "sectionName": this.payload.sectionInfo.sectionName,
150
+ "qno": response[0].questions[0].qno,
151
+ "checklistDescription": this.taskForm.value.checklistDescription,
152
+ "parentQuestion": this.payload.inputData.parentQuestion ? this.payload.inputData.parentQuestion : this.payload.inputData.qno,
153
+ },
154
+ "upsert": {
155
+ "redoStatus": true,
156
+ "redo": true
157
+ }
158
+ };
159
+ if (this.payload.operationtype == 'task') {
160
+ this.traxService.redomultiTask(input).pipe(takeUntil(this.destroy$)).subscribe({
161
+ next: (res) => {
162
+ if (res && res?.code === 200) {
163
+ this.toastService.getSuccessToast(res?.message);
164
+ this.activeModal.close('submit');
165
+ }
166
+ }
167
+ });
168
+ }
169
+ else {
170
+ this.traxService.redoTaskmultichecklist(input).pipe(takeUntil(this.destroy$)).subscribe({
171
+ next: (res) => {
172
+ if (res && res?.code === 200) {
173
+ this.toastService.getSuccessToast(res?.message);
174
+ this.activeModal.close('submit');
175
+ }
176
+ }
177
+ });
178
+ }
179
+ }
180
+ else {
181
+ let payload = {
182
+ "checkListName": this.taskForm.value.checklistName,
183
+ "checkListDescription": this.taskForm.value.checklistDescription,
184
+ "checkListId": this.sourceCheckList_id,
185
+ "sectionId": this.payload.sectionInfo.section_id,
186
+ "sectionName": this.payload.sectionInfo.sectionName,
187
+ "qno": this.payload.inputData.qno,
188
+ "coverage": this.payload.coverage,
189
+ "showcomment": this.showcomment,
190
+ "excelData": this.excelData,
191
+ "parentQuestion": this.payload.inputData.parentQuestion ? this.payload.inputData.parentQuestion : this.payload.inputData.qno,
192
+ "question": [
193
+ {
194
+ "qno": 1,
195
+ "qname": this.payload.inputData.qname,
196
+ "qcomment": this.taskForm.value.checklistDescription,
197
+ "answerType": response[0].questions[0].answerType,
198
+ "runAI": false,
199
+ "runAIDescription": "",
200
+ "allowUploadfromGallery": response[0].questions[0].allowUploadfromGallery,
201
+ "linkType": false,
202
+ "questionReferenceImage": this.uploadedFiles && this.uploadedFiles.length > 0 ? this.uploadedFiles : response[0].questions[0].questionReferenceImage,
203
+ "descriptivetype": response[0].questions[0].descriptivetype,
204
+ "answers": response[0].questions[0].answers
205
+ }
206
+ ],
207
+ "scheduleDate": dayjs(this.selectedDate.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"),
208
+ "scheduleEndTime": time.format("hh:mm A"),
209
+ "userEmail": this.payload.selectedUsers,
210
+ "storeName": this.payload.selectedStores,
211
+ "clientId": this.clientId,
212
+ "allowedStoreLocation": this.allowedStoreLocation,
213
+ "restrictAttendance": this.restrictAttendance,
214
+ "checkListType": "checklistTask" // ['checklistTask','cctv]
215
+ };
216
+ if (response[0].questions[0].answerType === 'image' || response[0].questions[0].answerType === 'descriptiveImage' || response[0].questions[0].answerType === 'multipleImage') {
217
+ if (this.uploadedFiles && this.uploadedFiles.length > 0) {
218
+ payload.question.forEach((data) => {
219
+ data?.answers.forEach((ans) => {
220
+ ans.referenceImage = this.uploadedFiles;
221
+ });
222
+ });
223
+ }
224
+ }
225
+ // console.log(payload)
226
+ // return
227
+ try {
228
+ this.traxService.CreatechecklistMultiTask(payload).subscribe({
229
+ next: (res) => {
230
+ if (res?.code === 200) {
231
+ console.log("------------------");
232
+ this.toastService.getSuccessToast(res?.message);
233
+ this.activeModal.close('submit');
234
+ }
235
+ }, error: (err) => {
236
+ console.error('Request Failed:', err);
237
+ }
238
+ });
239
+ }
240
+ catch (err) {
241
+ console.log("88888", err);
242
+ }
243
+ }
244
+ }
245
+ createForm() {
246
+ this.taskForm = this.fb.group({
247
+ checklistName: ['', [Validators.required, noWhitespaceValidator()]],
248
+ checklistDescription: [''],
249
+ sections: this.fb.array([])
250
+ });
251
+ this.updateForm();
252
+ }
253
+ addSectionForm(section) {
254
+ const sectionFormData = this.fb.group({
255
+ id: [section?.id ?? ''],
256
+ name: [section?.name ?? ''],
257
+ questions: this.fb.array([])
258
+ });
259
+ this.taskForm.get('sections').push(sectionFormData);
260
+ }
261
+ addQuestionForm(question, sectionIndex, insertIndex) {
262
+ const questionFormData = this.fb.group({
263
+ qno: [question?.qno ?? (this.getQuestions(sectionIndex)?.length ? this.getQuestions(sectionIndex).length + 1 : 1), [Validators.required]],
264
+ qname: [question?.qname ?? '', [Validators.required, noWhitespaceValidator()]],
265
+ answerType: [question?.answerType ?? 'descriptive', [Validators.required]],
266
+ runAI: [question?.runAI ?? false],
267
+ runAIDescription: [question?.runAIDescription ?? ''],
268
+ allowUploadfromGallery: [question?.allowUploadfromGallery ?? false],
269
+ linkType: [question?.linkType ?? false],
270
+ questionReferenceImage: [[...question?.questionReferenceImage ?? '']],
271
+ answers: this.fb.array([])
272
+ });
273
+ if (question.answerType === 'descriptive' || question.answerType === 'multipleImage') {
274
+ questionFormData.addControl('descriptivetype', new FormControl(question?.descriptivetype ?? 'text'));
275
+ }
276
+ if (question.answerType === 'yes/no' || question.answerType === 'multiplechoicesingle' || question.answerType === 'multiplechoicemultiple') {
277
+ questionFormData.get('answers')?.addValidators(uniqueStringValidator());
278
+ }
279
+ if (insertIndex !== undefined) {
280
+ this.taskForm.get('sections')
281
+ .at(sectionIndex).get('questions').insert(insertIndex, questionFormData);
282
+ return;
283
+ }
284
+ this.taskForm.get('sections')
285
+ .at(sectionIndex).get('questions').push(questionFormData);
286
+ }
287
+ addAnswerForm(answer, sectionIndex, questionIndex, insertIndex) {
288
+ const answerFormData = this.fb.group({
289
+ answer: [answer?.answer ?? ''],
290
+ answeroptionNumber: [answer?.answeroptionNumber ?? (this.getAnswers(sectionIndex, questionIndex)?.length ? this.getAnswers(sectionIndex, questionIndex).length + 1 : 1), [Validators.required]],
291
+ sopFlag: [answer?.sopFlag ?? false],
292
+ validation: [answer?.validation ?? false],
293
+ validationType: [answer?.validationType ?? ''],
294
+ referenceImage: [[...answer?.referenceImage ?? '']],
295
+ showLinked: [answer?.showLinked ?? false],
296
+ linkedQuestion: [answer?.linkedQuestion ?? 0],
297
+ nestedQuestion: [answer?.nestedQuestion ?? []],
298
+ });
299
+ const answerType = ((this.taskForm?.get('sections')).at(sectionIndex)?.get('questions')).at(questionIndex)?.get('answerType')?.value;
300
+ if (answerType === 'descriptive' || answerType === 'descriptiveImage' || answerType === 'image' || answerType === 'multipleImage' || answerType === 'date' || answerType === 'linearscale' || answerType === 'time') {
301
+ answerFormData.addControl('validationAnswer', new FormControl(answer?.validationAnswer ?? ''));
302
+ }
303
+ if (answerType === 'yes/no' || answerType === 'multiplechoicesingle' || answerType === 'multiplechoicemultiple') {
304
+ answerFormData.addControl('allowUploadfromGallery', new FormControl(answer?.allowUploadfromGallery ?? false));
305
+ answerFormData.addControl('runAI', new FormControl(answer?.runAI ?? false));
306
+ answerFormData.get('answer')?.addValidators([Validators.required, noWhitespaceValidator()]);
307
+ }
308
+ if (answerType === 'linearscale') {
309
+ answerFormData.addControl('rangeStart', new FormControl(answer?.rangeStart ?? 0));
310
+ answerFormData.addControl('rangeEnd', new FormControl(answer?.rangeEnd ?? 0));
311
+ }
312
+ if (answerType === 'yes/no' || answerType === 'multiplechoicesingle' || answerType === 'multiplechoicemultiple' || answerType === 'multipleImage') {
313
+ answerFormData.addControl('descriptivetype', new FormControl(answer?.descriptivetype ?? 'text'));
314
+ }
315
+ if (insertIndex !== undefined) {
316
+ this.taskForm.get('sections')
317
+ .at(sectionIndex).get('questions')
318
+ .at(questionIndex).get('answers').insert(insertIndex, answerFormData);
319
+ return;
320
+ }
321
+ this.taskForm.get('sections')
322
+ .at(sectionIndex).get('questions')
323
+ .at(questionIndex).get('answers').push(answerFormData);
324
+ }
325
+ get getSections() {
326
+ return this.taskForm?.get('sections');
327
+ }
328
+ getQuestions(sectionIndex) {
329
+ return (this.taskForm?.get('sections')).at(sectionIndex)?.get('questions');
330
+ }
331
+ isInvalidAnswer(secIdx, qnIdx) {
332
+ let answer = this.getAnswers(secIdx, qnIdx);
333
+ if (answer.value.length > 2) {
334
+ return true;
335
+ }
336
+ else {
337
+ return false;
338
+ }
339
+ }
340
+ getAnswers(sectionIndex, questionIndex) {
341
+ return this.taskForm.get('sections').at(sectionIndex).get('questions').at(questionIndex).get('answers');
342
+ }
343
+ uploadFile(event, sectionIndex, questionIndex, answerIndex) {
344
+ if (event.target.files != undefined && event.target.files.length) {
345
+ const formData = new FormData();
346
+ const file = event.target.files[0];
347
+ formData.append('file', file, file.name);
348
+ formData.append('clientId', this.clientId);
349
+ this.traxService.taskImageupload(formData).pipe(takeUntil(this.destroy$)).subscribe({
350
+ next: (res) => {
351
+ if (res.data.imgUrl) {
352
+ this.selectedFile = file;
353
+ this.previewUrl = URL.createObjectURL(file);
354
+ this.uploadedFiles.push(res.data.imgUrl);
355
+ if (this.fileInput) {
356
+ this.fileInput.nativeElement.value = '';
357
+ }
358
+ }
359
+ },
360
+ error: (err) => {
361
+ this.toastService.getErrorToast(err?.error?.error?.message || 'Something went wrong');
362
+ }
363
+ });
364
+ }
365
+ }
366
+ togglegeofencing(evt) {
367
+ this.allowedStoreLocation = evt.target.checked;
368
+ }
369
+ toggleAttendance(evt) {
370
+ this.restrictAttendance = evt.target.checked;
371
+ }
372
+ closeDropdown(event) {
373
+ this.dropDown = false;
374
+ }
375
+ openDropdown(event) {
376
+ event.stopPropagation();
377
+ this.dropDown = !this.dropDown;
378
+ }
379
+ selectedItem = '00:00';
380
+ dropDown = false;
381
+ currentTime = '';
382
+ updateCurrentTime() {
383
+ const now = new Date();
384
+ const nextHour = new Date();
385
+ nextHour.setHours(now.getHours() + 1);
386
+ const hours = String(now.getHours()).padStart(2, '0');
387
+ const minutes = String(Math.floor(now.getMinutes() / 30) * 30).padStart(2, '0');
388
+ this.currentTime = `${hours}:${minutes}`;
389
+ const nextHourStr = `${String(nextHour.getHours()).padStart(2, '0')}:00`;
390
+ this.selectedItem = this.timeDetails[this.timeDetails.length - 2].id;
391
+ }
392
+ isDisabled(time) {
393
+ const now = new Date();
394
+ console.log(dayjs(now).format('YYYY-MM-DD'), dayjs(this.selectedDate.startDate, "DD-MM-YYYY").format("YYYY-MM-DD"));
395
+ if (dayjs(now).format('YYYY-MM-DD') === dayjs(this.selectedDate.startDate, "DD-MM-YYYY").format("YYYY-MM-DD")) {
396
+ now.setHours(now.getHours() + 1);
397
+ const disabledThreshold = `${String(now.getHours()).padStart(2, '0')}:00`;
398
+ console.log(disabledThreshold);
399
+ return time < disabledThreshold;
400
+ }
401
+ else {
402
+ return false;
403
+ }
404
+ }
405
+ selectItem(value) {
406
+ this.selectedItem = value;
407
+ this.dropDown = false;
408
+ }
409
+ onAnswerDelete(sectionIndex, questionIndex, answerIndex) {
410
+ this.getAnswers(sectionIndex, questionIndex).removeAt(answerIndex);
411
+ this.toastService.getSuccessToast('Answer deleted successfully');
412
+ }
413
+ onValidateResponseChange(event, sectionIndex, questionIndex, answerIndex) {
414
+ if (event.target.checked) {
415
+ this.getAnswers(sectionIndex, questionIndex).at(answerIndex).get('showLinked')?.setValue(false);
416
+ }
417
+ }
418
+ addNewAnswer(sectionIndex, questionIndex, type) {
419
+ if (type === 'multiplechoicesingle' || type === 'multiplechoicemultiple') {
420
+ this.addAnswerForm(multiplechoice_answer_template, sectionIndex, questionIndex);
421
+ this.toastService.getSuccessToast('Answer added successfully');
422
+ }
423
+ }
424
+ onQuestionChange(event, sectionIndex, questionIndex) {
425
+ let question;
426
+ const answerType = event.target.value;
427
+ switch (answerType) {
428
+ case 'descriptive':
429
+ question = descriptive_question_template;
430
+ break;
431
+ case 'yes/no':
432
+ question = yesorno_question_template;
433
+ break;
434
+ case 'multiplechoicesingle':
435
+ question = multiplechoicesingle_question_template;
436
+ break;
437
+ case 'multiplechoicemultiple':
438
+ question = multiplechoicemultiple_question_template;
439
+ break;
440
+ case 'descriptiveImage':
441
+ question = descriptiveImage_question_template;
442
+ break;
443
+ case 'image':
444
+ question = image_question_template;
445
+ break;
446
+ case 'video':
447
+ question = video_question_template;
448
+ break;
449
+ case 'multipleImage':
450
+ question = multipleImage_question_template;
451
+ break;
452
+ case 'date':
453
+ question = date_question_template;
454
+ break;
455
+ case 'linearscale':
456
+ question = linearscale_question_template;
457
+ break;
458
+ case 'time':
459
+ question = time_question_template;
460
+ break;
461
+ default:
462
+ question = descriptive_question_template;
463
+ break;
464
+ }
465
+ const questionName = this.getQuestions(sectionIndex).at(questionIndex).get('qname')?.value || '';
466
+ this.getQuestions(sectionIndex).removeAt(questionIndex);
467
+ this.addQuestionForm(question, sectionIndex, questionIndex);
468
+ this.getQuestions(sectionIndex).at(questionIndex).get('qname')?.setValue(questionName);
469
+ if (question?.answers.length) {
470
+ question.answers.forEach((element, idx) => {
471
+ this.addAnswerForm(element, sectionIndex, questionIndex, idx);
472
+ });
473
+ }
474
+ }
475
+ selectedDate = {};
476
+ dayjs = dayjs;
477
+ isCustomDate = (m) => {
478
+ const isValidDate = m > this.dayjs();
479
+ return isValidDate ? 'invalid-date' : false;
480
+ };
481
+ onStartDateChange(event) {
482
+ if (this.dayjs(event.startDate).isValid()) {
483
+ this.isCustomDate = (m) => {
484
+ return m.isBefore(this.dayjs(), 'day') ? 'invalid-date' : false;
485
+ };
486
+ }
487
+ }
488
+ datechange(event) {
489
+ if (!event.endDate || !event.startDate) {
490
+ return;
491
+ }
492
+ }
493
+ uploadedFiles = [];
494
+ selectedFile;
495
+ previewUrl;
496
+ fileInput;
497
+ removeImage(index) {
498
+ this.selectedFile = undefined;
499
+ this.previewUrl = undefined;
500
+ if (this.fileInput) {
501
+ this.fileInput.nativeElement.value = '';
502
+ }
503
+ this.uploadedFiles.splice(index, 1);
504
+ }
505
+ ngOnDestroy() {
506
+ this.destroy$.next(true);
507
+ this.destroy$.complete();
508
+ }
509
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddMultitaskComponent, deps: [{ token: i1.FormBuilder }, { token: i2.NgbActiveModal }, { token: i3.GlobalStateService }, { token: i4.TraxService }, { token: i0.ChangeDetectorRef }, { token: i2.NgbModal }, { token: i5.Router }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Component });
510
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddMultitaskComponent, selector: "lib-add-multitask", inputs: { type: "type", sourceCheckList_id: "sourceCheckList_id", filtertype: "filtertype", showcomment: "showcomment", excelData: "excelData", payload: "payload", taskDetails: "taskDetails", checklistInfo: "checklistInfo" }, host: { listeners: { "document:click": "closeDropdown($event)" } }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"card group-delete py-0\">\r\n <div *ngIf=\"type ==='task'\" class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"modal-header px-0 py-5 \">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M30 18H22C21.4696 18 20.9609 18.2107 20.5858 18.5858C20.2107 18.9609 20 19.4696 20 20V36C20 36.5304 20.2107 37.0391 20.5858 37.4142C20.9609 37.7893 21.4696 38 22 38H34C34.5304 38 35.0391 37.7893 35.4142 37.4142C35.7893 37.0391 36 36.5304 36 36V24M30 18L36 24M30 18V24H36M28 34V28M25 31H31\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3 mt-5\"> {{type}}</h3>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-body scroll-y w-100 p-1 scroll custom-scroll\">\r\n <form [formGroup]=\"taskForm\">\r\n <ng-container *ngFor=\"let section of getSections?.controls; let i = index\">\r\n <ng-container [formGroup]=\"section\">\r\n <ng-container *ngFor=\"let question of getQuestions(i)?.controls; let j = index\">\r\n <ng-container [formGroup]=\"question\">\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <div class=\"text-gray-600\">This Task is linked to </div>\r\n <div class=\"d-flex mt-3\">\r\n <div>Checklist Name :</div>\r\n <div>\r\n <h4> {{payload.checklistName}}</h4>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mt-3\">\r\n <div>Question :</div>\r\n <div><span class=\"text-wrap\"> {{question.get('qno')?.value}}.\r\n {{question.get('qname')?.value}}</span></div>\r\n </div>\r\n <div class=\"d-flex mt-3 mb-3\">\r\n <div>Stores Selected :</div>\r\n <div>\r\n <h4>{{payload.selectedStores.length}} stores</h4>\r\n </div>\r\n </div>\r\n <label class=\"label-name my-2\">\r\n Task Name<span class=\"text-danger\">*</span>\r\n </label>\r\n <input [formControl]=\"taskForm.controls.checklistName\" type=\"text\"\r\n placeholder=\"Enter Task Name\" class=\"form-control mb-5\">\r\n <div\r\n class=\"fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- <div class=\"row px-5\" *ngIf=\"payload.inputData.answerType==='video'\">\r\n \r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div\r\n class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n >\r\n <div class=\"row\">\r\n \r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\" (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n \r\n <button class=\"carousel-control-next\" *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n \r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='image'||payload.inputData.answerType==='descriptiveImage'||payload.inputData.answerType==='multipleImage'\">\r\n \r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div\r\n class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n >\r\n <div class=\"row\">\r\n \r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\" (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n \r\n <button class=\"carousel-control-next\" *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n \r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='multiplechoicesingle'||payload.inputData.answerType==='yes/no'||payload.inputData.answerType==='date'||payload.inputData.answerType==='time' ||payload.inputData.answerType==='multiplechoicemultiple'||payload.inputData.answerType==='linearscale'||payload.inputData.answerType==='descriptive' \">\r\n <div class=\"row\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <span class=\"mt-1\">{{item.answer}}</span>\r\n </div>\r\n </div> -->\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\" *ngIf=\"showcomment\">\r\n <label class=\"label-name my-2\">\r\n Task Comment\r\n </label>\r\n <textarea [formControl]=\"taskForm.controls.checklistDescription\"\r\n class=\"form-control form-control\" placeholder=\"Enter a comment\"\r\n name=\"Main entrance signage is cracked, and lights are flickering. Please retake the image\"\r\n rows=\"4\"></textarea>\r\n </div>\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Response Type\r\n </label>\r\n <select (change)=\"onQuestionChange($event, i, j)\" formControlName=\"answerType\"\r\n class=\"form-select mb-5\">\r\n <option *ngFor=\"let answer of answerTypes\" [value]=\"answer.value\">\r\n {{answer.label}}</option>\r\n </select>\r\n\r\n </div>\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\"\r\n *ngIf=\"question.get('answerType')?.value !=='time'&&question.get('answerType')?.value !=='date'\">\r\n <label class=\"label-name1 my-3\">\r\n Answer Options\r\n </label>\r\n <div [id]=\"'question-' + i + j\" class=\"question-container mb-10\">\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'descriptive'\">\r\n <div class=\"d-flex mb-5\">\r\n <div class=\"form-check\">\r\n <input formControlName=\"descriptivetype\"\r\n class=\"form-check-input cursor-pointer\" type=\"radio\"\r\n value=\"text\" [id]=\"'descriptivetype_text' + i + j\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptivetype_text' + i + j\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\"\r\n class=\"form-check-input cursor-pointer\" type=\"radio\"\r\n value=\"number\" [id]=\"'descriptivetype_number' + i + j\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptivetype_number' + i + j\">Number</label>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'yes/no'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"input-group \">\r\n <input formControlName=\"answer\" type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Enter answer here\">\r\n\r\n </div>\r\n <ng-container\r\n *ngIf=\"answer.get('answer')?.invalid && answer.get('answer')?.touched\">\r\n <div *ngIf=\"answer.get('answer')?.hasError('required')|| answer.get('answer')?.hasError('whitespace')\"\r\n class=\"text-danger mt-2\">* Answer is required</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'multiplechoicesingle' || question.get('answerType')?.value === 'multiplechoicemultiple'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"input-group \">\r\n <input formControlName=\"answer\" type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Enter answer here\">\r\n\r\n <button *ngIf=\"isInvalidAnswer(i,j)\"\r\n class=\"btn btn-outline\" type=\"button\">\r\n <svg class=\"cursor-pointer\"\r\n (click)=\"onAnswerDelete(i, j, k)\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n matTooltip=\"Delete answer\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path _ngcontent-ng-c1491044170=\"\"\r\n d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n <ng-container\r\n *ngIf=\"answer.get('answer')?.invalid && answer.get('answer')?.touched\">\r\n <div *ngIf=\"answer.get('answer')?.hasError('required')||answer.get('answer')?.hasError('whitespace')\"\r\n class=\"text-danger mt-2\">* Answer is required</div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n <div (click)=\"addNewAnswer(i, j, 'multiplechoicesingle')\"\r\n class=\"add-reference-btn mb-5 d-flex justify-content-center\">\r\n Add More Answer\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'descriptiveImage' || question.get('answerType')?.value === 'image'\">\r\n\r\n\r\n\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n\r\n\r\n\r\n\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\">\r\n\r\n\r\n <div>\r\n <div class=\"form-check form-switch ps-0\">\r\n <input\r\n [formControl]=\"question.controls.allowUploadfromGallery\"\r\n class=\"form-check-input me-3\"\r\n type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label\r\n class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'video'\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"form-check form-switch ps-0\">\r\n <input formControlName=\"allowUploadfromGallery\"\r\n class=\"form-check-input me-3\" type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'multipleImage'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\">\r\n <div>\r\n <div class=\"form-check form-switch ps-0\">\r\n <input\r\n [formControl]=\"question.controls.allowUploadfromGallery\"\r\n class=\"form-check-input me-3\"\r\n type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label\r\n class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-6\"\r\n *ngIf=\"question.controls.descriptivetype\">\r\n <div class=\"d-flex align-items-center h-100\">\r\n <div class=\"form-check\">\r\n <input\r\n [formControl]=\"question.controls.descriptivetype\"\r\n class=\"form-check-input cursor-pointer\"\r\n type=\"radio\" value=\"text\"\r\n [id]=\"'descriptive_answer_validation_text' + i + j + k\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptive_answer_validation_text' + i + j + k\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input\r\n [formControl]=\"question.controls.descriptivetype\"\r\n class=\"form-check-input cursor-pointer\"\r\n type=\"radio\" value=\"number\"\r\n [id]=\"'descriptive_answer_validation_number' + i + j + k\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptive_answer_validation_number' + i + j + k\">Number</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'date' || question.get('answerType')?.value === 'time'\">\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'linearscale'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"col-4\">\r\n <div class=\"d-flex justify-content-between align-items-center \">\r\n <div class=\"me-2\">\r\n <input type=\"number\" formControlName=\"rangeStart\"\r\n class=\"form-control\">\r\n </div>\r\n <div class=\"me-2 check-label\">\r\n to\r\n </div>\r\n <div>\r\n <input type=\"number\" formControlName=\"rangeEnd\"\r\n class=\"form-control\">\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"row mb-3 fv-plugins-icon-container \">\r\n <div class=\"col-md-6\">\r\n <label class=\"label-name my-2\">\r\n Due date\r\n </label>\r\n\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [showCustomRangeLabel]=\"false\"\r\n [alwaysShowCalendars]=\"false\" [autoApply]=\"true\" [singleDatePicker]=\"true\"\r\n [ngModelOptions]=\"{standalone: true}\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"selectedDate\"\r\n (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"label-name my-2\">Due time</label>\r\n <div class=\"position-relative w-100\">\r\n <button type=\"button\" (click)=\"openDropdown($event)\"\r\n class=\"btn btn-default w-100 btn-outline btn-outline-default rounded-3 mt-1 text-nowrap border-val d-flex justify-content-between h-45px\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.6665V4.99984M6.66667 1.6665V4.99984M2.5 8.33317H17.5M4.16667 3.33317H15.8333C16.7538 3.33317 17.5 4.07936 17.5 4.99984V16.6665C17.5 17.587 16.7538 18.3332 15.8333 18.3332H4.16667C3.24619 18.3332 2.5 17.587 2.5 16.6665V4.99984C2.5 4.07936 3.24619 3.33317 4.16667 3.33317Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"ps-12\">{{ selectedItem }}</span>\r\n </button>\r\n <div *ngIf=\"dropDown\"\r\n class=\"card py-1 w-100 position-absolute z-1 h-200px scroll-y top-50px end-0\">\r\n <ul class=\"list-unstyled\">\r\n <li *ngFor=\"let item of timeDetails\"\r\n [ngClass]=\"selectedItem === item.text ? 'active' : ''\"\r\n class=\"camera px-5 items fw-semibold cursor-pointer py-2\"\r\n [class.disabled]=\"isDisabled(item.text)\" (click)=\"selectItem(item.text)\">\r\n {{ item.text }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Assign to\r\n </label>\r\n <!-- <input type=\"text\" class=\"form-control\" [value]=\"this.checklistInfo?.submittedBy\" [disabled]=\"true\"> -->\r\n <div *ngIf=\"filtertype==='Teams'\">\r\n <lib-disabled-select [items]=\"payload.selectedUsers\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedUsers\"></lib-disabled-select>\r\n </div>\r\n <div *ngIf=\"filtertype==='Clusters'\">\r\n <lib-disabled-select [items]=\"payload.selectedStores\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedStores\"></lib-disabled-select>\r\n </div>\r\n </div>\r\n <div class=\"fv-row my-3 fv-plugins-icon-container\">\r\n <div class=\"border-attach col-md-3 cursor-pointer\" *ngIf=\"this.uploadedFiles.length<3\"\r\n (click)=\"fileInput.click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.8666 9.2081L10.2082 16.8664C9.27005 17.8046 7.99757 18.3317 6.67075 18.3317C5.34393 18.3317 4.07145 17.8046 3.13325 16.8664C2.19505 15.9282 1.66797 14.6558 1.66797 13.3289C1.66797 12.0021 2.19505 10.7296 3.13325 9.79144L10.7916 2.1331C11.4171 1.50763 12.2654 1.15625 13.1499 1.15625C14.0345 1.15625 14.8828 1.50763 15.5082 2.1331C16.1337 2.75857 16.4851 3.60689 16.4851 4.49144C16.4851 5.37598 16.1337 6.2243 15.5082 6.84977L7.84158 14.5081C7.52885 14.8208 7.10469 14.9965 6.66242 14.9965C6.22014 14.9965 5.79598 14.8208 5.48325 14.5081C5.17051 14.1954 4.99482 13.7712 4.99482 13.3289C4.99482 12.8867 5.17051 12.4625 5.48325 12.1498L12.5582 5.0831\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-3\">Add Attachment</span>\r\n <input #fileInput type=\"file\" accept=\".png, .jpg, .jpeg, .svg, .gif\"\r\n (change)=\"uploadFile($event,0,0,0)\" hidden />\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4 image-preview mt-2\" *ngFor=\"let item of uploadedFiles; let i = index\">\r\n <button class=\"remove-icon\" (click)=\"removeImage(i)\">\u2716</button>\r\n <img [src]=\"item\" alt=\"Preview\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': allowedStoreLocation}\">\r\n <div class=\"form-check form-switch ps-0 my-2\">\r\n <input class=\"form-check-input my-5 mx-3 cursor-pointer ps-0\" type=\"checkbox\" id=\"flexSwitchCheckDefault\" \r\n [checked]=\"allowedStoreLocation\" (change)=\"togglegeofencing($event)\">\r\n <span class=\"fw-bold\" for=\"sameComment\"> Geo fencing</span>\r\n <div class=\"text-muted medium mt-1 ms-10\">\r\n By enabling, the checklist can be filled by the user only when inside the store.\r\n </div>\r\n </div>\r\n \r\n \r\n </div>\r\n \r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': restrictAttendance }\" >\r\n <div class=\"form-check form-switch ps-0 my-2\">\r\n <input class=\"form-check-input my-5 mx-3 form-switch ps-0\" type=\"checkbox\" id=\"flexSwitchCheckDefault\" \r\n [checked]=\"restrictAttendance\" (change)=\"toggleAttendance($event)\"> \r\n <span class=\"fw-bold\" for=\"sameComment\">Restrict attendance</span>\r\n <div class=\"text-muted medium mt-1 ms-10\">\r\n By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n </div>\r\n <div class=\" w-100 modal-footer px-0 pt-3 pb-5\">\r\n <div role=\"group\" class=\"d-flex mt-3 w-100\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-primary w-100 ms-3\" [disabled]=\"!this.taskForm.valid||submitted\"\r\n (click)=\"onSubmit()\">Create\r\n Task</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"type ==='redo'\" class=\"card-body py-0 d-flex flex-start flex-column p-9 scroll \">\r\n <div class=\"my-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M39 20.0001V26.0001M39 26.0001H33M39 26.0001L34.36 21.6401C33.2853 20.5648 31.9556 19.7793 30.4952 19.3568C29.0348 18.9344 27.4911 18.8888 26.0083 19.2243C24.5255 19.5598 23.1518 20.2655 22.0155 21.2755C20.8791 22.2855 20.0172 23.5669 19.51 25.0001M17 36.0001V30.0001M17 30.0001H23M17 30.0001L21.64 34.3601C22.7147 35.4354 24.0444 36.2209 25.5048 36.6433C26.9652 37.0657 28.5089 37.1113 29.9917 36.7758C31.4745 36.4403 32.8482 35.7346 33.9845 34.7247C35.1209 33.7147 35.9828 32.4333 36.49 31.0001\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3 mt-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let section of getSections?.controls; let i = index\">\r\n <ng-container [formGroup]=\"section\">\r\n <ng-container *ngFor=\"let question of getQuestions(i)?.controls; let j = index\">\r\n <ng-container [formGroup]=\"question\">\r\n\r\n <div class=\"modal-body scroll-y w-100 p-1\">\r\n <h5 class=\"label-name1 my-2\">\r\n Redo\r\n </h5>\r\n <!-- <h5 class=\"label-name1 my-2\">\r\n {{payload.checklistName}}\r\n </h5> -->\r\n <div class=\"text-gray-600\">\r\n {{question.get('qno')?.value}}. {{question.get('qname')?.value}}\r\n </div>\r\n <div class=\"row px-5\" *ngIf=\"payload.inputData.answerType==='video'\">\r\n <div class=\"col-md-6\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <div class=\"title-ref my-3\">Uploaded Video</div>\r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\">\r\n <div class=\"row\">\r\n <!-- <div *ngFor=\"let pair of group\" class=\"col-md-12\" > -->\r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\"\r\n (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n\r\n <button class=\"carousel-control-next\"\r\n *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\" (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='image'||payload.inputData.answerType==='descriptiveImage'||payload.inputData.answerType==='multipleImage'\">\r\n <div class=\"col-md-6\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <div class=\"title-ref my-3\">Uploaded Image</div>\r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\">\r\n <div class=\"row\">\r\n <!-- <div *ngFor=\"let pair of group\" class=\"col-md-12\" > -->\r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\"\r\n (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n\r\n <button class=\"carousel-control-next\"\r\n *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\" (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='multiplechoicesingle'||payload.inputData.answerType==='yes/no'||payload.inputData.answerType==='multiplechoicemultiple'||payload.inputData.answerType==='date'||payload.inputData.answerType==='time'||payload.inputData.answerType==='linearscale'||payload.inputData.answerType==='descriptive' \">\r\n <div class=\"col-md-12\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <span class=\"mt-1\">{{item.answer}}</span>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"taskForm\">\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Your Comment\r\n </label>\r\n <textarea [formControl]=\"taskForm.controls.checklistDescription\"\r\n class=\"form-control form-control\" placeholder=\"Enter a comment\"\r\n name=\"Main entrance signage is cracked, and lights are flickering. Please retake the image\"\r\n rows=\"4\"></textarea>\r\n </div>\r\n\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Assign to\r\n </label>\r\n <!-- <input type=\"text\" class=\"form-control\" [value]=\"this.checklistInfo?.submittedBy\"\r\n [disabled]=\"true\"> -->\r\n <div *ngIf=\"filtertype==='Teams'\">\r\n <lib-disabled-select [items]=\"payload.selectedUsers\" [multi]=\"true\"\r\n [searchField]=\"'userName'\" [idField]=\"'userName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedUsers\"></lib-disabled-select>\r\n </div>\r\n <div *ngIf=\"filtertype==='Clusters'\">\r\n <lib-disabled-select [items]=\"payload.selectedStores\" [multi]=\"true\"\r\n [searchField]=\"'storeName'\" [idField]=\"'storeName'\"\r\n [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedStores\"></lib-disabled-select>\r\n </div>\r\n\r\n </div>\r\n <div class=\"mt-5 w-100\">\r\n <div role=\"group\" class=\"d-flex mt-3 mb-15\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-primary w-100 ms-3\"\r\n [disabled]=\"submitted\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".carousel{position:relative}.carousel-item{display:none;transition:opacity .5s}.carousel-item.active{display:block;opacity:1}.option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#008edf}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}.carousel-control-prev,.carousel-control-next{position:absolute;top:50%;transform:translateY(-50%);border:none;padding:10px;cursor:pointer}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-indicators{position:absolute;left:35%;transform:translate(-50%);gap:10px}.carousel-indicators li{list-style:none!important;width:10px;height:10px;background-color:#ddd;border-radius:50%;cursor:pointer;transition:background-color .3s}.carousel-indicators li.active{background-color:#007bff}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:25rem!important;height:25rem!important;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.image-thumb{height:auto;border-radius:8px}.dropselect{color:var(--Gray-500, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.nodata-title{font-size:14px!important;font-weight:600}.carousel-control-prev-icon,.carousel-control-next-icon{color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "component", type: i9.DisabledSelectComponent, selector: "lib-disabled-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "dropDowndisabled", "label"], outputs: ["selected"] }] });
511
+ }
512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddMultitaskComponent, decorators: [{
513
+ type: Component,
514
+ args: [{ selector: 'lib-add-multitask', template: "<div class=\"card group-delete py-0\">\r\n <div *ngIf=\"type ==='task'\" class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"modal-header px-0 py-5 \">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M30 18H22C21.4696 18 20.9609 18.2107 20.5858 18.5858C20.2107 18.9609 20 19.4696 20 20V36C20 36.5304 20.2107 37.0391 20.5858 37.4142C20.9609 37.7893 21.4696 38 22 38H34C34.5304 38 35.0391 37.7893 35.4142 37.4142C35.7893 37.0391 36 36.5304 36 36V24M30 18L36 24M30 18V24H36M28 34V28M25 31H31\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3 mt-5\"> {{type}}</h3>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-body scroll-y w-100 p-1 scroll custom-scroll\">\r\n <form [formGroup]=\"taskForm\">\r\n <ng-container *ngFor=\"let section of getSections?.controls; let i = index\">\r\n <ng-container [formGroup]=\"section\">\r\n <ng-container *ngFor=\"let question of getQuestions(i)?.controls; let j = index\">\r\n <ng-container [formGroup]=\"question\">\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <div class=\"text-gray-600\">This Task is linked to </div>\r\n <div class=\"d-flex mt-3\">\r\n <div>Checklist Name :</div>\r\n <div>\r\n <h4> {{payload.checklistName}}</h4>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mt-3\">\r\n <div>Question :</div>\r\n <div><span class=\"text-wrap\"> {{question.get('qno')?.value}}.\r\n {{question.get('qname')?.value}}</span></div>\r\n </div>\r\n <div class=\"d-flex mt-3 mb-3\">\r\n <div>Stores Selected :</div>\r\n <div>\r\n <h4>{{payload.selectedStores.length}} stores</h4>\r\n </div>\r\n </div>\r\n <label class=\"label-name my-2\">\r\n Task Name<span class=\"text-danger\">*</span>\r\n </label>\r\n <input [formControl]=\"taskForm.controls.checklistName\" type=\"text\"\r\n placeholder=\"Enter Task Name\" class=\"form-control mb-5\">\r\n <div\r\n class=\"fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback\">\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- <div class=\"row px-5\" *ngIf=\"payload.inputData.answerType==='video'\">\r\n \r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div\r\n class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n >\r\n <div class=\"row\">\r\n \r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\" (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n \r\n <button class=\"carousel-control-next\" *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n \r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='image'||payload.inputData.answerType==='descriptiveImage'||payload.inputData.answerType==='multipleImage'\">\r\n \r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div\r\n class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n >\r\n <div class=\"row\">\r\n \r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\" (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n \r\n <button class=\"carousel-control-next\" *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n \r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\"\r\n (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='multiplechoicesingle'||payload.inputData.answerType==='yes/no'||payload.inputData.answerType==='date'||payload.inputData.answerType==='time' ||payload.inputData.answerType==='multiplechoicemultiple'||payload.inputData.answerType==='linearscale'||payload.inputData.answerType==='descriptive' \">\r\n <div class=\"row\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <span class=\"mt-1\">{{item.answer}}</span>\r\n </div>\r\n </div> -->\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\" *ngIf=\"showcomment\">\r\n <label class=\"label-name my-2\">\r\n Task Comment\r\n </label>\r\n <textarea [formControl]=\"taskForm.controls.checklistDescription\"\r\n class=\"form-control form-control\" placeholder=\"Enter a comment\"\r\n name=\"Main entrance signage is cracked, and lights are flickering. Please retake the image\"\r\n rows=\"4\"></textarea>\r\n </div>\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Response Type\r\n </label>\r\n <select (change)=\"onQuestionChange($event, i, j)\" formControlName=\"answerType\"\r\n class=\"form-select mb-5\">\r\n <option *ngFor=\"let answer of answerTypes\" [value]=\"answer.value\">\r\n {{answer.label}}</option>\r\n </select>\r\n\r\n </div>\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\"\r\n *ngIf=\"question.get('answerType')?.value !=='time'&&question.get('answerType')?.value !=='date'\">\r\n <label class=\"label-name1 my-3\">\r\n Answer Options\r\n </label>\r\n <div [id]=\"'question-' + i + j\" class=\"question-container mb-10\">\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'descriptive'\">\r\n <div class=\"d-flex mb-5\">\r\n <div class=\"form-check\">\r\n <input formControlName=\"descriptivetype\"\r\n class=\"form-check-input cursor-pointer\" type=\"radio\"\r\n value=\"text\" [id]=\"'descriptivetype_text' + i + j\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptivetype_text' + i + j\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\"\r\n class=\"form-check-input cursor-pointer\" type=\"radio\"\r\n value=\"number\" [id]=\"'descriptivetype_number' + i + j\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptivetype_number' + i + j\">Number</label>\r\n </div>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'yes/no'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"input-group \">\r\n <input formControlName=\"answer\" type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Enter answer here\">\r\n\r\n </div>\r\n <ng-container\r\n *ngIf=\"answer.get('answer')?.invalid && answer.get('answer')?.touched\">\r\n <div *ngIf=\"answer.get('answer')?.hasError('required')|| answer.get('answer')?.hasError('whitespace')\"\r\n class=\"text-danger mt-2\">* Answer is required</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'multiplechoicesingle' || question.get('answerType')?.value === 'multiplechoicemultiple'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"input-group \">\r\n <input formControlName=\"answer\" type=\"text\"\r\n class=\"form-control\"\r\n placeholder=\"Enter answer here\">\r\n\r\n <button *ngIf=\"isInvalidAnswer(i,j)\"\r\n class=\"btn btn-outline\" type=\"button\">\r\n <svg class=\"cursor-pointer\"\r\n (click)=\"onAnswerDelete(i, j, k)\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n matTooltip=\"Delete answer\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path _ngcontent-ng-c1491044170=\"\"\r\n d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n <ng-container\r\n *ngIf=\"answer.get('answer')?.invalid && answer.get('answer')?.touched\">\r\n <div *ngIf=\"answer.get('answer')?.hasError('required')||answer.get('answer')?.hasError('whitespace')\"\r\n class=\"text-danger mt-2\">* Answer is required</div>\r\n </ng-container>\r\n </div>\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n <div (click)=\"addNewAnswer(i, j, 'multiplechoicesingle')\"\r\n class=\"add-reference-btn mb-5 d-flex justify-content-center\">\r\n Add More Answer\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'descriptiveImage' || question.get('answerType')?.value === 'image'\">\r\n\r\n\r\n\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n\r\n\r\n\r\n\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\">\r\n\r\n\r\n <div>\r\n <div class=\"form-check form-switch ps-0\">\r\n <input\r\n [formControl]=\"question.controls.allowUploadfromGallery\"\r\n class=\"form-check-input me-3\"\r\n type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label\r\n class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'video'\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"form-check form-switch ps-0\">\r\n <input formControlName=\"allowUploadfromGallery\"\r\n class=\"form-check-input me-3\" type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'multipleImage'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"row\">\r\n <div class=\"col-12 mb-5\">\r\n <div class=\"row\">\r\n <div class=\"col-6\">\r\n <div\r\n class=\"d-flex align-items-center justify-content-between\">\r\n <div>\r\n <div class=\"form-check form-switch ps-0\">\r\n <input\r\n [formControl]=\"question.controls.allowUploadfromGallery\"\r\n class=\"form-check-input me-3\"\r\n type=\"checkbox\" role=\"switch\"\r\n [id]=\"'allow_upload_from_gallery' + i + j\">\r\n <label\r\n class=\"form-check-label check-label\"\r\n [for]=\"'allow_upload_from_gallery' + i + j\">Allow\r\n upload from gallery</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-6\"\r\n *ngIf=\"question.controls.descriptivetype\">\r\n <div class=\"d-flex align-items-center h-100\">\r\n <div class=\"form-check\">\r\n <input\r\n [formControl]=\"question.controls.descriptivetype\"\r\n class=\"form-check-input cursor-pointer\"\r\n type=\"radio\" value=\"text\"\r\n [id]=\"'descriptive_answer_validation_text' + i + j + k\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptive_answer_validation_text' + i + j + k\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input\r\n [formControl]=\"question.controls.descriptivetype\"\r\n class=\"form-check-input cursor-pointer\"\r\n type=\"radio\" value=\"number\"\r\n [id]=\"'descriptive_answer_validation_number' + i + j + k\">\r\n <label class=\"cursor-pointer dscriptiveType\"\r\n [for]=\"'descriptive_answer_validation_number' + i + j + k\">Number</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'date' || question.get('answerType')?.value === 'time'\">\r\n\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'linearscale'\">\r\n <ng-container\r\n *ngFor=\"let answer of getAnswers(i, j).controls; let k = index\">\r\n <ng-container [formGroup]=\"answer\">\r\n <div class=\"col-4\">\r\n <div class=\"d-flex justify-content-between align-items-center \">\r\n <div class=\"me-2\">\r\n <input type=\"number\" formControlName=\"rangeStart\"\r\n class=\"form-control\">\r\n </div>\r\n <div class=\"me-2 check-label\">\r\n to\r\n </div>\r\n <div>\r\n <input type=\"number\" formControlName=\"rangeEnd\"\r\n class=\"form-control\">\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"row mb-3 fv-plugins-icon-container \">\r\n <div class=\"col-md-6\">\r\n <label class=\"label-name my-2\">\r\n Due date\r\n </label>\r\n\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" type=\"text\" matInput ngxDaterangepickerMd\r\n [drops]=\"'down'\" [opens]=\"'right'\" [showCustomRangeLabel]=\"false\"\r\n [alwaysShowCalendars]=\"false\" [autoApply]=\"true\" [singleDatePicker]=\"true\"\r\n [ngModelOptions]=\"{standalone: true}\" [keepCalendarOpeningWithRange]=\"true\"\r\n [showCancel]=\"true\" autocomplete=\"off\" [(ngModel)]=\"selectedDate\"\r\n (startDateChanged)=\"onStartDateChange($event)\" [isCustomDate]=\"isCustomDate\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"datechange($event)\" name=\"daterange\" [readonly]=\"true\" />\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <label class=\"label-name my-2\">Due time</label>\r\n <div class=\"position-relative w-100\">\r\n <button type=\"button\" (click)=\"openDropdown($event)\"\r\n class=\"btn btn-default w-100 btn-outline btn-outline-default rounded-3 mt-1 text-nowrap border-val d-flex justify-content-between h-45px\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.6665V4.99984M6.66667 1.6665V4.99984M2.5 8.33317H17.5M4.16667 3.33317H15.8333C16.7538 3.33317 17.5 4.07936 17.5 4.99984V16.6665C17.5 17.587 16.7538 18.3332 15.8333 18.3332H4.16667C3.24619 18.3332 2.5 17.587 2.5 16.6665V4.99984C2.5 4.07936 3.24619 3.33317 4.16667 3.33317Z\"\r\n stroke=\"#667085\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <span class=\"ps-12\">{{ selectedItem }}</span>\r\n </button>\r\n <div *ngIf=\"dropDown\"\r\n class=\"card py-1 w-100 position-absolute z-1 h-200px scroll-y top-50px end-0\">\r\n <ul class=\"list-unstyled\">\r\n <li *ngFor=\"let item of timeDetails\"\r\n [ngClass]=\"selectedItem === item.text ? 'active' : ''\"\r\n class=\"camera px-5 items fw-semibold cursor-pointer py-2\"\r\n [class.disabled]=\"isDisabled(item.text)\" (click)=\"selectItem(item.text)\">\r\n {{ item.text }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Assign to\r\n </label>\r\n <!-- <input type=\"text\" class=\"form-control\" [value]=\"this.checklistInfo?.submittedBy\" [disabled]=\"true\"> -->\r\n <div *ngIf=\"filtertype==='Teams'\">\r\n <lib-disabled-select [items]=\"payload.selectedUsers\" [multi]=\"true\" [searchField]=\"'userName'\"\r\n [idField]=\"'userName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedUsers\"></lib-disabled-select>\r\n </div>\r\n <div *ngIf=\"filtertype==='Clusters'\">\r\n <lib-disabled-select [items]=\"payload.selectedStores\" [multi]=\"true\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedStores\"></lib-disabled-select>\r\n </div>\r\n </div>\r\n <div class=\"fv-row my-3 fv-plugins-icon-container\">\r\n <div class=\"border-attach col-md-3 cursor-pointer\" *ngIf=\"this.uploadedFiles.length<3\"\r\n (click)=\"fileInput.click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M17.8666 9.2081L10.2082 16.8664C9.27005 17.8046 7.99757 18.3317 6.67075 18.3317C5.34393 18.3317 4.07145 17.8046 3.13325 16.8664C2.19505 15.9282 1.66797 14.6558 1.66797 13.3289C1.66797 12.0021 2.19505 10.7296 3.13325 9.79144L10.7916 2.1331C11.4171 1.50763 12.2654 1.15625 13.1499 1.15625C14.0345 1.15625 14.8828 1.50763 15.5082 2.1331C16.1337 2.75857 16.4851 3.60689 16.4851 4.49144C16.4851 5.37598 16.1337 6.2243 15.5082 6.84977L7.84158 14.5081C7.52885 14.8208 7.10469 14.9965 6.66242 14.9965C6.22014 14.9965 5.79598 14.8208 5.48325 14.5081C5.17051 14.1954 4.99482 13.7712 4.99482 13.3289C4.99482 12.8867 5.17051 12.4625 5.48325 12.1498L12.5582 5.0831\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-3\">Add Attachment</span>\r\n <input #fileInput type=\"file\" accept=\".png, .jpg, .jpeg, .svg, .gif\"\r\n (change)=\"uploadFile($event,0,0,0)\" hidden />\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4 image-preview mt-2\" *ngFor=\"let item of uploadedFiles; let i = index\">\r\n <button class=\"remove-icon\" (click)=\"removeImage(i)\">\u2716</button>\r\n <img [src]=\"item\" alt=\"Preview\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mt-3\">\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': allowedStoreLocation}\">\r\n <div class=\"form-check form-switch ps-0 my-2\">\r\n <input class=\"form-check-input my-5 mx-3 cursor-pointer ps-0\" type=\"checkbox\" id=\"flexSwitchCheckDefault\" \r\n [checked]=\"allowedStoreLocation\" (change)=\"togglegeofencing($event)\">\r\n <span class=\"fw-bold\" for=\"sameComment\"> Geo fencing</span>\r\n <div class=\"text-muted medium mt-1 ms-10\">\r\n By enabling, the checklist can be filled by the user only when inside the store.\r\n </div>\r\n </div>\r\n \r\n \r\n </div>\r\n \r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': restrictAttendance }\" >\r\n <div class=\"form-check form-switch ps-0 my-2\">\r\n <input class=\"form-check-input my-5 mx-3 form-switch ps-0\" type=\"checkbox\" id=\"flexSwitchCheckDefault\" \r\n [checked]=\"restrictAttendance\" (change)=\"toggleAttendance($event)\"> \r\n <span class=\"fw-bold\" for=\"sameComment\">Restrict attendance</span>\r\n <div class=\"text-muted medium mt-1 ms-10\">\r\n By enabling, user can't be able to clockout without completing the task.\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n </form>\r\n\r\n </div>\r\n <div class=\" w-100 modal-footer px-0 pt-3 pb-5\">\r\n <div role=\"group\" class=\"d-flex mt-3 w-100\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-primary w-100 ms-3\" [disabled]=\"!this.taskForm.valid||submitted\"\r\n (click)=\"onSubmit()\">Create\r\n Task</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"type ==='redo'\" class=\"card-body py-0 d-flex flex-start flex-column p-9 scroll \">\r\n <div class=\"my-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\" />\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\" />\r\n <path\r\n d=\"M39 20.0001V26.0001M39 26.0001H33M39 26.0001L34.36 21.6401C33.2853 20.5648 31.9556 19.7793 30.4952 19.3568C29.0348 18.9344 27.4911 18.8888 26.0083 19.2243C24.5255 19.5598 23.1518 20.2655 22.0155 21.2755C20.8791 22.2855 20.0172 23.5669 19.51 25.0001M17 36.0001V30.0001M17 30.0001H23M17 30.0001L21.64 34.3601C22.7147 35.4354 24.0444 36.2209 25.5048 36.6433C26.9652 37.0657 28.5089 37.1113 29.9917 36.7758C31.4745 36.4403 32.8482 35.7346 33.9845 34.7247C35.1209 33.7147 35.9828 32.4333 36.49 31.0001\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3 mt-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let section of getSections?.controls; let i = index\">\r\n <ng-container [formGroup]=\"section\">\r\n <ng-container *ngFor=\"let question of getQuestions(i)?.controls; let j = index\">\r\n <ng-container [formGroup]=\"question\">\r\n\r\n <div class=\"modal-body scroll-y w-100 p-1\">\r\n <h5 class=\"label-name1 my-2\">\r\n Redo\r\n </h5>\r\n <!-- <h5 class=\"label-name1 my-2\">\r\n {{payload.checklistName}}\r\n </h5> -->\r\n <div class=\"text-gray-600\">\r\n {{question.get('qno')?.value}}. {{question.get('qname')?.value}}\r\n </div>\r\n <div class=\"row px-5\" *ngIf=\"payload.inputData.answerType==='video'\">\r\n <div class=\"col-md-6\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <div class=\"title-ref my-3\">Uploaded Video</div>\r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\">\r\n <div class=\"row\">\r\n <!-- <div *ngFor=\"let pair of group\" class=\"col-md-12\" > -->\r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\"\r\n (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n\r\n <button class=\"carousel-control-next\"\r\n *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\" (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='image'||payload.inputData.answerType==='descriptiveImage'||payload.inputData.answerType==='multipleImage'\">\r\n <div class=\"col-md-6\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <div class=\"title-ref my-3\">Uploaded Image</div>\r\n <div class=\"carousel\">\r\n <div class=\"carousel-inner\">\r\n <div class=\"carousel-item\"\r\n *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\">\r\n <div class=\"row\">\r\n <!-- <div *ngFor=\"let pair of group\" class=\"col-md-12\" > -->\r\n <img src=\"{{environment.TraxAnswerCDN}}{{group}}\"\r\n class=\"image-thumb mb-8 d-block w-100 cursor-pointer\"\r\n alt=\"Image {{ i + 1 }}\" />\r\n </div>\r\n <!-- </div> -->\r\n </div>\r\n </div>\r\n <button class=\"carousel-control-prev\" *ngIf=\"currentIndex > 0\"\r\n (click)=\"prevSlide()\">\r\n <span class=\"carousel-control-prev-icon\"></span>\r\n </button>\r\n\r\n <button class=\"carousel-control-next\"\r\n *ngIf=\"currentIndex < payload.refImage.length - 1\" (click)=\"nextSlide()\">\r\n <span class=\"carousel-control-next-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"payload.refImage.length > 1\" class=\"row\">\r\n <ul class=\"carousel-indicators\">\r\n <li *ngFor=\"let group of payload.refImage; let i = index\"\r\n [class.active]=\"i === currentIndex\" (click)=\"goToSlide(i)\">\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row px-5\"\r\n *ngIf=\"payload.inputData.answerType==='multiplechoicesingle'||payload.inputData.answerType==='yes/no'||payload.inputData.answerType==='multiplechoicemultiple'||payload.inputData.answerType==='date'||payload.inputData.answerType==='time'||payload.inputData.answerType==='linearscale'||payload.inputData.answerType==='descriptive' \">\r\n <div class=\"col-md-12\" *ngFor=\"let item of payload.inputData.userAnswer\">\r\n <span class=\"mt-1\">{{item.answer}}</span>\r\n </div>\r\n </div>\r\n\r\n <form [formGroup]=\"taskForm\">\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Your Comment\r\n </label>\r\n <textarea [formControl]=\"taskForm.controls.checklistDescription\"\r\n class=\"form-control form-control\" placeholder=\"Enter a comment\"\r\n name=\"Main entrance signage is cracked, and lights are flickering. Please retake the image\"\r\n rows=\"4\"></textarea>\r\n </div>\r\n\r\n\r\n <div class=\"fv-row mb-3 fv-plugins-icon-container\">\r\n <label class=\"label-name my-2\">\r\n Assign to\r\n </label>\r\n <!-- <input type=\"text\" class=\"form-control\" [value]=\"this.checklistInfo?.submittedBy\"\r\n [disabled]=\"true\"> -->\r\n <div *ngIf=\"filtertype==='Teams'\">\r\n <lib-disabled-select [items]=\"payload.selectedUsers\" [multi]=\"true\"\r\n [searchField]=\"'userName'\" [idField]=\"'userName'\" [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedUsers\"></lib-disabled-select>\r\n </div>\r\n <div *ngIf=\"filtertype==='Clusters'\">\r\n <lib-disabled-select [items]=\"payload.selectedStores\" [multi]=\"true\"\r\n [searchField]=\"'storeName'\" [idField]=\"'storeName'\"\r\n [dropDowndisabled]=\"true\"\r\n [selectedValues]=\"payload.selectedStores\"></lib-disabled-select>\r\n </div>\r\n\r\n </div>\r\n <div class=\"mt-5 w-100\">\r\n <div role=\"group\" class=\"d-flex mt-3 mb-15\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button id=\"alert-toast\" class=\"btn btn-primary w-100 ms-3\"\r\n [disabled]=\"submitted\" (click)=\"onSubmit()\">Submit</button>\r\n </div>\r\n </div>\r\n\r\n\r\n </form>\r\n\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".carousel{position:relative}.carousel-item{display:none;transition:opacity .5s}.carousel-item.active{display:block;opacity:1}.option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#008edf}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}.carousel-control-prev,.carousel-control-next{position:absolute;top:50%;transform:translateY(-50%);border:none;padding:10px;cursor:pointer}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-indicators{position:absolute;left:35%;transform:translate(-50%);gap:10px}.carousel-indicators li{list-style:none!important;width:10px;height:10px;background-color:#ddd;border-radius:50%;cursor:pointer;transition:background-color .3s}.carousel-indicators li.active{background-color:#007bff}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:25rem!important;height:25rem!important;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.image-thumb{height:auto;border-radius:8px}.dropselect{color:var(--Gray-500, #344054);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.nodata-title{font-size:14px!important;font-weight:600}.carousel-control-prev-icon,.carousel-control-next-icon{color:#fff!important}\n"] }]
515
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.NgbActiveModal }, { type: i3.GlobalStateService }, { type: i4.TraxService }, { type: i0.ChangeDetectorRef }, { type: i2.NgbModal }, { type: i5.Router }, { type: i6.ToastService }], propDecorators: { type: [{
516
+ type: Input
517
+ }], sourceCheckList_id: [{
518
+ type: Input
519
+ }], filtertype: [{
520
+ type: Input
521
+ }], showcomment: [{
522
+ type: Input
523
+ }], excelData: [{
524
+ type: Input
525
+ }], payload: [{
526
+ type: Input
527
+ }], taskDetails: [{
528
+ type: Input
529
+ }], checklistInfo: [{
530
+ type: Input
531
+ }], closeDropdown: [{
532
+ type: HostListener,
533
+ args: ['document:click', ['$event']]
534
+ }], fileInput: [{
535
+ type: ViewChild,
536
+ args: ['fileInput']
537
+ }] } });
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW11bHRpdGFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1tdWx0aXRhc2svYWRkLW11bHRpdGFzay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1tdWx0aXRhc2svYWRkLW11bHRpdGFzay5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUEwQixXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNNUYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDZCQUE2QixFQUFFLGtDQUFrQyxFQUFFLHVCQUF1QixFQUFFLDZCQUE2QixFQUFFLDhCQUE4QixFQUFFLHdDQUF3QyxFQUFFLHNDQUFzQyxFQUFFLCtCQUErQixFQUFFLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdFosT0FBTyxFQUFFLE9BQU8sRUFBOEMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRGLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUNuQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7Ozs7QUFFbEUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU9sQixNQUFNLE9BQU8scUJBQXFC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QUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1FBQ2x0QixFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFF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QVcsQ0FBQyxLQUFVO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFDRCxXQUFXO1FBRVQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO3dHQXZnQlUscUJBQXFCOzRGQUFyQixxQkFBcUIsdWNDdEJsQyw4OXBEQXFzQk07OzRGRC9xQk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjsrUUFNcEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkEwQkcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFvVk4sYUFBYTtzQkFEWixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9JbEIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCwgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEFuc3dlciwgQW5zd2VyRm9ybSwgQW5zd2VyVHlwZSwgSGVhZGVyRmlsdGVyLCBJVGFzaywgUXVlc3Rpb24sIFF1ZXN0aW9uRm9ybSwgU2VjdGlvbiwgU2VjdGlvbkZvcm0sIFRhc2tGb3JtLCBWYWxpZGF0aW9uVHlwZSB9IGZyb20gJy4vY3JlYXRlLXRhc2suaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgZGF0ZV9xdWVzdGlvbl90ZW1wbGF0ZSwgZGVzY3JpcHRpdmVfcXVlc3Rpb25fdGVtcGxhdGUsIGRlc2NyaXB0aXZlSW1hZ2VfcXVlc3Rpb25fdGVtcGxhdGUsIGltYWdlX3F1ZXN0aW9uX3RlbXBsYXRlLCBsaW5lYXJzY2FsZV9xdWVzdGlvbl90ZW1wbGF0ZSwgbXVsdGlwbGVjaG9pY2VfYW5zd2VyX3RlbXBsYXRlLCBtdWx0aXBsZWNob2ljZW11bHRpcGxlX3F1ZXN0aW9uX3RlbXBsYXRlLCBtdWx0aXBsZWNob2ljZXNpbmdsZV9xdWVzdGlvbl90ZW1wbGF0ZSwgbXVsdGlwbGVJbWFnZV9xdWVzdGlvbl90ZW1wbGF0ZSwgdGltZV9xdWVzdGlvbl90ZW1wbGF0ZSwgdmlkZW9fcXVlc3Rpb25fdGVtcGxhdGUsIHllc29ybm9fcXVlc3Rpb25fdGVtcGxhdGUgfSBmcm9tICcuL2NyZWF0ZS10YXNrLmRhdGEnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCB1dGMgZnJvbSAnZGF5anMvcGx1Z2luL3V0Yyc7XHJcbmltcG9ydCB7IG5vV2hpdGVzcGFjZVZhbGlkYXRvciB9IGZyb20gJy4vd2hpdGVzcGFjZS12YWxpZGF0b3InO1xyXG5pbXBvcnQgeyB1bmlxdWVTdHJpbmdWYWxpZGF0b3IgfSBmcm9tICcuL3VuaXF1ZS1zdHJpbmctdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgVGltZVBlcmlvZCB9IGZyb20gJ25neC1kYXRlcmFuZ2VwaWNrZXItbWF0ZXJpYWwvZGF0ZXJhbmdlcGlja2VyLmNvbXBvbmVudCc7XHJcbmRheWpzLmV4dGVuZCh1dGMpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLW11bHRpdGFzaycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1tdWx0aXRhc2suY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hZGQtbXVsdGl0YXNrLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkTXVsdGl0YXNrQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICB0YXNrRm9ybTogRm9ybUdyb3VwPFRhc2tGb3JtPjtcclxuICBASW5wdXQoKSB0eXBlOiBhbnlcclxuICBASW5wdXQoKSBzb3VyY2VDaGVja0xpc3RfaWQ6IGFueVxyXG4gIEBJbnB1dCgpIGZpbHRlcnR5cGU6IGFueVxyXG4gIEBJbnB1dCgpIHNob3djb21tZW50OiBhbnlcclxuICBASW5wdXQoKSBleGNlbERhdGE6IGFueVxyXG4gIGN1cnJlbnRJbmRleDogbnVtYmVyID0gMDtcclxuICBpbnRlcnZhbElkOiBhbnk7XHJcbiAgYWxsb3dlZFN0b3JlTG9jYXRpb246IGJvb2xlYW4gPSBmYWxzZVxyXG4gIHJlc3RyaWN0QXR0ZW5kYW5jZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgc3VibWl0dGVkOiBib29sZWFuID0gZmFsc2VcclxuICBoZWFkZXJEYXRhOiBIZWFkZXJGaWx0ZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIGFuc3dlclR5cGVzOiB7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBBbnN3ZXJUeXBlIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6ICdEZXNjcmlwdGl2ZSBBbnN3ZXInLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlJyB9LFxyXG4gICAgeyBsYWJlbDogJ0EvQiBRdWVzdGlvbicsIHZhbHVlOiAneWVzL25vJyB9LFxyXG4gICAgeyBsYWJlbDogJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbiAtIFNpbmdsZSBBbnN3ZXInLCB2YWx1ZTogJ211bHRpcGxlY2hvaWNlc2luZ2xlJyB9LFxyXG4gICAgeyBsYWJlbDogJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbiAtIE11bHRpcGxlIEFuc3dlcicsIHZhbHVlOiAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZScgfSxcclxuICAgIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlIHdpdGggRGVzY3JpcHRpb24nLCB2YWx1ZTogJ2Rlc2NyaXB0aXZlSW1hZ2UnIH0sXHJcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZSBJbWFnZSBhcyBhbnN3ZXInLCB2YWx1ZTogJ2ltYWdlJyB9LFxyXG4gICAgeyBsYWJlbDogJ0NhcHR1cmUgdmlkZW8gYXMgYW5zd2VyJywgdmFsdWU6ICd2aWRlbycgfSxcclxuICAgIHsgbGFiZWw6ICdDYXB0dXJlIE11bHRpcGxlIEltYWdlJywgdmFsdWU6ICdtdWx0aXBsZUltYWdlJyB9LFxyXG4gICAgeyBsYWJlbDogJ0RhdGUgLSBERC9NTS9ZWVlZJywgdmFsdWU6ICdkYXRlJyB9LFxyXG4gICAgeyBsYWJlbDogJ0xpbmVhciBTY2FsZScsIHZhbHVlOiAnbGluZWFyc2NhbGUnIH0sXHJcbiAgICB7IGxhYmVsOiAnVGltZScsIHZhbHVlOiAndGltZScgfV1cclxuICB2YWxpZGF0aW9uVHlwZXM6IHsgbGFiZWw6IHN0cmluZywgdmFsdWU6IFZhbGlkYXRpb25UeXBlIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6ICdDYXB0dXJlIEltYWdlJywgdmFsdWU6ICdDYXB0dXJlIEltYWdlJyB9LFxyXG4gICAgeyBsYWJlbDogJ0Rlc2NyaXB0aXZlIEFuc3dlcicsIHZhbHVlOiAnRGVzY3JpcHRpdmUgQW5zd2VyJyB9LFxyXG4gICAgeyBsYWJlbDogJ0NhcHR1cmUgVmlkZW8nLCB2YWx1ZTogJ0NhcHR1cmUgVmlkZW8nIH1dXHJcbiAgZW52aXJvbm1lbnQ6IGFueTtcclxuICB0YXNrQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgQElucHV0KCkgcGF5bG9hZDogYW55XHJcbiAgQElucHV0KCkgdGFza0RldGFpbHM6IGFueVxyXG4gIEBJbnB1dCgpIGNoZWNrbGlzdEluZm86IGFueVxyXG5cclxuICBjbGllbnRJZDogYW55XHJcbiAgdGltZURldGFpbHM6IGFueSA9IFt7IGlkOiAnMDA6MDAnLCB0ZXh0OiBcIjAwOjAwXCIgfSwgeyBpZDogJzAwOjMwJywgdGV4dDogXCIwMDozMFwiIH0sIHsgaWQ6ICcwMTowMCcsIHRleHQ6IFwiMDE6MDBcIiB9LCB7IGlkOiAnMDE6MzAnLCB0ZXh0OiBcIjAxOjMwXCIgfSwgeyBpZDogJzAyOjAwJywgdGV4dDogXCIwMjowMFwiIH0sIHsgaWQ6ICcwMjozMCcsIHRleHQ6IFwiMDI6MzBcIiB9LCB7IGlkOiAnMDM6MDAnLCB0ZXh0OiBcIjAzOjAwXCIgfSwgeyBpZDogJzAzOjMwJywgdGV4dDogXCIwMzozMFwiIH0sIHsgaWQ6ICcwNDowMCcsIHRleHQ6IFwiMDQ6MDBcIiB9LCB7IGlkOiAnMDQ6MzAnLCB0ZXh0OiBcIjA0OjMwXCIgfSwgeyBpZDogJzA1OjAwJywgdGV4dDogXCIwNTowMFwiIH0sIHsgaWQ6ICcwNTozMCcsIHRleHQ6IFwiMDU6MzBcIiB9LCB7IGlkOiAnMDY6MDAnLCB0ZXh0OiBcIjA2OjAwXCIgfSwgeyBpZDogJzA2OjMwJywgdGV4dDogXCIwNjozMFwiIH0sIHsgaWQ6ICcwNzowMCcsIHRleHQ6IFwiMDc6MDBcIiB9LCB7IGlkOiAnMDc6MzAnLCB0ZXh0OiBcIjA3OjMwXCIgfSwgeyBpZDogJzA4OjAwJywgdGV4dDogXCIwODowMFwiIH0sIHsgaWQ6ICcwODozMCcsIHRleHQ6IFwiMDg6MzBcIiB9LCB7IGlkOiAnMDk6MDAnLCB0ZXh0OiBcIjA5OjAwXCIgfSwgeyBpZDogJzA5OjMwJywgdGV4dDogXCIwOTozMFwiIH0sIHsgaWQ6ICcxMDowMCcsIHRleHQ6IFwiMTA6MDBcIiB9LCB7IGlkOiAnMTA6MzAnLCB0ZXh0OiBcIjEwOjMwXCIgfSxcclxuICB7IGlkOiAnMTE6MDAnLCB0ZXh0OiBcIjExOjAwXCIgfSwgeyBpZDogJzExOjMwJywgdGV4dDogXCIxMTozMFwiIH0sIHsgaWQ6ICcxMjowMCcsIHRleHQ6IFwiMTI6MDBcIiB9LCB7IGlkOiAnMTI6MzAnLCB0ZXh0OiBcIjEyOjMwXCIgfSwgeyBpZDogJzEzOjAwJywgdGV4dDogXCIxMzowMFwiIH0sIHsgaWQ6ICcxMzozMCcsIHRleHQ6IFwiMTM6MzBcIiB9LCB7IGlkOiAnMTQ6MDAnLCB0ZXh0OiBcIjE0OjAwXCIgfSwgeyBpZDogJzE0OjMwJywgdGV4dDogXCIxNDozMFwiIH0sIHsgaWQ6ICcxNTowMCcsIHRleHQ6IFwiMTU6MDBcIiB9LCB7IGlkOiAnMTU6MzAnLCB0ZXh0OiBcIjE1OjMwXCIgfSwgeyBpZDogJzE2OjAwJywgdGV4dDogXCIxNjowMFwiIH0sIHsgaWQ6ICcxNjozMCcsIHRleHQ6IFwiMTY6MzBcIiB9LCB7IGlkOiAnMTc6MDAnLCB0ZXh0OiBcIjE3OjAwXCIgfSwgeyBpZDogJzE3OjMwJywgdGV4dDogXCIxNzozMFwiIH0sIHsgaWQ6ICcxODowMCcsIHRleHQ6IFwiMTg6MDBcIiB9LCB7IGlkOiAnMTg6MzAnLCB0ZXh0OiBcIjE4OjMwXCIgfSwgeyBpZDogJzE5OjAwJywgdGV4dDogXCIxOTowMFwiIH0sIHsgaWQ6ICcxOTozMCcsIHRleHQ6IFwiMTk6MzBcIiB9LCB7IGlkOiAnMjA6MDAnLCB0ZXh0OiBcIjIwOjAwXCIgfSwgeyBpZDogJzIwOjMwJywgdGV4dDogXCIyMDozMFwiIH0sIHsgaWQ6ICcyMTowMCcsIHRleHQ6IFwiMjE6MDBcIiB9LCB7IGlkOiAnMjE6MzAnLCB0ZXh0OiBcIjIxOjMwXCIgfSwgeyBpZDogJzIyOjAwJywgdGV4dDogXCIyMjowMFwiIH0sIHsgaWQ6ICcyMjozMCcsIHRleHQ6IFwiMjI6MzBcIiB9LCB7IGlkOiAnMjM6MDAnLCB0ZXh0OiBcIjIzOjAwXCIgfSwgeyBpZDogJzIzOjMwJywgdGV4dDogXCIyMzozMFwiIH0sIHsgaWQ6ICcyNDowMCcsIHRleHQ6IFwiMjQ6MDBcIiB9XHJcbiAgXVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLCBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgdGhpcy5oZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMucGF5bG9hZClcclxuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZW52KSA9PiB7XHJcbiAgICAgIGlmIChlbnYpIHtcclxuICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gZW52XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBpZiAodGhpcy5oZWFkZXJEYXRhPy5jbGllbnQpIHtcclxuICAgICAgdGhpcy5jbGllbnRJZCA9IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgdXNlcmluZm8gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlci1pbmZvXCIpIHx8IFwiXCIpXHJcbiAgICAgIGlmICh1c2VyaW5mbyAmJiB1c2VyaW5mbz8uY2xpZW50SWQpIHtcclxuICAgICAgICB0aGlzLmNsaWVudElkID0gdXNlcmluZm8/LmNsaWVudElkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUuc3RhcnREYXRlID0gdGhpcy5kYXlqcygpLnV0YygpLmZvcm1hdChcIkRELU1NLVlZWVlcIik7XHJcbiAgICB0aGlzLnVwZGF0ZUN1cnJlbnRUaW1lKClcclxuICB9XHJcbiAgdGFza3M6IG51bWJlcltdID0gWzFdOyAvLyBMaXN0IG9mIHRhc2sgSURzXHJcbiAgdGFza0NvdW50ZXI6IG51bWJlciA9IDE7IC8vIENvdW50ZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIHRhc2sgSURzXHJcblxyXG5cclxuICB1cGRhdGVGb3JtKCkge1xyXG4gICAgdGhpcy50YXNrRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgY2hlY2tsaXN0TmFtZTogdGhpcy50YXNrRGV0YWlscz8uY2hlY2tMaXN0TmFtZSA/PyAnJyxcclxuICAgICAgY2hlY2tsaXN0RGVzY3JpcHRpb246IHRoaXMudGFza0RldGFpbHM/LmNoZWNrTGlzdERlc2NyaXB0aW9uID8/ICcnLFxyXG4gICAgfSlcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YXNrRGV0YWlscz8uc2VjdGlvbnM/Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuYWRkU2VjdGlvbkZvcm0odGhpcy50YXNrRGV0YWlscy5zZWN0aW9uc1tpXSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMudGFza0RldGFpbHMuc2VjdGlvbnNbaV0/LnF1ZXN0aW9ucz8ubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICB0aGlzLmFkZFF1ZXN0aW9uRm9ybSh0aGlzLnRhc2tEZXRhaWxzLnNlY3Rpb25zW2ldPy5xdWVzdGlvbnNbal0sIGkpO1xyXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy50YXNrRGV0YWlscy5zZWN0aW9uc1tpXT8ucXVlc3Rpb25zW2pdPy5hbnN3ZXJzPy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgdGhpcy5hZGRBbnN3ZXJGb3JtKHRoaXMudGFza0RldGFpbHMuc2VjdGlvbnNbaV0/LnF1ZXN0aW9uc1tqXT8uYW5zd2Vyc1trXSwgaSwgaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcbiAgcHJldlNsaWRlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4ID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRJbmRleC0tO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmV4dFNsaWRlKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4IDwgdGhpcy5wYXlsb2FkLnJlZkltYWdlLmxlbmd0aCAtIDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50SW5kZXgrKztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9TbGlkZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMucGF5bG9hZC5yZWZJbWFnZS5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBpbmRleDtcclxuICAgIH1cclxuICB9XHJcbiAgY2FuY2VsKCkge1xyXG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnY2xvc2UnKVxyXG4gICAgY29uc3QgdHJpZ2dlckJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN0cmlnZ2VyQnV0dG9uSWQnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIHRyaWdnZXJCdXR0b24/LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25TdWJtaXQoKSB7XHJcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWVcclxuICAgIGxldCByZXNwb25zZTogYW55ID0gdGhpcy50YXNrRm9ybS52YWx1ZS5zZWN0aW9uc1xyXG5cclxuICAgIGNvbnN0IHRpbWUgPSBkYXlqcyh0aGlzLnNlbGVjdGVkSXRlbSwgXCJISDptbVwiKVxyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3JlZG8nKSB7XHJcbiAgICAgIGxldCBpbnB1dCA9IHtcclxuICAgICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgXCJwYXlsb2FkXCI6IHtcclxuICAgICAgICAgIFwiY292ZXJhZ2VcIjogdGhpcy5wYXlsb2FkLmNvdmVyYWdlLFxyXG4gICAgICAgICAgXCJ1c2VyRW1haWxcIjogdGhpcy5wYXlsb2FkLnNlbGVjdGVkVXNlcnMsXHJcbiAgICAgICAgICBcInN0b3JlTmFtZVwiOiB0aGlzLnBheWxvYWQuc2VsZWN0ZWRTdG9yZXMsXHJcbiAgICAgICAgICBcInNlY3Rpb25faWRcIjogdGhpcy5wYXlsb2FkLnNlY3Rpb25JbmZvLnNlY3Rpb25faWQsXHJcbiAgICAgICAgICBcInNlY3Rpb25OYW1lXCI6IHRoaXMucGF5bG9hZC5zZWN0aW9uSW5mby5zZWN0aW9uTmFtZSxcclxuICAgICAgICAgIFwicW5vXCI6IHJlc3BvbnNlWzBdLnF1ZXN0aW9uc1swXS5xbm8sXHJcbiAgICAgICAgICBcImNoZWNrbGlzdERlc2NyaXB0aW9uXCI6IHRoaXMudGFza0Zvcm0udmFsdWUuY2hlY2tsaXN0RGVzY3JpcHRpb24sXHJcbiAgICAgICAgICBcInBhcmVudFF1ZXN0aW9uXCI6IHRoaXMucGF5bG9hZC5pbnB1dERhdGEucGFyZW50UXVlc3Rpb24gPyB0aGlzLnBheWxvYWQuaW5wdXREYXRhLnBhcmVudFF1ZXN0aW9uIDogdGhpcy5wYXlsb2FkLmlucHV0RGF0YS5xbm8sXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcInVwc2VydFwiOiB7XHJcbiAgICAgICAgICBcInJlZG9TdGF0dXNcIjogdHJ1ZSxcclxuICAgICAgICAgIFwicmVkb1wiOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnBheWxvYWQub3BlcmF0aW9udHlwZSA9PSAndGFzaycpIHtcclxuICAgICAgICB0aGlzLnRyYXhTZXJ2aWNlLnJlZG9tdWx0aVRhc2soaW5wdXQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRyYXhTZXJ2aWNlLnJlZG9UYXNrbXVsdGljaGVja2xpc3QoaW5wdXQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBwYXlsb2FkID0ge1xyXG4gICAgICAgIFwiY2hlY2tMaXN0TmFtZVwiOiB0aGlzLnRhc2tGb3JtLnZhbHVlLmNoZWNrbGlzdE5hbWUsXHJcbiAgICAgICAgXCJjaGVja0xpc3REZXNjcmlwdGlvblwiOiB0aGlzLnRhc2tGb3JtLnZhbHVlLmNoZWNrbGlzdERlc2NyaXB0aW9uLFxyXG4gICAgICAgIFwiY2hlY2tMaXN0SWRcIjogdGhpcy5zb3VyY2VDaGVja0xpc3RfaWQsXHJcbiAgICAgICAgXCJzZWN0aW9uSWRcIjogdGhpcy5wYXlsb2FkLnNlY3Rpb25JbmZvLnNlY3Rpb25faWQsXHJcbiAgICAgICAgXCJzZWN0aW9uTmFtZVwiOiB0aGlzLnBheWxvYWQuc2VjdGlvbkluZm8uc2VjdGlvbk5hbWUsXHJcbiAgICAgICAgXCJxbm9cIjogdGhpcy5wYXlsb2FkLmlucHV0RGF0YS5xbm8sXHJcbiAgICAgICAgXCJjb3ZlcmFnZVwiOiB0aGlzLnBheWxvYWQuY292ZXJhZ2UsXHJcbiAgICAgICAgXCJzaG93Y29tbWVudFwiOiB0aGlzLnNob3djb21tZW50LFxyXG4gICAgICAgIFwiZXhjZWxEYXRhXCI6IHRoaXMuZXhjZWxEYXRhLFxyXG4gICAgICAgIFwicGFyZW50UXVlc3Rpb25cIjogdGhpcy5wYXlsb2FkLmlucHV0RGF0YS5wYXJlbnRRdWVzdGlvbiA/IHRoaXMucGF5bG9hZC5pbnB1dERhdGEucGFyZW50UXVlc3Rpb24gOiB0aGlzLnBheWxvYWQuaW5wdXREYXRhLnFubyxcclxuICAgICAgICBcInF1ZXN0aW9uXCI6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgXCJxbm9cIjogMSxcclxuICAgICAgICAgICAgXCJxbmFtZVwiOiB0aGlzLnBheWxvYWQuaW5wdXREYXRhLnFuYW1lLFxyXG4gICAgICAgICAgICBcInFjb21tZW50XCI6IHRoaXMudGFza0Zvcm0udmFsdWUuY2hlY2tsaXN0RGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIFwiYW5zd2VyVHlwZVwiOiByZXNwb25zZVswXS5xdWVzdGlvbnNbMF0uYW5zd2VyVHlwZSxcclxuICAgICAgICAgICAgXCJydW5BSVwiOiBmYWxzZSxcclxuICAgICAgICAgICAgXCJydW5BSURlc2NyaXB0aW9uXCI6IFwiXCIsXHJcbiAgICAgICAgICAgIFwiYWxsb3dVcGxvYWRmcm9tR2FsbGVyeVwiOiByZXNwb25zZVswXS5xdWVzdGlvbnNbMF0uYWxsb3dVcGxvYWRmcm9tR2FsbGVyeSxcclxuICAgICAgICAgICAgXCJsaW5rVHlwZVwiOiBmYWxzZSxcclxuICAgICAgICAgICAgXCJxdWVzdGlvblJlZmVyZW5jZUltYWdlXCI6IHRoaXMudXBsb2FkZWRGaWxlcyAmJiB0aGlzLnVwbG9hZGVkRmlsZXMubGVuZ3RoID4gMCA/IHRoaXMudXBsb2FkZWRGaWxlcyA6IHJlc3BvbnNlWzBdLnF1ZXN0aW9uc1swXS5xdWVzdGlvblJlZmVyZW5jZUltYWdlLFxyXG4gICAgICAgICAgICBcImRlc2NyaXB0aXZldHlwZVwiOiByZXNwb25zZVswXS5xdWVzdGlvbnNbMF0uZGVzY3JpcHRpdmV0eXBlLFxyXG4gICAgICAgICAgICBcImFuc3dlcnNcIjogcmVzcG9uc2VbMF0ucXVlc3Rpb25zWzBdLmFuc3dlcnNcclxuICAgICAgICAgIH1cclxuICAgICAgICBdLFxyXG4gICAgICAgIFwic2NoZWR1bGVEYXRlXCI6IGRheWpzKHRoaXMuc2VsZWN0ZWREYXRlLnN0YXJ0RGF0ZSwgXCJERC1NTS1ZWVlZXCIpLmZvcm1hdChcIllZWVktTU0tRERcIiksXHJcbiAgICAgICAgXCJzY2hlZHVsZUVuZFRpbWVcIjogdGltZS5mb3JtYXQoXCJoaDptbSBBXCIpLFxyXG4gICAgICAgIFwidXNlckVtYWlsXCI6IHRoaXMucGF5bG9hZC5zZWxlY3RlZFVzZXJzLFxyXG4gICAgICAgIFwic3RvcmVOYW1lXCI6IHRoaXMucGF5bG9hZC5zZWxlY3RlZFN0b3JlcyxcclxuICAgICAgICBcImNsaWVudElkXCI6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgXCJhbGxvd2VkU3RvcmVMb2NhdGlvblwiOiB0aGlzLmFsbG93ZWRTdG9yZUxvY2F0aW9uLFxyXG4gICAgICAgIFwicmVzdHJpY3RBdHRlbmRhbmNlXCI6IHRoaXMucmVzdHJpY3RBdHRlbmRhbmNlLFxyXG4gICAgICAgIFwiY2hlY2tMaXN0VHlwZVwiOiBcImNoZWNrbGlzdFRhc2tcIiAgLy8gWydjaGVja2xpc3RUYXNrJywnY2N0dl1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJlc3BvbnNlWzBdLnF1ZXN0aW9uc1swXS5hbnN3ZXJUeXBlID09PSAnaW1hZ2UnIHx8IHJlc3BvbnNlWzBdLnF1ZXN0aW9uc1swXS5hbnN3ZXJUeXBlID09PSAnZGVzY3JpcHRpdmVJbWFnZScgfHwgcmVzcG9uc2VbMF0ucXVlc3Rpb25zWzBdLmFuc3dlclR5cGUgPT09ICdtdWx0aXBsZUltYWdlJykge1xyXG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZXMgJiYgdGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHBheWxvYWQucXVlc3Rpb24uZm9yRWFjaCgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGE/LmFuc3dlcnMuZm9yRWFjaCgoYW5zOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBhbnMucmVmZXJlbmNlSW1hZ2UgPSB0aGlzLnVwbG9hZGVkRmlsZXNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHBheWxvYWQpXHJcbiAgICAgIC8vIHJldHVyblxyXG4gICAgICB0cnl7XHJcblxyXG4gICAgICAgIHRoaXMudHJheFNlcnZpY2UuQ3JlYXRlY2hlY2tsaXN0TXVsdGlUYXNrKHBheWxvYWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCItLS0tLS0tLS0tLS0tLS0tLS1cIilcclxuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzPy5tZXNzYWdlKVxyXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LCBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZXF1ZXN0IEZhaWxlZDonLCBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiODg4ODhcIixlcnIpXHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVGb3JtKCkge1xyXG4gICAgdGhpcy50YXNrRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBjaGVja2xpc3ROYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBub1doaXRlc3BhY2VWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBjaGVja2xpc3REZXNjcmlwdGlvbjogWycnXSxcclxuICAgICAgc2VjdGlvbnM6IHRoaXMuZmIuYXJyYXk8Rm9ybUdyb3VwPFNlY3Rpb25Gb3JtPj4oW10pXHJcbiAgICB9KVxyXG4gICAgdGhpcy51cGRhdGVGb3JtKClcclxuXHJcbiAgfVxyXG4gIGFkZFNlY3Rpb25Gb3JtKHNlY3Rpb24/OiBTZWN0aW9uKSB7XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbkZvcm1EYXRhOiBGb3JtR3JvdXA8U2VjdGlvbkZvcm0+ID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGlkOiBbc2VjdGlvbj8uaWQgPz8gJyddLFxyXG4gICAgICBuYW1lOiBbc2VjdGlvbj8ubmFtZSA/PyAnJ10sXHJcbiAgICAgIHF1ZXN0aW9uczogdGhpcy5mYi5hcnJheTxGb3JtR3JvdXA8UXVlc3Rpb25Gb3JtPj4oW10pXHJcbiAgICB9KTtcclxuXHJcbiAgICAodGhpcy50YXNrRm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxTZWN0aW9uRm9ybT4+KS5wdXNoKHNlY3Rpb25Gb3JtRGF0YSlcclxuICB9XHJcblxyXG4gIGFkZFF1ZXN0aW9uRm9ybShxdWVzdGlvbjogUXVlc3Rpb24sIHNlY3Rpb25JbmRleDogbnVtYmVyLCBpbnNlcnRJbmRleD86IG51bWJlcikge1xyXG4gICAgY29uc3QgcXVlc3Rpb25Gb3JtRGF0YTogRm9ybUdyb3VwPFF1ZXN0aW9uRm9ybT4gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcW5vOiBbcXVlc3Rpb24/LnFubyA/PyAodGhpcy5nZXRRdWVzdGlvbnMoc2VjdGlvbkluZGV4KT8ubGVuZ3RoID8gdGhpcy5nZXRRdWVzdGlvbnMoc2VjdGlvbkluZGV4KS5sZW5ndGggKyAxIDogMSksIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHFuYW1lOiBbcXVlc3Rpb24/LnFuYW1lID8/ICcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgbm9XaGl0ZXNwYWNlVmFsaWRhdG9yKCldXSxcclxuICAgICAgYW5zd2VyVHlwZTogW3F1ZXN0aW9uPy5hbnN3ZXJUeXBlID8/ICdkZXNjcmlwdGl2ZScsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHJ1bkFJOiBbcXVlc3Rpb24/LnJ1bkFJID8/IGZhbHNlXSxcclxuICAgICAgcnVuQUlEZXNjcmlwdGlvbjogW3F1ZXN0aW9uPy5ydW5BSURlc2NyaXB0aW9uID8/ICcnXSxcclxuICAgICAgYWxsb3dVcGxvYWRmcm9tR2FsbGVyeTogW3F1ZXN0aW9uPy5hbGxvd1VwbG9hZGZyb21HYWxsZXJ5ID8/IGZhbHNlXSxcclxuICAgICAgbGlua1R5cGU6IFtxdWVzdGlvbj8ubGlua1R5cGUgPz8gZmFsc2VdLFxyXG4gICAgICBxdWVzdGlvblJlZmVyZW5jZUltYWdlOiBbWy4uLnF1ZXN0aW9uPy5xdWVzdGlvblJlZmVyZW5jZUltYWdlID8/ICcnXV0sXHJcbiAgICAgIGFuc3dlcnM6IHRoaXMuZmIuYXJyYXk8Rm9ybUdyb3VwPEFuc3dlckZvcm0+PihbXSlcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChxdWVzdGlvbi5hbnN3ZXJUeXBlID09PSAnZGVzY3JpcHRpdmUnIHx8IHF1ZXN0aW9uLmFuc3dlclR5cGUgPT09ICdtdWx0aXBsZUltYWdlJykge1xyXG4gICAgICBxdWVzdGlvbkZvcm1EYXRhLmFkZENvbnRyb2woJ2Rlc2NyaXB0aXZldHlwZScsIG5ldyBGb3JtQ29udHJvbChxdWVzdGlvbj8uZGVzY3JpcHRpdmV0eXBlID8/ICd0ZXh0JykpXHJcbiAgICB9XHJcbiAgICBpZiAocXVlc3Rpb24uYW5zd2VyVHlwZSA9PT0gJ3llcy9ubycgfHwgcXVlc3Rpb24uYW5zd2VyVHlwZSA9PT0gJ211bHRpcGxlY2hvaWNlc2luZ2xlJyB8fCBxdWVzdGlvbi5hbnN3ZXJUeXBlID09PSAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZScpIHtcclxuICAgICAgcXVlc3Rpb25Gb3JtRGF0YS5nZXQoJ2Fuc3dlcnMnKT8uYWRkVmFsaWRhdG9ycyh1bmlxdWVTdHJpbmdWYWxpZGF0b3IoKSlcclxuICAgIH1cclxuICAgIGlmIChpbnNlcnRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICgodGhpcy50YXNrRm9ybS5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxTZWN0aW9uRm9ybT4+KVxyXG4gICAgICAgIC5hdChzZWN0aW9uSW5kZXgpLmdldCgncXVlc3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxRdWVzdGlvbkZvcm0+PikuaW5zZXJ0KGluc2VydEluZGV4LCBxdWVzdGlvbkZvcm1EYXRhKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAoKHRoaXMudGFza0Zvcm0uZ2V0KCdzZWN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8U2VjdGlvbkZvcm0+PilcclxuICAgICAgLmF0KHNlY3Rpb25JbmRleCkuZ2V0KCdxdWVzdGlvbnMnKSBhcyBGb3JtQXJyYXk8Rm9ybUdyb3VwPFF1ZXN0aW9uRm9ybT4+KS5wdXNoKHF1ZXN0aW9uRm9ybURhdGEpXHJcbiAgfVxyXG5cclxuICBhZGRBbnN3ZXJGb3JtKGFuc3dlcjogQW5zd2VyLCBzZWN0aW9uSW5kZXg6IG51bWJlciwgcXVlc3Rpb25JbmRleDogbnVtYmVyLCBpbnNlcnRJbmRleD86IG51bWJlcikge1xyXG4gICAgY29uc3QgYW5zd2VyRm9ybURhdGE6IEZvcm1Hcm91cDxBbnN3ZXJGb3JtPiA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBhbnN3ZXI6IFthbnN3ZXI/LmFuc3dlciA/PyAnJ10sXHJcbiAgICAgIGFuc3dlcm9wdGlvbk51bWJlcjogW2Fuc3dlcj8uYW5zd2Vyb3B0aW9uTnVtYmVyID8/ICh0aGlzLmdldEFuc3dlcnMoc2VjdGlvbkluZGV4LCBxdWVzdGlvbkluZGV4KT8ubGVuZ3RoID8gdGhpcy5nZXRBbnN3ZXJzKHNlY3Rpb25JbmRleCwgcXVlc3Rpb25JbmRleCkubGVuZ3RoICsgMSA6IDEpLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBzb3BGbGFnOiBbYW5zd2VyPy5zb3BGbGFnID8/IGZhbHNlXSxcclxuICAgICAgdmFsaWRhdGlvbjogW2Fuc3dlcj8udmFsaWRhdGlvbiA/PyBmYWxzZV0sXHJcbiAgICAgIHZhbGlkYXRpb25UeXBlOiBbYW5zd2VyPy52YWxpZGF0aW9uVHlwZSA/PyAnJ10sXHJcbiAgICAgIHJlZmVyZW5jZUltYWdlOiBbWy4uLmFuc3dlcj8ucmVmZXJlbmNlSW1hZ2UgPz8gJyddXSxcclxuICAgICAgc2hvd0xpbmtlZDogW2Fuc3dlcj8uc2hvd0xpbmtlZCA/PyBmYWxzZV0sXHJcbiAgICAgIGxpbmtlZFF1ZXN0aW9uOiBbYW5zd2VyPy5saW5rZWRRdWVzdGlvbiA/PyAwXSxcclxuICAgICAgbmVzdGVkUXVlc3Rpb246IFthbnN3ZXI/Lm5lc3RlZFF1ZXN0aW9uID8/IFtdXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGFuc3dlclR5cGU6IEFuc3dlclR5cGUgPSAoKHRoaXMudGFza0Zvcm0/LmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXkpLmF0KHNlY3Rpb25JbmRleCk/LmdldCgncXVlc3Rpb25zJykgYXMgRm9ybUFycmF5KS5hdChxdWVzdGlvbkluZGV4KT8uZ2V0KCdhbnN3ZXJUeXBlJyk/LnZhbHVlO1xyXG5cclxuICAgIGlmIChhbnN3ZXJUeXBlID09PSAnZGVzY3JpcHRpdmUnIHx8IGFuc3dlclR5cGUgPT09ICdkZXNjcmlwdGl2ZUltYWdlJyB8fCBhbnN3ZXJUeXBlID09PSAnaW1hZ2UnIHx8IGFuc3dlclR5cGUgPT09ICdtdWx0aXBsZUltYWdlJyB8fCBhbnN3ZXJUeXBlID09PSAnZGF0ZScgfHwgYW5zd2VyVHlwZSA9PT0gJ2xpbmVhcnNjYWxlJyB8fCBhbnN3ZXJUeXBlID09PSAndGltZScpIHtcclxuICAgICAgYW5zd2VyRm9ybURhdGEuYWRkQ29udHJvbCgndmFsaWRhdGlvbkFuc3dlcicsIG5ldyBGb3JtQ29udHJvbChhbnN3ZXI/LnZhbGlkYXRpb25BbnN3ZXIgPz8gJycpKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChhbnN3ZXJUeXBlID09PSAneWVzL25vJyB8fCBhbnN3ZXJUeXBlID09PSAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnIHx8IGFuc3dlclR5cGUgPT09ICdtdWx0aXBsZWNob2ljZW11bHRpcGxlJykge1xyXG4gICAgICBhbnN3ZXJGb3JtRGF0YS5hZGRDb250cm9sKCdhbGxvd1VwbG9hZGZyb21HYWxsZXJ5JywgbmV3IEZvcm1Db250cm9sKGFuc3dlcj8uYWxsb3dVcGxvYWRmcm9tR2FsbGVyeSA/PyBmYWxzZSkpO1xyXG4gICAgICBhbnN3ZXJGb3JtRGF0YS5hZGRDb250cm9sKCdydW5BSScsIG5ldyBGb3JtQ29udHJvbChhbnN3ZXI/LnJ1bkFJID8/IGZhbHNlKSk7XHJcbiAgICAgIGFuc3dlckZvcm1EYXRhLmdldCgnYW5zd2VyJyk/LmFkZFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIG5vV2hpdGVzcGFjZVZhbGlkYXRvcigpXSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYW5zd2VyVHlwZSA9PT0gJ2xpbmVhcnNjYWxlJykge1xyXG4gICAgICBhbnN3ZXJGb3JtRGF0YS5hZGRDb250cm9sKCdyYW5nZVN0YXJ0JywgbmV3IEZvcm1Db250cm9sKGFuc3dlcj8ucmFuZ2VTdGFydCA/PyAwKSk7XHJcbiAgICAgIGFuc3dlckZvcm1EYXRhLmFkZENvbnRyb2woJ3JhbmdlRW5kJywgbmV3IEZvcm1Db250cm9sKGFuc3dlcj8ucmFuZ2VFbmQgPz8gMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhbnN3ZXJUeXBlID09PSAneWVzL25vJyB8fCBhbnN3ZXJUeXBlID09PSAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnIHx8IGFuc3dlclR5cGUgPT09ICdtdWx0aXBsZWNob2ljZW11bHRpcGxlJyB8fCBhbnN3ZXJUeXBlID09PSAnbXVsdGlwbGVJbWFnZScpIHtcclxuICAgICAgYW5zd2VyRm9ybURhdGEuYWRkQ29udHJvbCgnZGVzY3JpcHRpdmV0eXBlJywgbmV3IEZvcm1Db250cm9sKGFuc3dlcj8uZGVzY3JpcHRpdmV0eXBlID8/ICd0ZXh0JykpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbnNlcnRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICgoKHRoaXMudGFza0Zvcm0uZ2V0KCdzZWN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8U2VjdGlvbkZvcm0+PilcclxuICAgICAgICAuYXQoc2VjdGlvbkluZGV4KS5nZXQoJ3F1ZXN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8UXVlc3Rpb25Gb3JtPj4pXHJcbiAgICAgICAgLmF0KHF1ZXN0aW9uSW5kZXgpLmdldCgnYW5zd2VycycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8QW5zd2VyRm9ybT4+KS5pbnNlcnQoaW5zZXJ0SW5kZXgsIGFuc3dlckZvcm1EYXRhKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICAoKCh0aGlzLnRhc2tGb3JtLmdldCgnc2VjdGlvbnMnKSBhcyBGb3JtQXJyYXk8Rm9ybUdyb3VwPFNlY3Rpb25Gb3JtPj4pXHJcbiAgICAgIC5hdChzZWN0aW9uSW5kZXgpLmdldCgncXVlc3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxRdWVzdGlvbkZvcm0+PilcclxuICAgICAgLmF0KHF1ZXN0aW9uSW5kZXgpLmdldCgnYW5zd2VycycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8QW5zd2VyRm9ybT4+KS5wdXNoKGFuc3dlckZvcm1EYXRhKVxyXG4gIH1cclxuXHJcbiAgZ2V0IGdldFNlY3Rpb25zKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnRhc2tGb3JtPy5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxTZWN0aW9uRm9ybT4+KVxyXG4gIH1cclxuXHJcbiAgZ2V0UXVlc3Rpb25zKHNlY3Rpb25JbmRleDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gKCh0aGlzLnRhc2tGb3JtPy5nZXQoJ3NlY3Rpb25zJykgYXMgRm9ybUFycmF5PEZvcm1Hcm91cDxTZWN0aW9uRm9ybT4+KS5hdChzZWN0aW9uSW5kZXgpPy5nZXQoJ3F1ZXN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8UXVlc3Rpb25Gb3JtPj4pXHJcbiAgfVxyXG4gIGlzSW52YWxpZEFuc3dlcihzZWNJZHg6IG51bWJlciwgcW5JZHg6IG51bWJlcikge1xyXG4gICAgbGV0IGFuc3dlciA9IHRoaXMuZ2V0QW5zd2VycyhzZWNJZHgsIHFuSWR4KTtcclxuICAgIGlmIChhbnN3ZXIudmFsdWUubGVuZ3RoID4gMikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEFuc3dlcnMoc2VjdGlvbkluZGV4OiBudW1iZXIsIHF1ZXN0aW9uSW5kZXg6IG51bWJlcikge1xyXG4gICAgcmV0dXJuICgoKHRoaXMudGFza0Zvcm0uZ2V0KCdzZWN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8U2VjdGlvbkZvcm0+PikuYXQoc2VjdGlvbkluZGV4KS5nZXQoJ3F1ZXN0aW9ucycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8UXVlc3Rpb25Gb3JtPj4pLmF0KHF1ZXN0aW9uSW5kZXgpLmdldCgnYW5zd2VycycpIGFzIEZvcm1BcnJheTxGb3JtR3JvdXA8QW5zd2VyRm9ybT4+KVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkRmlsZShldmVudDogYW55LCBzZWN0aW9uSW5kZXg6IG51bWJlciwgcXVlc3Rpb25JbmRleDogbnVtYmVyLCBhbnN3ZXJJbmRleD86IG51bWJlcikge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5maWxlcyAhPSB1bmRlZmluZWQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICBjb25zdCBmaWxlOiBGaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2NsaWVudElkJywgdGhpcy5jbGllbnRJZCBhcyBzdHJpbmcpXHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UudGFza0ltYWdldXBsb2FkKGZvcm1EYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuZGF0YS5pbWdVcmwpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xyXG4gICAgICAgICAgICB0aGlzLnByZXZpZXdVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChyZXMuZGF0YS5pbWdVcmwpXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1NvbWV0aGluZyB3ZW50IHdyb25nJylcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIHRvZ2dsZWdlb2ZlbmNpbmcoZXZ0OiBhbnkpIHtcclxuICAgIHRoaXMuYWxsb3dlZFN0b3JlTG9jYXRpb24gPSBldnQudGFyZ2V0LmNoZWNrZWQ7XHJcbiAgfVxyXG4gIHRvZ2dsZUF0dGVuZGFuY2UoZXZ0OiBhbnkpIHtcclxuICAgIHRoaXMucmVzdHJpY3RBdHRlbmRhbmNlID0gZXZ0LnRhcmdldC5jaGVja2VkO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgY2xvc2VEcm9wZG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wRG93biA9IGZhbHNlO1xyXG4gIH1cclxuICBvcGVuRHJvcGRvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5kcm9wRG93biA9ICF0aGlzLmRyb3BEb3duO1xyXG5cclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSXRlbTogYW55ID0gJzAwOjAwJztcclxuICBkcm9wRG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGN1cnJlbnRUaW1lOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgdXBkYXRlQ3VycmVudFRpbWUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgbmV4dEhvdXIgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbmV4dEhvdXIuc2V0SG91cnMobm93LmdldEhvdXJzKCkgKyAxKTtcclxuXHJcbiAgICBjb25zdCBob3VycyA9IFN0cmluZyhub3cuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1pbnV0ZXMgPSBTdHJpbmcoTWF0aC5mbG9vcihub3cuZ2V0TWludXRlcygpIC8gMzApICogMzApLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICB0aGlzLmN1cnJlbnRUaW1lID0gYCR7aG91cnN9OiR7bWludXRlc31gO1xyXG5cclxuICAgIGNvbnN0IG5leHRIb3VyU3RyID0gYCR7U3RyaW5nKG5leHRIb3VyLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyl9OjAwYDtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy50aW1lRGV0YWlsc1t0aGlzLnRpbWVEZXRhaWxzLmxlbmd0aCAtIDJdLmlkO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlZCh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zb2xlLmxvZyhkYXlqcyhub3cpLmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBkYXlqcyh0aGlzLnNlbGVjdGVkRGF0ZS5zdGFydERhdGUsIFwiREQtTU0tWVlZWVwiKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpKVxyXG4gICAgaWYgKGRheWpzKG5vdykuZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGRheWpzKHRoaXMuc2VsZWN0ZWREYXRlLnN0YXJ0RGF0ZSwgXCJERC1NTS1ZWVlZXCIpLmZvcm1hdChcIllZWVktTU0tRERcIikpIHtcclxuICAgICAgbm93LnNldEhvdXJzKG5vdy5nZXRIb3VycygpICsgMSk7XHJcbiAgICAgIGNvbnN0IGRpc2FibGVkVGhyZXNob2xkID0gYCR7U3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpfTowMGA7XHJcbiAgICAgIGNvbnNvbGUubG9nKGRpc2FibGVkVGhyZXNob2xkKVxyXG4gICAgICByZXR1cm4gdGltZSA8IGRpc2FibGVkVGhyZXNob2xkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RJdGVtKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdmFsdWU7XHJcbiAgICB0aGlzLmRyb3BEb3duID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBvbkFuc3dlckRlbGV0ZShzZWN0aW9uSW5kZXg6IG51bWJlciwgcXVlc3Rpb25JbmRleDogbnVtYmVyLCBhbnN3ZXJJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmdldEFuc3dlcnMoc2VjdGlvbkluZGV4LCBxdWVzdGlvbkluZGV4KS5yZW1vdmVBdChhbnN3ZXJJbmRleClcclxuICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdCgnQW5zd2VyIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5JylcclxuXHJcbiAgfVxyXG5cclxuICBvblZhbGlkYXRlUmVzcG9uc2VDaGFuZ2UoZXZlbnQ6IGFueSwgc2VjdGlvbkluZGV4OiBudW1iZXIsIHF1ZXN0aW9uSW5kZXg6IG51bWJlciwgYW5zd2VySW5kZXg6IG51bWJlcikge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuZ2V0QW5zd2VycyhzZWN0aW9uSW5kZXgsIHF1ZXN0aW9uSW5kZXgpLmF0KGFuc3dlckluZGV4KS5nZXQoJ3Nob3dMaW5rZWQnKT8uc2V0VmFsdWUoZmFsc2UpXHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZE5ld0Fuc3dlcihzZWN0aW9uSW5kZXg6IG51bWJlciwgcXVlc3Rpb25JbmRleDogbnVtYmVyLCB0eXBlOiBBbnN3ZXJUeXBlKSB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ211bHRpcGxlY2hvaWNlc2luZ2xlJyB8fCB0eXBlID09PSAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZScpIHtcclxuICAgICAgdGhpcy5hZGRBbnN3ZXJGb3JtKG11bHRpcGxlY2hvaWNlX2Fuc3dlcl90ZW1wbGF0ZSBhcyBBbnN3ZXIsIHNlY3Rpb25JbmRleCwgcXVlc3Rpb25JbmRleClcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KCdBbnN3ZXIgYWRkZWQgc3VjY2Vzc2Z1bGx5JylcclxuXHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uUXVlc3Rpb25DaGFuZ2UoZXZlbnQ6IGFueSwgc2VjdGlvbkluZGV4OiBudW1iZXIsIHF1ZXN0aW9uSW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IHF1ZXN0aW9uXHJcbiAgICBjb25zdCBhbnN3ZXJUeXBlOiBBbnN3ZXJUeXBlID0gZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICBzd2l0Y2ggKGFuc3dlclR5cGUpIHtcclxuICAgICAgY2FzZSAnZGVzY3JpcHRpdmUnOiBxdWVzdGlvbiA9IGRlc2NyaXB0aXZlX3F1ZXN0aW9uX3RlbXBsYXRlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3llcy9ubyc6IHF1ZXN0aW9uID0geWVzb3Jub19xdWVzdGlvbl90ZW1wbGF0ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtdWx0aXBsZWNob2ljZXNpbmdsZSc6IHF1ZXN0aW9uID0gbXVsdGlwbGVjaG9pY2VzaW5nbGVfcXVlc3Rpb25fdGVtcGxhdGVcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZSc6IHF1ZXN0aW9uID0gbXVsdGlwbGVjaG9pY2VtdWx0aXBsZV9xdWVzdGlvbl90ZW1wbGF0ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkZXNjcmlwdGl2ZUltYWdlJzogcXVlc3Rpb24gPSBkZXNjcmlwdGl2ZUltYWdlX3F1ZXN0aW9uX3RlbXBsYXRlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2ltYWdlJzogcXVlc3Rpb24gPSBpbWFnZV9xdWVzdGlvbl90ZW1wbGF0ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd2aWRlbyc6IHF1ZXN0aW9uID0gdmlkZW9fcXVlc3Rpb25fdGVtcGxhdGVcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbGVJbWFnZSc6IHF1ZXN0aW9uID0gbXVsdGlwbGVJbWFnZV9xdWVzdGlvbl90ZW1wbGF0ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkYXRlJzogcXVlc3Rpb24gPSBkYXRlX3F1ZXN0aW9uX3RlbXBsYXRlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xpbmVhcnNjYWxlJzogcXVlc3Rpb24gPSBsaW5lYXJzY2FsZV9xdWVzdGlvbl90ZW1wbGF0ZVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICd0aW1lJzogcXVlc3Rpb24gPSB0aW1lX3F1ZXN0aW9uX3RlbXBsYXRlXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6IHF1ZXN0aW9uID0gZGVzY3JpcHRpdmVfcXVlc3Rpb25fdGVtcGxhdGVcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNvbnN0IHF1ZXN0aW9uTmFtZSA9IHRoaXMuZ2V0UXVlc3Rpb25zKHNlY3Rpb25JbmRleCkuYXQocXVlc3Rpb25JbmRleCkuZ2V0KCdxbmFtZScpPy52YWx1ZSB8fCAnJ1xyXG5cclxuICAgIHRoaXMuZ2V0UXVlc3Rpb25zKHNlY3Rpb25JbmRleCkucmVtb3ZlQXQocXVlc3Rpb25JbmRleClcclxuXHJcbiAgICB0aGlzLmFkZFF1ZXN0aW9uRm9ybShxdWVzdGlvbiBhcyBRdWVzdGlvbiwgc2VjdGlvbkluZGV4LCBxdWVzdGlvbkluZGV4KVxyXG5cclxuICAgIHRoaXMuZ2V0UXVlc3Rpb25zKHNlY3Rpb25JbmRleCkuYXQocXVlc3Rpb25JbmRleCkuZ2V0KCdxbmFtZScpPy5zZXRWYWx1ZShxdWVzdGlvbk5hbWUpXHJcblxyXG4gICAgaWYgKHF1ZXN0aW9uPy5hbnN3ZXJzLmxlbmd0aCkge1xyXG4gICAgICBxdWVzdGlvbi5hbnN3ZXJzLmZvckVhY2goKGVsZW1lbnQsIGlkeCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYWRkQW5zd2VyRm9ybShlbGVtZW50IGFzIEFuc3dlciwgc2VjdGlvbkluZGV4LCBxdWVzdGlvbkluZGV4LCBpZHgpXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZWxlY3RlZERhdGU6IGFueSA9IHt9O1xyXG4gIGRheWpzID0gZGF5anM7XHJcbiAgaXNDdXN0b21EYXRlID0gKG06IGRheWpzLkRheWpzKSA9PiB7XHJcbiAgICBjb25zdCBpc1ZhbGlkRGF0ZSA9IG0gPiB0aGlzLmRheWpzKCk7XHJcbiAgICByZXR1cm4gaXNWYWxpZERhdGUgPyAnaW52YWxpZC1kYXRlJyA6IGZhbHNlO1xyXG4gIH1cclxuICBvblN0YXJ0RGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXlqcyhldmVudC5zdGFydERhdGUpLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLmlzQ3VzdG9tRGF0ZSA9IChtOiBkYXlqcy5EYXlqcykgPT4ge1xyXG4gICAgICAgIHJldHVybiBtLmlzQmVmb3JlKHRoaXMuZGF5anMoKSwgJ2RheScpID8gJ2ludmFsaWQtZGF0ZScgOiBmYWxzZTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRhdGVjaGFuZ2UoZXZlbnQ6IFRpbWVQZXJpb2QpIHtcclxuICAgIGlmICghZXZlbnQuZW5kRGF0ZSB8fCAhZXZlbnQuc3RhcnREYXRlKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHVwbG9hZGVkRmlsZXM6IEZpbGVbXSA9IFtdO1xyXG5cclxuXHJcbiAgc2VsZWN0ZWRGaWxlPzogRmlsZTtcclxuICBwcmV2aWV3VXJsPzogYW55O1xyXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHJlbW92ZUltYWdlKGluZGV4OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5wcmV2aWV3VXJsID0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuZmlsZUlucHV0KSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgIH1cclxuICAgIHRoaXMudXBsb2FkZWRGaWxlcy5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJkIGdyb3VwLWRlbGV0ZSBweS0wXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0ndGFzaydcIiBjbGFzcz1cImNhcmQtYm9keSBweS0wIGQtZmxleCBmbGV4LXN0YXJ0IGZsZXgtY29sdW1uIHAtOSBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHB4LTAgcHktNSBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlIGQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjU2XCIgaGVpZ2h0PVwiNTZcIiB2aWV3Qm94PVwiMCAwIDU2IDU2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0RBRjFGRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiOFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0zMCAxOEgyMkMyMS40Njk2IDE4IDIwLjk2MDkgMTguMjEwNyAyMC41ODU4IDE4LjU4NThDMjAuMjEwNyAxOC45NjA5IDIwIDE5LjQ2OTYgMjAgMjBWMzZDMjAgMzYuNTMwNCAyMC4yMTA3IDM3LjAzOTEgMjAuNTg1OCAzNy40MTQyQzIwLjk2MDkgMzcuNzg5MyAyMS40Njk2IDM4IDIyIDM4SDM0QzM0LjUzMDQgMzggMzUuMDM5MSAzNy43ODkzIDM1LjQxNDIgMzcuNDE0MkMzNS43ODkzIDM3LjAzOTEgMzYgMzYuNTMwNCAzNiAzNlYyNE0zMCAxOEwzNiAyNE0zMCAxOFYyNEgzNk0yOCAzNFYyOE0yNSAzMUgzMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1jYXBpdGFsaXplIG14LTMgbXQtNVwiPiB7e3R5cGV9fTwvaDM+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgc2Nyb2xsLXkgdy0xMDAgcC0xICBzY3JvbGwgY3VzdG9tLXNjcm9sbFwiPlxyXG4gICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInRhc2tGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGdldFNlY3Rpb25zPy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJzZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGdldFF1ZXN0aW9ucyhpKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJxdWVzdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdi1yb3cgbWItMyBmdi1wbHVnaW5zLWljb24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNjAwXCI+VGhpcyBUYXNrIGlzIGxpbmtlZCB0byA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PkNoZWNrbGlzdCBOYW1lIDo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PiB7e3BheWxvYWQuY2hlY2tsaXN0TmFtZX19PC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlF1ZXN0aW9uIDo8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gY2xhc3M9XCJ0ZXh0LXdyYXBcIj4ge3txdWVzdGlvbi5nZXQoJ3FubycpPy52YWx1ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3F1ZXN0aW9uLmdldCgncW5hbWUnKT8udmFsdWV9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXQtMyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlN0b3JlcyBTZWxlY3RlZCA6PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e3BheWxvYWQuc2VsZWN0ZWRTdG9yZXMubGVuZ3RofX0gc3RvcmVzPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtbmFtZSBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrIE5hbWU8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbF09XCJ0YXNrRm9ybS5jb250cm9scy5jaGVja2xpc3ROYW1lXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBUYXNrIE5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnYtcGx1Z2lucy1tZXNzYWdlLWNvbnRhaW5lciBmdi1wbHVnaW5zLW1lc3NhZ2UtY29udGFpbmVyLS1lbmFibGVkIGludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIiAqbmdJZj1cInBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0ndmlkZW8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJvdXNlbC1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgcGF5bG9hZC5yZWZJbWFnZTsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e2Vudmlyb25tZW50LlRyYXhBbnN3ZXJDRE59fXt7Z3JvdXB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS10aHVtYiBtYi04IGQtYmxvY2sgdy0xMDAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlIHt7IGkgKyAxIH19XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtcHJldlwiICpuZ0lmPVwiY3VycmVudEluZGV4ID4gMFwiIChjbGljayk9XCJwcmV2U2xpZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYXJvdXNlbC1jb250cm9sLW5leHRcIiAqbmdJZj1cImN1cnJlbnRJbmRleCA8IHBheWxvYWQucmVmSW1hZ2UubGVuZ3RoIC0gMVwiIChjbGljayk9XCJuZXh0U2xpZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkLnJlZkltYWdlLmxlbmd0aCA+IDFcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjYXJvdXNlbC1pbmRpY2F0b3JzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBncm91cCBvZiBwYXlsb2FkLnJlZkltYWdlOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1NsaWRlKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBweC01XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwYXlsb2FkLmlucHV0RGF0YS5hbnN3ZXJUeXBlPT09J2ltYWdlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdkZXNjcmlwdGl2ZUltYWdlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdtdWx0aXBsZUltYWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXJvdXNlbC1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgcGF5bG9hZC5yZWZJbWFnZTsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgIHNyYz1cInt7ZW52aXJvbm1lbnQuVHJheEFuc3dlckNETn19e3tncm91cH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImltYWdlLXRodW1iIG1iLTggZC1ibG9jayB3LTEwMCBjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiSW1hZ2Uge3sgaSArIDEgfX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2Fyb3VzZWwtY29udHJvbC1wcmV2XCIgKm5nSWY9XCJjdXJyZW50SW5kZXggPiAwXCIgKGNsaWNrKT1cInByZXZTbGlkZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Fyb3VzZWwtY29udHJvbC1wcmV2LWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtbmV4dFwiICpuZ0lmPVwiY3VycmVudEluZGV4IDwgcGF5bG9hZC5yZWZJbWFnZS5sZW5ndGggLSAxXCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Fyb3VzZWwtY29udHJvbC1uZXh0LWljb25cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWQucmVmSW1hZ2UubGVuZ3RoID4gMVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNhcm91c2VsLWluZGljYXRvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGdyb3VwIG9mIHBheWxvYWQucmVmSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImkgPT09IGN1cnJlbnRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvU2xpZGUoaSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0nbXVsdGlwbGVjaG9pY2VzaW5nbGUnfHxwYXlsb2FkLmlucHV0RGF0YS5hbnN3ZXJUeXBlPT09J3llcy9ubyd8fHBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0nZGF0ZSd8fHBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0ndGltZScgfHxwYXlsb2FkLmlucHV0RGF0YS5hbnN3ZXJUeXBlPT09J211bHRpcGxlY2hvaWNlbXVsdGlwbGUnfHxwYXlsb2FkLmlucHV0RGF0YS5hbnN3ZXJUeXBlPT09J2xpbmVhcnNjYWxlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdkZXNjcmlwdGl2ZScgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXlsb2FkLmlucHV0RGF0YS51c2VyQW5zd2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm10LTFcIj57e2l0ZW0uYW5zd2VyfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnYtcm93IG1iLTMgZnYtcGx1Z2lucy1pY29uLWNvbnRhaW5lclwiICpuZ0lmPVwic2hvd2NvbW1lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtbmFtZSBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrIENvbW1lbnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIFtmb3JtQ29udHJvbF09XCJ0YXNrRm9ybS5jb250cm9scy5jaGVja2xpc3REZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGEgY29tbWVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiTWFpbiBlbnRyYW5jZSBzaWduYWdlIGlzIGNyYWNrZWQsIGFuZCBsaWdodHMgYXJlIGZsaWNrZXJpbmcuIFBsZWFzZSByZXRha2UgdGhlIGltYWdlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI0XCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ2LXJvdyBtYi0zIGZ2LXBsdWdpbnMtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtbmFtZSBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSBUeXBlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJvblF1ZXN0aW9uQ2hhbmdlKCRldmVudCwgaSwgailcIiBmb3JtQ29udHJvbE5hbWU9XCJhbnN3ZXJUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1zZWxlY3QgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGFuc3dlclR5cGVzXCIgW3ZhbHVlXT1cImFuc3dlci52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YW5zd2VyLmxhYmVsfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdi1yb3cgbWItMyBmdi1wbHVnaW5zLWljb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgIT09J3RpbWUnJiZxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgIT09J2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLW5hbWUxIG15LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuc3dlciBPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cIidxdWVzdGlvbi0nICsgaSArIGpcIiBjbGFzcz1cInF1ZXN0aW9uLWNvbnRhaW5lciBtYi0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXN0aW9uLmdldCgnYW5zd2VyVHlwZScpPy52YWx1ZSA9PT0gJ2Rlc2NyaXB0aXZlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aXZldHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cInJhZGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInRleHRcIiBbaWRdPVwiJ2Rlc2NyaXB0aXZldHlwZV90ZXh0JyArIGkgKyBqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkc2NyaXB0aXZlVHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCInZGVzY3JpcHRpdmV0eXBlX3RleHQnICsgaSArIGpcIj5UZXh0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG1zLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGl2ZXR5cGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJudW1iZXJcIiBbaWRdPVwiJ2Rlc2NyaXB0aXZldHlwZV9udW1iZXInICsgaSArIGpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1cnNvci1wb2ludGVyIGRzY3JpcHRpdmVUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9yXT1cIidkZXNjcmlwdGl2ZXR5cGVfbnVtYmVyJyArIGkgKyBqXCI+TnVtYmVyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXN0aW9uLmdldCgnYW5zd2VyVHlwZScpPy52YWx1ZSA9PT0gJ3llcy9ubydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhbnN3ZXIgb2YgZ2V0QW5zd2VycyhpLCBqKS5jb250cm9sczsgbGV0IGsgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiYW5zd2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJhbnN3ZXJcIiB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgYW5zd2VyIGhlcmVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFuc3dlci5nZXQoJ2Fuc3dlcicpPy5pbnZhbGlkICYmIGFuc3dlci5nZXQoJ2Fuc3dlcicpPy50b3VjaGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYW5zd2VyLmdldCgnYW5zd2VyJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpfHwgYW5zd2VyLmdldCgnYW5zd2VyJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPiogQW5zd2VyIGlzIHJlcXVpcmVkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicXVlc3Rpb24uZ2V0KCdhbnN3ZXJUeXBlJyk/LnZhbHVlID09PSAnbXVsdGlwbGVjaG9pY2VzaW5nbGUnIHx8IHF1ZXN0aW9uLmdldCgnYW5zd2VyVHlwZScpPy52YWx1ZSA9PT0gJ211bHRpcGxlY2hvaWNlbXVsdGlwbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGdldEFuc3dlcnMoaSwgaikuY29udHJvbHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImFuc3dlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYW5zd2VyXCIgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGFuc3dlciBoZXJlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzSW52YWxpZEFuc3dlcihpLGopXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BbnN3ZXJEZWxldGUoaSwgaiwgaylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSBhbnN3ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cImN1c3RvbS10ZXN0XCIgd2lkdGg9XCIyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIF9uZ2NvbnRlbnQtbmctYzE0OTEwNDQxNzA9XCJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNSA1TDUgMTVNNSA1TDE1IDE1XCIgc3Ryb2tlPVwiIzY2NzA4NVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjY2NjY3XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYW5zd2VyLmdldCgnYW5zd2VyJyk/LmludmFsaWQgJiYgYW5zd2VyLmdldCgnYW5zd2VyJyk/LnRvdWNoZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhbnN3ZXIuZ2V0KCdhbnN3ZXInKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJyl8fGFuc3dlci5nZXQoJ2Fuc3dlcicpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj4qIEFuc3dlciBpcyByZXF1aXJlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJhZGROZXdBbnN3ZXIoaSwgaiwgJ211bHRpcGxlY2hvaWNlc2luZ2xlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFkZC1yZWZlcmVuY2UtYnRuIG1iLTUgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIE1vcmUgQW5zd2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgPT09ICdkZXNjcmlwdGl2ZUltYWdlJyB8fCBxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgPT09ICdpbWFnZSdcIj5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhbnN3ZXIgb2YgZ2V0QW5zd2VycyhpLCBqKS5jb250cm9sczsgbGV0IGsgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiYW5zd2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcblxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBwcy0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJxdWVzdGlvbi5jb250cm9scy5hbGxvd1VwbG9hZGZyb21HYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG1lLTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiByb2xlPVwic3dpdGNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidhbGxvd191cGxvYWRfZnJvbV9nYWxsZXJ5JyArIGkgKyBqXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBjaGVjay1sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiJ2FsbG93X3VwbG9hZF9mcm9tX2dhbGxlcnknICsgaSArIGpcIj5BbGxvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWQgZnJvbSBnYWxsZXJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXN0aW9uLmdldCgnYW5zd2VyVHlwZScpPy52YWx1ZSA9PT0gJ3ZpZGVvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBwcy0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT1cImFsbG93VXBsb2FkZnJvbUdhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbWUtM1wiIHR5cGU9XCJjaGVja2JveFwiIHJvbGU9XCJzd2l0Y2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2FsbG93X3VwbG9hZF9mcm9tX2dhbGxlcnknICsgaSArIGpcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIGNoZWNrLWxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCInYWxsb3dfdXBsb2FkX2Zyb21fZ2FsbGVyeScgKyBpICsgalwiPkFsbG93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZCBmcm9tIGdhbGxlcnk8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXN0aW9uLmdldCgnYW5zd2VyVHlwZScpPy52YWx1ZSA9PT0gJ211bHRpcGxlSW1hZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGdldEFuc3dlcnMoaSwgaikuY29udHJvbHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImFuc3dlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggcHMtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicXVlc3Rpb24uY29udHJvbHMuYWxsb3dVcGxvYWRmcm9tR2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCIgcm9sZT1cInN3aXRjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInYWxsb3dfdXBsb2FkX2Zyb21fZ2FsbGVyeScgKyBpICsgalwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgY2hlY2stbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9yXT1cIidhbGxvd191cGxvYWRfZnJvbV9nYWxsZXJ5JyArIGkgKyBqXCI+QWxsb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkIGZyb20gZ2FsbGVyeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5jb250cm9scy5kZXNjcmlwdGl2ZXR5cGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInF1ZXN0aW9uLmNvbnRyb2xzLmRlc2NyaXB0aXZldHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCInZGVzY3JpcHRpdmVfYW5zd2VyX3ZhbGlkYXRpb25fdGV4dCcgKyBpICsgaiArIGtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImN1cnNvci1wb2ludGVyIGRzY3JpcHRpdmVUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9yXT1cIidkZXNjcmlwdGl2ZV9hbnN3ZXJfdmFsaWRhdGlvbl90ZXh0JyArIGkgKyBqICsga1wiPlRleHQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbXMtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInF1ZXN0aW9uLmNvbnRyb2xzLmRlc2NyaXB0aXZldHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIiB2YWx1ZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidkZXNjcmlwdGl2ZV9hbnN3ZXJfdmFsaWRhdGlvbl9udW1iZXInICsgaSArIGogKyBrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkc2NyaXB0aXZlVHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcl09XCInZGVzY3JpcHRpdmVfYW5zd2VyX3ZhbGlkYXRpb25fbnVtYmVyJyArIGkgKyBqICsga1wiPk51bWJlcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgPT09ICdkYXRlJyB8fCBxdWVzdGlvbi5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWUgPT09ICd0aW1lJ1wiPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlc3Rpb24uZ2V0KCdhbnN3ZXJUeXBlJyk/LnZhbHVlID09PSAnbGluZWFyc2NhbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGdldEFuc3dlcnMoaSwgaikuY29udHJvbHM7IGxldCBrID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImFuc3dlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInJhbmdlU3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMiBjaGVjay1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cInJhbmdlRW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zIGZ2LXBsdWdpbnMtaWNvbi1jb250YWluZXIgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLW5hbWUgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVlIGRhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtcy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEzLjMzMzMgMS42NjY2M1Y0Ljk5OTk2TTYuNjY2NjcgMS42NjY2M1Y0Ljk5OTk2TTIuNSA4LjMzMzI5SDE3LjVNNC4xNjY2NyAzLjMzMzI5SDE1LjgzMzNDMTYuNzUzOCAzLjMzMzI5IDE3LjUgNC4wNzk0OCAxNy41IDQuOTk5OTZWMTYuNjY2NkMxNy41IDE3LjU4NzEgMTYuNzUzOCAxOC4zMzMzIDE1LjgzMzMgMTguMzMzM0g0LjE2NjY3QzMuMjQ2MTkgMTguMzMzMyAyLjUgMTcuNTg3MSAyLjUgMTYuNjY2NlY0Ljk5OTk2QzIuNSA0LjA3OTQ4IDMuMjQ2MTkgMy4zMzMyOSA0LjE2NjY3IDMuMzMzMjlaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmeC1kYXRlLXJhbmdlIGZvcm0tY29udHJvbCBwcy0xNFwiIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgbmd4RGF0ZXJhbmdlcGlja2VyTWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW3NpbmdsZURhdGVQaWNrZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2FuY2VsXT1cInRydWVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0RGF0ZUNoYW5nZWQpPVwib25TdGFydERhdGVDaGFuZ2UoJGV2ZW50KVwiIFtpc0N1c3RvbURhdGVdPVwiaXNDdXN0b21EYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cInsgZm9ybWF0OiAnREQtTU0tWVlZWScsIGZpcnN0RGF5OiAxLCBtb250aE5hbWVzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZXNVcGRhdGVkKT1cImRhdGVjaGFuZ2UoJGV2ZW50KVwiIG5hbWU9XCJkYXRlcmFuZ2VcIiBbcmVhZG9ubHldPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1uYW1lIG15LTJcIj5EdWUgdGltZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZSB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9wZW5Ecm9wZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCB3LTEwMCBidG4tb3V0bGluZSBidG4tb3V0bGluZS1kZWZhdWx0IHJvdW5kZWQtMyBtdC0xIHRleHQtbm93cmFwIGJvcmRlci12YWwgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGgtNDVweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuMzMzMyAxLjY2NjVWNC45OTk4NE02LjY2NjY3IDEuNjY2NVY0Ljk5OTg0TTIuNSA4LjMzMzE3SDE3LjVNNC4xNjY2NyAzLjMzMzE3SDE1LjgzMzNDMTYuNzUzOCAzLjMzMzE3IDE3LjUgNC4wNzkzNiAxNy41IDQuOTk5ODRWMTYuNjY2NUMxNy41IDE3LjU4NyAxNi43NTM4IDE4LjMzMzIgMTUuODMzMyAxOC4zMzMySDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMyIDIuNSAxNy41ODcgMi41IDE2LjY2NjVWNC45OTk4NEMyLjUgNC4wNzkzNiAzLjI0NjE5IDMuMzMzMTcgNC4xNjY2NyAzLjMzMzE3WlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBzLTEyXCI+e3sgc2VsZWN0ZWRJdGVtIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcERvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FyZCBweS0xIHctMTAwIHBvc2l0aW9uLWFic29sdXRlIHotMSBoLTIwMHB4IHNjcm9sbC15IHRvcC01MHB4IGVuZC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdGltZURldGFpbHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwic2VsZWN0ZWRJdGVtID09PSBpdGVtLnRleHQgPyAnYWN0aXZlJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FtZXJhIHB4LTUgaXRlbXMgZnctc2VtaWJvbGQgY3Vyc29yLXBvaW50ZXIgcHktMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChpdGVtLnRleHQpXCIgKGNsaWNrKT1cInNlbGVjdEl0ZW0oaXRlbS50ZXh0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS50ZXh0IH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnYtcm93IG1iLTMgZnYtcGx1Z2lucy1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsLW5hbWUgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ24gdG9cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwidGhpcy5jaGVja2xpc3RJbmZvPy5zdWJtaXR0ZWRCeVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJ0eXBlPT09J1RlYW1zJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWRpc2FibGVkLXNlbGVjdCBbaXRlbXNdPVwicGF5bG9hZC5zZWxlY3RlZFVzZXJzXCIgW211bHRpXT1cInRydWVcIiBbc2VhcmNoRmllbGRdPVwiJ3VzZXJOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCIndXNlck5hbWUnXCIgW2Ryb3BEb3duZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwicGF5bG9hZC5zZWxlY3RlZFVzZXJzXCI+PC9saWItZGlzYWJsZWQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJ0eXBlPT09J0NsdXN0ZXJzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGliLWRpc2FibGVkLXNlbGVjdCBbaXRlbXNdPVwicGF5bG9hZC5zZWxlY3RlZFN0b3Jlc1wiIFttdWx0aV09XCJ0cnVlXCIgW3NlYXJjaEZpZWxkXT1cIidzdG9yZU5hbWUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZEZpZWxkXT1cIidzdG9yZU5hbWUnXCIgW2Ryb3BEb3duZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwicGF5bG9hZC5zZWxlY3RlZFN0b3Jlc1wiPjwvbGliLWRpc2FibGVkLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ2LXJvdyBteS0zIGZ2LXBsdWdpbnMtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLWF0dGFjaCBjb2wtbWQtMyBjdXJzb3ItcG9pbnRlclwiICpuZ0lmPVwidGhpcy51cGxvYWRlZEZpbGVzLmxlbmd0aDwzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE3Ljg2NjYgOS4yMDgxTDEwLjIwODIgMTYuODY2NEM5LjI3MDA1IDE3LjgwNDYgNy45OTc1NyAxOC4zMzE3IDYuNjcwNzUgMTguMzMxN0M1LjM0MzkzIDE4LjMzMTcgNC4wNzE0NSAxNy44MDQ2IDMuMTMzMjUgMTYuODY2NEMyLjE5NTA1IDE1LjkyODIgMS42Njc5NyAxNC42NTU4IDEuNjY3OTcgMTMuMzI4OUMxLjY2Nzk3IDEyLjAwMjEgMi4xOTUwNSAxMC43Mjk2IDMuMTMzMjUgOS43OTE0NEwxMC43OTE2IDIuMTMzMUMxMS40MTcxIDEuNTA3NjMgMTIuMjY1NCAxLjE1NjI1IDEzLjE0OTkgMS4xNTYyNUMxNC4wMzQ1IDEuMTU2MjUgMTQuODgyOCAxLjUwNzYzIDE1LjUwODIgMi4xMzMxQzE2LjEzMzcgMi43NTg1NyAxNi40ODUxIDMuNjA2ODkgMTYuNDg1MSA0LjQ5MTQ0QzE2LjQ4NTEgNS4zNzU5OCAxNi4xMzM3IDYuMjI0MyAxNS41MDgyIDYuODQ5NzdMNy44NDE1OCAxNC41MDgxQzcuNTI4ODUgMTQuODIwOCA3LjEwNDY5IDE0Ljk5NjUgNi42NjI0MiAxNC45OTY1QzYuMjIwMTQgMTQuOTk2NSA1Ljc5NTk4IDE0LjgyMDggNS40ODMyNSAxNC41MDgxQzUuMTcwNTEgMTQuMTk1NCA0Ljk5NDgyIDEzLjc3MTIgNC45OTQ4MiAxMy4zMjg5QzQuOTk0ODIgMTIuODg2NyA1LjE3MDUxIDEyLjQ2MjUgNS40ODMyNSAxMi4xNDk4TDEyLjU1ODIgNS4wODMxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTNcIj5BZGQgQXR0YWNobWVudDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIucG5nLCAuanBnLCAuanBlZywgLnN2ZywgLmdpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwbG9hZEZpbGUoJGV2ZW50LDAsMCwwKVwiIGhpZGRlbiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGltYWdlLXByZXZpZXcgbXQtMlwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHVwbG9hZGVkRmlsZXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyZW1vdmUtaWNvblwiIChjbGljayk9XCJyZW1vdmVJbWFnZShpKVwiPuKcljwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW1cIiBhbHQ9XCJQcmV2aWV3XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWItMyBwLTMgYm9yZGVyIHJvdW5kZWQgb3B0aW9uLWJveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZS1vcHRpb24nOiBhbGxvd2VkU3RvcmVMb2NhdGlvbn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBwcy0wIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBteS01IG14LTMgY3Vyc29yLXBvaW50ZXIgcHMtMFwiICB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImZsZXhTd2l0Y2hDaGVja0RlZmF1bHRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsb3dlZFN0b3JlTG9jYXRpb25cIiAoY2hhbmdlKT1cInRvZ2dsZWdlb2ZlbmNpbmcoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy1ib2xkXCIgIGZvcj1cInNhbWVDb21tZW50XCI+ICBHZW8gZmVuY2luZzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIG1lZGl1bSBtdC0xIG1zLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZW5hYmxpbmcsIHRoZSBjaGVja2xpc3QgY2FuIGJlIGZpbGxlZCBieSB0aGUgdXNlciBvbmx5IHdoZW4gaW5zaWRlIHRoZSBzdG9yZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgcC0zIGJvcmRlciByb3VuZGVkIG9wdGlvbi1ib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdhY3RpdmUtb3B0aW9uJzogcmVzdHJpY3RBdHRlbmRhbmNlIH1cIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBwcy0wIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBteS01IG14LTMgZm9ybS1zd2l0Y2ggcHMtMFwiICB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImZsZXhTd2l0Y2hDaGVja0RlZmF1bHRcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicmVzdHJpY3RBdHRlbmRhbmNlXCIgKGNoYW5nZSk9XCJ0b2dnbGVBdHRlbmRhbmNlKCRldmVudClcIj4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctYm9sZFwiIGZvcj1cInNhbWVDb21tZW50XCI+UmVzdHJpY3QgYXR0ZW5kYW5jZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgbWVkaXVtIG10LTEgbXMtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBlbmFibGluZywgdXNlciBjYW4ndCBiZSBhYmxlIHRvIGNsb2Nrb3V0IHdpdGhvdXQgY29tcGxldGluZyB0aGUgdGFzay5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCIgdy0xMDAgbW9kYWwtZm9vdGVyIHB4LTAgcHQtMyBwYi01XCI+XHJcbiAgICAgICAgICAgIDxkaXYgcm9sZT1cImdyb3VwXCIgY2xhc3M9XCJkLWZsZXggbXQtMyB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSB3LTEwMCBtZS0zXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiYWxlcnQtdG9hc3RcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMCBtcy0zXCIgW2Rpc2FibGVkXT1cIiF0aGlzLnRhc2tGb3JtLnZhbGlkfHxzdWJtaXR0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblN1Ym1pdCgpXCI+Q3JlYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgVGFzazwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0ncmVkbydcIiBjbGFzcz1cImNhcmQtYm9keSBweS0wIGQtZmxleCBmbGV4LXN0YXJ0IGZsZXgtY29sdW1uIHAtOSBzY3JvbGwgXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm15LTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlIGQtZmxleCBcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzkgMjAuMDAwMVYyNi4wMDAxTTM5IDI2LjAwMDFIMzNNMzkgMjYuMDAwMUwzNC4zNiAyMS42NDAxQzMzLjI4NTMgMjAuNTY0OCAzMS45NTU2IDE5Ljc3OTMgMzAuNDk1MiAxOS4zNTY4QzI5LjAzNDggMTguOTM0NCAyNy40OTExIDE4Ljg4ODggMjYuMDA4MyAxOS4yMjQzQzI0LjUyNTUgMTkuNTU5OCAyMy4xNTE4IDIwLjI2NTUgMjIuMDE1NSAyMS4yNzU1QzIwLjg3OTEgMjIuMjg1NSAyMC4wMTcyIDIzLjU2NjkgMTkuNTEgMjUuMDAwMU0xNyAzNi4wMDAxVjMwLjAwMDFNMTcgMzAuMDAwMUgyM00xNyAzMC4wMDAxTDIxLjY0IDM0LjM2MDFDMjIuNzE0NyAzNS40MzU0IDI0LjA0NDQgMzYuMjIwOSAyNS41MDQ4IDM2LjY0MzNDMjYuOTY1MiAzNy4wNjU3IDI4LjUwODkgMzcuMTExMyAyOS45OTE3IDM2Ljc3NThDMzEuNDc0NSAzNi40NDAzIDMyLjg0ODIgMzUuNzM0NiAzMy45ODQ1IDM0LjcyNDdDMzUuMTIwOSAzMy43MTQ3IDM1Ljk4MjggMzIuNDMzMyAzNi40OSAzMS4wMDAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWNhcGl0YWxpemUgbXgtMyBtdC0zXCI+IHt7dHlwZX19PC9oMz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdGlvbiBvZiBnZXRTZWN0aW9ucz8uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cInNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGdldFF1ZXN0aW9ucyhpKT8uY29udHJvbHM7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwicXVlc3Rpb25cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHctMTAwIHAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibGFiZWwtbmFtZTEgbXktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxoNSBjbGFzcz1cImxhYmVsLW5hbWUxIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3BheWxvYWQuY2hlY2tsaXN0TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g1PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNjAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3txdWVzdGlvbi5nZXQoJ3FubycpPy52YWx1ZX19LiB7e3F1ZXN0aW9uLmdldCgncW5hbWUnKT8udmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIiAqbmdJZj1cInBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0ndmlkZW8nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGF5bG9hZC5pbnB1dERhdGEudXNlckFuc3dlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtcmVmIG15LTNcIj5VcGxvYWRlZCBWaWRlbzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1pbm5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbC1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIHBheWxvYWQucmVmSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImkgPT09IGN1cnJlbnRJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nRm9yPVwibGV0IHBhaXIgb2YgZ3JvdXBcIiAgY2xhc3M9XCJjb2wtbWQtMTJcIiA+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7e2Vudmlyb25tZW50LlRyYXhBbnN3ZXJDRE59fXt7Z3JvdXB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWFnZS10aHVtYiBtYi04IGQtYmxvY2sgdy0xMDAgY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlIHt7IGkgKyAxIH19XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2Fyb3VzZWwtY29udHJvbC1wcmV2XCIgKm5nSWY9XCJjdXJyZW50SW5kZXggPiAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJldlNsaWRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtcHJldi1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtbmV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50SW5kZXggPCBwYXlsb2FkLnJlZkltYWdlLmxlbmd0aCAtIDFcIiAoY2xpY2spPVwibmV4dFNsaWRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtbmV4dC1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBheWxvYWQucmVmSW1hZ2UubGVuZ3RoID4gMVwiIGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY2Fyb3VzZWwtaW5kaWNhdG9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGdyb3VwIG9mIHBheWxvYWQucmVmSW1hZ2U7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIiAoY2xpY2spPVwiZ29Ub1NsaWRlKGkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwYXlsb2FkLmlucHV0RGF0YS5hbnN3ZXJUeXBlPT09J2ltYWdlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdkZXNjcmlwdGl2ZUltYWdlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdtdWx0aXBsZUltYWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHBheWxvYWQuaW5wdXREYXRhLnVzZXJBbnN3ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLXJlZiBteS0zXCI+VXBsb2FkZWQgSW1hZ2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcm91c2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBncm91cCBvZiBwYXlsb2FkLnJlZkltYWdlOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpID09PSBjdXJyZW50SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0Zvcj1cImxldCBwYWlyIG9mIGdyb3VwXCIgIGNsYXNzPVwiY29sLW1kLTEyXCIgPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3tlbnZpcm9ubWVudC5UcmF4QW5zd2VyQ0ROfX17e2dyb3VwfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1hZ2UtdGh1bWIgbWItOCBkLWJsb2NrIHctMTAwIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJJbWFnZSB7eyBpICsgMSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhcm91c2VsLWNvbnRyb2wtcHJldlwiICpuZ0lmPVwiY3VycmVudEluZGV4ID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByZXZTbGlkZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJvdXNlbC1jb250cm9sLXByZXYtaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYXJvdXNlbC1jb250cm9sLW5leHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudEluZGV4IDwgcGF5bG9hZC5yZWZJbWFnZS5sZW5ndGggLSAxXCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJvdXNlbC1jb250cm9sLW5leHQtaWNvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYXlsb2FkLnJlZkltYWdlLmxlbmd0aCA+IDFcIiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNhcm91c2VsLWluZGljYXRvcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBncm91cCBvZiBwYXlsb2FkLnJlZkltYWdlOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaSA9PT0gY3VycmVudEluZGV4XCIgKGNsaWNrKT1cImdvVG9TbGlkZShpKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHB4LTVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdtdWx0aXBsZWNob2ljZXNpbmdsZSd8fHBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0neWVzL25vJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdtdWx0aXBsZWNob2ljZW11bHRpcGxlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdkYXRlJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSd0aW1lJ3x8cGF5bG9hZC5pbnB1dERhdGEuYW5zd2VyVHlwZT09PSdsaW5lYXJzY2FsZSd8fHBheWxvYWQuaW5wdXREYXRhLmFuc3dlclR5cGU9PT0nZGVzY3JpcHRpdmUnIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwYXlsb2FkLmlucHV0RGF0YS51c2VyQW5zd2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXQtMVwiPnt7aXRlbS5hbnN3ZXJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwidGFza0Zvcm1cIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ2LXJvdyBtYi0zIGZ2LXBsdWdpbnMtaWNvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwtbmFtZSBteS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBDb21tZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBbZm9ybUNvbnRyb2xdPVwidGFza0Zvcm0uY29udHJvbHMuY2hlY2tsaXN0RGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBhIGNvbW1lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cIk1haW4gZW50cmFuY2Ugc2lnbmFnZSBpcyBjcmFja2VkLCBhbmQgbGlnaHRzIGFyZSBmbGlja2VyaW5nLiBQbGVhc2UgcmV0YWtlIHRoZSBpbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiNFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnYtcm93IG1iLTMgZnYtcGx1Z2lucy1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbC1uYW1lIG15LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbiB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cInRoaXMuY2hlY2tsaXN0SW5mbz8uc3VibWl0dGVkQnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIj4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJ0eXBlPT09J1RlYW1zJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1kaXNhYmxlZC1zZWxlY3QgW2l0ZW1zXT1cInBheWxvYWQuc2VsZWN0ZWRVc2Vyc1wiIFttdWx0aV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRmllbGRdPVwiJ3VzZXJOYW1lJ1wiIFtpZEZpZWxkXT1cIid1c2VyTmFtZSdcIiBbZHJvcERvd25kaXNhYmxlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZXNdPVwicGF5bG9hZC5zZWxlY3RlZFVzZXJzXCI+PC9saWItZGlzYWJsZWQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcnR5cGU9PT0nQ2x1c3RlcnMnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWRpc2FibGVkLXNlbGVjdCBbaXRlbXNdPVwicGF5bG9hZC5zZWxlY3RlZFN0b3Jlc1wiIFttdWx0aV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoRmllbGRdPVwiJ3N0b3JlTmFtZSdcIiBbaWRGaWVsZF09XCInc3RvcmVOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3BEb3duZGlzYWJsZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cInBheWxvYWQuc2VsZWN0ZWRTdG9yZXNcIj48L2xpYi1kaXNhYmxlZC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNSB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHJvbGU9XCJncm91cFwiIGNsYXNzPVwiZC1mbGV4IG10LTMgbWItMTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgdy0xMDAgbWUtM1wiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFsZXJ0LXRvYXN0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInN1Ym1pdHRlZFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+U3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19