ezlibrary_v2 2.0.0
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.
- package/README.md +24 -0
- package/esm2020/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +34 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1077 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +28 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +225 -0
- package/esm2020/lib/auth/auth.guard.mjs +37 -0
- package/esm2020/lib/bi-service/bi.service.mjs +57 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +125 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +678 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +690 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +45 -0
- package/esm2020/lib/ez-lib.component.mjs +26 -0
- package/esm2020/lib/ez-lib.module.mjs +232 -0
- package/esm2020/lib/ez-lib.service.mjs +14 -0
- package/esm2020/lib/ezheader/header.component.mjs +400 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +918 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +169 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/fileupload-module/fileupload.module.mjs +80 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2798 -0
- package/esm2020/lib/globle/shared-services.service.mjs +25 -0
- package/esm2020/lib/globle/upload-service.service.mjs +63 -0
- package/esm2020/lib/header/header.component.mjs +172 -0
- package/esm2020/lib/invalid/invalid.component.mjs +70 -0
- package/esm2020/lib/logout/logout.component.mjs +104 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +258 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +17 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1109 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +64 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1028 -0
- package/esm2020/lib/report-format/report-format.component.mjs +403 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +27 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +58 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2817 -0
- package/esm2020/lib/system-module/system/system.component.mjs +970 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +83 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +83 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +24 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public-api.mjs +59 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +15300 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +15291 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +118 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +43 -0
- package/lib/auth/auth.guard.d.ts +14 -0
- package/lib/bi-service/bi.service.d.ts +16 -0
- package/lib/call-info/callinfo.component.d.ts +26 -0
- package/lib/comman-service/comman-service.service.d.ts +106 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +111 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ez-lib.component.d.ts +8 -0
- package/lib/ez-lib.module.d.ts +43 -0
- package/lib/ez-lib.service.d.ts +6 -0
- package/lib/ezheader/header.component.d.ts +57 -0
- package/lib/file-upload/fileupload.component.d.ts +127 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +49 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/fileupload-module/fileupload.module.d.ts +15 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +16 -0
- package/lib/header/header.component.d.ts +41 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +19 -0
- package/lib/menu-right/menu-right.component.d.ts +43 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +184 -0
- package/lib/pricing-service/pricing.service.d.ts +16 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +95 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +15 -0
- package/lib/system-module/subform/subform.component.d.ts +222 -0
- package/lib/system-module/system/system.component.d.ts +109 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +56 -0
- package/package.json +31 -0
- package/public-api.d.ts +54 -0
|
@@ -0,0 +1,918 @@
|
|
|
1
|
+
import { Component, ViewChild } from '@angular/core';
|
|
2
|
+
// import { FlashMessagesService } from 'angular2-flash-messages'
|
|
3
|
+
// import { Ng4LoadingSpinnerService } from 'ng4-loading-spinner';
|
|
4
|
+
import { Cookie } from 'ng2-cookies/ng2-cookies';
|
|
5
|
+
// import * as XLSX from 'ts-xlsx';
|
|
6
|
+
// import * as XLSX from 'xlsx/xlsx.mjs';
|
|
7
|
+
import * as XLSX from 'xlsx';
|
|
8
|
+
import { document } from 'ngx-bootstrap';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/router";
|
|
11
|
+
import * as i2 from "@angular/common/http";
|
|
12
|
+
import * as i3 from "../comman-service/comman-service.service";
|
|
13
|
+
import * as i4 from "@ng-select/ng-select";
|
|
14
|
+
import * as i5 from "@angular/common";
|
|
15
|
+
import * as i6 from "@angular/forms";
|
|
16
|
+
import * as i7 from "../utility/app-no-dbl-click.directive";
|
|
17
|
+
// import { AsyncLocalStorage } from 'async_hooks';
|
|
18
|
+
export class FileuploadComponent {
|
|
19
|
+
constructor(router, route,
|
|
20
|
+
// private flashMessagesService: FlashMessagesService,
|
|
21
|
+
// private spinnerService: Ng4LoadingSpinnerService,
|
|
22
|
+
http, cs) {
|
|
23
|
+
this.router = router;
|
|
24
|
+
this.route = route;
|
|
25
|
+
this.http = http;
|
|
26
|
+
this.cs = cs;
|
|
27
|
+
this.header = {};
|
|
28
|
+
this.fileToUpload = null;
|
|
29
|
+
this.fileName = "";
|
|
30
|
+
this.step = 1;
|
|
31
|
+
this.sheetData = [];
|
|
32
|
+
this.headerAttributeDtl = {};
|
|
33
|
+
this.defultDisplayLen = 5;
|
|
34
|
+
this.defultDisplayObj = [];
|
|
35
|
+
this.attrStructureDtl = [];
|
|
36
|
+
this.headerList = [];
|
|
37
|
+
this.totalmatch = 0;
|
|
38
|
+
this.totalignore = 0;
|
|
39
|
+
this.pageDefination = {};
|
|
40
|
+
this.rowdatamapDetails = {};
|
|
41
|
+
this.rowdistinctDataMap = {};
|
|
42
|
+
this.charHeaderList = [];
|
|
43
|
+
this.attributeDtlMap = {};
|
|
44
|
+
this.mappSheetData = [];
|
|
45
|
+
this.lable = "";
|
|
46
|
+
this.lableFile = "";
|
|
47
|
+
this.statusList = [];
|
|
48
|
+
this.fileDetails = [];
|
|
49
|
+
this.fileTypeList = [];
|
|
50
|
+
this.fileOptionsList = [];
|
|
51
|
+
this.check_status = [];
|
|
52
|
+
this.pkt_status = [];
|
|
53
|
+
this.colFormate = [];
|
|
54
|
+
this.ignoreFormate = [];
|
|
55
|
+
this.allcols = [];
|
|
56
|
+
this.fileLogIdn = 0;
|
|
57
|
+
this.show = false;
|
|
58
|
+
this.stepMsg = '';
|
|
59
|
+
this.dateFormatMap = {};
|
|
60
|
+
this.mappingskip = false;
|
|
61
|
+
this.dateFormatList = [{ "k": "dd/mm/yy", "v": "dd/mm/yy" },
|
|
62
|
+
{ "k": "mm/dd/yy", "v": "mm/dd/yy" },
|
|
63
|
+
{ "k": "dd/Mon/yy", "v": "dd/Mon/yy" },
|
|
64
|
+
];
|
|
65
|
+
this.gmatchedCount = 0;
|
|
66
|
+
this.gresultCount = 0;
|
|
67
|
+
this.sttsFile = {};
|
|
68
|
+
// checkUploadStt() {
|
|
69
|
+
// this.spinnerService.show();
|
|
70
|
+
// let reqObj = {};
|
|
71
|
+
// reqObj['formNme'] = this.route.snapshot.params['frmname'];
|
|
72
|
+
// reqObj['file_log_idn'] = this.fileLogIdn;
|
|
73
|
+
// console.log(JSON.stringify(reqObj));
|
|
74
|
+
// this.us.data(reqObj, 'getFileLogStatus', 'fileUpload/load').subscribe(response => {
|
|
75
|
+
// if (response.status == 'SUCCESS') {
|
|
76
|
+
// this.clicked = true;
|
|
77
|
+
// let result = response.result || {};
|
|
78
|
+
// console.log(result);
|
|
79
|
+
// this.stts['C'] = result['C'];
|
|
80
|
+
// this.stts['P'] = result['P'];
|
|
81
|
+
// this.stts['E'] = result['E'];
|
|
82
|
+
// this.stts['T'] = result['T'];
|
|
83
|
+
// this.step = 4;
|
|
84
|
+
// this.spinnerService.hide();
|
|
85
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
86
|
+
// }
|
|
87
|
+
// this.spinnerService.hide();
|
|
88
|
+
// }, error => {
|
|
89
|
+
// this.spinnerService.hide();
|
|
90
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
91
|
+
// });
|
|
92
|
+
// }
|
|
93
|
+
this.stts = {};
|
|
94
|
+
this.clicked = false;
|
|
95
|
+
this.totProgress = 0;
|
|
96
|
+
this.totProgressFile = 0;
|
|
97
|
+
this.lastRefreshTimeFile = null;
|
|
98
|
+
this.lastRefreshTime = null;
|
|
99
|
+
}
|
|
100
|
+
handleFileInput(files) {
|
|
101
|
+
this.fileToUpload = files.item(0);
|
|
102
|
+
this.fileName = files[0].name;
|
|
103
|
+
}
|
|
104
|
+
onFileSelect(input) {
|
|
105
|
+
const files = input.files;
|
|
106
|
+
if (files && files.length) {
|
|
107
|
+
const fileToRead = files[0];
|
|
108
|
+
const fileReader = new FileReader();
|
|
109
|
+
fileReader.onload = this.onFileLoad;
|
|
110
|
+
fileReader.readAsText(fileToRead, "UTF-8");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
onFileLoad(fileLoadedEvent) {
|
|
114
|
+
const csvSeparator = ';';
|
|
115
|
+
const textFromFileLoaded = fileLoadedEvent.target.result;
|
|
116
|
+
this.csvContent = textFromFileLoaded;
|
|
117
|
+
const txt = textFromFileLoaded;
|
|
118
|
+
const csv = [];
|
|
119
|
+
const lines = txt.split('\n');
|
|
120
|
+
console.log(lines[0]);
|
|
121
|
+
lines.forEach(element => {
|
|
122
|
+
const cols = element.split(csvSeparator);
|
|
123
|
+
csv.push(cols);
|
|
124
|
+
});
|
|
125
|
+
this.parsedCsv = csv;
|
|
126
|
+
// demo output as alert
|
|
127
|
+
var output = "";
|
|
128
|
+
csv.forEach(row => {
|
|
129
|
+
output += "\n";
|
|
130
|
+
var colNo = 0;
|
|
131
|
+
row.forEach(col => {
|
|
132
|
+
if (colNo > 0)
|
|
133
|
+
output += " | ";
|
|
134
|
+
output += col;
|
|
135
|
+
colNo++;
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
return output;
|
|
139
|
+
}
|
|
140
|
+
incomingfile(event) {
|
|
141
|
+
this.file = event.target.files[0];
|
|
142
|
+
this.fileName = this.file.name;
|
|
143
|
+
this.Upload();
|
|
144
|
+
}
|
|
145
|
+
Upload() {
|
|
146
|
+
this.show = true;
|
|
147
|
+
this.stepMsg = 'File upload in process..';
|
|
148
|
+
// this.spinnerService.show();
|
|
149
|
+
this.mappSheetData = [];
|
|
150
|
+
this.sheetData = [];
|
|
151
|
+
let fileReader = new FileReader();
|
|
152
|
+
fileReader.onload = (e) => {
|
|
153
|
+
this.arrayBuffer = fileReader.result;
|
|
154
|
+
var data = new Uint8Array(this.arrayBuffer);
|
|
155
|
+
var arr = new Array();
|
|
156
|
+
for (var i = 0; i != data.length; ++i)
|
|
157
|
+
arr[i] = String.fromCharCode(data[i]);
|
|
158
|
+
var bstr = arr.join("");
|
|
159
|
+
var workbook = XLSX.read(bstr, { type: "binary" });
|
|
160
|
+
var first_sheet_name = workbook.SheetNames[0];
|
|
161
|
+
var worksheet = workbook.Sheets[first_sheet_name];
|
|
162
|
+
var sheetDataMap = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
|
|
163
|
+
let headerList = sheetDataMap[0];
|
|
164
|
+
headerList.forEach(hdr => {
|
|
165
|
+
this.headerList.push(hdr.trim());
|
|
166
|
+
});
|
|
167
|
+
this.sheetData = XLSX.utils.sheet_to_json(worksheet);
|
|
168
|
+
this.mappSheetData = XLSX.utils.sheet_to_json(worksheet);
|
|
169
|
+
this.fileLogIdn = 0;
|
|
170
|
+
console.log("this.headerList", this.headerList);
|
|
171
|
+
this.getHeaderMatch();
|
|
172
|
+
// const distinctSh = [...new Set(this.sheetData.map(x=>x.SHAPE))];
|
|
173
|
+
};
|
|
174
|
+
fileReader.readAsArrayBuffer(this.file);
|
|
175
|
+
}
|
|
176
|
+
setSetp(step) {
|
|
177
|
+
this.step = step;
|
|
178
|
+
if (step == 1) {
|
|
179
|
+
this.ngOnDestroy();
|
|
180
|
+
this.ngOnInit();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
getHeaderMatch() {
|
|
184
|
+
this.show = true;
|
|
185
|
+
debugger;
|
|
186
|
+
this.stepMsg = 'Header verification in process ...';
|
|
187
|
+
// this.spinnerService.show();
|
|
188
|
+
let reqObj = {};
|
|
189
|
+
reqObj['formNme'] = 'fileUpload';
|
|
190
|
+
reqObj['attrList'] = this.headerList;
|
|
191
|
+
reqObj['fileIdn'] = this.fileType;
|
|
192
|
+
this.header["method"] = 'loadHeaderAttr';
|
|
193
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
194
|
+
if (response.status == 'SUCCESS') {
|
|
195
|
+
let result = response.result;
|
|
196
|
+
this.headerAttributeDtl = result.attrDetails || '';
|
|
197
|
+
console.log("this.headerAttributeDtl", this.headerAttributeDtl);
|
|
198
|
+
let headerListLnt = this.headerList.length;
|
|
199
|
+
this.totalmatch = result.totalmatch || 0;
|
|
200
|
+
if (this.headerAttributeDtl != '') {
|
|
201
|
+
this.attrStructureDtl = result.attrStructureDtl || [];
|
|
202
|
+
if (this.sheetData.length < 5)
|
|
203
|
+
this.defultDisplayLen = this.sheetData.length;
|
|
204
|
+
for (var i = 0; i < this.defultDisplayLen; i++)
|
|
205
|
+
this.defultDisplayObj[i] = this.sheetData[i];
|
|
206
|
+
let ignoreColumnLst = result.ignore_column || [];
|
|
207
|
+
ignoreColumnLst.forEach(hdrDsc => {
|
|
208
|
+
if (this.headerAttributeDtl[hdrDsc] != undefined) {
|
|
209
|
+
this.headerAttributeDtl[hdrDsc].ignore = 'Y';
|
|
210
|
+
headerListLnt--;
|
|
211
|
+
this.totalignore++;
|
|
212
|
+
if (this.headerAttributeDtl[hdrDsc].attr != "")
|
|
213
|
+
this.totalmatch--;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
let isDate = false;
|
|
217
|
+
this.headerList.forEach(hdr => {
|
|
218
|
+
let hdrAttr = this.headerAttributeDtl[hdr] || {};
|
|
219
|
+
if (hdrAttr.dta_typ == 'd') {
|
|
220
|
+
this.dateFormatMap[hdr] = this.dateFormat;
|
|
221
|
+
isDate = true;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
if (this.totalmatch == headerListLnt && isDate == false) {
|
|
225
|
+
this.ValidateFileHeaderMapping('N');
|
|
226
|
+
this.show = false;
|
|
227
|
+
this.step = 3;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.step = 2;
|
|
231
|
+
}
|
|
232
|
+
this.show = false;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// this.flashMessagesService.show("Some problem in File Header Matching", { cssClass: 'alert-danger', timeout: 3000 });
|
|
236
|
+
}
|
|
237
|
+
//this.spinnerService.hide();
|
|
238
|
+
this.show = false;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.show = false;
|
|
242
|
+
//this.spinnerService.hide();
|
|
243
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-danger', timeout: 3000 });
|
|
244
|
+
}
|
|
245
|
+
}, error => {
|
|
246
|
+
// this.spinnerService.hide();
|
|
247
|
+
this.show = false;
|
|
248
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
updatecolumnstatue(hdr) {
|
|
252
|
+
var isIgnore = this.headerAttributeDtl[hdr].ignore || '';
|
|
253
|
+
if (isIgnore == 'Y') {
|
|
254
|
+
this.headerAttributeDtl[hdr].ignore = 'N';
|
|
255
|
+
this.totalignore--;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
this.totalignore++;
|
|
259
|
+
this.headerAttributeDtl[hdr].ignore = 'Y';
|
|
260
|
+
}
|
|
261
|
+
console.log(this.headerAttributeDtl[hdr]);
|
|
262
|
+
}
|
|
263
|
+
confirmsetHeaderMapp(hdr) {
|
|
264
|
+
this.maphdr = hdr;
|
|
265
|
+
let attr = this.headerAttributeDtl[hdr].attr;
|
|
266
|
+
this.attrStructureDtl.forEach(ele => {
|
|
267
|
+
if (ele.attr == attr) {
|
|
268
|
+
this.hdrmassage = this.headerAttributeDtl[hdr].attr + "(" + ele.print + ")";
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
document.getElementById('btnCofirmmaphdr').click();
|
|
272
|
+
}
|
|
273
|
+
CancelHeaderMapp() {
|
|
274
|
+
this.headerAttributeDtl[this.maphdr].attr = "";
|
|
275
|
+
}
|
|
276
|
+
setHeaderMapp() {
|
|
277
|
+
debugger;
|
|
278
|
+
let attr = this.headerAttributeDtl[this.maphdr].attr || '';
|
|
279
|
+
if (attr != '') {
|
|
280
|
+
let reqObj = {};
|
|
281
|
+
reqObj['formNme'] = 'fileUpload';
|
|
282
|
+
reqObj['optionaVal'] = this.maphdr;
|
|
283
|
+
reqObj['attr'] = attr;
|
|
284
|
+
console.log(JSON.stringify(reqObj));
|
|
285
|
+
this.header["method"] = 'addHeaderAttr';
|
|
286
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
287
|
+
console.log(response);
|
|
288
|
+
if (response.status == 'SUCCESS') {
|
|
289
|
+
let result = response.result || {};
|
|
290
|
+
let hdrDtl = result.attrDetails[this.maphdr] || '';
|
|
291
|
+
if (hdrDtl != '') {
|
|
292
|
+
this.totalmatch++;
|
|
293
|
+
this.headerAttributeDtl[this.maphdr] = hdrDtl;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.headerAttributeDtl[this.maphdr] = {
|
|
297
|
+
"attr": "",
|
|
298
|
+
"print": "",
|
|
299
|
+
"srt": "",
|
|
300
|
+
"dta_typ": "",
|
|
301
|
+
"attr_idn": ""
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// this.spinnerService.hide();
|
|
306
|
+
}, error => {
|
|
307
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
// this.flashMessagesService.show("Mapping attribute is empty please retry.", { cssClass: 'alert-danger', timeout: 3000 });
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
setRowDataMapp() {
|
|
315
|
+
if (!this.mappingskip) {
|
|
316
|
+
let rowMatchCount = 0;
|
|
317
|
+
this.charHeaderList = [];
|
|
318
|
+
debugger;
|
|
319
|
+
this.headerList.forEach(hdr => {
|
|
320
|
+
let attr = this.headerAttributeDtl[hdr].attr || '';
|
|
321
|
+
let attrType = this.headerAttributeDtl[hdr].dta_typ || '';
|
|
322
|
+
let isIgnore = this.headerAttributeDtl[hdr].ignore || '';
|
|
323
|
+
if (attr != '' && isIgnore != 'N' && attrType == 'c') {
|
|
324
|
+
debugger;
|
|
325
|
+
var distinctlist = Array.from(new Set(this.sheetData.map((item) => item[hdr])));
|
|
326
|
+
distinctlist = distinctlist.filter(function (e) { return e; });
|
|
327
|
+
if (distinctlist.length > 0) {
|
|
328
|
+
this.rowdistinctDataMap[attr] = distinctlist;
|
|
329
|
+
rowMatchCount = rowMatchCount + distinctlist.length;
|
|
330
|
+
this.gmatchedCount = rowMatchCount;
|
|
331
|
+
this.charHeaderList.push(hdr);
|
|
332
|
+
let attrDetails = this.attrStructureDtl.find(attrdtl => attrdtl.attr == attr) || {};
|
|
333
|
+
this.attributeDtlMap[attr] = attrDetails.prpList || [];
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
let reqObj = {};
|
|
338
|
+
reqObj['formNme'] = 'fileUpload';
|
|
339
|
+
reqObj['attrMap'] = this.rowdistinctDataMap;
|
|
340
|
+
console.log(JSON.stringify(reqObj));
|
|
341
|
+
this.header["method"] = 'loadHeaderAttrDtl';
|
|
342
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
343
|
+
// this.spinnerService.hide();
|
|
344
|
+
if (response.status == 'SUCCESS') {
|
|
345
|
+
let result = response.result;
|
|
346
|
+
console.log(result);
|
|
347
|
+
console.log(rowMatchCount);
|
|
348
|
+
debugger;
|
|
349
|
+
this.rowdatamapDetails = result.attrDetails || {};
|
|
350
|
+
this.gresultCount = result.totalmatch;
|
|
351
|
+
this.step = 3;
|
|
352
|
+
if (rowMatchCount == result.totalmatch) {
|
|
353
|
+
this.step = 4;
|
|
354
|
+
this.uploadFile();
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// this.flashMessagesService.show("please verify data mapping.", { cssClass: 'alert-danger', timeout: 3000 });
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
// this.flashMessagesService.show("something go wrong in row data.", { cssClass: 'alert-danger', timeout: 3000 });
|
|
362
|
+
}
|
|
363
|
+
}, error => {
|
|
364
|
+
// this.spinnerService.hide();
|
|
365
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
this.step = 4;
|
|
370
|
+
this.uploadFile();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
confirmHeaderDetailsMapp(attr, attr_idn, optionval) {
|
|
374
|
+
this.dtlAttr = attr;
|
|
375
|
+
this.dtlattr_idn = attr_idn;
|
|
376
|
+
this.dtloptionval = optionval;
|
|
377
|
+
let val = this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val;
|
|
378
|
+
let attributeDtlList = this.attributeDtlMap[attr];
|
|
379
|
+
attributeDtlList.forEach(ele => {
|
|
380
|
+
if (ele.val == val) {
|
|
381
|
+
this.dtlmassage = val + "(" + ele.print + ")";
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
document.getElementById('btnCofirmmapdtl').click();
|
|
385
|
+
}
|
|
386
|
+
CancelHeaderDetailsMapp() {
|
|
387
|
+
this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val = "";
|
|
388
|
+
}
|
|
389
|
+
setHeaderDetailsMapp() {
|
|
390
|
+
let attrDtlVal = this.rowdatamapDetails[this.dtlAttr][this.dtloptionval].val || '';
|
|
391
|
+
if (attrDtlVal != '') {
|
|
392
|
+
let reqObj = {};
|
|
393
|
+
reqObj['formNme'] = 'fileUpload';
|
|
394
|
+
reqObj['optionaVal'] = this.dtloptionval;
|
|
395
|
+
reqObj['attr_idn'] = this.dtlattr_idn;
|
|
396
|
+
reqObj['attr'] = this.dtlAttr;
|
|
397
|
+
reqObj['attrVal'] = attrDtlVal;
|
|
398
|
+
this.header["method"] = 'addDetailAttr';
|
|
399
|
+
console.log(JSON.stringify(reqObj));
|
|
400
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
401
|
+
console.log("addDetailAttr", response);
|
|
402
|
+
if (response.status == 'SUCCESS') {
|
|
403
|
+
this.gresultCount++;
|
|
404
|
+
let result = response.result || {};
|
|
405
|
+
console.log(result.attrDetails);
|
|
406
|
+
let attrDetails = result.attrDetails || {};
|
|
407
|
+
this.rowdatamapDetails[this.dtlAttr][this.dtloptionval] = attrDetails[this.dtloptionval];
|
|
408
|
+
// this.spinnerService.hide();
|
|
409
|
+
}
|
|
410
|
+
// this.spinnerService.hide();
|
|
411
|
+
}, error => {
|
|
412
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
// this.flashMessagesService.show("Mapping attribute is empty please retry.", { cssClass: 'alert-danger', timeout: 3000 });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
onSubmit(formVal) {
|
|
420
|
+
var t = Object.keys(formVal.form.controls).forEach(field => {
|
|
421
|
+
const control = formVal.form.get(field);
|
|
422
|
+
});
|
|
423
|
+
this.saveFileOption(formVal.value);
|
|
424
|
+
}
|
|
425
|
+
saveFileOption(frmvals) {
|
|
426
|
+
// this.spinnerService.show();
|
|
427
|
+
let reqObj = {};
|
|
428
|
+
reqObj = { ...frmvals, column_format: this.colFormate, ignore_column: this.ignoreFormate };
|
|
429
|
+
reqObj['formNme'] = 'fileUpload';
|
|
430
|
+
console.log(JSON.stringify(reqObj));
|
|
431
|
+
debugger;
|
|
432
|
+
this.header["method"] = 'addFileOption';
|
|
433
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
434
|
+
if (response.status == 'SUCCESS') {
|
|
435
|
+
debugger;
|
|
436
|
+
let result = response.result || {};
|
|
437
|
+
this.fileOptionsList = result.fileOptionsList;
|
|
438
|
+
this.fileType = result.file_idn;
|
|
439
|
+
this.ValidateFileHeaderMapping('N');
|
|
440
|
+
// this.spinnerService.hide();
|
|
441
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
442
|
+
}
|
|
443
|
+
// this.spinnerService.hide();
|
|
444
|
+
}, error => {
|
|
445
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
addFileLog(fileIdn) {
|
|
449
|
+
debugger;
|
|
450
|
+
let reqObj = {};
|
|
451
|
+
reqObj['formNme'] = 'fileUpload';
|
|
452
|
+
reqObj['file_idn'] = fileIdn;
|
|
453
|
+
reqObj['file_status'] = "Header Inserted";
|
|
454
|
+
reqObj['validation_remarks'] = "Header validated";
|
|
455
|
+
reqObj['header_row'] = this.allcols;
|
|
456
|
+
reqObj['header_attr_row'] = this.colFormate;
|
|
457
|
+
this.header["method"] = 'addFileLog';
|
|
458
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
459
|
+
if (response.status == 'SUCCESS') {
|
|
460
|
+
debugger;
|
|
461
|
+
let result = response.result || {};
|
|
462
|
+
this.fileLogIdn = result.file_log_idn;
|
|
463
|
+
this.setRowDataMapp();
|
|
464
|
+
// this.spinnerService.hide();
|
|
465
|
+
// this.flashMessagesService.show("Header validated successfully", { cssClass: 'alert-success', timeout: 3000 });
|
|
466
|
+
}
|
|
467
|
+
// this.spinnerService.hide();
|
|
468
|
+
}, error => {
|
|
469
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
ValidateFileHeaderMapping(formatSave) {
|
|
473
|
+
// this.spinnerService.show();
|
|
474
|
+
this.show = true;
|
|
475
|
+
this.stepMsg = 'Header verification in process ...';
|
|
476
|
+
this.colFormate = [];
|
|
477
|
+
this.ignoreFormate = [];
|
|
478
|
+
this.allcols = [];
|
|
479
|
+
let isValidate = true;
|
|
480
|
+
this.headerList.forEach(hdr => {
|
|
481
|
+
let hdrDtl = this.headerAttributeDtl[hdr] || '';
|
|
482
|
+
if (hdrDtl.attr == '' && hdrDtl.ignore != 'Y') {
|
|
483
|
+
isValidate = false;
|
|
484
|
+
}
|
|
485
|
+
if (hdrDtl.attr != '' && hdrDtl.ignore != 'N') {
|
|
486
|
+
this.colFormate.push(hdrDtl.attr);
|
|
487
|
+
}
|
|
488
|
+
if (hdrDtl.ignore == 'Y') {
|
|
489
|
+
this.ignoreFormate.push(hdr);
|
|
490
|
+
}
|
|
491
|
+
this.allcols.push(hdr);
|
|
492
|
+
});
|
|
493
|
+
if (isValidate && (this.fileType == null || this.fileType == undefined || this.fileType == "")) {
|
|
494
|
+
// this.spinnerService.hide();
|
|
495
|
+
this.stepMsg = "";
|
|
496
|
+
document.getElementById('btnfileUploadModal').click();
|
|
497
|
+
this.step = 2;
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
if (isValidate) {
|
|
502
|
+
if (formatSave == 'Y') {
|
|
503
|
+
this.updatefileOption();
|
|
504
|
+
}
|
|
505
|
+
this.addFileLog(this.fileType);
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
// this.spinnerService.hide();
|
|
509
|
+
// this.flashMessagesService.show("Please specify mapping or marke as ignore ", { cssClass: 'alert-danger', timeout: 3000 });
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
this.show = false;
|
|
513
|
+
}
|
|
514
|
+
updatefileOption() {
|
|
515
|
+
let reqObj = {};
|
|
516
|
+
reqObj['formNme'] = 'fileUpload';
|
|
517
|
+
reqObj['fileIdn'] = this.fileType;
|
|
518
|
+
reqObj['column_format'] = this.colFormate;
|
|
519
|
+
reqObj['ignore_column'] = this.ignoreFormate;
|
|
520
|
+
this.header["method"] = 'updateColumnFormat';
|
|
521
|
+
console.log(JSON.stringify(reqObj));
|
|
522
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
523
|
+
if (response.status == 'SUCCESS') {
|
|
524
|
+
}
|
|
525
|
+
}, error => {
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
uploadFile() {
|
|
529
|
+
this.dateFormat = this.dateFormat || 'dd/mm/yy';
|
|
530
|
+
this.delim = this.delim || '/';
|
|
531
|
+
this.show = true;
|
|
532
|
+
let dateValid = true;
|
|
533
|
+
let massage = "";
|
|
534
|
+
if (!this.mappingskip) {
|
|
535
|
+
this.stepMsg = "Data verification in process ...";
|
|
536
|
+
this.headerList.forEach(hdr => {
|
|
537
|
+
debugger;
|
|
538
|
+
let attr = this.headerAttributeDtl[hdr].attr || '';
|
|
539
|
+
let attrType = this.headerAttributeDtl[hdr].dta_typ || '';
|
|
540
|
+
let isIgnore = this.headerAttributeDtl[hdr].ignore || '';
|
|
541
|
+
if (isIgnore == 'Y') {
|
|
542
|
+
this.mappSheetData.map((rowData, i) => {
|
|
543
|
+
delete this.mappSheetData[i][hdr];
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
if (attrType == 'c') {
|
|
548
|
+
this.mappSheetData.map((rowData, i) => {
|
|
549
|
+
if (this.charHeaderList.indexOf(hdr) != -1) {
|
|
550
|
+
let attrdtlVal = rowData[hdr] || '';
|
|
551
|
+
if (attrdtlVal != '') {
|
|
552
|
+
let attrDtlMapVal = this.rowdatamapDetails[attr][attrdtlVal].srt;
|
|
553
|
+
this.mappSheetData[i][attr] = attrDtlMapVal.toString();
|
|
554
|
+
}
|
|
555
|
+
if (attr != hdr)
|
|
556
|
+
delete this.mappSheetData[i][hdr];
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
else if (attrType == 'n') {
|
|
561
|
+
this.mappSheetData.map((rowData, i) => {
|
|
562
|
+
let attrdtlVal = rowData[hdr] || '';
|
|
563
|
+
if (attrdtlVal != '') {
|
|
564
|
+
debugger;
|
|
565
|
+
attrdtlVal = attrdtlVal.replace(/[^0-9.-]/g, "");
|
|
566
|
+
this.mappSheetData[i][attr] = attrdtlVal.toString();
|
|
567
|
+
}
|
|
568
|
+
if (attr != hdr)
|
|
569
|
+
delete this.mappSheetData[i][hdr];
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
else if (attrType == 'd') {
|
|
573
|
+
this.mappSheetData.map((rowData, i) => {
|
|
574
|
+
debugger;
|
|
575
|
+
let attrdtlVal = rowData[hdr] || '';
|
|
576
|
+
let dtFrm = this.dateFormatMap[hdr] || 'dd/mm/yy';
|
|
577
|
+
if (attrdtlVal != '')
|
|
578
|
+
attrdtlVal = this.cs.dateValidation(attrdtlVal, dtFrm);
|
|
579
|
+
if (attrdtlVal == 'invaild') {
|
|
580
|
+
dateValid = false;
|
|
581
|
+
massage = "Please check Date :" + rowData[hdr] + " Date Format :" + dtFrm;
|
|
582
|
+
}
|
|
583
|
+
this.mappSheetData[i][attr] = attrdtlVal.toString();
|
|
584
|
+
if (attr != hdr)
|
|
585
|
+
delete this.mappSheetData[i][hdr];
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
else if (attrType == 't') {
|
|
589
|
+
this.mappSheetData.map((rowData, i) => {
|
|
590
|
+
let attrdtlVal = rowData[hdr] || '';
|
|
591
|
+
this.mappSheetData[i][attr] = attrdtlVal.toString();
|
|
592
|
+
if (attr != hdr)
|
|
593
|
+
delete this.mappSheetData[i][hdr];
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
if (dateValid) {
|
|
600
|
+
let reqObj = {};
|
|
601
|
+
reqObj['formNme'] = 'fileUpload'; //this.route.snapshot.params['frmname'];
|
|
602
|
+
reqObj['file_log_idn'] = this.fileLogIdn;
|
|
603
|
+
reqObj['attr_data'] = this.mappSheetData;
|
|
604
|
+
reqObj['in_data'] = this.sheetData;
|
|
605
|
+
reqObj['dateformat'] = this.dateFormatMap;
|
|
606
|
+
this.header["method"] = 'fileUpload';
|
|
607
|
+
let url = "fileUpload/load";
|
|
608
|
+
if (this.mdl == 'inward') {
|
|
609
|
+
url = 'inward/loadFile';
|
|
610
|
+
reqObj['inward_idn'] = this.inward_idn;
|
|
611
|
+
}
|
|
612
|
+
// console.log(reqObj);
|
|
613
|
+
console.log(JSON.stringify(reqObj));
|
|
614
|
+
// console.log(this.header);
|
|
615
|
+
this.cs.loadiFile(reqObj, this.header, url).then((response) => {
|
|
616
|
+
if (response.status == 'SUCCESS') {
|
|
617
|
+
let result = response.result || {};
|
|
618
|
+
console.log(result);
|
|
619
|
+
this.show = false;
|
|
620
|
+
this.step = 4;
|
|
621
|
+
this.fileLogIdn = result.file_log_idn;
|
|
622
|
+
this.hdrIdn = result.hdrIdn;
|
|
623
|
+
this.getProgressFile(this.fileLogIdn);
|
|
624
|
+
this.lableFile = "File Sequence No. " + this.fileLogIdn + " Uploading in progress...";
|
|
625
|
+
// set file id to local storage
|
|
626
|
+
// AsyncLocalStorage.arguments('uploadedFileId', result.file_log_idn);
|
|
627
|
+
this.lable = "Pricing Sequence No. " + this.hdrIdn + " Price calculations in progress...";
|
|
628
|
+
this.getProgressPrice(this.hdrIdn);
|
|
629
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
630
|
+
}
|
|
631
|
+
this.show = false;
|
|
632
|
+
// this.spinnerService.hide();
|
|
633
|
+
}, error => {
|
|
634
|
+
this.show = false;
|
|
635
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
else {
|
|
639
|
+
this.ngOnInit();
|
|
640
|
+
// this.flashMessagesService.show(massage, { cssClass: 'alert-danger', timeout: 4000 });
|
|
641
|
+
}
|
|
642
|
+
console.log("mappSheetData", JSON.stringify(this.mappSheetData));
|
|
643
|
+
console.log("this.sheetData", JSON.stringify(this.sheetData));
|
|
644
|
+
}
|
|
645
|
+
changeMapping(hdrObj, hdr, attr) {
|
|
646
|
+
this.headerAttributeDtl[hdr].ignore = 'Y';
|
|
647
|
+
this.headerAttributeDtl[hdr].attr = '';
|
|
648
|
+
this.removeAttrOptVal(attr, hdr);
|
|
649
|
+
}
|
|
650
|
+
removeAttrOptVal(attr, optionaVal) {
|
|
651
|
+
let reqObj = {};
|
|
652
|
+
reqObj['formNme'] = 'fileUpload';
|
|
653
|
+
reqObj['attr'] = attr;
|
|
654
|
+
reqObj['optionaVal'] = optionaVal;
|
|
655
|
+
console.log(JSON.stringify(reqObj));
|
|
656
|
+
this.header["method"] = 'removeAttrOptVal';
|
|
657
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
658
|
+
if (response.status == 'SUCCESS') {
|
|
659
|
+
// this.spinnerService.hide();
|
|
660
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
661
|
+
}
|
|
662
|
+
// this.spinnerService.hide();
|
|
663
|
+
}, error => {
|
|
664
|
+
// this.spinnerService.hide();
|
|
665
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
removeDetailAttrOptVal(attrIdn, optionaVal, val, hdrAttr) {
|
|
669
|
+
this.rowdatamapDetails[hdrAttr][optionaVal].val = '';
|
|
670
|
+
let reqObj = {};
|
|
671
|
+
reqObj['formNme'] = 'fileUpload';
|
|
672
|
+
reqObj['attrVal'] = val;
|
|
673
|
+
reqObj['optionaVal'] = optionaVal;
|
|
674
|
+
reqObj['attr_idn'] = attrIdn;
|
|
675
|
+
console.log(JSON.stringify(reqObj));
|
|
676
|
+
this.header["method"] = 'removeAttrOptVal';
|
|
677
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
678
|
+
if (response.status == 'SUCCESS') {
|
|
679
|
+
// this.spinnerService.hide();
|
|
680
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
681
|
+
}
|
|
682
|
+
// this.spinnerService.hide();
|
|
683
|
+
}, error => {
|
|
684
|
+
// this.spinnerService.hide();
|
|
685
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
getProgressFile(fileLogIdn) {
|
|
689
|
+
let reqObj = {};
|
|
690
|
+
reqObj['formNme'] = 'fileUpload';
|
|
691
|
+
reqObj['file_log_idn'] = fileLogIdn; //this.fileLogIdn;
|
|
692
|
+
console.log(JSON.stringify(reqObj));
|
|
693
|
+
this.header["method"] = 'getFileLogStatus';
|
|
694
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
695
|
+
if (response.status == 'SUCCESS') {
|
|
696
|
+
this.clicked = true;
|
|
697
|
+
let result = response.result || {};
|
|
698
|
+
console.log(result);
|
|
699
|
+
this.sttsFile['C'] = result['C'];
|
|
700
|
+
this.sttsFile['P'] = result['P'];
|
|
701
|
+
this.sttsFile['E'] = result['E'];
|
|
702
|
+
this.sttsFile['T'] = result['T'];
|
|
703
|
+
this.sttsFile['I'] = result['I'];
|
|
704
|
+
this.step = 4;
|
|
705
|
+
this.totProgressFile = Math.ceil(parseFloat(result['C']) * 100 / parseFloat(result['T']));
|
|
706
|
+
this.recallFile(fileLogIdn);
|
|
707
|
+
console.log(this.totProgress);
|
|
708
|
+
// this.spinnerService.hide();
|
|
709
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
710
|
+
}
|
|
711
|
+
// this.spinnerService.hide();
|
|
712
|
+
}, error => {
|
|
713
|
+
// this.spinnerService.hide();
|
|
714
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
getProgressPrice(hdrIdn) {
|
|
718
|
+
// this.spinnerService.show();
|
|
719
|
+
let reqObj = {};
|
|
720
|
+
reqObj['formNme'] = 'fileUpload';
|
|
721
|
+
reqObj['seqNo'] = hdrIdn; //"846";//this.fileLogIdn;
|
|
722
|
+
console.log(JSON.stringify(reqObj));
|
|
723
|
+
this.header["method"] = 'getPriceStatus';
|
|
724
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
725
|
+
if (response.status == 'SUCCESS') {
|
|
726
|
+
this.clicked = true;
|
|
727
|
+
let result = response.result || {};
|
|
728
|
+
console.log(result);
|
|
729
|
+
this.stts['C'] = result['C'];
|
|
730
|
+
this.stts['P'] = result['P'];
|
|
731
|
+
this.stts['E'] = result['E'];
|
|
732
|
+
this.stts['T'] = result['T'];
|
|
733
|
+
this.step = 4;
|
|
734
|
+
this.totProgress = Math.ceil(parseFloat(result['C']) * 100 / parseFloat(result['T']));
|
|
735
|
+
this.recall(this.hdrIdn);
|
|
736
|
+
console.log(this.totProgress);
|
|
737
|
+
// this.spinnerService.hide();
|
|
738
|
+
// this.flashMessagesService.show(response.message, { cssClass: 'alert-success', timeout: 3000 });
|
|
739
|
+
}
|
|
740
|
+
// this.spinnerService.hide();
|
|
741
|
+
}, error => {
|
|
742
|
+
// this.spinnerService.hide();
|
|
743
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
744
|
+
});
|
|
745
|
+
}
|
|
746
|
+
recallFile(fileLogIdn) {
|
|
747
|
+
if (this.totProgressFile < 100) {
|
|
748
|
+
this.lastRefreshTimeFile = new Date();
|
|
749
|
+
this.timerfile =
|
|
750
|
+
setTimeout(() => {
|
|
751
|
+
this.getProgressFile(fileLogIdn);
|
|
752
|
+
}, 5000);
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
clearTimeout(this.timerfile);
|
|
756
|
+
// this.PlanningComponent.getPacketsByHeaderId(hdrIdn);
|
|
757
|
+
// this.closebtn.nativeElement.click();
|
|
758
|
+
if (this.totProgressFile == 100 && this.totProgress == 100) {
|
|
759
|
+
document.getElementById('btnfileUploadModal').click();
|
|
760
|
+
this.router.navigate(['/pricing/rough/planingscreen/roughPlaningScreen'], { queryParams: { hdrId: this.hdrIdn } });
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
recall(hdrIdn) {
|
|
765
|
+
if (this.totProgress < 100) {
|
|
766
|
+
this.lastRefreshTime = new Date();
|
|
767
|
+
this.timerPrice =
|
|
768
|
+
setTimeout(() => {
|
|
769
|
+
this.getProgressPrice(hdrIdn);
|
|
770
|
+
}, 5000);
|
|
771
|
+
}
|
|
772
|
+
else {
|
|
773
|
+
clearTimeout(this.timerPrice);
|
|
774
|
+
if (this.totProgressFile == 100 && this.totProgress == 100) {
|
|
775
|
+
document.getElementById('btnfileUploadModal').click();
|
|
776
|
+
this.router.navigate(['/pricing/rough/planingscreen/roughPlaningScreen'], { queryParams: { hdrId: this.hdrIdn } });
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
SkipVerification() {
|
|
781
|
+
debugger;
|
|
782
|
+
this.mappingskip = true;
|
|
783
|
+
this.addFileLog(this.fileType);
|
|
784
|
+
}
|
|
785
|
+
SkipVerificationDtl() {
|
|
786
|
+
this.mappingskip = true;
|
|
787
|
+
this.step = 4;
|
|
788
|
+
this.uploadFile();
|
|
789
|
+
}
|
|
790
|
+
loadFileTypeData(fileUpload, mdl) {
|
|
791
|
+
this.sheetData = [];
|
|
792
|
+
this.headerAttributeDtl = {};
|
|
793
|
+
this.defultDisplayLen = 5;
|
|
794
|
+
this.defultDisplayObj = [];
|
|
795
|
+
this.attrStructureDtl = [];
|
|
796
|
+
this.headerList = [];
|
|
797
|
+
this.headerprp;
|
|
798
|
+
this.attrprp;
|
|
799
|
+
this.totalmatch = 0;
|
|
800
|
+
this.totalignore = 0;
|
|
801
|
+
this.pageDefination = {};
|
|
802
|
+
this.rowdatamapDetails = {};
|
|
803
|
+
this.rowdistinctDataMap = {};
|
|
804
|
+
this.charHeaderList = [];
|
|
805
|
+
this.attributeDtlMap = {};
|
|
806
|
+
this.mappSheetData = [];
|
|
807
|
+
this.statusList = [];
|
|
808
|
+
this.fileDetails = [];
|
|
809
|
+
this.fileTypeList = [];
|
|
810
|
+
this.fileOptionsList = [];
|
|
811
|
+
this.fileType;
|
|
812
|
+
this.nme;
|
|
813
|
+
this.typ;
|
|
814
|
+
this.description;
|
|
815
|
+
this.check_status = [];
|
|
816
|
+
this.pkt_status = [];
|
|
817
|
+
this.colFormate = [];
|
|
818
|
+
this.allcols = [];
|
|
819
|
+
this.fileLogIdn = 0;
|
|
820
|
+
this.show = false;
|
|
821
|
+
this.stepMsg = '';
|
|
822
|
+
this.stts = {};
|
|
823
|
+
this.clicked = false;
|
|
824
|
+
this.totProgress = 0;
|
|
825
|
+
this.totProgressFile = 0;
|
|
826
|
+
this.step = 1;
|
|
827
|
+
this.lable = "";
|
|
828
|
+
this.filenme = "";
|
|
829
|
+
let reqObj = {};
|
|
830
|
+
this.dateFormatMap = {};
|
|
831
|
+
let filetype = this.route.snapshot.params['filetype'] || '';
|
|
832
|
+
this.mdl = mdl;
|
|
833
|
+
this.filenme = this.route.snapshot.params['filetype'] || '';
|
|
834
|
+
this.mappingskip = false;
|
|
835
|
+
reqObj['formNme'] = fileUpload;
|
|
836
|
+
if (mdl != '')
|
|
837
|
+
reqObj['mdl'] = mdl;
|
|
838
|
+
if (filetype != '')
|
|
839
|
+
reqObj['filenme'] = filetype;
|
|
840
|
+
console.log(JSON.stringify(this.header));
|
|
841
|
+
console.log(JSON.stringify(reqObj));
|
|
842
|
+
this.header["method"] = 'loadFileUpload';
|
|
843
|
+
this.cs.loadiFile(reqObj, this.header, 'fileUpload/load').then((response) => {
|
|
844
|
+
if (response.status == 'SUCCESS') {
|
|
845
|
+
console.log(response);
|
|
846
|
+
debugger;
|
|
847
|
+
let result = response.result || {};
|
|
848
|
+
this.pageDefination = result.pageDefination;
|
|
849
|
+
this.statusList = result.statusList;
|
|
850
|
+
this.fileDetails = result.fileDetails;
|
|
851
|
+
this.fileTypeList = result.fileTypeList;
|
|
852
|
+
this.fileOptionsList = result.fileOptionsList || [];
|
|
853
|
+
if (this.fileOptionsList.length > 0)
|
|
854
|
+
this.fileType = this.fileOptionsList[0].k;
|
|
855
|
+
let addlAttr = this.fileOptionsList[0].addl_attr || {};
|
|
856
|
+
this.dateFormat = addlAttr.dateformat || 'dd/mm/yy';
|
|
857
|
+
this.delim = addlAttr.delim || '/';
|
|
858
|
+
this.statusList = result.statusList.map(option => ({
|
|
859
|
+
value: option.k,
|
|
860
|
+
label: option.v
|
|
861
|
+
}));
|
|
862
|
+
}
|
|
863
|
+
// this.spinnerService.hide();
|
|
864
|
+
}, error => {
|
|
865
|
+
// this.flashMessagesService.show(error, { cssClass: 'alert-danger', timeout: 3000 });
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
ngOnInit() {
|
|
869
|
+
let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
|
|
870
|
+
let cUrl = this.router.url;
|
|
871
|
+
this.cDt = new Date();
|
|
872
|
+
this.header = {
|
|
873
|
+
'clientkey': Cookie.get('_ck'),
|
|
874
|
+
'Content-Type': 'application/json',
|
|
875
|
+
'loginid': Cookie.get('_logid'),
|
|
876
|
+
'modulekey': mdlk[cUrl.split('/')[1]],
|
|
877
|
+
'source': 'qs'
|
|
878
|
+
};
|
|
879
|
+
this.route.params.subscribe((params) => {
|
|
880
|
+
let mdl = this.route.snapshot.params['grp'] || '';
|
|
881
|
+
this.loadFileTypeData('fileUpload', mdl);
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
stockInwardUpload(inwardDtl, mdl) {
|
|
885
|
+
this.inward_idn = inwardDtl.inward_idn;
|
|
886
|
+
this.inwardStockType = inwardDtl.stock_type;
|
|
887
|
+
this.mdl = mdl;
|
|
888
|
+
this.loadFileTypeData('fileUpload', mdl);
|
|
889
|
+
}
|
|
890
|
+
ngOnDestroy() {
|
|
891
|
+
if (this.timerfile != undefined)
|
|
892
|
+
clearTimeout(this.timerfile);
|
|
893
|
+
if (this.timerPrice != undefined)
|
|
894
|
+
clearTimeout(this.timerPrice);
|
|
895
|
+
}
|
|
896
|
+
setOptionsForMixToSingle() {
|
|
897
|
+
this.fileOptionsList = [
|
|
898
|
+
{ "k": "696", "v": "Marketing Stock" }
|
|
899
|
+
];
|
|
900
|
+
this.fileType = "696";
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
FileuploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileuploadComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.HttpClient }, { token: i3.CommanServiceService }], target: i0.ɵɵFactoryTarget.Component });
|
|
904
|
+
FileuploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: FileuploadComponent, selector: "app-fileupload", viewQueries: [{ propertyName: "closehdrbtn", first: true, predicate: ["closehdrbtn"], descendants: true }, { propertyName: "closedtlbtn", first: true, predicate: ["closedtlbtn"], descendants: true }, { propertyName: "Cofirmmapdtl", first: true, predicate: ["Cofirmmapdtl"], descendants: true }], ngImport: i0, template: "<div class=\"mt\" style=\"background: #fff;\">\r\n\r\n <div class=\"content-frame\">\r\n <p *ngIf=\"show\" class=\"loading-text\" style=\"z-index: 9999\"> {{stepMsg}} </p>\r\n\r\n <div class=\"innerD\">\r\n <div class=\"mt-element-step\">\r\n <div class=\"row step-thin\">\r\n\r\n <div class=\"col-md-2 bg-grey mt-step-col\" [ngClass]=\"{'done':step==1 ? 'done':''}\"\r\n (click)=setSetp(1)>\r\n <div class=\"mt-step-number bg-white font-grey\">1</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Browse</div>\r\n </div>\r\n <div class=\"col-md-4 bg-grey mt-step-col\" [ngClass]=\"{'done':step==2 ? 'done':''}\"\r\n (click)=setSetp(2)>\r\n <div class=\"mt-step-number bg-white font-grey\">2</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Header Verification</div>\r\n </div>\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==3 ? 'done':''}\"\r\n (click)=setSetp(3)>\r\n <div class=\"mt-step-number bg-white font-grey\">3</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Data Verification</div>\r\n </div>\r\n\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==4 ? 'done':''}\"\r\n (click)=setSetp(4)>\r\n <div class=\"mt-step-number bg-white font-grey\">4</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Uploading..</div>\r\n </div>\r\n </div>\r\n <div class=\"row upload\" *ngIf=\"step==1\">\r\n\r\n\r\n <div class=\"col-md-offset-3 col-md-3\" style=\"margin-top: 15px;\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-4 control-label\" style=\"padding: 5px;\">File Type :</label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"fileType\" [(ngModel)]=\"fileType\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileOptionsList\" value=\"{{file?.k}}\">{{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-md-2\">\r\n <a class=\"fileinput-wrapper btn btn-default fileinput btn-primary\"\r\n style=\"background: #3a5898\"><span>Browse file</span>\r\n <input type=\"file\" class=\"fileinput btn-primary\" name=\"filename\" id=\"filename\"\r\n title=\"Browse file\" accept=\".xlsx,.csv\" (change)=\"incomingfile($event)\"\r\n style=\"left: -163.75px; top: 9px;\"></a>\r\n\r\n </div>\r\n\r\n <!-- <label class=\"control-label\">Upload File : </label>\r\n\r\n <input type=\"file\" class=\"fileinput btn-primary\" accept=\".xlsx,.csv\" name=\"filename\" id=\"filename\"\r\n (change)=\"incomingfile($event)\" title=\"Browse file\"> -->\r\n\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==2\">\r\n <div class=\"row\">\r\n <div class=\"col-md-1\">\r\n Total Match : {{totalmatch}}\r\n </div>\r\n <div class=\"col-md-1\">\r\n Total Ignore : {{totalignore}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row col-md-12\" style=\"overflow: auto;width: 100%;\">\r\n <table class=\"fileuploadview\">\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th [ngClass]=\"{\r\n 'match':headerAttributeDtl[hdr].attr!='' && headerAttributeDtl[hdr].ignore!='Y',\r\n 'ignore':headerAttributeDtl[hdr].ignore=='Y',\r\n 'thbg':headerAttributeDtl[hdr].attr=='' && headerAttributeDtl[hdr].ignore!='Y'\r\n }\" (click)=\"updatecolumnstatue(hdr)\">{{hdr}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr==''\">\r\n <!-- <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr,$event.target)\"> -->\r\n <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr)\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let attrDtl of attrStructureDtl\"\r\n value=\"{{attrDtl?.attr}}\">{{attrDtl?.attr}}</option>\r\n </select>\r\n </ng-container>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr!=''\">\r\n {{headerAttributeDtl[hdr].attr}}\r\n \r\n </ng-container>\r\n\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].dta_typ=='d'\">\r\n <select class=\"select-control\" name=\"{{dateFormatMap[hdr]}}\"\r\n [(ngModel)]=\"dateFormatMap[hdr]\"\r\n >\r\n <option *ngFor=\"let dteFmt of dateFormatList\"\r\n value=\"{{dteFmt?.k}}\">{{dteFmt?.v}}</option>\r\n </select>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr> \r\n <tr *ngFor=\"let rowDis of defultDisplayObj ;\">\r\n <td *ngFor=\"let hdr of headerList ;\">\r\n {{rowDis[hdr]}}\r\n </td>\r\n\r\n </tr>\r\n\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerification()\">Skip</button>\r\n \r\n <button type=\"button\" *ngIf=\"fileLogIdn==0\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"ValidateFileHeaderMapping('Y')\">Verify</button>\r\n\r\n \r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row upload \" *ngIf=\"step==3\">\r\n <div class=\"row table-responsive col-md-12\">\r\n <table cellspacing=\"10\" class=\"displayTable fileuploadview\">\r\n <ng-container *ngFor=\"let hdr of charHeaderList ;let j=index;\">\r\n\r\n <tr>\r\n <th style=\"color:white;border: 1px solid white\">\r\n {{hdr}}({{headerAttributeDtl[hdr].attr}})</th>\r\n <td [ngClass]=\"{'even':j%2==0,'odd':j%2==1}\">\r\n <div class=\"row\" style=\"display: flex;\">\r\n <ng-container\r\n *ngFor=\"let attrVal of rowdistinctDataMap[headerAttributeDtl[hdr].attr];\">\r\n <div style=\"width:160px;margin-right: 1px\"\r\n [ngClass]=\"{'matchedUl':rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val !=''}\">\r\n <ul style=\"list-style: none;text-align:left\">\r\n <li> {{attrVal}} </li>\r\n <li>\r\n <select\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val==''\"\r\n class=\"select-control\"\r\n name=\"{{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}}\"\r\n [(ngModel)]=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val\"\r\n (change)=\"confirmHeaderDetailsMapp(headerAttributeDtl[hdr].attr,headerAttributeDtl[hdr].attr_idn,attrVal)\">\r\n <option value=\"\">--select--</option>\r\n <option\r\n *ngFor=\"let attrdtlmap of attributeDtlMap[headerAttributeDtl[hdr].attr]\"\r\n value=\"{{attrdtlmap?.val}}\">{{attrdtlmap?.val}}\r\n </option>\r\n </select>\r\n\r\n <span\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val!=''\">\r\n {{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}} \r\n <i (click)=\"removeDetailAttrOptVal(headerAttributeDtl[hdr].attr_idn,attrVal,rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val,[headerAttributeDtl[hdr].attr])\" class=\"fa fa-times\" aria-hidden=\"true\" style=\"color: red;cursor: pointer;\"></i>\r\n </span>\r\n \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerificationDtl()\">Skip</button>\r\n \r\n <button type=\"button\" class=\"btn btn-success pull-right\" style=\"margin: 5px\"\r\n (click)=\"uploadFile()\" [disabled]=\"gmatchedCount!=gresultCount\">Upload</button>\r\n \r\n \r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==4\">\r\n\r\n <div class=\"row\">\r\n\r\n </div>\r\n\r\n <div class=\"row\">\r\n\r\n <p *ngIf=\"step==4\" style=\"margin-left: 15px;color:green;font-size: 20px;text-align: left\">\r\n {{lableFile}}\r\n <span style=\"font-size: 14px;\" *ngIf=\"lastRefreshTimeFile != null\">Last\r\n refresh time :\r\n ({{lastRefreshTimeFile | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgressFile+'%'} \">\r\n {{totProgressFile}} %\r\n </div>\r\n </div>\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{sttsFile['C']}}\r\n Pending : {{sttsFile['P']}} Error :\r\n {{sttsFile['E']}} Invaild Status :\r\n {{sttsFile['I']}}\r\n Total : {{sttsFile['T']}}</strong></p>\r\n\r\n\r\n <p *ngIf=\"step==4\"\r\n style=\"margin-left: 15px;color:green;font-size: 20px;margin-top: 15px;text-align: left\">\r\n {{lable}}\r\n <span style=\"font-size: 12px;margin-left: 20px;color: black;\"\r\n *ngIf=\"lastRefreshTime != null\">Last\r\n refresh time :\r\n ({{lastRefreshTime | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgress+'%'} \">\r\n {{totProgress}} %\r\n </div>\r\n </div>\r\n\r\n <!-- <button type=\"button\" class=\"btn btn-success text-center\" style=\"margin: 5px\"\r\n (click)=\"checkUploadStt()\">Check\r\n Status</button> -->\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{stts['C']}}\r\n Pending : {{stts['P']}} Error : {{stts['E']}}\r\n Total : {{stts['T']}}</strong></p>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<div class=\"modal\" id=\"fileUploadModal\" tabindex=\"-1\" style=\"z-index: 999999\" role=\"dialog\"\r\n aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog \">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" #fileUploadclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Add file upload option</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n <div class=\"col-md-12\">\r\n <form class=\"form-horizontal\" role=\"form\" #f=\"ngForm\" (ngSubmit)=\"onSubmit(f)\" name=\"appForm\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Name\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nme\" name=\"nme\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Description\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"description\"\r\n name=\"description\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Type\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"typ\" [(ngModel)]=\"typ\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileTypeList\" value=\"{{file?.k}}\">\r\n {{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Check status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"check_status\" name=\"check_status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Packet status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"pkt_status\" name=\"pkt_status\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #fileUploadclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"onSubmit(f)\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"Cofirmmaphdr\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{maphdr}}</b> To Attribute <b>{{hdrmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" (click)=\"CancelHeaderMapp()\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderMapp();\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"Cofirmmapdtl\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{dtloptionval}}</b> To Attribute <b> {{dtlAttr}} </b> with AttributeDetail <b>{{dtlmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" (click)=\"CancelHeaderDetailsMapp()\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderDetailsMapp()\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n<button id=\"btnfileUploadModal\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#fileUploadModal\"></button>\r\n\r\n<button id=\"btnCofirmmaphdr\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmaphdr\"></button>\r\n<button id=\"btnCofirmmapdtl\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmapdtl\"></button>\r\n\r\n\r\n\r\n<!-- <div class=\"centered\">\r\n <div id=\"divSpinner\" class=\"spinner loading\">\r\n <div class=\"loading-text\">Loading ...</div>\r\n </div>\r\n\r\n <button (click)=\"test()\" id=\"btnLoadRecords\" style=\"cursor:pointer;position: absolute; top: 52%; left: 45%;\">Load Records</button>\r\n </div> -->", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px;background:#1b1e24}.innerD{min-height:calc(100vh - 100px);background:#fff}.mt-element-step .row{margin:0}.mt-element-step .step-thin .mt-step-col{padding-top:10px;padding-bottom:10px}.mt-element-step .step-thin .mt-step-number{font-size:22px;border-radius:50%!important;float:left;margin:auto;padding:3px 14px}.mt-element-step .step-thin .mt-step-title{font-size:20px;font-weight:100;padding-left:60px;margin-top:-4px}.mt-element-step .step-thin .mt-step-content{padding-left:60px;margin-top:-5px}.mt-element-step .step-thin .done{background-color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-number{color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-content,.mt-element-step .step-thin .done .mt-step-title{color:#fff!important}.font-grey-cascade{color:#95a5a6!important}.font-grey{color:#e5e5e5!important}.bg-grey{background:#E5E5E5!important}.bg-white{background:#fff!important}.mt-element-step .upload{text-align:center;padding-top:15px;padding-bottom:10px}.fileuploadview{width:calc(100% - 1px)}.fileuploadview th{padding:2px 5px;font-weight:700;font-size:12px;color:#000;height:35px;white-space:nowrap;text-align:center;vertical-align:middle}.fileuploadview tr{background-color:#fff}.fileuploadview td{height:25px;white-space:nowrap;text-align:center;font-size:9pt;padding:5px;border:1px solid white}.match{background-color:#95b75d!important}.ignore{background-color:#ff7a7a!important}.thbg{background-color:#e5e5e5!important}.select-control{height:20px;font-size:12px;line-height:18px;box-shadow:none;border:1px solid #D5D5D5;background:#F9F9F9;display:block;width:100%;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.displayTable td.odd:hover,.displayTable td.even:hover{background-color:#e3f6ff}.displayTable td.odd{background-color:#efefef}.displayTable td.even{background-color:#f8f8f8}.displayTable td a:BEFORE{color:green}.displayTable th a{text-align:center;color:#000}.displayTable th a:visited{text-align:center;color:#fff}.displayTable th a:hover{color:#fc0;background-color:transparent;text-align:center}.matchedUl{background-color:#beccd2}.loading-text{width:400px;position:absolute;top:calc(50% - 370px);left:calc(50% - 180px);text-align:center;color:#00f;font-size:25px}\n"], components: [{ type: i4.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i5.DatePipe } });
|
|
905
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FileuploadComponent, decorators: [{
|
|
906
|
+
type: Component,
|
|
907
|
+
args: [{ selector: 'app-fileupload', template: "<div class=\"mt\" style=\"background: #fff;\">\r\n\r\n <div class=\"content-frame\">\r\n <p *ngIf=\"show\" class=\"loading-text\" style=\"z-index: 9999\"> {{stepMsg}} </p>\r\n\r\n <div class=\"innerD\">\r\n <div class=\"mt-element-step\">\r\n <div class=\"row step-thin\">\r\n\r\n <div class=\"col-md-2 bg-grey mt-step-col\" [ngClass]=\"{'done':step==1 ? 'done':''}\"\r\n (click)=setSetp(1)>\r\n <div class=\"mt-step-number bg-white font-grey\">1</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Browse</div>\r\n </div>\r\n <div class=\"col-md-4 bg-grey mt-step-col\" [ngClass]=\"{'done':step==2 ? 'done':''}\"\r\n (click)=setSetp(2)>\r\n <div class=\"mt-step-number bg-white font-grey\">2</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Header Verification</div>\r\n </div>\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==3 ? 'done':''}\"\r\n (click)=setSetp(3)>\r\n <div class=\"mt-step-number bg-white font-grey\">3</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Data Verification</div>\r\n </div>\r\n\r\n <div class=\"col-md-3 bg-grey mt-step-col\" [ngClass]=\"{'done':step==4 ? 'done':''}\"\r\n (click)=setSetp(4)>\r\n <div class=\"mt-step-number bg-white font-grey\">4</div>\r\n <div class=\"mt-step-title uppercase font-grey-cascade\">Uploading..</div>\r\n </div>\r\n </div>\r\n <div class=\"row upload\" *ngIf=\"step==1\">\r\n\r\n\r\n <div class=\"col-md-offset-3 col-md-3\" style=\"margin-top: 15px;\">\r\n <div class=\"form-group w-100\">\r\n <label class=\"col-md-4 control-label\" style=\"padding: 5px;\">File Type :</label>\r\n <div class=\"col-md-8\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"fileType\" [(ngModel)]=\"fileType\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileOptionsList\" value=\"{{file?.k}}\">{{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"col-md-2\">\r\n <a class=\"fileinput-wrapper btn btn-default fileinput btn-primary\"\r\n style=\"background: #3a5898\"><span>Browse file</span>\r\n <input type=\"file\" class=\"fileinput btn-primary\" name=\"filename\" id=\"filename\"\r\n title=\"Browse file\" accept=\".xlsx,.csv\" (change)=\"incomingfile($event)\"\r\n style=\"left: -163.75px; top: 9px;\"></a>\r\n\r\n </div>\r\n\r\n <!-- <label class=\"control-label\">Upload File : </label>\r\n\r\n <input type=\"file\" class=\"fileinput btn-primary\" accept=\".xlsx,.csv\" name=\"filename\" id=\"filename\"\r\n (change)=\"incomingfile($event)\" title=\"Browse file\"> -->\r\n\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==2\">\r\n <div class=\"row\">\r\n <div class=\"col-md-1\">\r\n Total Match : {{totalmatch}}\r\n </div>\r\n <div class=\"col-md-1\">\r\n Total Ignore : {{totalignore}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"row col-md-12\" style=\"overflow: auto;width: 100%;\">\r\n <table class=\"fileuploadview\">\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th [ngClass]=\"{\r\n 'match':headerAttributeDtl[hdr].attr!='' && headerAttributeDtl[hdr].ignore!='Y',\r\n 'ignore':headerAttributeDtl[hdr].ignore=='Y',\r\n 'thbg':headerAttributeDtl[hdr].attr=='' && headerAttributeDtl[hdr].ignore!='Y'\r\n }\" (click)=\"updatecolumnstatue(hdr)\">{{hdr}}\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr==''\">\r\n <!-- <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr,$event.target)\"> -->\r\n <select class=\"select-control\" name=\"{{headerAttributeDtl[hdr].attr}}\"\r\n [(ngModel)]=\"headerAttributeDtl[hdr].attr\"\r\n (change)=\"confirmsetHeaderMapp(hdr)\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let attrDtl of attrStructureDtl\"\r\n value=\"{{attrDtl?.attr}}\">{{attrDtl?.attr}}</option>\r\n </select>\r\n </ng-container>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].attr!=''\">\r\n {{headerAttributeDtl[hdr].attr}}\r\n \r\n </ng-container>\r\n\r\n </th>\r\n </ng-container>\r\n </tr>\r\n <tr>\r\n <ng-container *ngFor=\"let hdr of headerList ;\">\r\n <th>\r\n <ng-container *ngIf=\"headerAttributeDtl[hdr].dta_typ=='d'\">\r\n <select class=\"select-control\" name=\"{{dateFormatMap[hdr]}}\"\r\n [(ngModel)]=\"dateFormatMap[hdr]\"\r\n >\r\n <option *ngFor=\"let dteFmt of dateFormatList\"\r\n value=\"{{dteFmt?.k}}\">{{dteFmt?.v}}</option>\r\n </select>\r\n </ng-container>\r\n </th>\r\n </ng-container>\r\n </tr> \r\n <tr *ngFor=\"let rowDis of defultDisplayObj ;\">\r\n <td *ngFor=\"let hdr of headerList ;\">\r\n {{rowDis[hdr]}}\r\n </td>\r\n\r\n </tr>\r\n\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerification()\">Skip</button>\r\n \r\n <button type=\"button\" *ngIf=\"fileLogIdn==0\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"ValidateFileHeaderMapping('Y')\">Verify</button>\r\n\r\n \r\n\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row upload \" *ngIf=\"step==3\">\r\n <div class=\"row table-responsive col-md-12\">\r\n <table cellspacing=\"10\" class=\"displayTable fileuploadview\">\r\n <ng-container *ngFor=\"let hdr of charHeaderList ;let j=index;\">\r\n\r\n <tr>\r\n <th style=\"color:white;border: 1px solid white\">\r\n {{hdr}}({{headerAttributeDtl[hdr].attr}})</th>\r\n <td [ngClass]=\"{'even':j%2==0,'odd':j%2==1}\">\r\n <div class=\"row\" style=\"display: flex;\">\r\n <ng-container\r\n *ngFor=\"let attrVal of rowdistinctDataMap[headerAttributeDtl[hdr].attr];\">\r\n <div style=\"width:160px;margin-right: 1px\"\r\n [ngClass]=\"{'matchedUl':rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val !=''}\">\r\n <ul style=\"list-style: none;text-align:left\">\r\n <li> {{attrVal}} </li>\r\n <li>\r\n <select\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val==''\"\r\n class=\"select-control\"\r\n name=\"{{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}}\"\r\n [(ngModel)]=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val\"\r\n (change)=\"confirmHeaderDetailsMapp(headerAttributeDtl[hdr].attr,headerAttributeDtl[hdr].attr_idn,attrVal)\">\r\n <option value=\"\">--select--</option>\r\n <option\r\n *ngFor=\"let attrdtlmap of attributeDtlMap[headerAttributeDtl[hdr].attr]\"\r\n value=\"{{attrdtlmap?.val}}\">{{attrdtlmap?.val}}\r\n </option>\r\n </select>\r\n\r\n <span\r\n *ngIf=\"rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val!=''\">\r\n {{rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val}} \r\n <i (click)=\"removeDetailAttrOptVal(headerAttributeDtl[hdr].attr_idn,attrVal,rowdatamapDetails[headerAttributeDtl[hdr].attr][attrVal].val,[headerAttributeDtl[hdr].attr])\" class=\"fa fa-times\" aria-hidden=\"true\" style=\"color: red;cursor: pointer;\"></i>\r\n </span>\r\n \r\n </li>\r\n </ul>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-offset-11 col-md-1\">\r\n <button type=\"button\" *ngIf=\"fileLogIdn==0 && filenme=='generic'\" class=\"btn btn-success pull-right\"\r\n style=\"margin: 5px\" (click)=\"SkipVerificationDtl()\">Skip</button>\r\n \r\n <button type=\"button\" class=\"btn btn-success pull-right\" style=\"margin: 5px\"\r\n (click)=\"uploadFile()\" [disabled]=\"gmatchedCount!=gresultCount\">Upload</button>\r\n \r\n \r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"row upload\" *ngIf=\"step==4\">\r\n\r\n <div class=\"row\">\r\n\r\n </div>\r\n\r\n <div class=\"row\">\r\n\r\n <p *ngIf=\"step==4\" style=\"margin-left: 15px;color:green;font-size: 20px;text-align: left\">\r\n {{lableFile}}\r\n <span style=\"font-size: 14px;\" *ngIf=\"lastRefreshTimeFile != null\">Last\r\n refresh time :\r\n ({{lastRefreshTimeFile | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgressFile+'%'} \">\r\n {{totProgressFile}} %\r\n </div>\r\n </div>\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{sttsFile['C']}}\r\n Pending : {{sttsFile['P']}} Error :\r\n {{sttsFile['E']}} Invaild Status :\r\n {{sttsFile['I']}}\r\n Total : {{sttsFile['T']}}</strong></p>\r\n\r\n\r\n <p *ngIf=\"step==4\"\r\n style=\"margin-left: 15px;color:green;font-size: 20px;margin-top: 15px;text-align: left\">\r\n {{lable}}\r\n <span style=\"font-size: 12px;margin-left: 20px;color: black;\"\r\n *ngIf=\"lastRefreshTime != null\">Last\r\n refresh time :\r\n ({{lastRefreshTime | date:'medium'}})</span>\r\n </p>\r\n\r\n <div class=\"progress\" style=\"margin: 15px;\">\r\n <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\"\r\n aria-valuemin=\"0\" aria-valuemax=\"100\" [ngStyle]=\"{'width':totProgress+'%'} \">\r\n {{totProgress}} %\r\n </div>\r\n </div>\r\n\r\n <!-- <button type=\"button\" class=\"btn btn-success text-center\" style=\"margin: 5px\"\r\n (click)=\"checkUploadStt()\">Check\r\n Status</button> -->\r\n\r\n <p *ngIf=\"step==4 && clicked\" style=\"margin-top: 35px;\"><strong> Complete :{{stts['C']}}\r\n Pending : {{stts['P']}} Error : {{stts['E']}}\r\n Total : {{stts['T']}}</strong></p>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n\r\n<div class=\"modal\" id=\"fileUploadModal\" tabindex=\"-1\" style=\"z-index: 999999\" role=\"dialog\"\r\n aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog \">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" #fileUploadclsbtn>\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Add file upload option</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n\r\n <div class=\"col-md-12\">\r\n <form class=\"form-horizontal\" role=\"form\" #f=\"ngForm\" (ngSubmit)=\"onSubmit(f)\" name=\"appForm\">\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Name\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nme\" name=\"nme\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Description\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"description\"\r\n name=\"description\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Type\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <select class=\"form-control\" name=\"typ\" [(ngModel)]=\"typ\">\r\n <option value=\"\">--select--</option>\r\n <option *ngFor=\"let file of fileTypeList\" value=\"{{file?.k}}\">\r\n {{file?.v}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Check status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"check_status\" name=\"check_status\" [multiple]=\"true\"\r\n [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <label class=\"col-md-3 control-label\">Packet status\r\n </label>\r\n <div class=\"col-md-5\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Status\" [options]=\"statusList\"\r\n [(ngModel)]=\"pkt_status\" name=\"pkt_status\" [allowClear]=\"true\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" #fileUploadclsbtn>Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"onSubmit(f)\">Save</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"Cofirmmaphdr\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{maphdr}}</b> To Attribute <b>{{hdrmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" (click)=\"CancelHeaderMapp()\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderMapp();\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal\" id=\"Cofirmmapdtl\" role=\"dialog\" aria-labelledby=\"smallModalHead\" aria-hidden=\"true\" data-backdrop=\"static\"\r\n data-keyboard=\"false\">\r\n <div class=\"modal-dialog\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" (click)=\"CancelHeaderMapp()\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\" >Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"smallModalHead\">Alert</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n Are you sure For Mapping <b>{{dtloptionval}}</b> To Attribute <b> {{dtlAttr}} </b> with AttributeDetail <b>{{dtlmassage}}</b> \r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" (click)=\"CancelHeaderDetailsMapp()\">Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" (click)=\"setHeaderDetailsMapp()\">Confirm</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n<button id=\"btnfileUploadModal\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#fileUploadModal\"></button>\r\n\r\n<button id=\"btnCofirmmaphdr\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmaphdr\"></button>\r\n<button id=\"btnCofirmmapdtl\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#Cofirmmapdtl\"></button>\r\n\r\n\r\n\r\n<!-- <div class=\"centered\">\r\n <div id=\"divSpinner\" class=\"spinner loading\">\r\n <div class=\"loading-text\">Loading ...</div>\r\n </div>\r\n\r\n <button (click)=\"test()\" id=\"btnLoadRecords\" style=\"cursor:pointer;position: absolute; top: 52%; left: 45%;\">Load Records</button>\r\n </div> -->", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px;background:#1b1e24}.innerD{min-height:calc(100vh - 100px);background:#fff}.mt-element-step .row{margin:0}.mt-element-step .step-thin .mt-step-col{padding-top:10px;padding-bottom:10px}.mt-element-step .step-thin .mt-step-number{font-size:22px;border-radius:50%!important;float:left;margin:auto;padding:3px 14px}.mt-element-step .step-thin .mt-step-title{font-size:20px;font-weight:100;padding-left:60px;margin-top:-4px}.mt-element-step .step-thin .mt-step-content{padding-left:60px;margin-top:-5px}.mt-element-step .step-thin .done{background-color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-number{color:#3b5998!important}.mt-element-step .step-thin .done .mt-step-content,.mt-element-step .step-thin .done .mt-step-title{color:#fff!important}.font-grey-cascade{color:#95a5a6!important}.font-grey{color:#e5e5e5!important}.bg-grey{background:#E5E5E5!important}.bg-white{background:#fff!important}.mt-element-step .upload{text-align:center;padding-top:15px;padding-bottom:10px}.fileuploadview{width:calc(100% - 1px)}.fileuploadview th{padding:2px 5px;font-weight:700;font-size:12px;color:#000;height:35px;white-space:nowrap;text-align:center;vertical-align:middle}.fileuploadview tr{background-color:#fff}.fileuploadview td{height:25px;white-space:nowrap;text-align:center;font-size:9pt;padding:5px;border:1px solid white}.match{background-color:#95b75d!important}.ignore{background-color:#ff7a7a!important}.thbg{background-color:#e5e5e5!important}.select-control{height:20px;font-size:12px;line-height:18px;box-shadow:none;border:1px solid #D5D5D5;background:#F9F9F9;display:block;width:100%;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.displayTable td.odd:hover,.displayTable td.even:hover{background-color:#e3f6ff}.displayTable td.odd{background-color:#efefef}.displayTable td.even{background-color:#f8f8f8}.displayTable td a:BEFORE{color:green}.displayTable th a{text-align:center;color:#000}.displayTable th a:visited{text-align:center;color:#fff}.displayTable th a:hover{color:#fc0;background-color:transparent;text-align:center}.matchedUl{background-color:#beccd2}.loading-text{width:400px;position:absolute;top:calc(50% - 370px);left:calc(50% - 180px);text-align:center;color:#00f;font-size:25px}\n"] }]
|
|
908
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.HttpClient }, { type: i3.CommanServiceService }]; }, propDecorators: { closehdrbtn: [{
|
|
909
|
+
type: ViewChild,
|
|
910
|
+
args: ['closehdrbtn']
|
|
911
|
+
}], closedtlbtn: [{
|
|
912
|
+
type: ViewChild,
|
|
913
|
+
args: ['closedtlbtn']
|
|
914
|
+
}], Cofirmmapdtl: [{
|
|
915
|
+
type: ViewChild,
|
|
916
|
+
args: ['Cofirmmapdtl']
|
|
917
|
+
}] } });
|
|
918
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lei1saWIvc3JjL2xpYi9maWxlLXVwbG9hZC9maWxldXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V6LWxpYi9zcmMvbGliL2ZpbGUtdXBsb2FkL2ZpbGV1cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFekUsaUVBQWlFO0FBQ2pFLGtFQUFrRTtBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFNakQsbUNBQW1DO0FBQ25DLHlDQUF5QztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUk3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFDekMsbURBQW1EO0FBU25ELE1BQU0sT0FBTyxtQkFBbUI7SUF5RDlCLFlBQ1MsTUFBYyxFQUNiLEtBQXFCO0lBQzdCLHNEQUFzRDtJQUN0RCxvREFBb0Q7SUFDNUMsSUFBZ0IsRUFDaEIsRUFBd0I7UUFMekIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNiLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBR3JCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUExRGxDLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDWixpQkFBWSxHQUFTLElBQUksQ0FBQztRQUMxQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHFCQUFnQixH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QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0csWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuLy8gaW1wb3J0IHsgRmxhc2hNZXNzYWdlc1NlcnZpY2UgfSBmcm9tICdhbmd1bGFyMi1mbGFzaC1tZXNzYWdlcydcclxuLy8gaW1wb3J0IHsgTmc0TG9hZGluZ1NwaW5uZXJTZXJ2aWNlIH0gZnJvbSAnbmc0LWxvYWRpbmctc3Bpbm5lcic7XHJcbmltcG9ydCB7IENvb2tpZSB9IGZyb20gJ25nMi1jb29raWVzL25nMi1jb29raWVzJztcclxuLy8gaW1wb3J0IHsgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICdAYW5ndWxhci9odHRwJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb21tYW5TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2NvbW1hbi1zZXJ2aWNlL2NvbW1hbi1zZXJ2aWNlLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3RzLXhsc3gnO1xyXG4vLyBpbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gveGxzeC5tanMnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5cclxuLy8gaW1wb3J0IHsgVXBsb2FkU2VydmljZVNlcnZpY2UgfSBmcm9tICdzcmMvYXBwL2NvbXBvbmVudHMvZmlsZXVwbG9hZC1tb2R1bGUvdXBsb2FkLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZGFsRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCdcclxuaW1wb3J0IHsgZG9jdW1lbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwJztcclxuLy8gaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdhc3luY19ob29rcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1maWxldXBsb2FkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZXVwbG9hZC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRmlsZXVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Nsb3NlaGRyYnRuJykgY2xvc2VoZHJidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnY2xvc2VkdGxidG4nKSBjbG9zZWR0bGJ0bjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdDb2Zpcm1tYXBkdGwnKSBDb2Zpcm1tYXBkdGw6IE1vZGFsRGlyZWN0aXZlO1xyXG4gIGhlYWRlciA9IHt9O1xyXG4gIGZpbGVUb1VwbG9hZDogRmlsZSA9IG51bGw7XHJcbiAgZmlsZU5hbWUgPSBcIlwiO1xyXG4gIGNEdDtcclxuICBzdGVwID0gMTtcclxuICBzaGVldERhdGEgPSBbXTtcclxuICBoZWFkZXJBdHRyaWJ1dGVEdGwgPSB7fTtcclxuICBkZWZ1bHREaXNwbGF5TGVuID0gNTtcclxuICBkZWZ1bHREaXNwbGF5T2JqID0gW107XHJcbiAgYXR0clN0cnVjdHVyZUR0bCA9IFtdO1xyXG4gIGhlYWRlckxpc3QgPSBbXTtcclxuICBoZWFkZXJwcnA7XHJcbiAgYXR0cnBycDtcclxuICB0b3RhbG1hdGNoID0gMDtcclxuICB0b3RhbGlnbm9yZSA9IDA7XHJcbiAgcGFnZURlZmluYXRpb24gPSB7fTtcclxuICByb3dkYXRhbWFwRGV0YWlscyA9IHt9O1xyXG4gIHJvd2Rpc3RpbmN0RGF0YU1hcCA9IHt9O1xyXG4gIGNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgYXR0cmlidXRlRHRsTWFwID0ge307XHJcbiAgbWFwcFNoZWV0RGF0YSA9IFtdO1xyXG4gIGxhYmxlID0gXCJcIjtcclxuICBsYWJsZUZpbGUgPSBcIlwiO1xyXG4gIHN0YXR1c0xpc3QgPSBbXTtcclxuICBmaWxlRGV0YWlscyA9IFtdO1xyXG4gIGZpbGVUeXBlTGlzdCA9IFtdO1xyXG4gIGZpbGVPcHRpb25zTGlzdCA9IFtdO1xyXG4gIGZpbGVUeXBlO1xyXG4gIG5tZTtcclxuICB0eXA7XHJcbiAgbWRsO1xyXG4gIGRlc2NyaXB0aW9uO1xyXG4gIGNoZWNrX3N0YXR1cyA9IFtdO1xyXG4gIHBrdF9zdGF0dXMgPSBbXTtcclxuICBjb2xGb3JtYXRlID0gW107XHJcbiAgaWdub3JlRm9ybWF0ZSA9IFtdO1xyXG4gIGFsbGNvbHMgPSBbXTtcclxuICBmaWxlTG9nSWRuID0gMDtcclxuICBzaG93ID0gZmFsc2U7XHJcbiAgc3RlcE1zZyA9ICcnO1xyXG4gIHRpbWVyZmlsZTtcclxuICB0aW1lclByaWNlO1xyXG4gIGRhdGVGb3JtYXQ7XHJcbiAgZGVsaW07XHJcbiAgZGF0ZUZvcm1hdE1hcCA9IHt9O1xyXG4gIG1hcHBpbmdza2lwID0gZmFsc2U7XHJcbiAgZmlsZXR5cGU7XHJcbiAgZmlsZW5tZTtcclxuICBkYXRlRm9ybWF0TGlzdCA9IFt7IFwia1wiOiBcImRkL21tL3l5XCIsIFwidlwiOiBcImRkL21tL3l5XCIgfSxcclxuICB7IFwia1wiOiBcIm1tL2RkL3l5XCIsIFwidlwiOiBcIm1tL2RkL3l5XCIgfSxcclxuICB7IFwia1wiOiBcImRkL01vbi95eVwiLCBcInZcIjogXCJkZC9Nb24veXlcIiB9LFxyXG4gIF1cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgLy8gcHJpdmF0ZSBmbGFzaE1lc3NhZ2VzU2VydmljZTogRmxhc2hNZXNzYWdlc1NlcnZpY2UsXHJcbiAgICAvLyBwcml2YXRlIHNwaW5uZXJTZXJ2aWNlOiBOZzRMb2FkaW5nU3Bpbm5lclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGNzOiBDb21tYW5TZXJ2aWNlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIGhhbmRsZUZpbGVJbnB1dChmaWxlczogRmlsZUxpc3QpIHtcclxuICAgIHRoaXMuZmlsZVRvVXBsb2FkID0gZmlsZXMuaXRlbSgwKTtcclxuICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlc1swXS5uYW1lO1xyXG4gIH1cclxuICBvbkZpbGVTZWxlY3QoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGZpbGVzID0gaW5wdXQuZmlsZXM7XHJcblxyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCkge1xyXG5cclxuICAgICAgY29uc3QgZmlsZVRvUmVhZCA9IGZpbGVzWzBdO1xyXG5cclxuICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gdGhpcy5vbkZpbGVMb2FkO1xyXG5cclxuICAgICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGVUb1JlYWQsIFwiVVRGLThcIik7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBjc3ZDb250ZW50OiBzdHJpbmc7XHJcbiAgcGFyc2VkQ3N2OiBzdHJpbmdbXVtdO1xyXG4gIG9uRmlsZUxvYWQoZmlsZUxvYWRlZEV2ZW50KSB7XHJcbiAgICBjb25zdCBjc3ZTZXBhcmF0b3IgPSAnOyc7XHJcbiAgICBjb25zdCB0ZXh0RnJvbUZpbGVMb2FkZWQgPSBmaWxlTG9hZGVkRXZlbnQudGFyZ2V0LnJlc3VsdDtcclxuICAgIHRoaXMuY3N2Q29udGVudCA9IHRleHRGcm9tRmlsZUxvYWRlZDtcclxuICAgIGNvbnN0IHR4dCA9IHRleHRGcm9tRmlsZUxvYWRlZDtcclxuICAgIGNvbnN0IGNzdiA9IFtdO1xyXG4gICAgY29uc3QgbGluZXMgPSB0eHQuc3BsaXQoJ1xcbicpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGxpbmVzWzBdKTtcclxuXHJcblxyXG4gICAgbGluZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgY29sczogc3RyaW5nW10gPSBlbGVtZW50LnNwbGl0KGNzdlNlcGFyYXRvcik7XHJcbiAgICAgIGNzdi5wdXNoKGNvbHMpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhcnNlZENzdiA9IGNzdjtcclxuXHJcbiAgICAvLyBkZW1vIG91dHB1dCBhcyBhbGVydFxyXG4gICAgdmFyIG91dHB1dDogc3RyaW5nID0gXCJcIjtcclxuICAgIGNzdi5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIG91dHB1dCArPSBcIlxcblwiO1xyXG4gICAgICB2YXIgY29sTm8gPSAwO1xyXG4gICAgICByb3cuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmIChjb2xObyA+IDApIG91dHB1dCArPSBcIiB8IFwiO1xyXG4gICAgICAgIG91dHB1dCArPSBjb2w7XHJcbiAgICAgICAgY29sTm8rKztcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXJyYXlCdWZmZXI6IGFueTtcclxuICBmaWxlOiBGaWxlO1xyXG4gIGluY29taW5nZmlsZShldmVudCkge1xyXG4gICAgdGhpcy5maWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgdGhpcy5maWxlTmFtZSA9IHRoaXMuZmlsZS5uYW1lO1xyXG4gICAgdGhpcy5VcGxvYWQoKTtcclxuICB9XHJcblxyXG4gIFVwbG9hZCgpIHtcclxuXHJcbiAgICB0aGlzLnNob3cgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGVwTXNnID0gJ0ZpbGUgdXBsb2FkIGluIHByb2Nlc3MuLic7XHJcbiAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMubWFwcFNoZWV0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5zaGVldERhdGEgPSBbXTtcclxuICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGUpID0+IHtcclxuICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IGZpbGVSZWFkZXIucmVzdWx0O1xyXG4gICAgICB2YXIgZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xyXG4gICAgICB2YXIgYXJyID0gbmV3IEFycmF5KCk7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpICE9IGRhdGEubGVuZ3RoOyArK2kpIGFycltpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpXSk7XHJcbiAgICAgIHZhciBic3RyID0gYXJyLmpvaW4oXCJcIik7XHJcbiAgICAgIHZhciB3b3JrYm9vayA9IFhMU1gucmVhZChic3RyLCB7IHR5cGU6IFwiYmluYXJ5XCIgfSk7XHJcbiAgICAgIHZhciBmaXJzdF9zaGVldF9uYW1lID0gd29ya2Jvb2suU2hlZXROYW1lc1swXTtcclxuICAgICAgdmFyIHdvcmtzaGVldCA9IHdvcmtib29rLlNoZWV0c1tmaXJzdF9zaGVldF9uYW1lXTtcclxuXHJcbiAgICAgIHZhciBzaGVldERhdGFNYXA6IGFueSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQsIHsgaGVhZGVyOiAxIH0pO1xyXG4gICAgICBsZXQgaGVhZGVyTGlzdCA9IHNoZWV0RGF0YU1hcFswXTtcclxuICAgICAgaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJMaXN0LnB1c2goaGRyLnRyaW0oKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNoZWV0RGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbih3b3Jrc2hlZXQpO1xyXG4gICAgICB0aGlzLm1hcHBTaGVldERhdGEgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24od29ya3NoZWV0KTtcclxuICAgICAgdGhpcy5maWxlTG9nSWRuID0gMDtcclxuICAgICAgY29uc29sZS5sb2coXCJ0aGlzLmhlYWRlckxpc3RcIiwgdGhpcy5oZWFkZXJMaXN0KTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0SGVhZGVyTWF0Y2goKTtcclxuICAgICAgLy8gY29uc3QgZGlzdGluY3RTaCA9IFsuLi5uZXcgU2V0KHRoaXMuc2hlZXREYXRhLm1hcCh4PT54LlNIQVBFKSldO1xyXG4gICAgfVxyXG4gICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcih0aGlzLmZpbGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2V0cChzdGVwKSB7XHJcbiAgICB0aGlzLnN0ZXAgPSBzdGVwO1xyXG5cclxuICAgIGlmIChzdGVwID09IDEpIHtcclxuICAgICAgdGhpcy5uZ09uRGVzdHJveSgpO1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRIZWFkZXJNYXRjaCgpIHtcclxuICAgIHRoaXMuc2hvdyA9IHRydWU7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICdIZWFkZXIgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uJztcclxuICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICByZXFPYmpbJ2F0dHJMaXN0J10gPSB0aGlzLmhlYWRlckxpc3Q7XHJcbiAgICByZXFPYmpbJ2ZpbGVJZG4nXSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICB0aGlzLmhlYWRlcltcIm1ldGhvZFwiXSA9ICdsb2FkSGVhZGVyQXR0cic7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGwgPSByZXN1bHQuYXR0ckRldGFpbHMgfHwgJyc7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFwiLCB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bCk7XHJcbiAgICAgICAgbGV0IGhlYWRlckxpc3RMbnQgPSB0aGlzLmhlYWRlckxpc3QubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMudG90YWxtYXRjaCA9IHJlc3VsdC50b3RhbG1hdGNoIHx8IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsICE9ICcnKSB7XHJcbiAgICAgICAgICB0aGlzLmF0dHJTdHJ1Y3R1cmVEdGwgPSByZXN1bHQuYXR0clN0cnVjdHVyZUR0bCB8fCBbXTtcclxuICAgICAgICAgIGlmICh0aGlzLnNoZWV0RGF0YS5sZW5ndGggPCA1KVxyXG4gICAgICAgICAgICB0aGlzLmRlZnVsdERpc3BsYXlMZW4gPSB0aGlzLnNoZWV0RGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGVmdWx0RGlzcGxheUxlbjsgaSsrKVxyXG4gICAgICAgICAgICB0aGlzLmRlZnVsdERpc3BsYXlPYmpbaV0gPSB0aGlzLnNoZWV0RGF0YVtpXTtcclxuXHJcbiAgICAgICAgICBsZXQgaWdub3JlQ29sdW1uTHN0ID0gcmVzdWx0Lmlnbm9yZV9jb2x1bW4gfHwgW107XHJcbiAgICAgICAgICBpZ25vcmVDb2x1bW5Mc3QuZm9yRWFjaChoZHJEc2MgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkckRzY10gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyRHNjXS5pZ25vcmUgPSAnWSc7XHJcbiAgICAgICAgICAgICAgaGVhZGVyTGlzdExudC0tO1xyXG4gICAgICAgICAgICAgIHRoaXMudG90YWxpZ25vcmUrKztcclxuICAgICAgICAgICAgICBpZiAodGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyRHNjXS5hdHRyICE9IFwiXCIpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsbWF0Y2gtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBsZXQgaXNEYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgdGhpcy5oZWFkZXJMaXN0LmZvckVhY2goaGRyID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBoZHJBdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXSB8fCB7fTtcclxuICAgICAgICAgICAgaWYgKGhkckF0dHIuZHRhX3R5cCA9PSAnZCcpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXRNYXBbaGRyXSA9IHRoaXMuZGF0ZUZvcm1hdDtcclxuICAgICAgICAgICAgICBpc0RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy50b3RhbG1hdGNoID09IGhlYWRlckxpc3RMbnQgJiYgaXNEYXRlID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuVmFsaWRhdGVGaWxlSGVhZGVyTWFwcGluZygnTicpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdGVwID0gMztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXAgPSAyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcIlNvbWUgcHJvYmxlbSBpbiBGaWxlIEhlYWRlciBNYXRjaGluZ1wiLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgdXBkYXRlY29sdW1uc3RhdHVlKGhkcikge1xyXG5cclxuICAgIHZhciBpc0lnbm9yZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uaWdub3JlIHx8ICcnO1xyXG4gICAgaWYgKGlzSWdub3JlID09ICdZJykge1xyXG4gICAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSA9ICdOJ1xyXG4gICAgICB0aGlzLnRvdGFsaWdub3JlLS07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvdGFsaWdub3JlKys7XHJcbiAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uaWdub3JlID0gJ1knO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXSk7XHJcbiAgfVxyXG4gIG1hcGhkcjtcclxuICBoZHJtYXNzYWdlO1xyXG4gIGNvbmZpcm1zZXRIZWFkZXJNYXBwKGhkcikge1xyXG4gICAgdGhpcy5tYXBoZHIgPSBoZHI7XHJcbiAgICBsZXQgYXR0ciA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cjtcclxuICAgIHRoaXMuYXR0clN0cnVjdHVyZUR0bC5mb3JFYWNoKGVsZSA9PiB7XHJcblxyXG4gICAgICBpZiAoZWxlLmF0dHIgPT0gYXR0cikge1xyXG4gICAgICAgIHRoaXMuaGRybWFzc2FnZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciArIFwiKFwiICsgZWxlLnByaW50ICsgXCIpXCI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkNvZmlybW1hcGhkcicpLmNsaWNrKCk7XHJcbiAgfVxyXG4gIENhbmNlbEhlYWRlck1hcHAoKSB7XHJcbiAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFt0aGlzLm1hcGhkcl0uYXR0ciA9IFwiXCI7XHJcbiAgfVxyXG4gIHNldEhlYWRlck1hcHAoKSB7XHJcbiAgICBkZWJ1Z2dlcjtcclxuICAgIGxldCBhdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbdGhpcy5tYXBoZHJdLmF0dHIgfHwgJyc7XHJcbiAgICBpZiAoYXR0ciAhPSAnJykge1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICByZXFPYmpbJ29wdGlvbmFWYWwnXSA9IHRoaXMubWFwaGRyXHJcbiAgICAgIHJlcU9ialsnYXR0ciddID0gYXR0cjtcclxuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2FkZEhlYWRlckF0dHInO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgICBsZXQgaGRyRHRsID0gcmVzdWx0LmF0dHJEZXRhaWxzW3RoaXMubWFwaGRyXSB8fCAnJztcclxuICAgICAgICAgIGlmIChoZHJEdGwgIT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy50b3RhbG1hdGNoKys7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW3RoaXMubWFwaGRyXSA9IGhkckR0bDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW3RoaXMubWFwaGRyXSA9IHtcclxuICAgICAgICAgICAgICBcImF0dHJcIjogXCJcIixcclxuICAgICAgICAgICAgICBcInByaW50XCI6IFwiXCIsXHJcbiAgICAgICAgICAgICAgXCJzcnRcIjogXCJcIixcclxuICAgICAgICAgICAgICBcImR0YV90eXBcIjogXCJcIixcclxuICAgICAgICAgICAgICBcImF0dHJfaWRuXCI6IFwiXCJcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJNYXBwaW5nIGF0dHJpYnV0ZSBpcyBlbXB0eSBwbGVhc2UgcmV0cnkuXCIsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGdtYXRjaGVkQ291bnQgPSAwO1xyXG4gIGdyZXN1bHRDb3VudCA9IDA7XHJcbiAgc2V0Um93RGF0YU1hcHAoKSB7XHJcbiAgICBpZiAoIXRoaXMubWFwcGluZ3NraXApIHtcclxuICAgICAgbGV0IHJvd01hdGNoQ291bnQgPSAwO1xyXG4gICAgICB0aGlzLmNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcblxyXG4gICAgICAgIGxldCBhdHRyID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyIHx8ICcnO1xyXG4gICAgICAgIGxldCBhdHRyVHlwZSA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uZHRhX3R5cCB8fCAnJztcclxuICAgICAgICBsZXQgaXNJZ25vcmUgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSB8fCAnJztcclxuICAgICAgICBpZiAoYXR0ciAhPSAnJyAmJiBpc0lnbm9yZSAhPSAnTicgJiYgYXR0clR5cGUgPT0gJ2MnKSB7XHJcbiAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgdmFyIGRpc3RpbmN0bGlzdCA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLnNoZWV0RGF0YS5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbVtoZHJdKSkpO1xyXG4gICAgICAgICAgZGlzdGluY3RsaXN0ID0gZGlzdGluY3RsaXN0LmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSB9KTtcclxuICAgICAgICAgIGlmIChkaXN0aW5jdGxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvd2Rpc3RpbmN0RGF0YU1hcFthdHRyXSA9IGRpc3RpbmN0bGlzdDtcclxuICAgICAgICAgICAgcm93TWF0Y2hDb3VudCA9IHJvd01hdGNoQ291bnQgKyBkaXN0aW5jdGxpc3QubGVuZ3RoO1xyXG4gICAgICAgICAgICB0aGlzLmdtYXRjaGVkQ291bnQgPSByb3dNYXRjaENvdW50O1xyXG4gICAgICAgICAgICB0aGlzLmNoYXJIZWFkZXJMaXN0LnB1c2goaGRyKTtcclxuICAgICAgICAgICAgbGV0IGF0dHJEZXRhaWxzID0gdGhpcy5hdHRyU3RydWN0dXJlRHRsLmZpbmQoYXR0cmR0bCA9PiBhdHRyZHRsLmF0dHIgPT0gYXR0cikgfHwge307XHJcbiAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlRHRsTWFwW2F0dHJdID0gYXR0ckRldGFpbHMucHJwTGlzdCB8fCBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICByZXFPYmpbJ2F0dHJNYXAnXSA9IHRoaXMucm93ZGlzdGluY3REYXRhTWFwO1xyXG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnbG9hZEhlYWRlckF0dHJEdGwnO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJvd01hdGNoQ291bnQpO1xyXG4gICAgICAgICAgZGVidWdnZXI7XHJcblxyXG4gICAgICAgICAgdGhpcy5yb3dkYXRhbWFwRGV0YWlscyA9IHJlc3VsdC5hdHRyRGV0YWlscyB8fCB7fTtcclxuICAgICAgICAgIHRoaXMuZ3Jlc3VsdENvdW50ID0gcmVzdWx0LnRvdGFsbWF0Y2g7XHJcbiAgICAgICAgICB0aGlzLnN0ZXAgPSAzO1xyXG4gICAgICAgICAgaWYgKHJvd01hdGNoQ291bnQgPT0gcmVzdWx0LnRvdGFsbWF0Y2gpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGVwID0gNDtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlKCk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcInBsZWFzZSB2ZXJpZnkgZGF0YSBtYXBwaW5nLlwiLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcInNvbWV0aGluZyBnbyB3cm9uZyBpbiByb3cgZGF0YS5cIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0ZXAgPSA0O1xyXG4gICAgICB0aGlzLnVwbG9hZEZpbGUoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIGR0bEF0dHI7XHJcbiAgZHRsYXR0cl9pZG47XHJcbiAgZHRsb3B0aW9udmFsO1xyXG4gIGR0bG1hc3NhZ2U7XHJcbiAgY29uZmlybUhlYWRlckRldGFpbHNNYXBwKGF0dHIsIGF0dHJfaWRuLCBvcHRpb252YWwpIHtcclxuICAgIHRoaXMuZHRsQXR0ciA9IGF0dHI7XHJcbiAgICB0aGlzLmR0bGF0dHJfaWRuID0gYXR0cl9pZG47XHJcbiAgICB0aGlzLmR0bG9wdGlvbnZhbCA9IG9wdGlvbnZhbDtcclxuICAgIGxldCB2YWwgPSB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbDtcclxuICAgIGxldCBhdHRyaWJ1dGVEdGxMaXN0ID0gdGhpcy5hdHRyaWJ1dGVEdGxNYXBbYXR0cl07XHJcbiAgICBhdHRyaWJ1dGVEdGxMaXN0LmZvckVhY2goZWxlID0+IHtcclxuXHJcbiAgICAgIGlmIChlbGUudmFsID09IHZhbCkge1xyXG4gICAgICAgIHRoaXMuZHRsbWFzc2FnZSA9IHZhbCArIFwiKFwiICsgZWxlLnByaW50ICsgXCIpXCI7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkNvZmlybW1hcGR0bCcpLmNsaWNrKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgQ2FuY2VsSGVhZGVyRGV0YWlsc01hcHAoKSB7XHJcbiAgICB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbCA9IFwiXCI7XHJcbiAgfVxyXG4gIHNldEhlYWRlckRldGFpbHNNYXBwKCkge1xyXG4gICAgbGV0IGF0dHJEdGxWYWwgPSB0aGlzLnJvd2RhdGFtYXBEZXRhaWxzW3RoaXMuZHRsQXR0cl1bdGhpcy5kdGxvcHRpb252YWxdLnZhbCB8fCAnJztcclxuICAgIGlmIChhdHRyRHRsVmFsICE9ICcnKSB7XHJcbiAgICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICAgIHJlcU9ialsnb3B0aW9uYVZhbCddID0gdGhpcy5kdGxvcHRpb252YWxcclxuICAgICAgcmVxT2JqWydhdHRyX2lkbiddID0gdGhpcy5kdGxhdHRyX2lkbjtcclxuICAgICAgcmVxT2JqWydhdHRyJ10gPSB0aGlzLmR0bEF0dHI7XHJcbiAgICAgIHJlcU9ialsnYXR0clZhbCddID0gYXR0ckR0bFZhbDtcclxuICAgICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnYWRkRGV0YWlsQXR0cic7XHJcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWRkRGV0YWlsQXR0clwiLCByZXNwb25zZSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgIHRoaXMuZ3Jlc3VsdENvdW50Kys7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IHx8IHt9O1xyXG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LmF0dHJEZXRhaWxzKTtcclxuICAgICAgICAgIGxldCBhdHRyRGV0YWlscyA9IHJlc3VsdC5hdHRyRGV0YWlscyB8fCB7fVxyXG4gICAgICAgICAgdGhpcy5yb3dkYXRhbWFwRGV0YWlsc1t0aGlzLmR0bEF0dHJdW3RoaXMuZHRsb3B0aW9udmFsXSA9IGF0dHJEZXRhaWxzW3RoaXMuZHRsb3B0aW9udmFsXTtcclxuICAgICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG5cclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhcIk1hcHBpbmcgYXR0cmlidXRlIGlzIGVtcHR5IHBsZWFzZSByZXRyeS5cIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBvblN1Ym1pdChmb3JtVmFsKSB7XHJcbiAgICB2YXIgdCA9IE9iamVjdC5rZXlzKGZvcm1WYWwuZm9ybS5jb250cm9scykuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtVmFsLmZvcm0uZ2V0KGZpZWxkKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zYXZlRmlsZU9wdGlvbihmb3JtVmFsLnZhbHVlKTtcclxuICB9XHJcbiAgc2F2ZUZpbGVPcHRpb24oZnJtdmFscykge1xyXG4gICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmogPSB7IC4uLmZybXZhbHMsIGNvbHVtbl9mb3JtYXQ6IHRoaXMuY29sRm9ybWF0ZSwgaWdub3JlX2NvbHVtbjogdGhpcy5pZ25vcmVGb3JtYXRlIH07XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2FkZEZpbGVPcHRpb24nO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgdGhpcy5maWxlT3B0aW9uc0xpc3QgPSByZXN1bHQuZmlsZU9wdGlvbnNMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGUgPSByZXN1bHQuZmlsZV9pZG47XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0ZUZpbGVIZWFkZXJNYXBwaW5nKCdOJyk7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBhZGRGaWxlTG9nKGZpbGVJZG4pIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnZmlsZV9pZG4nXSA9IGZpbGVJZG47XHJcbiAgICByZXFPYmpbJ2ZpbGVfc3RhdHVzJ10gPSBcIkhlYWRlciBJbnNlcnRlZFwiO1xyXG4gICAgcmVxT2JqWyd2YWxpZGF0aW9uX3JlbWFya3MnXSA9IFwiSGVhZGVyIHZhbGlkYXRlZFwiO1xyXG4gICAgcmVxT2JqWydoZWFkZXJfcm93J10gPSB0aGlzLmFsbGNvbHM7XHJcbiAgICByZXFPYmpbJ2hlYWRlcl9hdHRyX3JvdyddID0gdGhpcy5jb2xGb3JtYXRlO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnYWRkRmlsZUxvZyc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCB8fCB7fTtcclxuICAgICAgICB0aGlzLmZpbGVMb2dJZG4gPSByZXN1bHQuZmlsZV9sb2dfaWRuO1xyXG4gICAgICAgIHRoaXMuc2V0Um93RGF0YU1hcHAoKTtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJIZWFkZXIgdmFsaWRhdGVkIHN1Y2Nlc3NmdWxseVwiLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFZhbGlkYXRlRmlsZUhlYWRlck1hcHBpbmcoZm9ybWF0U2F2ZSkge1xyXG4gICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcblxyXG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICdIZWFkZXIgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uJztcclxuICAgIHRoaXMuY29sRm9ybWF0ZSA9IFtdO1xyXG4gICAgdGhpcy5pZ25vcmVGb3JtYXRlID0gW107XHJcbiAgICB0aGlzLmFsbGNvbHMgPSBbXTtcclxuICAgIGxldCBpc1ZhbGlkYXRlID0gdHJ1ZTtcclxuICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgIGxldCBoZHJEdGwgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdIHx8ICcnXHJcbiAgICAgIGlmIChoZHJEdGwuYXR0ciA9PSAnJyAmJiBoZHJEdGwuaWdub3JlICE9ICdZJykge1xyXG4gICAgICAgIGlzVmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaGRyRHRsLmF0dHIgIT0gJycgJiYgaGRyRHRsLmlnbm9yZSAhPSAnTicpIHtcclxuICAgICAgICB0aGlzLmNvbEZvcm1hdGUucHVzaChoZHJEdGwuYXR0cik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGhkckR0bC5pZ25vcmUgPT0gJ1knKSB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVGb3JtYXRlLnB1c2goaGRyKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmFsbGNvbHMucHVzaChoZHIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGlzVmFsaWRhdGUgJiYgKHRoaXMuZmlsZVR5cGUgPT0gbnVsbCB8fCB0aGlzLmZpbGVUeXBlID09IHVuZGVmaW5lZCB8fCB0aGlzLmZpbGVUeXBlID09IFwiXCIpKSB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICAgICAgdGhpcy5zdGVwTXNnID0gXCJcIjtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bmZpbGVVcGxvYWRNb2RhbCcpLmNsaWNrKCk7XHJcbiAgICAgIHRoaXMuc3RlcCA9IDI7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICBpZiAoaXNWYWxpZGF0ZSkge1xyXG4gICAgICAgIGlmIChmb3JtYXRTYXZlID09ICdZJykge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVmaWxlT3B0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkRmlsZUxvZyh0aGlzLmZpbGVUeXBlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coXCJQbGVhc2Ugc3BlY2lmeSBtYXBwaW5nIG9yIG1hcmtlIGFzIGlnbm9yZSBcIiwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG5cclxuXHJcbiAgfVxyXG4gIGhkcklkbjtcclxuICB1cGRhdGVmaWxlT3B0aW9uKCkge1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAnZmlsZVVwbG9hZCc7XHJcbiAgICByZXFPYmpbJ2ZpbGVJZG4nXSA9IHRoaXMuZmlsZVR5cGU7XHJcbiAgICByZXFPYmpbJ2NvbHVtbl9mb3JtYXQnXSA9IHRoaXMuY29sRm9ybWF0ZTtcclxuICAgIHJlcU9ialsnaWdub3JlX2NvbHVtbiddID0gdGhpcy5pZ25vcmVGb3JtYXRlO1xyXG5cclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ3VwZGF0ZUNvbHVtbkZvcm1hdCc7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuY3MubG9hZGlGaWxlKHJlcU9iaiwgdGhpcy5oZWFkZXIsICdmaWxlVXBsb2FkL2xvYWQnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgIH1cclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkRmlsZSgpIHtcclxuICAgIHRoaXMuZGF0ZUZvcm1hdCA9IHRoaXMuZGF0ZUZvcm1hdCB8fCAnZGQvbW0veXknO1xyXG4gICAgdGhpcy5kZWxpbSA9IHRoaXMuZGVsaW0gfHwgJy8nO1xyXG4gICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuICAgIGxldCBkYXRlVmFsaWQgPSB0cnVlO1xyXG4gICAgbGV0IG1hc3NhZ2UgPSBcIlwiO1xyXG5cclxuICAgIGlmICghdGhpcy5tYXBwaW5nc2tpcCkge1xyXG4gICAgICB0aGlzLnN0ZXBNc2cgPSBcIkRhdGEgdmVyaWZpY2F0aW9uIGluIHByb2Nlc3MgLi4uXCI7XHJcbiAgICAgIHRoaXMuaGVhZGVyTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgZGVidWdnZXJcclxuICAgICAgICBsZXQgYXR0ciA9IHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciB8fCAnJztcclxuICAgICAgICBsZXQgYXR0clR5cGUgPSB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmR0YV90eXAgfHwgJyc7XHJcbiAgICAgICAgbGV0IGlzSWdub3JlID0gdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5pZ25vcmUgfHwgJyc7XHJcbiAgICAgICAgaWYgKGlzSWdub3JlID09ICdZJykge1xyXG4gICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhLm1hcCgocm93RGF0YSwgaSkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2hkcl07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGF0dHJUeXBlID09ICdjJykge1xyXG4gICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGEubWFwKChyb3dEYXRhLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhckhlYWRlckxpc3QuaW5kZXhPZihoZHIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmR0bFZhbCA9IHJvd0RhdGFbaGRyXSB8fCAnJztcclxuICAgICAgICAgICAgICAgIGlmIChhdHRyZHRsVmFsICE9ICcnKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgYXR0ckR0bE1hcFZhbCA9IHRoaXMucm93ZGF0YW1hcERldGFpbHNbYXR0cl1bYXR0cmR0bFZhbF0uc3J0O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGFbaV1bYXR0cl0gPSBhdHRyRHRsTWFwVmFsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBoZHIpXHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcHBTaGVldERhdGFbaV1baGRyXVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH0gZWxzZSBpZiAoYXR0clR5cGUgPT0gJ24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWFwcFNoZWV0RGF0YS5tYXAoKHJvd0RhdGEsIGkpID0+IHtcclxuICAgICAgICAgICAgICBsZXQgYXR0cmR0bFZhbCA9IHJvd0RhdGFbaGRyXSB8fCAnJztcclxuICAgICAgICAgICAgICBpZiAoYXR0cmR0bFZhbCAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgZGVidWdnZXJcclxuICAgICAgICAgICAgICAgIGF0dHJkdGxWYWwgPSBhdHRyZHRsVmFsLnJlcGxhY2UoL1teMC05Li1dL2csIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2F0dHJdID0gYXR0cmR0bFZhbC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBoZHIpXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2hkcl1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChhdHRyVHlwZSA9PSAnZCcpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWFwcFNoZWV0RGF0YS5tYXAoKHJvd0RhdGEsIGkpID0+IHtcclxuICAgICAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgICAgIGxldCBhdHRyZHRsVmFsID0gcm93RGF0YVtoZHJdIHx8ICcnO1xyXG4gICAgICAgICAgICAgIGxldCBkdEZybSA9IHRoaXMuZGF0ZUZvcm1hdE1hcFtoZHJdIHx8ICdkZC9tbS95eSc7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHJkdGxWYWwgIT0gJycpXHJcbiAgICAgICAgICAgICAgICBhdHRyZHRsVmFsID0gdGhpcy5jcy5kYXRlVmFsaWRhdGlvbihhdHRyZHRsVmFsLCBkdEZybSk7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHJkdGxWYWwgPT0gJ2ludmFpbGQnKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlVmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIG1hc3NhZ2UgPSBcIlBsZWFzZSBjaGVjayBEYXRlIDpcIiArIHJvd0RhdGFbaGRyXSArIFwiIERhdGUgRm9ybWF0IDpcIiArIGR0RnJtO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhW2ldW2F0dHJdID0gYXR0cmR0bFZhbC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgIGlmIChhdHRyICE9IGhkcilcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLm1hcHBTaGVldERhdGFbaV1baGRyXVxyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIGlmIChhdHRyVHlwZSA9PSAndCcpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXBwU2hlZXREYXRhLm1hcCgocm93RGF0YSwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBhdHRyZHRsVmFsID0gcm93RGF0YVtoZHJdIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLm1hcHBTaGVldERhdGFbaV1bYXR0cl0gPSBhdHRyZHRsVmFsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gaGRyKVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWFwcFNoZWV0RGF0YVtpXVtoZHJdXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGVWYWxpZCkge1xyXG4gICAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnOy8vdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5hbWUnXTtcclxuICAgICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IHRoaXMuZmlsZUxvZ0lkbjtcclxuICAgICAgcmVxT2JqWydhdHRyX2RhdGEnXSA9IHRoaXMubWFwcFNoZWV0RGF0YTtcclxuICAgICAgcmVxT2JqWydpbl9kYXRhJ10gPSB0aGlzLnNoZWV0RGF0YTtcclxuICAgICAgcmVxT2JqWydkYXRlZm9ybWF0J10gPSB0aGlzLmRhdGVGb3JtYXRNYXA7XHJcbiAgICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgICBsZXQgdXJsID0gXCJmaWxlVXBsb2FkL2xvYWRcIjtcclxuICAgICAgaWYgKHRoaXMubWRsID09ICdpbndhcmQnKSB7XHJcbiAgICAgICAgdXJsID0gJ2lud2FyZC9sb2FkRmlsZSc7XHJcbiAgICAgICAgcmVxT2JqWydpbndhcmRfaWRuJ10gPSB0aGlzLmlud2FyZF9pZG47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHJlcU9iaik7XHJcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmhlYWRlcik7XHJcblxyXG4gICAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCB1cmwpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCB8fCB7fTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICAgICAgICB0aGlzLmZpbGVMb2dJZG4gPSByZXN1bHQuZmlsZV9sb2dfaWRuO1xyXG4gICAgICAgICAgdGhpcy5oZHJJZG4gPSByZXN1bHQuaGRySWRuO1xyXG4gICAgICAgICAgdGhpcy5nZXRQcm9ncmVzc0ZpbGUodGhpcy5maWxlTG9nSWRuKTtcclxuICAgICAgICAgIHRoaXMubGFibGVGaWxlID0gXCJGaWxlIFNlcXVlbmNlIE5vLiBcIiArIHRoaXMuZmlsZUxvZ0lkbiArIFwiIFVwbG9hZGluZyBpbiBwcm9ncmVzcy4uLlwiO1xyXG4gICAgICAgICAgLy8gc2V0IGZpbGUgaWQgdG8gbG9jYWwgc3RvcmFnZVxyXG4gICAgICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2UuYXJndW1lbnRzKCd1cGxvYWRlZEZpbGVJZCcsIHJlc3VsdC5maWxlX2xvZ19pZG4pO1xyXG5cclxuICAgICAgICAgIHRoaXMubGFibGUgPSBcIlByaWNpbmcgU2VxdWVuY2UgTm8uIFwiICsgdGhpcy5oZHJJZG4gKyBcIiBQcmljZSBjYWxjdWxhdGlvbnMgaW4gcHJvZ3Jlc3MuLi5cIjtcclxuXHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzUHJpY2UodGhpcy5oZHJJZG4pO1xyXG5cclxuICAgICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3cobWFzc2FnZSwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDQwMDAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIm1hcHBTaGVldERhdGFcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy5tYXBwU2hlZXREYXRhKSk7XHJcbiAgICBjb25zb2xlLmxvZyhcInRoaXMuc2hlZXREYXRhXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hlZXREYXRhKSk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VNYXBwaW5nKGhkck9iaiwgaGRyLCBhdHRyKSB7XHJcbiAgICB0aGlzLmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSA9ICdZJztcclxuICAgIHRoaXMuaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciA9ICcnO1xyXG4gICAgdGhpcy5yZW1vdmVBdHRyT3B0VmFsKGF0dHIsIGhkcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVtb3ZlQXR0ck9wdFZhbChhdHRyLCBvcHRpb25hVmFsKSB7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnYXR0ciddID0gYXR0cjtcclxuICAgIHJlcU9ialsnb3B0aW9uYVZhbCddID0gb3B0aW9uYVZhbDtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAncmVtb3ZlQXR0ck9wdFZhbCc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcmVtb3ZlRGV0YWlsQXR0ck9wdFZhbChhdHRySWRuLCBvcHRpb25hVmFsLCB2YWwsIGhkckF0dHIpIHtcclxuICAgIHRoaXMucm93ZGF0YW1hcERldGFpbHNbaGRyQXR0cl1bb3B0aW9uYVZhbF0udmFsID0gJyc7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9ICdmaWxlVXBsb2FkJztcclxuICAgIHJlcU9ialsnYXR0clZhbCddID0gdmFsO1xyXG4gICAgcmVxT2JqWydvcHRpb25hVmFsJ10gPSBvcHRpb25hVmFsO1xyXG4gICAgcmVxT2JqWydhdHRyX2lkbiddID0gYXR0cklkbjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAncmVtb3ZlQXR0ck9wdFZhbCc7XHJcbiAgICB0aGlzLmNzLmxvYWRpRmlsZShyZXFPYmosIHRoaXMuaGVhZGVyLCAnZmlsZVVwbG9hZC9sb2FkJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhyZXNwb25zZS5tZXNzYWdlLCB7IGNzc0NsYXNzOiAnYWxlcnQtc3VjY2VzcycsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBzdHRzRmlsZSA9IHt9XHJcbiAgZ2V0UHJvZ3Jlc3NGaWxlKGZpbGVMb2dJZG4pIHtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IGZpbGVMb2dJZG47Ly90aGlzLmZpbGVMb2dJZG47XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2dldEZpbGVMb2dTdGF0dXMnO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydDJ10gPSByZXN1bHRbJ0MnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydQJ10gPSByZXN1bHRbJ1AnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydUJ10gPSByZXN1bHRbJ1QnXTtcclxuICAgICAgICB0aGlzLnN0dHNGaWxlWydJJ10gPSByZXN1bHRbJ0knXTtcclxuICAgICAgICB0aGlzLnN0ZXAgPSA0O1xyXG4gICAgICAgIHRoaXMudG90UHJvZ3Jlc3NGaWxlID0gTWF0aC5jZWlsKHBhcnNlRmxvYXQocmVzdWx0WydDJ10pICogMTAwIC8gcGFyc2VGbG9hdChyZXN1bHRbJ1QnXSkpO1xyXG4gICAgICAgIHRoaXMucmVjYWxsRmlsZShmaWxlTG9nSWRuKTtcclxuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnRvdFByb2dyZXNzKTtcclxuICAgICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3cocmVzcG9uc2UubWVzc2FnZSwgeyBjc3NDbGFzczogJ2FsZXJ0LXN1Y2Nlc3MnLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KGVycm9yLCB7IGNzc0NsYXNzOiAnYWxlcnQtZGFuZ2VyJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyBjaGVja1VwbG9hZFN0dCgpIHtcclxuICAvLyAgIHRoaXMuc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gIC8vICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gIC8vICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbmFtZSddO1xyXG4gIC8vICAgcmVxT2JqWydmaWxlX2xvZ19pZG4nXSA9IHRoaXMuZmlsZUxvZ0lkbjtcclxuICAvLyAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gIC8vICAgdGhpcy51cy5kYXRhKHJlcU9iaiwgJ2dldEZpbGVMb2dTdGF0dXMnLCAnZmlsZVVwbG9hZC9sb2FkJykuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAvLyAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAvLyAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gIC8vICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgLy8gICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAvLyAgICAgICB0aGlzLnN0dHNbJ0MnXSA9IHJlc3VsdFsnQyddO1xyXG4gIC8vICAgICAgIHRoaXMuc3R0c1snUCddID0gcmVzdWx0WydQJ107XHJcbiAgLy8gICAgICAgdGhpcy5zdHRzWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAvLyAgICAgICB0aGlzLnN0dHNbJ1QnXSA9IHJlc3VsdFsnVCddO1xyXG4gIC8vICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgLy8gICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgLy8gICAgICAgdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAvLyAgIH0sIGVycm9yID0+IHtcclxuICAvLyAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgLy8gICAgIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgLy8gICB9KTtcclxuXHJcbiAgLy8gfVxyXG5cclxuICBzdHRzID0ge307XHJcbiAgY2xpY2tlZCA9IGZhbHNlO1xyXG4gIHRvdFByb2dyZXNzID0gMDtcclxuICB0b3RQcm9ncmVzc0ZpbGUgPSAwO1xyXG4gIGdldFByb2dyZXNzUHJpY2UoaGRySWRuKSB7XHJcbiAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gJ2ZpbGVVcGxvYWQnO1xyXG4gICAgcmVxT2JqWydzZXFObyddID0gaGRySWRuOy8vXCI4NDZcIjsvL3RoaXMuZmlsZUxvZ0lkbjtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlcU9iaikpO1xyXG4gICAgdGhpcy5oZWFkZXJbXCJtZXRob2RcIl0gPSAnZ2V0UHJpY2VTdGF0dXMnO1xyXG4gICAgdGhpcy5jcy5sb2FkaUZpbGUocmVxT2JqLCB0aGlzLmhlYWRlciwgJ2ZpbGVVcGxvYWQvbG9hZCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgICB0aGlzLnN0dHNbJ0MnXSA9IHJlc3VsdFsnQyddO1xyXG4gICAgICAgIHRoaXMuc3R0c1snUCddID0gcmVzdWx0WydQJ107XHJcbiAgICAgICAgdGhpcy5zdHRzWydFJ10gPSByZXN1bHRbJ0UnXTtcclxuICAgICAgICB0aGlzLnN0dHNbJ1QnXSA9IHJlc3VsdFsnVCddO1xyXG4gICAgICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICAgICAgdGhpcy50b3RQcm9ncmVzcyA9IE1hdGguY2VpbChwYXJzZUZsb2F0KHJlc3VsdFsnQyddKSAqIDEwMCAvIHBhcnNlRmxvYXQocmVzdWx0WydUJ10pKTtcclxuICAgICAgICB0aGlzLnJlY2FsbCh0aGlzLmhkcklkbik7XHJcbiAgICAgICAgY29uc29sZS5sb2codGhpcy50b3RQcm9ncmVzcyk7XHJcbiAgICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgLy8gdGhpcy5mbGFzaE1lc3NhZ2VzU2VydmljZS5zaG93KHJlc3BvbnNlLm1lc3NhZ2UsIHsgY3NzQ2xhc3M6ICdhbGVydC1zdWNjZXNzJywgdGltZW91dDogMzAwMCB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIC8vIHRoaXMuZmxhc2hNZXNzYWdlc1NlcnZpY2Uuc2hvdyhlcnJvciwgeyBjc3NDbGFzczogJ2FsZXJ0LWRhbmdlcicsIHRpbWVvdXQ6IDMwMDAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG4gIGxhc3RSZWZyZXNoVGltZUZpbGUgPSBudWxsO1xyXG4gIHJlY2FsbEZpbGUoZmlsZUxvZ0lkbikge1xyXG5cclxuICAgIGlmICh0aGlzLnRvdFByb2dyZXNzRmlsZSA8IDEwMCkge1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoVGltZUZpbGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB0aGlzLnRpbWVyZmlsZSA9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzRmlsZShmaWxlTG9nSWRuKTtcclxuICAgICAgICB9LCA1MDAwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcmZpbGUpO1xyXG4gICAgICAvLyB0aGlzLlBsYW5uaW5nQ29tcG9uZW50LmdldFBhY2tldHNCeUhlYWRlcklkKGhkcklkbik7XHJcbiAgICAgIC8vIHRoaXMuY2xvc2VidG4ubmF0aXZlRWxlbWVudC5jbGljaygpO1xyXG4gICAgICBpZiAodGhpcy50b3RQcm9ncmVzc0ZpbGUgPT0gMTAwICYmIHRoaXMudG90UHJvZ3Jlc3MgPT0gMTAwKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bmZpbGVVcGxvYWRNb2RhbCcpLmNsaWNrKCk7XHJcblxyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3ByaWNpbmcvcm91Z2gvcGxhbmluZ3NjcmVlbi9yb3VnaFBsYW5pbmdTY3JlZW4nXSwgeyBxdWVyeVBhcmFtczogeyBoZHJJZDogdGhpcy5oZHJJZG4gfSB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcbiAgbGFzdFJlZnJlc2hUaW1lID0gbnVsbDtcclxuICByZWNhbGwoaGRySWRuKSB7XHJcbiAgICBpZiAodGhpcy50b3RQcm9ncmVzcyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoVGltZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIHRoaXMudGltZXJQcmljZSA9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldFByb2dyZXNzUHJpY2UoaGRySWRuKTtcclxuICAgICAgICB9LCA1MDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJQcmljZSk7XHJcbiAgICAgIGlmICh0aGlzLnRvdFByb2dyZXNzRmlsZSA9PSAxMDAgJiYgdGhpcy50b3RQcm9ncmVzcyA9PSAxMDApIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuZmlsZVVwbG9hZE1vZGFsJykuY2xpY2soKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9wcmljaW5nL3JvdWdoL3BsYW5pbmdzY3JlZW4vcm91Z2hQbGFuaW5nU2NyZWVuJ10sIHsgcXVlcnlQYXJhbXM6IHsgaGRySWQ6IHRoaXMuaGRySWRuIH0gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgU2tpcFZlcmlmaWNhdGlvbigpIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB0aGlzLm1hcHBpbmdza2lwID0gdHJ1ZTtcclxuICAgIHRoaXMuYWRkRmlsZUxvZyh0aGlzLmZpbGVUeXBlKTtcclxuXHJcbiAgfVxyXG4gIFNraXBWZXJpZmljYXRpb25EdGwoKSB7XHJcbiAgICB0aGlzLm1hcHBpbmdza2lwID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RlcCA9IDQ7XHJcbiAgICB0aGlzLnVwbG9hZEZpbGUoKTtcclxuICB9XHJcblxyXG4gIGxvYWRGaWxlVHlwZURhdGEoZmlsZVVwbG9hZCwgbWRsKSB7XHJcbiAgICB0aGlzLnNoZWV0RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJBdHRyaWJ1dGVEdGwgPSB7fTtcclxuICAgIHRoaXMuZGVmdWx0RGlzcGxheUxlbiA9IDU7XHJcbiAgICB0aGlzLmRlZnVsdERpc3BsYXlPYmogPSBbXTtcclxuICAgIHRoaXMuYXR0clN0cnVjdHVyZUR0bCA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJMaXN0ID0gW107XHJcbiAgICB0aGlzLmhlYWRlcnBycDtcclxuICAgIHRoaXMuYXR0cnBycDtcclxuICAgIHRoaXMudG90YWxtYXRjaCA9IDA7XHJcbiAgICB0aGlzLnRvdGFsaWdub3JlID0gMDtcclxuICAgIHRoaXMucGFnZURlZmluYXRpb24gPSB7fTtcclxuICAgIHRoaXMucm93ZGF0YW1hcERldGFpbHMgPSB7fTtcclxuICAgIHRoaXMucm93ZGlzdGluY3REYXRhTWFwID0ge307XHJcbiAgICB0aGlzLmNoYXJIZWFkZXJMaXN0ID0gW107XHJcbiAgICB0aGlzLmF0dHJpYnV0ZUR0bE1hcCA9IHt9O1xyXG4gICAgdGhpcy5tYXBwU2hlZXREYXRhID0gW107XHJcbiAgICB0aGlzLnN0YXR1c0xpc3QgPSBbXTtcclxuICAgIHRoaXMuZmlsZURldGFpbHMgPSBbXTtcclxuICAgIHRoaXMuZmlsZVR5cGVMaXN0ID0gW107XHJcbiAgICB0aGlzLmZpbGVPcHRpb25zTGlzdCA9IFtdO1xyXG4gICAgdGhpcy5maWxlVHlwZTtcclxuICAgIHRoaXMubm1lO1xyXG4gICAgdGhpcy50eXA7XHJcbiAgICB0aGlzLmRlc2NyaXB0aW9uO1xyXG4gICAgdGhpcy5jaGVja19zdGF0dXMgPSBbXTtcclxuICAgIHRoaXMucGt0X3N0YXR1cyA9IFtdO1xyXG4gICAgdGhpcy5jb2xGb3JtYXRlID0gW107XHJcbiAgICB0aGlzLmFsbGNvbHMgPSBbXTtcclxuICAgIHRoaXMuZmlsZUxvZ0lkbiA9IDA7XHJcbiAgICB0aGlzLnNob3cgPSBmYWxzZTtcclxuICAgIHRoaXMuc3RlcE1zZyA9ICcnO1xyXG4gICAgdGhpcy5zdHRzID0ge307XHJcbiAgICB0aGlzLmNsaWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudG90UHJvZ3Jlc3MgPSAwO1xyXG4gICAgdGhpcy50b3RQcm9ncmVzc0ZpbGUgPSAwO1xyXG4gICAgdGhpcy5zdGVwID0gMTtcclxuICAgIHRoaXMubGFibGUgPSBcIlwiO1xyXG4gICAgdGhpcy5maWxlbm1lID0gXCJcIjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHRoaXMuZGF0ZUZvcm1hdE1hcCA9IHt9O1xyXG4gICAgbGV0IGZpbGV0eXBlID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZpbGV0eXBlJ10gfHwgJyc7XHJcbiAgICB0aGlzLm1kbCA9IG1kbDtcclxuICAgIHRoaXMuZmlsZW5tZSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmaWxldHlwZSddIHx8ICcnO1xyXG4gICAgdGhpcy5tYXBwaW5nc2tpcCA9IGZhbHNlO1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSBmaWxlVXBsb2FkO1xyXG4gICAgaWYgKG1kbCAhPSAnJylcclxuICAgICAgcmVxT2JqWydtZGwnXSA9IG1kbDtcclxuICAgIGlmIChmaWxldHlwZSAhPSAnJylcclxuICAgICAgcmVxT2JqWydmaWxlbm1lJ10gPSBmaWxldHlwZTtcclxuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMuaGVhZGVyKSk7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyW1wibWV0aG9kXCJdID0gJ2xvYWRGaWxlVXBsb2FkJztcclxuICAgIHRoaXMuY3MubG9hZGlGaWxlKHJlcU9iaiwgdGhpcy5oZWFkZXIsICdmaWxlVXBsb2FkL2xvYWQnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgIGRlYnVnZ2VyO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgfHwge307XHJcbiAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlc3VsdC5wYWdlRGVmaW5hdGlvblxyXG4gICAgICAgIHRoaXMuc3RhdHVzTGlzdCA9IHJlc3VsdC5zdGF0dXNMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZURldGFpbHMgPSByZXN1bHQuZmlsZURldGFpbHM7XHJcbiAgICAgICAgdGhpcy5maWxlVHlwZUxpc3QgPSByZXN1bHQuZmlsZVR5cGVMaXN0O1xyXG4gICAgICAgIHRoaXMuZmlsZU9wdGlvbnNMaXN0ID0gcmVzdWx0LmZpbGVPcHRpb25zTGlzdCB8fCBbXTtcclxuICAgICAgICBpZiAodGhpcy5maWxlT3B0aW9uc0xpc3QubGVuZ3RoID4gMClcclxuICAgICAgICAgIHRoaXMuZmlsZVR5cGUgPSB0aGlzLmZpbGVPcHRpb25zTGlzdFswXS5rO1xyXG4gICAgICAgIGxldCBhZGRsQXR0ciA9IHRoaXMuZmlsZU9wdGlvbnNMaXN0WzBdLmFkZGxfYXR0ciB8fCB7fTtcclxuICAgICAgICB0aGlzLmRhdGVGb3JtYXQgPSBhZGRsQXR0ci5kYXRlZm9ybWF0IHx8ICdkZC9tbS95eSc7XHJcbiAgICAgICAgdGhpcy5kZWxpbSA9IGFkZGxBdHRyLmRlbGltIHx8ICcvJztcclxuICAgICAgICB0aGlzLnN0YXR1c0xpc3QgPSByZXN1bHQuc3RhdHVzTGlzdC5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgICAgICB2YWx1ZTogb3B0aW9uLmssXHJcbiAgICAgICAgICBsYWJlbDogb3B0aW9uLnZcclxuICAgICAgICB9KSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB9LCBlcnJvciA9PiB7XHJcblxyXG4gICAgICAvLyB0aGlzLmZsYXNoTWVzc2FnZXNTZXJ2aWNlLnNob3coZXJyb3IsIHsgY3NzQ2xhc3M6ICdhbGVydC1kYW5nZXInLCB0aW1lb3V0OiAzMDAwIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG5cclxuICAgIGxldCBtZGxrID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWRsS2V5JykpO1xyXG4gICAgbGV0IGNVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcbiAgICB0aGlzLmNEdCA9IG5ldyBEYXRlKCk7XHJcbiAgICB0aGlzLmhlYWRlciA9IHtcclxuICAgICAgJ2NsaWVudGtleSc6IENvb2tpZS5nZXQoJ19jaycpLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnbW9kdWxla2V5JzogbWRsa1tjVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgbWRsID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2dycCddIHx8ICcnO1xyXG5cclxuICAgICAgdGhpcy5sb2FkRmlsZVR5cGVEYXRhKCdmaWxlVXBsb2FkJywgbWRsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpbndhcmRfaWRuO1xyXG4gIGlud2FyZFN0b2NrVHlwZTtcclxuICBzdG9ja0lud2FyZFVwbG9hZChpbndhcmREdGwsIG1kbCkge1xyXG4gICAgdGhpcy5pbndhcmRfaWRuID0gaW53YXJkRHRsLmlud2FyZF9pZG47XHJcbiAgICB0aGlzLmlud2FyZFN0b2NrVHlwZSA9IGlud2FyZER0bC5zdG9ja190eXBlO1xyXG4gICAgdGhpcy5tZGwgPSBtZGw7XHJcbiAgICB0aGlzLmxvYWRGaWxlVHlwZURhdGEoJ2ZpbGVVcGxvYWQnLCBtZGwpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy50aW1lcmZpbGUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcmZpbGUpO1xyXG5cclxuICAgIGlmICh0aGlzLnRpbWVyUHJpY2UgIT0gdW5kZWZpbmVkKVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lclByaWNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRPcHRpb25zRm9yTWl4VG9TaW5nbGUoKSB7XHJcbiAgICB0aGlzLmZpbGVPcHRpb25zTGlzdCA9IFtcclxuICAgICAgeyBcImtcIjogXCI2OTZcIiwgXCJ2XCI6IFwiTWFya2V0aW5nIFN0b2NrXCIgfVxyXG4gICAgXTtcclxuICAgIHRoaXMuZmlsZVR5cGUgPSBcIjY5NlwiO1xyXG4gIH1cclxuXHJcblxyXG59IiwiPGRpdiBjbGFzcz1cIm10XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiAjZmZmO1wiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lXCI+XHJcbiAgICAgICAgPHAgKm5nSWY9XCJzaG93XCIgY2xhc3M9XCJsb2FkaW5nLXRleHRcIiBzdHlsZT1cInotaW5kZXg6IDk5OTlcIj4ge3tzdGVwTXNnfX0gPC9wPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5uZXJEXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1lbGVtZW50LXN0ZXBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc3RlcC10aGluXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBiZy1ncmV5IG10LXN0ZXAtY29sXCIgW25nQ2xhc3NdPVwieydkb25lJzpzdGVwPT0xID8gJ2RvbmUnOicnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9c2V0U2V0cCgxKT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LXN0ZXAtbnVtYmVyIGJnLXdoaXRlIGZvbnQtZ3JleVwiPjE8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LXN0ZXAtdGl0bGUgdXBwZXJjYXNlIGZvbnQtZ3JleS1jYXNjYWRlXCI+QnJvd3NlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGJnLWdyZXkgbXQtc3RlcC1jb2xcIiBbbmdDbGFzc109XCJ7J2RvbmUnOnN0ZXA9PTIgPyAnZG9uZSc6Jyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1zZXRTZXRwKDIpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC1udW1iZXIgYmctd2hpdGUgZm9udC1ncmV5XCI+MjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC10aXRsZSB1cHBlcmNhc2UgZm9udC1ncmV5LWNhc2NhZGVcIj5IZWFkZXIgVmVyaWZpY2F0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGJnLWdyZXkgbXQtc3RlcC1jb2xcIiBbbmdDbGFzc109XCJ7J2RvbmUnOnN0ZXA9PTMgPyAnZG9uZSc6Jyd9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1zZXRTZXRwKDMpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC1udW1iZXIgYmctd2hpdGUgZm9udC1ncmV5XCI+MzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtc3RlcC10aXRsZSB1cHBlcmNhc2UgZm9udC1ncmV5LWNhc2NhZGVcIj5EYXRhIFZlcmlmaWNhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgYmctZ3JleSBtdC1zdGVwLWNvbFwiIFtuZ0NsYXNzXT1cInsnZG9uZSc6c3RlcD09NCA/ICdkb25lJzonJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPXNldFNldHAoNCk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1zdGVwLW51bWJlciBiZy13aGl0ZSBmb250LWdyZXlcIj40PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1zdGVwLXRpdGxlIHVwcGVyY2FzZSBmb250LWdyZXktY2FzY2FkZVwiPlVwbG9hZGluZy4uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT0xXCI+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0zIGNvbC1tZC0zXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTQgY29udHJvbC1sYWJlbFwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPkZpbGUgVHlwZSA6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cImZpbGVUeXBlXCIgWyhuZ01vZGVsKV09XCJmaWxlVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tc2VsZWN0LS08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZU9wdGlvbnNMaXN0XCIgdmFsdWU9XCJ7e2ZpbGU/Lmt9fVwiPnt7ZmlsZT8udn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmaWxlaW5wdXQtd3JhcHBlciBidG4gYnRuLWRlZmF1bHQgIGZpbGVpbnB1dCBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6ICMzYTU4OThcIj48c3Bhbj5Ccm93c2UgZmlsZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZmlsZWlucHV0IGJ0bi1wcmltYXJ5XCIgbmFtZT1cImZpbGVuYW1lXCIgaWQ9XCJmaWxlbmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJCcm93c2UgZmlsZVwiIGFjY2VwdD1cIi54bHN4LC5jc3ZcIiAoY2hhbmdlKT1cImluY29taW5nZmlsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IC0xNjMuNzVweDsgdG9wOiA5cHg7XCI+PC9hPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+VXBsb2FkIEZpbGUgOiAmbmJzcDsmbmJzcDsmbmJzcDs8L2xhYmVsPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImZpbGVpbnB1dCBidG4tcHJpbWFyeVwiIGFjY2VwdD1cIi54bHN4LC5jc3ZcIiBuYW1lPVwiZmlsZW5hbWVcIiBpZD1cImZpbGVuYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJpbmNvbWluZ2ZpbGUoJGV2ZW50KVwiIHRpdGxlPVwiQnJvd3NlIGZpbGVcIj4gLS0+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIE1hdGNoIDoge3t0b3RhbG1hdGNofX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG90YWwgSWdub3JlIDoge3t0b3RhbGlnbm9yZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbC1tZC0xMlwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87d2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImZpbGV1cGxvYWR2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRlckxpc3QgO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hdGNoJzpoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyIT0nJyAmJiBoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5pZ25vcmUhPSdZJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmUnOmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZT09J1knLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoYmcnOmhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHI9PScnICYmIGhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmlnbm9yZSE9J1knXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJ1cGRhdGVjb2x1bW5zdGF0dWUoaGRyKVwiPnt7aGRyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRlckxpc3QgO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cj09JydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiIG5hbWU9XCJ7e2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0clwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29uZmlybXNldEhlYWRlck1hcHAoaGRyLCRldmVudC50YXJnZXQpXCI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwic2VsZWN0LWNvbnRyb2xcIiBuYW1lPVwie3toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbmZpcm1zZXRIZWFkZXJNYXBwKGhkcilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tc2VsZWN0LS08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgYXR0ckR0bCBvZiBhdHRyU3RydWN0dXJlRHRsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3thdHRyRHRsPy5hdHRyfX1cIj57e2F0dHJEdGw/LmF0dHJ9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0ciE9JydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhkciBvZiBoZWFkZXJMaXN0IDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmR0YV90eXA9PSdkJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiIG5hbWU9XCJ7e2RhdGVGb3JtYXRNYXBbaGRyXX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkYXRlRm9ybWF0TWFwW2hkcl1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZHRlRm10IG9mIGRhdGVGb3JtYXRMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tkdGVGbXQ/Lmt9fVwiPnt7ZHRlRm10Py52fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3dEaXMgb2YgZGVmdWx0RGlzcGxheU9iaiA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZGVyTGlzdCA7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cm93RGlzW2hkcl19fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0xMSBjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZmlsZUxvZ0lkbj09MCAmJiBmaWxlbm1lPT0nZ2VuZXJpYydcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlNraXBWZXJpZmljYXRpb24oKVwiPlNraXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImZpbGVMb2dJZG49PTBcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlZhbGlkYXRlRmlsZUhlYWRlck1hcHBpbmcoJ1knKVwiPlZlcmlmeTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB1cGxvYWQgXCIgKm5nSWY9XCJzdGVwPT0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB0YWJsZS1yZXNwb25zaXZlIGNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9XCIxMFwiIGNsYXNzPVwiZGlzcGxheVRhYmxlIGZpbGV1cGxvYWR2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgY2hhckhlYWRlckxpc3QgO2xldCBqPWluZGV4O1wiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cImNvbG9yOndoaXRlO2JvcmRlcjogMXB4IHNvbGlkIHdoaXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hkcn19KHt7aGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cn19KTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBbbmdDbGFzc109XCJ7J2V2ZW4nOmolMj09MCwnb2RkJzpqJTI9PTF9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGF0dHJWYWwgb2Ygcm93ZGlzdGluY3REYXRhTWFwW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MTYwcHg7bWFyZ2luLXJpZ2h0OiAxcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtYXRjaGVkVWwnOnJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbCAhPScnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIHN0eWxlPVwibGlzdC1zdHlsZTogbm9uZTt0ZXh0LWFsaWduOmxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+IHt7YXR0clZhbH19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbD09JydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QtY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJvd2RhdGFtYXBEZXRhaWxzW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdW2F0dHJWYWxdLnZhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbmZpcm1IZWFkZXJEZXRhaWxzTWFwcChoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyLGhlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJfaWRuLGF0dHJWYWwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS1zZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdHRyZHRsbWFwIG9mIGF0dHJpYnV0ZUR0bE1hcFtoZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7e2F0dHJkdGxtYXA/LnZhbH19XCI+e3thdHRyZHRsbWFwPy52YWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicm93ZGF0YW1hcERldGFpbHNbaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cl1bYXR0clZhbF0udmFsIT0nJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWx9fSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsgPGkgKGNsaWNrKT1cInJlbW92ZURldGFpbEF0dHJPcHRWYWwoaGVhZGVyQXR0cmlidXRlRHRsW2hkcl0uYXR0cl9pZG4sYXR0clZhbCxyb3dkYXRhbWFwRGV0YWlsc1toZWFkZXJBdHRyaWJ1dGVEdGxbaGRyXS5hdHRyXVthdHRyVmFsXS52YWwsW2hlYWRlckF0dHJpYnV0ZUR0bFtoZHJdLmF0dHJdKVwiIGNsYXNzPVwiZmEgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBzdHlsZT1cImNvbG9yOiByZWQ7Y3Vyc29yOiBwb2ludGVyO1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLW9mZnNldC0xMSBjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZmlsZUxvZ0lkbj09MCAmJiBmaWxlbm1lPT0nZ2VuZXJpYydcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbjogNXB4XCIgKGNsaWNrKT1cIlNraXBWZXJpZmljYXRpb25EdGwoKVwiPlNraXA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBwdWxsLXJpZ2h0XCIgc3R5bGU9XCJtYXJnaW46IDVweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwbG9hZEZpbGUoKVwiIFtkaXNhYmxlZF09XCJnbWF0Y2hlZENvdW50IT1ncmVzdWx0Q291bnRcIj5VcGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgdXBsb2FkXCIgKm5nSWY9XCJzdGVwPT00XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE1cHg7Y29sb3I6Z3JlZW47Zm9udC1zaXplOiAyMHB4O3RleHQtYWxpZ246IGxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFibGVGaWxlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxNHB4O1wiICpuZ0lmPVwibGFzdFJlZnJlc2hUaW1lRmlsZSAhPSBudWxsXCI+TGFzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggdGltZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt7bGFzdFJlZnJlc2hUaW1lRmlsZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwibWFyZ2luOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItd2FybmluZ1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCI2MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6dG90UHJvZ3Jlc3NGaWxlKyclJ30gIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dG90UHJvZ3Jlc3NGaWxlfX0gJVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJzdGVwPT00ICYmIGNsaWNrZWRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDM1cHg7XCI+PHN0cm9uZz4gQ29tcGxldGUgOnt7c3R0c0ZpbGVbJ0MnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFBlbmRpbmcgOiB7e3N0dHNGaWxlWydQJ119fSAmbmJzcDsmbmJzcDsmbmJzcDsgRXJyb3IgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c3R0c0ZpbGVbJ0UnXX19Jm5ic3A7Jm5ic3A7Jm5ic3A7IEludmFpbGQgU3RhdHVzIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0dHNGaWxlWydJJ119fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyBUb3RhbCA6IHt7c3R0c0ZpbGVbJ1QnXX19PC9zdHJvbmc+PC9wPlxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxNXB4O2NvbG9yOmdyZWVuO2ZvbnQtc2l6ZTogMjBweDttYXJnaW4tdG9wOiAxNXB4O3RleHQtYWxpZ246IGxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bGFibGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEycHg7bWFyZ2luLWxlZnQ6IDIwcHg7Y29sb3I6IGJsYWNrO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJsYXN0UmVmcmVzaFRpbWUgIT0gbnVsbFwiPkxhc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoIHRpbWUgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7e2xhc3RSZWZyZXNoVGltZSB8IGRhdGU6J21lZGl1bSd9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzc1wiIHN0eWxlPVwibWFyZ2luOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhciBwcm9ncmVzcy1iYXItd2FybmluZ1wiIHJvbGU9XCJwcm9ncmVzc2JhclwiIGFyaWEtdmFsdWVub3c9XCI2MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIiBhcmlhLXZhbHVlbWF4PVwiMTAwXCIgW25nU3R5bGVdPVwieyd3aWR0aCc6dG90UHJvZ3Jlc3MrJyUnfSAgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0b3RQcm9ncmVzc319ICVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgdGV4dC1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbjogNXB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGVja1VwbG9hZFN0dCgpXCI+Q2hlY2tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1czwvYnV0dG9uPiAtLT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwic3RlcD09NCAmJiBjbGlja2VkXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAzNXB4O1wiPjxzdHJvbmc+IENvbXBsZXRlIDp7e3N0dHNbJ0MnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IFBlbmRpbmcgOiB7e3N0dHNbJ1AnXX19ICZuYnNwOyZuYnNwOyZuYnNwOyBFcnJvciA6IHt7c3R0c1snRSddfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsgVG90YWwgOiB7e3N0dHNbJ1QnXX19PC9zdHJvbmc+PC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJmaWxlVXBsb2FkTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgc3R5bGU9XCJ6LWluZGV4OiA5OTk5OTlcIiByb2xlPVwiZGlhbG9nXCJcclxuICAgIGFyaWEtbGFiZWxsZWRieT1cInNtYWxsTW9kYWxIZWFkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIGRhdGEta2V5Ym9hcmQ9XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiICNmaWxlVXBsb2FkY2xzYnRuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJzbWFsbE1vZGFsSGVhZFwiPkFkZCBmaWxlIHVwbG9hZCBvcHRpb248L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cImZvcm0taG9yaXpvbnRhbFwiIHJvbGU9XCJmb3JtXCIgI2Y9XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoZilcIiBuYW1lPVwiYXBwRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5OYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIm5tZVwiIG5hbWU9XCJubWVcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5EZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTMgY29udHJvbC1sYWJlbFwiPlR5cGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmFtZT1cInR5cFwiIFsobmdNb2RlbCldPVwidHlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLXNlbGVjdC0tPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZVR5cGVMaXN0XCIgdmFsdWU9XCJ7e2ZpbGU/Lmt9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmaWxlPy52fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5DaGVjayBzdGF0dXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWN0IFN0YXR1c1wiIFtvcHRpb25zXT1cInN0YXR1c0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNoZWNrX3N0YXR1c1wiIG5hbWU9XCJjaGVja19zdGF0dXNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNvcHRpb25UZW1wbGF0ZSBsZXQtb3B0aW9uPVwib3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmFtZmFtZmFtLWZsYWdzIHt7b3B0aW9uPy52YWx1ZX19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbj8ubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5QYWNrZXQgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTdGF0dXNcIiBbb3B0aW9uc109XCJzdGF0dXNMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwa3Rfc3RhdHVzXCIgbmFtZT1cInBrdF9zdGF0dXNcIiBbYWxsb3dDbGVhcl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhbWZhbWZhbS1mbGFncyB7e29wdGlvbj8udmFsdWV9fVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24/LmxhYmVsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgI2ZpbGVVcGxvYWRjbHNidG4+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcHBBcHBOb0RibENsaWNrXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KGYpXCI+U2F2ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiQ29maXJtbWFwaGRyXCIgIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzbWFsbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmFja2Ryb3A9XCJzdGF0aWNcIlxyXG4gIGRhdGEta2V5Ym9hcmQ9XCJmYWxzZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiQ2FuY2VsSGVhZGVyTWFwcCgpXCIgY2xhc3M9XCJjbG9zZVwiICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiID5DbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwic21hbGxNb2RhbEhlYWRcIj5BbGVydDwvaDQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSBGb3IgTWFwcGluZyA8Yj57e21hcGhkcn19PC9iPiBUbyBBdHRyaWJ1dGUgPGI+e3toZHJtYXNzYWdlfX08L2I+IFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwiQ2FuY2VsSGVhZGVyTWFwcCgpXCIgICBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJzZXRIZWFkZXJNYXBwKCk7XCI+Q29uZmlybTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cIkNvZmlybW1hcGR0bFwiICByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwic21hbGxNb2RhbEhlYWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCJcclxuICBkYXRhLWtleWJvYXJkPVwiZmFsc2VcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIkNhbmNlbEhlYWRlck1hcHAoKVwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIiA+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cInNtYWxsTW9kYWxIZWFkXCI+QWxlcnQ8L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICBBcmUgeW91IHN1cmUgRm9yIE1hcHBpbmcgPGI+e3tkdGxvcHRpb252YWx9fTwvYj4gVG8gQXR0cmlidXRlICA8Yj4ge3tkdGxBdHRyfX0gPC9iPiB3aXRoIEF0dHJpYnV0ZURldGFpbCA8Yj57e2R0bG1hc3NhZ2V9fTwvYj4gXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cIkNhbmNlbEhlYWRlckRldGFpbHNNYXBwKClcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJzZXRIZWFkZXJEZXRhaWxzTWFwcCgpXCI+Q29uZmlybTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbjxidXR0b24gaWQ9XCJidG5maWxlVXBsb2FkTW9kYWxcIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjZmlsZVVwbG9hZE1vZGFsXCI+PC9idXR0b24+XHJcblxyXG48YnV0dG9uIGlkPVwiYnRuQ29maXJtbWFwaGRyXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI0NvZmlybW1hcGhkclwiPjwvYnV0dG9uPlxyXG48YnV0dG9uIGlkPVwiYnRuQ29maXJtbWFwZHRsXCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI0NvZmlybW1hcGR0bFwiPjwvYnV0dG9uPlxyXG5cclxuXHJcblxyXG48IS0tIDxkaXYgY2xhc3M9XCJjZW50ZXJlZFwiPlxyXG4gICAgPGRpdiBpZD1cImRpdlNwaW5uZXJcIiBjbGFzcz1cInNwaW5uZXIgbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0XCI+TG9hZGluZyAuLi48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxidXR0b24gKGNsaWNrKT1cInRlc3QoKVwiIGlkPVwiYnRuTG9hZFJlY29yZHNcIiBzdHlsZT1cImN1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MiU7IGxlZnQ6IDQ1JTtcIj5Mb2FkIFJlY29yZHM8L2J1dHRvbj5cclxuICA8L2Rpdj4gLS0+Il19
|