tango-app-ui-analyse-trax 3.6.1 → 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 (43) 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-multitask/add-multitask.component.mjs +538 -0
  6. package/esm2022/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.mjs +269 -0
  7. package/esm2022/lib/components/add-multitask/create-task.data.mjs +306 -0
  8. package/esm2022/lib/components/add-multitask/create-task.interface.mjs +2 -0
  9. package/esm2022/lib/components/add-multitask/unique-string-validator.mjs +10 -0
  10. package/esm2022/lib/components/add-multitask/whitespace-validator.mjs +10 -0
  11. package/esm2022/lib/components/add-task/add-task.component.mjs +3 -1
  12. package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +3 -3
  13. package/esm2022/lib/components/dashboard/dashboard.component.mjs +3 -3
  14. package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +1 -1
  15. package/esm2022/lib/components/disabled-select/disabled-select.component.mjs +158 -0
  16. package/esm2022/lib/components/flags/flags.component.mjs +1 -1
  17. package/esm2022/lib/components/flags-info/flags-info.component.mjs +1 -1
  18. package/esm2022/lib/components/gallery/gallery.component.mjs +170 -24
  19. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +6 -3
  20. package/esm2022/lib/components/task-configure/task-configure.component.mjs +5 -5
  21. package/esm2022/lib/components/task-info/task-info.component.mjs +1 -1
  22. package/esm2022/lib/services/trax.service.mjs +17 -2
  23. package/esm2022/lib/tango-analyse-trax.module.mjs +12 -5
  24. package/fesm2022/{tango-app-ui-analyse-trax-eye-test-audit.module-BeDM0cg8.mjs → tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs} +7 -7
  25. package/fesm2022/{tango-app-ui-analyse-trax-eye-test-audit.module-BeDM0cg8.mjs.map → tango-app-ui-analyse-trax-eye-test-audit.module-B6bePYMW.mjs.map} +1 -1
  26. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CscGaVfu.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs} +1670 -241
  27. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-IHj5-6FY.mjs.map +1 -0
  28. package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
  29. package/lib/components/activity-log-v2/activity-log-v2.component.d.ts +1 -0
  30. package/lib/components/add-multitask/add-multitask.component.d.ts +95 -0
  31. package/lib/components/add-multitask/bulkcreationmodel/bulkcreationmodel.component.d.ts +42 -0
  32. package/lib/components/add-multitask/create-task.data.d.ts +244 -0
  33. package/lib/components/add-multitask/create-task.interface.d.ts +147 -0
  34. package/lib/components/add-multitask/unique-string-validator.d.ts +2 -0
  35. package/lib/components/add-multitask/whitespace-validator.d.ts +2 -0
  36. package/lib/components/disabled-select/disabled-select.component.d.ts +34 -0
  37. package/lib/components/gallery/gallery.component.d.ts +19 -1
  38. package/lib/components/reactive-select/reactive-select.component.d.ts +2 -2
  39. package/lib/components/task-configure/task-configure.component.d.ts +2 -2
  40. package/lib/services/trax.service.d.ts +5 -1
  41. package/lib/tango-analyse-trax.module.d.ts +11 -8
  42. package/package.json +1 -1
  43. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CscGaVfu.mjs.map +0 -1
@@ -0,0 +1,269 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { AddMultitaskComponent } from '../add-multitask.component';
3
+ import * as XLSX from 'xlsx';
4
+ import { Subject, takeUntil } from "rxjs";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@ng-bootstrap/ng-bootstrap";
7
+ import * as i2 from "../../../services/trax.service";
8
+ import * as i3 from "tango-app-ui-shared";
9
+ import * as i4 from "@angular/common";
10
+ export class BulkcreationmodelComponent {
11
+ modalService;
12
+ activeModal;
13
+ traxService;
14
+ toastService;
15
+ cd;
16
+ selectedOption = 'same';
17
+ payload;
18
+ taskDetails;
19
+ checklistInfo;
20
+ type;
21
+ sourceCheckList_id;
22
+ filtertype;
23
+ headerData;
24
+ excelData = [];
25
+ bulkupload;
26
+ fileInput;
27
+ fileInput1;
28
+ afterValidation;
29
+ excelError;
30
+ destroy$ = new Subject();
31
+ constructor(modalService, activeModal, traxService, toastService, cd) {
32
+ this.modalService = modalService;
33
+ this.activeModal = activeModal;
34
+ this.traxService = traxService;
35
+ this.toastService = toastService;
36
+ this.cd = cd;
37
+ this.headerData = JSON.parse(localStorage.getItem('header-filters'));
38
+ }
39
+ setOption(option) {
40
+ this.selectedOption = option;
41
+ }
42
+ proceed() {
43
+ console.log('Selected Option:', this.selectedOption);
44
+ if (this.selectedOption === 'same') {
45
+ this.taskcreationPopup(true);
46
+ }
47
+ else {
48
+ this.modalService.open(this.bulkupload, {
49
+ centered: true, backdrop: 'static'
50
+ });
51
+ }
52
+ }
53
+ taskcreationPopup(showcomment) {
54
+ const modalRef = this.modalService.open(AddMultitaskComponent, {
55
+ centered: true,
56
+ size: 'lg',
57
+ });
58
+ modalRef.componentInstance.type = this.type;
59
+ modalRef.componentInstance.filtertype = this.filtertype;
60
+ modalRef.componentInstance.taskDetails = this.taskDetails;
61
+ modalRef.componentInstance.sourceCheckList_id = this.sourceCheckList_id;
62
+ modalRef.componentInstance.payload = this.payload;
63
+ modalRef.componentInstance.showcomment = showcomment;
64
+ modalRef.componentInstance.excelData = this.excelData;
65
+ modalRef.result.then((result) => {
66
+ console.log(result);
67
+ if (result == 'submit') {
68
+ this.activeModal.close('submit');
69
+ }
70
+ });
71
+ }
72
+ closeactivepopup() {
73
+ this.activeModal.close('submit');
74
+ }
75
+ validateDetails() {
76
+ console.log(this.headerData?.client);
77
+ let params = {
78
+ assignedData: this.excelData,
79
+ clientId: this.headerData?.client,
80
+ coverage: this.payload.coverage
81
+ };
82
+ this.traxService.taskvalidateUserData(params).pipe(takeUntil(this.destroy$)).subscribe({
83
+ next: (res) => {
84
+ if (res && res?.code == 200) {
85
+ this.taskcreationPopup(false);
86
+ }
87
+ },
88
+ error: (err) => {
89
+ if (err?.error?.error && err?.error?.code == 400) {
90
+ let errorData = err?.error?.error;
91
+ console.log(errorData);
92
+ if (errorData.length) {
93
+ this.modalService.dismissAll();
94
+ const popupcontent = {
95
+ displayprop: false,
96
+ imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
97
+ title: `Invalid details!`,
98
+ content: `Please provide correct and complete store information.`,
99
+ buttontype: 'error',
100
+ error: errorData
101
+ };
102
+ this.afterUplload(popupcontent);
103
+ return;
104
+ }
105
+ }
106
+ }
107
+ });
108
+ }
109
+ Reupload() {
110
+ // this.dialog.dismissAll();
111
+ if (this.fileInput) {
112
+ this.fileInput.nativeElement.value = '';
113
+ }
114
+ if (this.fileInput1) {
115
+ this.fileInput1.nativeElement.value = '';
116
+ }
117
+ let ele = document.getElementById('kt_account_team_size_select_2');
118
+ ele?.click();
119
+ this.cd.detectChanges();
120
+ }
121
+ getStoreCounts(data) {
122
+ if (this.payload.coverage === 'store') {
123
+ const uniqueStoreNames = new Set(data.map((item) => item.storeName));
124
+ return uniqueStoreNames.size;
125
+ }
126
+ else if (this.payload.coverage === 'users') {
127
+ const uniqueUserNames = new Set(data.map((item) => item.userName));
128
+ return uniqueUserNames.size;
129
+ }
130
+ }
131
+ downloadTemplate() {
132
+ console.log(this.payload);
133
+ let excelData = [];
134
+ if (this.payload.selectedStores && this.payload.selectedStores.length > 0) {
135
+ this.payload.selectedStores.forEach((item) => {
136
+ excelData.push({
137
+ checklistName: this.payload.checklistName,
138
+ questionName: this.payload.inputData.qname,
139
+ storeName: item.storeName,
140
+ comments: '',
141
+ });
142
+ });
143
+ }
144
+ else if (this.payload.selectedUsers && this.payload.selectedUsers.length > 0) {
145
+ this.payload.selectedStores.forEach((item) => {
146
+ excelData.push({
147
+ checklistName: this.payload.checklistName,
148
+ questionName: this.payload.inputData.qname,
149
+ userEmail: item.userEmail,
150
+ comments: '',
151
+ });
152
+ });
153
+ }
154
+ this.traxService.exportAsExcelFile(excelData, `Bulk ${this.type}`);
155
+ }
156
+ afterUplload(data) {
157
+ this.excelError = data;
158
+ this.modalService.open(this.afterValidation, { centered: true, backdrop: 'static' });
159
+ }
160
+ onFileUpload(event, type) {
161
+ const target = (event.target);
162
+ let data;
163
+ let error = [];
164
+ let ValidationError = false;
165
+ let isExcelFile = !!target.files[0].name.match(/(.xls|.xlsx)/);
166
+ if (isExcelFile) {
167
+ const reader = new FileReader();
168
+ reader.readAsBinaryString(target.files[0]);
169
+ reader.onload = (e) => {
170
+ const bstr = e.target.result;
171
+ const wb = XLSX.read(bstr, { type: 'binary' });
172
+ const wsname = wb.SheetNames[0];
173
+ const ws = wb.Sheets[wsname];
174
+ data = XLSX.utils.sheet_to_json(ws);
175
+ this.excelData = data;
176
+ if (!data.length || (data.some((item) => 'clusterName' in item || 'teamName' in item))) {
177
+ this.toastService.getErrorToast('Please Upload a Valid file.');
178
+ return;
179
+ }
180
+ // data = data.filter((item: any) => {
181
+ // return ((item?.storeName && item?.storeName.trim() != '' && item?.storeName.trim() != null) || (item?.userName && item?.userName.trim() != '' && item?.userName.trim() != null) || (item?.userEmail && item?.userEmail.trim() != '' && item?.userEmail.trim() != null))
182
+ // })
183
+ data.forEach((element, index) => {
184
+ if (element?.userEmail) {
185
+ element.userEmail = element?.userEmail.replace(/\s/g, '');
186
+ }
187
+ console.log(this.payload.coverage);
188
+ if (this.payload.coverage === 'store') {
189
+ console.log(element.storeName);
190
+ if ((element.storeName && element.storeName.trim() == '') || element.storeName == null) {
191
+ error.push(`Invalid StoreName - C${index + 2}`);
192
+ }
193
+ }
194
+ else if (this.payload.coverage === 'users') {
195
+ if ((element.userEmail && element.userEmail.trim() == '') || element.userEmail == null) {
196
+ error.push(`Invalid userEmail - C${index + 2}`);
197
+ }
198
+ if (element?.userEmail && !element.userEmail.match(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/)) {
199
+ error.push(`Invalid userEmail - C${index + 2}`);
200
+ }
201
+ }
202
+ // if ((element.comments && element.comments.trim() == '') || element.comments == null) {
203
+ // error.push(`Invalid comment - D${index + 2}`)
204
+ // }
205
+ });
206
+ console.log(error.length);
207
+ if (error.length) {
208
+ this.modalService.dismissAll();
209
+ const popupcontent = {
210
+ displayprop: false,
211
+ imagesrc: `<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" fill="none"><rect x="4" y="4" width="48" height="48" rx="24" fill="#FEF0C7"/><path d="M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z" stroke="#DC6803" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><rect x="4" y="4" width="48" height="48" rx="24" stroke="#FFFAEB" stroke-width="8"/></svg>`,
212
+ title: `Invalid details!`,
213
+ content: `Please provide correct and complete store information.`,
214
+ buttontype: 'error',
215
+ error: error
216
+ };
217
+ this.afterUplload(popupcontent);
218
+ return;
219
+ }
220
+ else {
221
+ !ValidationError ? this.afterUplload() : '';
222
+ }
223
+ if (this.fileInput) {
224
+ this.fileInput.nativeElement.value = '';
225
+ }
226
+ if (this.fileInput1) {
227
+ this.fileInput1.nativeElement.value = '';
228
+ }
229
+ };
230
+ }
231
+ else {
232
+ if (this.fileInput) {
233
+ this.fileInput.nativeElement.value = '';
234
+ }
235
+ this.toastService.getErrorToast('Please Upload a Excel file.');
236
+ }
237
+ }
238
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BulkcreationmodelComponent, deps: [{ token: i1.NgbModal }, { token: i1.NgbActiveModal }, { token: i2.TraxService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
239
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BulkcreationmodelComponent, selector: "lib-bulkcreationmodel", inputs: { payload: "payload", taskDetails: "taskDetails", checklistInfo: "checklistInfo", type: "type", sourceCheckList_id: "sourceCheckList_id", filtertype: "filtertype" }, viewQueries: [{ propertyName: "bulkupload", first: true, predicate: ["bulkupload"], descendants: true }, { propertyName: "fileInput", first: true, predicate: ["file"], descendants: true }, { propertyName: "fileInput1", first: true, predicate: ["file1"], descendants: true }, { propertyName: "afterValidation", first: true, predicate: ["afterValidation"], descendants: true }], ngImport: i0, template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 mb-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M12 18V12M9 15H15\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'same' }\" (click)=\"setOption('same')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"sameComment\"\r\n [checked]=\"selectedOption === 'same'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"sameComment\">\r\n Create task with same comment\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Apply a single comment to all selected stores. This option is useful when the {{type}} details are identical for\r\n every store.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'different' }\" (click)=\"setOption('different')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"differentComments\"\r\n [checked]=\"selectedOption === 'different'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"differentComments\">\r\n Create {{type}} with different comments <span class=\"text-muted\">(via Excel upload)</span>\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Use an Excel template to assign different comments to each selected store. This allows you to customize the\r\n {{type}} for each location.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal-footer border-top-0\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"proceed()\">Proceed</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\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 </div> <span class=\"config-heading fw-semibold ms-5 w-auto text-capitalize\">{{type}}</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">1. Use the template to upload and create multiple {{type}}s at once.</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">2. Download the template here - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplate()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">3. Add your data to the Template File</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">4. Upload it below for processing</div>\r\n\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'upload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#0d6efd}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
240
+ }
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BulkcreationmodelComponent, decorators: [{
242
+ type: Component,
243
+ args: [{ selector: 'lib-bulkcreationmodel', template: "<div class=\"card group-delete py-0\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 mb-5\">\r\n <div class=\"symbol symbol-75px symbol-circle d-flex \">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path\r\n d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8M14 2L20 8M14 2V8H20M12 18V12M9 15H15\"\r\n stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <h3 class=\"text-capitalize mx-3\"> {{type}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"form-check mb-3 p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'same' }\" (click)=\"setOption('same')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"sameComment\"\r\n [checked]=\"selectedOption === 'same'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"sameComment\">\r\n Create task with same comment\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Apply a single comment to all selected stores. This option is useful when the {{type}} details are identical for\r\n every store.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-check p-3 border rounded option-box\"\r\n [ngClass]=\"{ 'active-option': selectedOption === 'different' }\" (click)=\"setOption('different')\">\r\n <input class=\"form-check-input my-5 mx-3\" type=\"radio\" name=\"taskOption\" id=\"differentComments\"\r\n [checked]=\"selectedOption === 'different'\">\r\n <div class=\"mx-3\">\r\n <label class=\"form-check-label fw-semibold\" for=\"differentComments\">\r\n Create {{type}} with different comments <span class=\"text-muted\">(via Excel upload)</span>\r\n </label>\r\n <div class=\"text-muted small mt-1 ms-10\">\r\n Use an Excel template to assign different comments to each selected store. This allows you to customize the\r\n {{type}} for each location.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"modal-footer border-top-0\">\r\n <button type=\"button\" class=\"btn btn-outline-secondary\" data-bs-dismiss=\"modal\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"proceed()\">Proceed</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<ng-template #bulkupload let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-5\">\r\n <div class=\"card-title mt-3\">\r\n <div class=\"bg-light-primary rounded-5 w-40px h-40px d-flex justify-content-center align-items-center\">\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 </div> <span class=\"config-heading fw-semibold ms-5 w-auto text-capitalize\">{{type}}</span>\r\n </div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"flex-column\">\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">1. Use the template to upload and create multiple {{type}}s at once.</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">2. Download the template here - <a class=\"text-decoration-underline cursor-pointer\" (click)=\"downloadTemplate()\">Download the template here</a></div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">3. Add your data to the Template File</div>\r\n <div class=\"storeAssign mt-3\" style=\"font-weight: 400\">4. Upload it below for processing</div>\r\n\r\n \r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"model.close()\">Cancel</button>\r\n <button class=\"btn btn-md py-3 btn-default ms-3 btn-primary\" (click)=\"file1.click()\">Upload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'upload')\" />\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #afterValidation let-model>\r\n <div class=\"card border-0\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{getStoreCounts(excelData)}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total <span *ngIf=\"this.payload.coverage==='store'\">Stores</span> <span *ngIf=\"this.payload.coverage==='users'\">Users</span></div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0 text-end pt-0\">\r\n <button class=\"btn btn-md btn-default btn-outline\" (click)=\"closeactivepopup()\">Cancel</button>\r\n <button *ngIf=\"!excelError\" class=\"btn btn-md py-4 btn-default ms-3 btn-primary\" (click)=\"validateDetails()\">Proceed</button>\r\n <button *ngIf=\"excelError\" class=\"btn py-3 btn-md btn-default ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n <input style=\"visibility: hidden;\" #file1 type=\"file\" id=\"kt_account_team_size_select_2\"\r\n (change)=\"onFileUpload($event,'reupload')\" />\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".option-box{transition:border-color .3s,background-color .3s;cursor:pointer}.option-box:hover{border-color:#0d6efd}.active-option{border-color:#008edf!important;color:#008edf!important;background-color:#e7f1ff}\n"] }]
244
+ }], ctorParameters: () => [{ type: i1.NgbModal }, { type: i1.NgbActiveModal }, { type: i2.TraxService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { payload: [{
245
+ type: Input
246
+ }], taskDetails: [{
247
+ type: Input
248
+ }], checklistInfo: [{
249
+ type: Input
250
+ }], type: [{
251
+ type: Input
252
+ }], sourceCheckList_id: [{
253
+ type: Input
254
+ }], filtertype: [{
255
+ type: Input
256
+ }], bulkupload: [{
257
+ type: ViewChild,
258
+ args: ['bulkupload']
259
+ }], fileInput: [{
260
+ type: ViewChild,
261
+ args: ['file']
262
+ }], fileInput1: [{
263
+ type: ViewChild,
264
+ args: ['file1']
265
+ }], afterValidation: [{
266
+ type: ViewChild,
267
+ args: ['afterValidation']
268
+ }] } });
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsa2NyZWF0aW9ubW9kZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmF4L3NyYy9saWIvY29tcG9uZW50cy9hZGQtbXVsdGl0YXNrL2J1bGtjcmVhdGlvbm1vZGVsL2J1bGtjcmVhdGlvbm1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYWRkLW11bHRpdGFzay9idWxrY3JlYXRpb25tb2RlbC9idWxrY3JlYXRpb25tb2RlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR25FLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBbUIsT0FBTyxFQUFzQyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQU0vRixNQUFNLE9BQU8sMEJBQTBCO0lBZ0JqQjtJQUFnQztJQUFxQztJQUFrQztJQUFvQztJQWYvSixjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQ2YsT0FBTyxDQUFLO0lBQ1osV0FBVyxDQUFLO0lBQ2hCLGFBQWEsQ0FBSztJQUNsQixJQUFJLENBQUs7SUFDVCxrQkFBa0IsQ0FBSztJQUN2QixVQUFVLENBQUs7SUFDeEIsVUFBVSxDQUFjO0lBQ3hCLFNBQVMsR0FBUSxFQUFFLENBQUE7SUFDTSxVQUFVLENBQU07SUFDdEIsU0FBUyxDQUFjO0lBQ3RCLFVBQVUsQ0FBYztJQUNkLGVBQWUsQ0FBTTtJQUNuRCxVQUFVLENBQU07SUFDaEIsUUFBUSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDekIsWUFBb0IsWUFBc0IsRUFBVSxXQUEyQixFQUFVLFdBQXdCLEVBQVUsWUFBMEIsRUFBVSxFQUFxQjtRQUFoSyxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQWM7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNsTCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBVyxDQUFDLENBQUE7SUFDaEYsQ0FBQztJQUNELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLE1BQU0sRUFBRTtZQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDN0I7YUFBTTtZQUVMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3RDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVE7YUFDbkMsQ0FBQyxDQUFBO1NBR0g7SUFDSCxDQUFDO0lBR0QsaUJBQWlCLENBQUMsV0FBb0I7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDN0QsUUFBUSxFQUFFLElBQUk7WUFDZCxJQUFJLEVBQUUsSUFBSTtTQUVYLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtRQUMzQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUE7UUFDdkQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQ3pELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUE7UUFDdkUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQ2pELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFBO1FBQ3BELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUNyRCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbkIsSUFBSSxNQUFNLElBQUksUUFBUSxFQUFFO2dCQUN0QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELGdCQUFnQjtRQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxlQUFlO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BDLElBQUksTUFBTSxHQUFHO1lBQ1gsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtTQUNoQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNyRixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUU7b0JBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtpQkFDOUI7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFO29CQUNoRCxJQUFJLFNBQVMsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztvQkFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDdEIsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFO3dCQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUMvQixNQUFNLFlBQVksR0FBRzs0QkFDbkIsV0FBVyxFQUFFLEtBQUs7NEJBQ2xCLFFBQVEsRUFBRSwwL0JBQTAvQjs0QkFDcGdDLEtBQUssRUFBRSxrQkFBa0I7NEJBQ3pCLE9BQU8sRUFBRSx3REFBd0Q7NEJBQ2pFLFVBQVUsRUFBRSxPQUFPOzRCQUNuQixLQUFLLEVBQUUsU0FBUzt5QkFDakIsQ0FBQTt3QkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFBO3dCQUMvQixPQUFPO3FCQUNSO2lCQUNGO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQTtJQU1KLENBQUM7SUFDRCxRQUFRO1FBQ04sNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDMUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDbkUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsY0FBYyxDQUFDLElBQVM7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxRSxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQztTQUM5QjthQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzVDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN6QixJQUFJLFNBQVMsR0FBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNoRCxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7b0JBQ3pDLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLO29CQUMxQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFFBQVEsRUFBRSxFQUFFO2lCQUNiLENBQUMsQ0FBQTtZQUNKLENBQUMsQ0FBQyxDQUFBO1NBQ0g7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2hELFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtvQkFDekMsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUs7b0JBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsUUFBUSxFQUFFLEVBQUU7aUJBQ2IsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7U0FFSDtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFckUsQ0FBQztJQUdELFlBQVksQ0FBQyxJQUFVO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFDRCxZQUFZLENBQUMsS0FBVSxFQUFFLElBQVM7UUFDaEMsTUFBTSxNQUFNLEdBQStCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBUyxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksZUFBZSxHQUFZLEtBQUssQ0FBQztRQUNyQyxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9ELElBQUksV0FBVyxFQUFFO1lBQ2YsTUFBTSxNQUFNLEdBQWUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxHQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE1BQU0sR0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLEVBQUUsR0FBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO29CQUMzRixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO29CQUM5RCxPQUFPO2lCQUNSO2dCQUNELHNDQUFzQztnQkFDdEMsNFFBQTRRO2dCQUM1USxLQUFLO2dCQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUU7b0JBQ3hDLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRTt3QkFDdEIsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQzNEO29CQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtvQkFDbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7d0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFOzRCQUN0RixLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTt5QkFDaEQ7cUJBQ0Y7eUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7NEJBQ3RGLEtBQUssQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO3lCQUNoRDt3QkFDRCxJQUFJLE9BQU8sRUFBRSxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxFQUFFOzRCQUNyRyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTt5QkFDaEQ7cUJBQ0Y7b0JBQ0QseUZBQXlGO29CQUN6RixrREFBa0Q7b0JBQ2xELElBQUk7Z0JBQ04sQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3pCLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxZQUFZLEdBQUc7d0JBQ25CLFdBQVcsRUFBRSxLQUFLO3dCQUNsQixRQUFRLEVBQUUsMC9CQUEwL0I7d0JBQ3BnQyxLQUFLLEVBQUUsa0JBQWtCO3dCQUN6QixPQUFPLEVBQUUsd0RBQXdEO3dCQUNqRSxVQUFVLEVBQUUsT0FBTzt3QkFDbkIsS0FBSyxFQUFFLEtBQUs7cUJBQ2IsQ0FBQTtvQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFBO29CQUMvQixPQUFPO2lCQUNSO3FCQUNJO29CQUNILENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDN0M7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2lCQUN6QztnQkFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7aUJBQzFDO1lBQ0gsQ0FBQyxDQUFBO1NBQ0Y7YUFDSTtZQUNILElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUN6QztZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO3dHQXRPVSwwQkFBMEI7NEZBQTFCLDBCQUEwQixvbUJDYnZDLGc0UUFtSWM7OzRGRHRIRCwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UsdUJBQXVCOytMQU14QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFHbUIsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUNKLFNBQVM7c0JBQTNCLFNBQVM7dUJBQUMsTUFBTTtnQkFDRyxVQUFVO3NCQUE3QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1ksZUFBZTtzQkFBNUMsU0FBUzt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nYk1vZGFsLE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBBZGRNdWx0aXRhc2tDb21wb25lbnQgfSBmcm9tICcuLi9hZGQtbXVsdGl0YXNrLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IEhlYWRlckZpbHRlciwgIH0gZnJvbSAnLi4vLi4vdGFzay1jb25maWd1cmUvdGFzay1jb25maWd1cmUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqc1wiO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1idWxrY3JlYXRpb25tb2RlbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1bGtjcmVhdGlvbm1vZGVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYnVsa2NyZWF0aW9ubW9kZWwuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWxrY3JlYXRpb25tb2RlbENvbXBvbmVudCB7XHJcbiAgc2VsZWN0ZWRPcHRpb24gPSAnc2FtZSc7XHJcbiAgQElucHV0KCkgcGF5bG9hZDogYW55XHJcbiAgQElucHV0KCkgdGFza0RldGFpbHM6IGFueVxyXG4gIEBJbnB1dCgpIGNoZWNrbGlzdEluZm86IGFueVxyXG4gIEBJbnB1dCgpIHR5cGU6IGFueVxyXG4gIEBJbnB1dCgpIHNvdXJjZUNoZWNrTGlzdF9pZDogYW55XHJcbiAgQElucHV0KCkgZmlsdGVydHlwZTogYW55XHJcbiAgaGVhZGVyRGF0YTogSGVhZGVyRmlsdGVyXHJcbiAgZXhjZWxEYXRhOiBhbnkgPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ2J1bGt1cGxvYWQnKSBidWxrdXBsb2FkOiBhbnk7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZScpIGZpbGVJbnB1dCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZTEnKSBmaWxlSW5wdXQxITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdhZnRlclZhbGlkYXRpb24nKSBhZnRlclZhbGlkYXRpb246IGFueTtcclxuICBleGNlbEVycm9yOiBhbnk7XHJcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCwgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLCBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5oZWFkZXJEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaGVhZGVyLWZpbHRlcnMnKSBhcyBzdHJpbmcpXHJcbiAgfVxyXG4gIHNldE9wdGlvbihvcHRpb246IHN0cmluZykge1xyXG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IG9wdGlvbjtcclxuICB9XHJcblxyXG4gIHByb2NlZWQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnU2VsZWN0ZWQgT3B0aW9uOicsIHRoaXMuc2VsZWN0ZWRPcHRpb24pO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPcHRpb24gPT09ICdzYW1lJykge1xyXG4gICAgICB0aGlzLnRhc2tjcmVhdGlvblBvcHVwKHRydWUpXHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLmJ1bGt1cGxvYWQsIHtcclxuICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgYmFja2Ryb3A6ICdzdGF0aWMnXHJcbiAgICAgIH0pXHJcblxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB0YXNrY3JlYXRpb25Qb3B1cChzaG93Y29tbWVudDogYm9vbGVhbikge1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFkZE11bHRpdGFza0NvbXBvbmVudCwge1xyXG4gICAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgICAgc2l6ZTogJ2xnJyxcclxuXHJcbiAgICB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR5cGUgPSB0aGlzLnR5cGVcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmZpbHRlcnR5cGUgPSB0aGlzLmZpbHRlcnR5cGVcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRhc2tEZXRhaWxzID0gdGhpcy50YXNrRGV0YWlsc1xyXG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc291cmNlQ2hlY2tMaXN0X2lkID0gdGhpcy5zb3VyY2VDaGVja0xpc3RfaWRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnBheWxvYWQgPSB0aGlzLnBheWxvYWRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNob3djb21tZW50ID0gc2hvd2NvbW1lbnRcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmV4Y2VsRGF0YSA9IHRoaXMuZXhjZWxEYXRhXHJcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgaWYgKHJlc3VsdCA9PSAnc3VibWl0Jykge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICBjbG9zZWFjdGl2ZXBvcHVwKCkge1xyXG4gICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdzdWJtaXQnKTtcclxuICB9XHJcbiAgdmFsaWRhdGVEZXRhaWxzKCkge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWFkZXJEYXRhPy5jbGllbnQpXHJcbiAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICBhc3NpZ25lZERhdGE6IHRoaXMuZXhjZWxEYXRhLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIGNvdmVyYWdlOiB0aGlzLnBheWxvYWQuY292ZXJhZ2VcclxuICAgIH1cclxuICAgIHRoaXMudHJheFNlcnZpY2UudGFza3ZhbGlkYXRlVXNlckRhdGEocGFyYW1zKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXM/LmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRhc2tjcmVhdGlvblBvcHVwKGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChlcnI/LmVycm9yPy5lcnJvciAmJiBlcnI/LmVycm9yPy5jb2RlID09IDQwMCkge1xyXG4gICAgICAgICAgbGV0IGVycm9yRGF0YSA9IGVycj8uZXJyb3I/LmVycm9yO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3JEYXRhKVxyXG4gICAgICAgICAgaWYgKGVycm9yRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgICAgICBjb25zdCBwb3B1cGNvbnRlbnQgPSB7XHJcbiAgICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIGltYWdlc3JjOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCI+PHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBmaWxsPVwiI0ZFRjBDN1wiLz48cGF0aCBkPVwiTTI3Ljk5OTggMjQuMDAxMlYyOC4wMDEyTTI3Ljk5OTggMzIuMDAxMkgyOC4wMDk4TTI2LjI4OTggMTguODYxMkwxNy44MTk4IDMzLjAwMTJDMTcuNjQ1MSAzMy4zMDM2IDE3LjU1MjcgMzMuNjQ2NSAxNy41NTE4IDMzLjk5NTdDMTcuNTUwOCAzNC4zNDQ5IDE3LjY0MTMgMzQuNjg4MyAxNy44MTQyIDM0Ljk5MTdDMTcuOTg3MSAzNS4yOTUxIDE4LjIzNjUgMzUuNTQ3OSAxOC41Mzc1IDM1LjcyNUMxOC44Mzg1IDM1LjkwMjEgMTkuMTgwNiAzNS45OTczIDE5LjUyOTggMzYuMDAxMkgzNi40Njk4QzM2LjgxOSAzNS45OTczIDM3LjE2MTEgMzUuOTAyMSAzNy40NjIxIDM1LjcyNUMzNy43NjMxIDM1LjU0NzkgMzguMDEyNCAzNS4yOTUxIDM4LjE4NTQgMzQuOTkxN0MzOC4zNTgzIDM0LjY4ODMgMzguNDQ4OCAzNC4zNDQ5IDM4LjQ0NzggMzMuOTk1N0MzOC40NDY4IDMzLjY0NjUgMzguMzU0NCAzMy4zMDM2IDM4LjE3OTggMzMuMDAxMkwyOS43MDk4IDE4Ljg2MTJDMjkuNTMxNSAxOC41NjczIDI5LjI4MDUgMTguMzI0MyAyOC45ODEgMTguMTU1N0MyOC42ODE0IDE3Ljk4NyAyOC4zNDM1IDE3Ljg5ODQgMjcuOTk5OCAxNy44OTg0QzI3LjY1NiAxNy44OTg0IDI3LjMxODEgMTcuOTg3IDI3LjAxODYgMTguMTU1N0MyNi43MTkxIDE4LjMyNDMgMjYuNDY4IDE4LjU2NzMgMjYuMjg5OCAxOC44NjEyWlwiIHN0cm9rZT1cIiNEQzY4MDNcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0ZGRkFFQlwiIHN0cm9rZS13aWR0aD1cIjhcIi8+PC9zdmc+YCxcclxuICAgICAgICAgICAgICB0aXRsZTogYEludmFsaWQgZGV0YWlscyFgLFxyXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICAgIGJ1dHRvbnR5cGU6ICdlcnJvcicsXHJcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yRGF0YVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuICBSZXVwbG9hZCgpIHtcclxuICAgIC8vIHRoaXMuZGlhbG9nLmRpc21pc3NBbGwoKTtcclxuICAgIGlmICh0aGlzLmZpbGVJbnB1dCkge1xyXG4gICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5maWxlSW5wdXQxKSB7XHJcbiAgICAgIHRoaXMuZmlsZUlucHV0MS5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICBsZXQgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yJyk7XHJcbiAgICBlbGU/LmNsaWNrKCk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgZ2V0U3RvcmVDb3VudHMoZGF0YTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5wYXlsb2FkLmNvdmVyYWdlID09PSAnc3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZVN0b3JlTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uc3RvcmVOYW1lKSk7XHJcbiAgICAgIHJldHVybiB1bmlxdWVTdG9yZU5hbWVzLnNpemU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMucGF5bG9hZC5jb3ZlcmFnZSA9PT0gJ3VzZXJzJykge1xyXG4gICAgICBjb25zdCB1bmlxdWVVc2VyTmFtZXMgPSBuZXcgU2V0KGRhdGEubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0udXNlck5hbWUpKTtcclxuICAgICAgcmV0dXJuIHVuaXF1ZVVzZXJOYW1lcy5zaXplO1xyXG4gICAgfVxyXG4gIH1cclxuICBkb3dubG9hZFRlbXBsYXRlKCkge1xyXG4gICAgY29uc29sZS5sb2codGhpcy5wYXlsb2FkKVxyXG4gICAgbGV0IGV4Y2VsRGF0YTogYW55ID0gW107XHJcbiAgICBpZiAodGhpcy5wYXlsb2FkLnNlbGVjdGVkU3RvcmVzICYmIHRoaXMucGF5bG9hZC5zZWxlY3RlZFN0b3Jlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMucGF5bG9hZC5zZWxlY3RlZFN0b3Jlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICBleGNlbERhdGEucHVzaCh7XHJcbiAgICAgICAgICBjaGVja2xpc3ROYW1lOiB0aGlzLnBheWxvYWQuY2hlY2tsaXN0TmFtZSxcclxuICAgICAgICAgIHF1ZXN0aW9uTmFtZTogdGhpcy5wYXlsb2FkLmlucHV0RGF0YS5xbmFtZSxcclxuICAgICAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUsXHJcbiAgICAgICAgICBjb21tZW50czogJycsXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSBpZiAodGhpcy5wYXlsb2FkLnNlbGVjdGVkVXNlcnMgJiYgdGhpcy5wYXlsb2FkLnNlbGVjdGVkVXNlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnBheWxvYWQuc2VsZWN0ZWRTdG9yZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgZXhjZWxEYXRhLnB1c2goe1xyXG4gICAgICAgICAgY2hlY2tsaXN0TmFtZTogdGhpcy5wYXlsb2FkLmNoZWNrbGlzdE5hbWUsXHJcbiAgICAgICAgICBxdWVzdGlvbk5hbWU6IHRoaXMucGF5bG9hZC5pbnB1dERhdGEucW5hbWUsXHJcbiAgICAgICAgICB1c2VyRW1haWw6IGl0ZW0udXNlckVtYWlsLFxyXG4gICAgICAgICAgY29tbWVudHM6ICcnLFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShleGNlbERhdGEsIGBCdWxrICR7dGhpcy50eXBlfWApO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBhZnRlclVwbGxvYWQoZGF0YT86IGFueSkge1xyXG4gICAgdGhpcy5leGNlbEVycm9yID0gZGF0YTtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5hZnRlclZhbGlkYXRpb24sIHsgY2VudGVyZWQ6IHRydWUsIGJhY2tkcm9wOiAnc3RhdGljJyB9KVxyXG4gIH1cclxuICBvbkZpbGVVcGxvYWQoZXZlbnQ6IGFueSwgdHlwZTogYW55KSB7XHJcbiAgICBjb25zdCB0YXJnZXQ6IERhdGFUcmFuc2ZlciA9IDxEYXRhVHJhbnNmZXI+KGV2ZW50LnRhcmdldCk7XHJcbiAgICBsZXQgZGF0YTogYW55O1xyXG4gICAgbGV0IGVycm9yOiBhbnkgPSBbXTtcclxuICAgIGxldCBWYWxpZGF0aW9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBpc0V4Y2VsRmlsZSA9ICEhdGFyZ2V0LmZpbGVzWzBdLm5hbWUubWF0Y2goLygueGxzfC54bHN4KS8pO1xyXG4gICAgaWYgKGlzRXhjZWxGaWxlKSB7XHJcbiAgICAgIGNvbnN0IHJlYWRlcjogRmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcodGFyZ2V0LmZpbGVzWzBdKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBic3RyOiBzdHJpbmcgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgY29uc3Qgd2I6IFhMU1guV29ya0Jvb2sgPSBYTFNYLnJlYWQoYnN0ciwgeyB0eXBlOiAnYmluYXJ5JyB9KTtcclxuICAgICAgICBjb25zdCB3c25hbWU6IHN0cmluZyA9IHdiLlNoZWV0TmFtZXNbMF07XHJcbiAgICAgICAgY29uc3Qgd3M6IFhMU1guV29ya1NoZWV0ID0gd2IuU2hlZXRzW3dzbmFtZV07XHJcbiAgICAgICAgZGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3cyk7XHJcbiAgICAgICAgdGhpcy5leGNlbERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGlmICghZGF0YS5sZW5ndGggfHwgKGRhdGEuc29tZSgoaXRlbTogYW55KSA9PiAnY2x1c3Rlck5hbWUnIGluIGl0ZW0gfHwgJ3RlYW1OYW1lJyBpbiBpdGVtKSkpIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBVcGxvYWQgYSBWYWxpZCBmaWxlLicpXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRhdGEgPSBkYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gICByZXR1cm4gKChpdGVtPy5zdG9yZU5hbWUgJiYgaXRlbT8uc3RvcmVOYW1lLnRyaW0oKSAhPSAnJyAmJiBpdGVtPy5zdG9yZU5hbWUudHJpbSgpICE9IG51bGwpIHx8IChpdGVtPy51c2VyTmFtZSAmJiBpdGVtPy51c2VyTmFtZS50cmltKCkgIT0gJycgJiYgaXRlbT8udXNlck5hbWUudHJpbSgpICE9IG51bGwpIHx8IChpdGVtPy51c2VyRW1haWwgJiYgaXRlbT8udXNlckVtYWlsLnRyaW0oKSAhPSAnJyAmJiBpdGVtPy51c2VyRW1haWwudHJpbSgpICE9IG51bGwpKVxyXG4gICAgICAgIC8vIH0pXHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwpIHtcclxuICAgICAgICAgICAgZWxlbWVudC51c2VyRW1haWwgPSBlbGVtZW50Py51c2VyRW1haWwucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMucGF5bG9hZC5jb3ZlcmFnZSlcclxuICAgICAgICAgIGlmICh0aGlzLnBheWxvYWQuY292ZXJhZ2UgPT09ICdzdG9yZScpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZWxlbWVudC5zdG9yZU5hbWUpXHJcbiAgICAgICAgICAgIGlmICgoZWxlbWVudC5zdG9yZU5hbWUgJiYgZWxlbWVudC5zdG9yZU5hbWUudHJpbSgpID09ICcnKSB8fCBlbGVtZW50LnN0b3JlTmFtZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgZXJyb3IucHVzaChgSW52YWxpZCBTdG9yZU5hbWUgLSBDJHtpbmRleCArIDJ9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBheWxvYWQuY292ZXJhZ2UgPT09ICd1c2VycycpIHtcclxuICAgICAgICAgICAgaWYgKChlbGVtZW50LnVzZXJFbWFpbCAmJiBlbGVtZW50LnVzZXJFbWFpbC50cmltKCkgPT0gJycpIHx8IGVsZW1lbnQudXNlckVtYWlsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICBlcnJvci5wdXNoKGBJbnZhbGlkIHVzZXJFbWFpbCAtIEMke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50Py51c2VyRW1haWwgJiYgIWVsZW1lbnQudXNlckVtYWlsLm1hdGNoKC9eW2EtekEtWjAtOS5fLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw2fSQvKSkge1xyXG4gICAgICAgICAgICAgIGVycm9yLnB1c2goYEludmFsaWQgdXNlckVtYWlsIC0gQyR7aW5kZXggKyAyfWApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIGlmICgoZWxlbWVudC5jb21tZW50cyAmJiBlbGVtZW50LmNvbW1lbnRzLnRyaW0oKSA9PSAnJykgfHwgZWxlbWVudC5jb21tZW50cyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyAgIGVycm9yLnB1c2goYEludmFsaWQgY29tbWVudCAtIEQke2luZGV4ICsgMn1gKVxyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IubGVuZ3RoKVxyXG4gICAgICAgIGlmIChlcnJvci5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICAgIGNvbnN0IHBvcHVwY29udGVudCA9IHtcclxuICAgICAgICAgICAgZGlzcGxheXByb3A6IGZhbHNlLFxyXG4gICAgICAgICAgICBpbWFnZXNyYzogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNTZcIiBoZWlnaHQ9XCI1NlwiIHZpZXdCb3g9XCIwIDAgNTYgNTZcIiBmaWxsPVwibm9uZVwiPjxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNGRUYwQzdcIi8+PHBhdGggZD1cIk0yNy45OTk4IDI0LjAwMTJWMjguMDAxMk0yNy45OTk4IDMyLjAwMTJIMjguMDA5OE0yNi4yODk4IDE4Ljg2MTJMMTcuODE5OCAzMy4wMDEyQzE3LjY0NTEgMzMuMzAzNiAxNy41NTI3IDMzLjY0NjUgMTcuNTUxOCAzMy45OTU3QzE3LjU1MDggMzQuMzQ0OSAxNy42NDEzIDM0LjY4ODMgMTcuODE0MiAzNC45OTE3QzE3Ljk4NzEgMzUuMjk1MSAxOC4yMzY1IDM1LjU0NzkgMTguNTM3NSAzNS43MjVDMTguODM4NSAzNS45MDIxIDE5LjE4MDYgMzUuOTk3MyAxOS41Mjk4IDM2LjAwMTJIMzYuNDY5OEMzNi44MTkgMzUuOTk3MyAzNy4xNjExIDM1LjkwMjEgMzcuNDYyMSAzNS43MjVDMzcuNzYzMSAzNS41NDc5IDM4LjAxMjQgMzUuMjk1MSAzOC4xODU0IDM0Ljk5MTdDMzguMzU4MyAzNC42ODgzIDM4LjQ0ODggMzQuMzQ0OSAzOC40NDc4IDMzLjk5NTdDMzguNDQ2OCAzMy42NDY1IDM4LjM1NDQgMzMuMzAzNiAzOC4xNzk4IDMzLjAwMTJMMjkuNzA5OCAxOC44NjEyQzI5LjUzMTUgMTguNTY3MyAyOS4yODA1IDE4LjMyNDMgMjguOTgxIDE4LjE1NTdDMjguNjgxNCAxNy45ODcgMjguMzQzNSAxNy44OTg0IDI3Ljk5OTggMTcuODk4NEMyNy42NTYgMTcuODk4NCAyNy4zMTgxIDE3Ljk4NyAyNy4wMTg2IDE4LjE1NTdDMjYuNzE5MSAxOC4zMjQzIDI2LjQ2OCAxOC41NjczIDI2LjI4OTggMTguODYxMlpcIiBzdHJva2U9XCIjREM2ODAzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cmVjdCB4PVwiNFwiIHk9XCI0XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgcng9XCIyNFwiIHN0cm9rZT1cIiNGRkZBRUJcIiBzdHJva2Utd2lkdGg9XCI4XCIvPjwvc3ZnPmAsXHJcbiAgICAgICAgICAgIHRpdGxlOiBgSW52YWxpZCBkZXRhaWxzIWAsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGBQbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBzdG9yZSBpbmZvcm1hdGlvbi5gLFxyXG4gICAgICAgICAgICBidXR0b250eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYWZ0ZXJVcGxsb2FkKHBvcHVwY29udGVudClcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAhVmFsaWRhdGlvbkVycm9yID8gdGhpcy5hZnRlclVwbGxvYWQoKSA6ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcclxuICAgICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsZUlucHV0MSkge1xyXG4gICAgICAgICAgdGhpcy5maWxlSW5wdXQxLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5maWxlSW5wdXQpIHtcclxuICAgICAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBVcGxvYWQgYSBFeGNlbCBmaWxlLicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZCBncm91cC1kZWxldGUgcHktMFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMCBkLWZsZXggZmxleC1zdGFydCBmbGV4LWNvbHVtbiBwLTkgXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibXktNSBtYi01XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzeW1ib2wgc3ltYm9sLTc1cHggc3ltYm9sLWNpcmNsZSBkLWZsZXggXCI+XHJcbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICBkPVwiTTE0IDJINkM1LjQ2OTU3IDIgNC45NjA4NiAyLjIxMDcxIDQuNTg1NzkgMi41ODU3OUM0LjIxMDcxIDIuOTYwODYgNCAzLjQ2OTU3IDQgNFYyMEM0IDIwLjUzMDQgNC4yMTA3MSAyMS4wMzkxIDQuNTg1NzkgMjEuNDE0MkM0Ljk2MDg2IDIxLjc4OTMgNS40Njk1NyAyMiA2IDIySDE4QzE4LjUzMDQgMjIgMTkuMDM5MSAyMS43ODkzIDE5LjQxNDIgMjEuNDE0MkMxOS43ODkzIDIxLjAzOTEgMjAgMjAuNTMwNCAyMCAyMFY4TTE0IDJMMjAgOE0xNCAyVjhIMjBNMTIgMThWMTJNOSAxNUgxNVwiXHJcbiAgICAgICAgICAgIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWNhcGl0YWxpemUgbXgtM1wiPiB7e3R5cGV9fTwvaDM+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBtYi0zIHAtMyBib3JkZXIgcm91bmRlZCBvcHRpb24tYm94XCJcclxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLW9wdGlvbic6IHNlbGVjdGVkT3B0aW9uID09PSAnc2FtZScgfVwiIChjbGljayk9XCJzZXRPcHRpb24oJ3NhbWUnKVwiPlxyXG4gICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IG15LTUgbXgtM1wiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ0YXNrT3B0aW9uXCIgaWQ9XCJzYW1lQ29tbWVudFwiXHJcbiAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0ZWRPcHRpb24gPT09ICdzYW1lJ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibXgtM1wiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgZnctc2VtaWJvbGRcIiBmb3I9XCJzYW1lQ29tbWVudFwiPlxyXG4gICAgICAgICAgQ3JlYXRlIHRhc2sgd2l0aCBzYW1lIGNvbW1lbnRcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTEgbXMtMTBcIj5cclxuICAgICAgICAgIEFwcGx5IGEgc2luZ2xlIGNvbW1lbnQgdG8gYWxsIHNlbGVjdGVkIHN0b3Jlcy4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4gdGhlIHt7dHlwZX19IGRldGFpbHMgYXJlIGlkZW50aWNhbCBmb3JcclxuICAgICAgICAgIGV2ZXJ5IHN0b3JlLlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIHAtMyBib3JkZXIgcm91bmRlZCBvcHRpb24tYm94XCJcclxuICAgICAgW25nQ2xhc3NdPVwieyAnYWN0aXZlLW9wdGlvbic6IHNlbGVjdGVkT3B0aW9uID09PSAnZGlmZmVyZW50JyB9XCIgKGNsaWNrKT1cInNldE9wdGlvbignZGlmZmVyZW50JylcIj5cclxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCAgbXktNSBteC0zXCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cInRhc2tPcHRpb25cIiBpZD1cImRpZmZlcmVudENvbW1lbnRzXCJcclxuICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3RlZE9wdGlvbiA9PT0gJ2RpZmZlcmVudCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm14LTNcIj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIGZ3LXNlbWlib2xkXCIgZm9yPVwiZGlmZmVyZW50Q29tbWVudHNcIj5cclxuICAgICAgICAgIENyZWF0ZSB7e3R5cGV9fSB3aXRoIGRpZmZlcmVudCBjb21tZW50cyA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj4odmlhIEV4Y2VsIHVwbG9hZCk8L3NwYW4+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtdC0xIG1zLTEwXCI+XHJcbiAgICAgICAgICBVc2UgYW4gRXhjZWwgdGVtcGxhdGUgdG8gYXNzaWduIGRpZmZlcmVudCBjb21tZW50cyB0byBlYWNoIHNlbGVjdGVkIHN0b3JlLiBUaGlzIGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZVxyXG4gICAgICAgICAge3t0eXBlfX0gZm9yIGVhY2ggbG9jYXRpb24uXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXIgYm9yZGVyLXRvcC0wXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cInByb2NlZWQoKVwiPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjYnVsa3VwbG9hZCBsZXQtbW9kZWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBtdC01XCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctbGlnaHQtcHJpbWFyeSByb3VuZGVkLTUgdy00MHB4IGgtNDBweCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMzAgMThIMjJDMjEuNDY5NiAxOCAyMC45NjA5IDE4LjIxMDcgMjAuNTg1OCAxOC41ODU4QzIwLjIxMDcgMTguOTYwOSAyMCAxOS40Njk2IDIwIDIwVjM2QzIwIDM2LjUzMDQgMjAuMjEwNyAzNy4wMzkxIDIwLjU4NTggMzcuNDE0MkMyMC45NjA5IDM3Ljc4OTMgMjEuNDY5NiAzOCAyMiAzOEgzNEMzNC41MzA0IDM4IDM1LjAzOTEgMzcuNzg5MyAzNS40MTQyIDM3LjQxNDJDMzUuNzg5MyAzNy4wMzkxIDM2IDM2LjUzMDQgMzYgMzZWMjRNMzAgMThMMzYgMjRNMzAgMThWMjRIMzZNMjggMzRWMjhNMjUgMzFIMzFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiA8c3BhbiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LXNlbWlib2xkIG1zLTUgdy1hdXRvIHRleHQtY2FwaXRhbGl6ZVwiPnt7dHlwZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwdC0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj4xLiBVc2UgdGhlIHRlbXBsYXRlIHRvIHVwbG9hZCBhbmQgY3JlYXRlIG11bHRpcGxlIHt7dHlwZX19cyBhdCBvbmNlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b3JlQXNzaWduIG10LTNcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDBcIj4yLiBEb3dubG9hZCB0aGUgdGVtcGxhdGUgaGVyZSAtICA8YSBjbGFzcz1cInRleHQtZGVjb3JhdGlvbi11bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZG93bmxvYWRUZW1wbGF0ZSgpXCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmU8L2E+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RvcmVBc3NpZ24gbXQtM1wiIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDQwMFwiPjMuIEFkZCB5b3VyIGRhdGEgdG8gdGhlIFRlbXBsYXRlIEZpbGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdG9yZUFzc2lnbiBtdC0zXCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwXCI+NC4gVXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTAgdGV4dC1lbmQgcHQtMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1tZCBidG4tZGVmYXVsdCBidG4tb3V0bGluZVwiIChjbGljayk9XCJtb2RlbC5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW1kIHB5LTMgYnRuLWRlZmF1bHQgbXMtMyBidG4tcHJpbWFyeVwiIChjbGljayk9XCJmaWxlMS5jbGljaygpXCI+VXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cInZpc2liaWxpdHk6IGhpZGRlbjtcIiAjZmlsZTEgdHlwZT1cImZpbGVcIiBpZD1cImt0X2FjY291bnRfdGVhbV9zaXplX3NlbGVjdF8yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVVwbG9hZCgkZXZlbnQsJ3VwbG9hZCcpXCIgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNhZnRlclZhbGlkYXRpb24gbGV0LW1vZGVsPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgbXQtMFwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgbXQtM1wiPjxzcGFuIGNsYXNzPVwiY29uZmlnLWhlYWRpbmcgZnctc2VtaWJvbGQgdy1hdXRvXCI+QXNzaWduIDxzcGFuICpuZ0lmPVwidGhpcy5wYXlsb2FkLmNvdmVyYWdlPT09J3N0b3JlJ1wiPlN0b3Jlczwvc3Bhbj4gPHNwYW4gKm5nSWY9XCJ0aGlzLnBheWxvYWQuY292ZXJhZ2U9PT0ndXNlcnMnXCI+VXNlcnM8L3NwYW4+PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHQtMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC04MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgY29uZmlnLWhlYWRpbmcgdy0xMDBcIj57e2dldFN0b3JlQ291bnRzKGV4Y2VsRGF0YSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkIHN1YnRpdGxlIG10LTFcIj5Ub3RhbCA8c3BhbiAqbmdJZj1cInRoaXMucGF5bG9hZC5jb3ZlcmFnZT09PSdzdG9yZSdcIj5TdG9yZXM8L3NwYW4+IDxzcGFuICpuZ0lmPVwidGhpcy5wYXlsb2FkLmNvdmVyYWdlPT09J3VzZXJzJ1wiPlVzZXJzPC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jYXJkIHJvdW5kZWQtMyBwLTMgZmxleC1jb2x1bW4gaC04MHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZCBjb25maWctaGVhZGluZyB3LTEwMFwiPnt7ZXhjZWxEYXRhPy5sZW5ndGh9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGQgc3VidGl0bGUgbXQtMVwiPlJvd3MgcHJvY2Vzc2VkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtY2FyZCByb3VuZGVkLTMgcC0zIGZsZXgtY29sdW1uIGgtODBweFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgPyAnZXJyb3ItaGVhZGluZyc6JydcIiBjbGFzcz1cImZ3LXNlbWlib2xkIGNvbmZpZy1oZWFkaW5nIHctMTAwXCI+e3tleGNlbEVycm9yPy5lcnJvcj8ubGVuZ3RoIHx8IDB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cImV4Y2VsRXJyb3IgPyAnZXhjZWwtZXJyb3InOicnXCIgY2xhc3M9XCJmdy1zZW1pYm9sZCBzdWJ0aXRsZSBtdC0xXCI+RXJyb3I8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhjZWxFcnJvclwiIGNsYXNzPVwiZmxleC1jb2x1bW4gbXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1oZWFkaW5nIGZ3LWJvbGRcIj5JbnZhbGlkIERldGFpbHMgITwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YnRpdGxlIG10LTVcIj5QbGVhc2UgcHJvdmlkZSBjb3JyZWN0IGFuZCBjb21wbGV0ZSBsYXlvdXQgaW5mb3JtYXRpb24uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC01IHctMTAwIHJvdW5kZWQtMyBib3JkZXItZXJyb3IgbXQtNSBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVycm9yIG9mIGV4Y2VsRXJyb3I/LmVycm9yOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbbmdDbGFzc109XCIhbGFzdCA/ICdtYi0yJyA6ICcnXCIgY2xhc3M9XCJ0ZXh0LWVycm9yXCI+e3tpICsgMX19KSB7e2Vycm9yfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wIHRleHQtZW5kIHB0LTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbWQgYnRuLWRlZmF1bHQgYnRuLW91dGxpbmVcIiAoY2xpY2spPVwiY2xvc2VhY3RpdmVwb3B1cCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZXhjZWxFcnJvclwiIGNsYXNzPVwiYnRuIGJ0bi1tZCBweS00IGJ0bi1kZWZhdWx0IG1zLTMgYnRuLXByaW1hcnlcIiAoY2xpY2spPVwidmFsaWRhdGVEZXRhaWxzKClcIj5Qcm9jZWVkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJleGNlbEVycm9yXCIgY2xhc3M9XCJidG4gcHktMyBidG4tbWQgYnRuLWRlZmF1bHQgbXMtMyBidG4tZGFuZ2VyXCIgKGNsaWNrKT1cIlJldXBsb2FkKCk7XCI+UmV1cGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiICNmaWxlMSB0eXBlPVwiZmlsZVwiIGlkPVwia3RfYWNjb3VudF90ZWFtX3NpemVfc2VsZWN0XzJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlVXBsb2FkKCRldmVudCwncmV1cGxvYWQnKVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT4iXX0=