tango-app-ui-analyse-traffic 3.4.0-beta.25-patch.0 → 3.4.0-beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/esm2022/lib/components/add-nob/add-nob.component.mjs +261 -0
  2. package/esm2022/lib/components/custom-select/custom-select.component.mjs +155 -0
  3. package/esm2022/lib/components/explore-view/explore-view.component.mjs +5 -5
  4. package/esm2022/lib/components/image-doc/image-doc.component.mjs +3 -3
  5. package/esm2022/lib/components/nob-upload/nob-upload.component.mjs +557 -10
  6. package/esm2022/lib/components/tango-analyse-traffic/tango-analyse-traffic.component.mjs +3 -3
  7. package/esm2022/lib/components/traffic-analysis/traffic-analysis.component.mjs +1993 -163
  8. package/esm2022/lib/components/traffic-card-charts/traffic-card-charts.component.mjs +56 -20
  9. package/esm2022/lib/components/traffic-charts/traffic-charts.component.mjs +10 -12
  10. package/esm2022/lib/components/video-url/video-url.component.mjs +2 -2
  11. package/esm2022/lib/services/traffic.service.mjs +78 -20
  12. package/esm2022/lib/tango-analyse-traffic.module.mjs +5 -3
  13. package/fesm2022/tango-app-ui-analyse-traffic.mjs +6446 -3588
  14. package/fesm2022/tango-app-ui-analyse-traffic.mjs.map +1 -1
  15. package/lib/components/add-nob/add-nob.component.d.ts +49 -0
  16. package/lib/components/custom-select/custom-select.component.d.ts +33 -0
  17. package/lib/components/nob-upload/nob-upload.component.d.ts +72 -3
  18. package/lib/components/traffic-analysis/traffic-analysis.component.d.ts +158 -5
  19. package/lib/components/traffic-card-charts/traffic-card-charts.component.d.ts +2 -0
  20. package/lib/services/traffic.service.d.ts +20 -0
  21. package/lib/tango-analyse-traffic.module.d.ts +9 -7
  22. package/package.json +1 -1
@@ -0,0 +1,261 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { Subject, takeUntil } from "rxjs";
3
+ import * as XLSX from 'xlsx';
4
+ import { DatePipe } from '@angular/common';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "../../services/traffic.service";
8
+ import * as i3 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i4 from "tango-app-ui-shared";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "../custom-select/custom-select.component";
12
+ export class AddNobComponent {
13
+ fb;
14
+ service;
15
+ activeModal;
16
+ ts;
17
+ cd;
18
+ datePipe;
19
+ type;
20
+ nobForm;
21
+ destroy$ = new Subject();
22
+ constructor(fb, service, activeModal, ts, cd, datePipe) {
23
+ this.fb = fb;
24
+ this.service = service;
25
+ this.activeModal = activeModal;
26
+ this.ts = ts;
27
+ this.cd = cd;
28
+ this.datePipe = datePipe;
29
+ }
30
+ ngOnDestroy() {
31
+ this.destroy$.next(true);
32
+ this.destroy$.complete();
33
+ }
34
+ clientId;
35
+ maxDate = '';
36
+ ngOnInit() {
37
+ let data = JSON.parse(localStorage.getItem("header-filters") || "");
38
+ this.clientId = data.client;
39
+ this.getNobStoreList(data.client);
40
+ this.setMaxDate();
41
+ }
42
+ storeList = [];
43
+ getNobStoreList(client) {
44
+ this.service.getNOBStoreList(client)?.pipe(takeUntil(this.destroy$))
45
+ .subscribe({
46
+ next: (res) => {
47
+ if (res && res.code === 200) {
48
+ this.storeList = res.data.result;
49
+ }
50
+ },
51
+ error: (err) => {
52
+ }
53
+ });
54
+ }
55
+ storeName;
56
+ storeId;
57
+ dateValue;
58
+ storeCode;
59
+ nobCount;
60
+ onNOBStoreSelect(event, type) {
61
+ if (!event) {
62
+ this.ts.getErrorToast('storeName or storeId is undefined or invalid');
63
+ return;
64
+ }
65
+ if (type === 'storeName') {
66
+ this.storeName = event.storeName;
67
+ const store = this.storeList.find(store => store.storeName === event.storeName);
68
+ if (store) {
69
+ this.storeId = store.storeId;
70
+ this.storeCode = store.storeCode;
71
+ }
72
+ else {
73
+ this.storeId = '';
74
+ this.storeCode = '';
75
+ }
76
+ }
77
+ else if (type === 'storeId') {
78
+ this.storeId = event.storeId;
79
+ const store = this.storeList.find(store => store.storeId === event.storeId);
80
+ if (store) {
81
+ this.storeName = store.storeName;
82
+ this.storeCode = store.storeCode;
83
+ }
84
+ else {
85
+ this.storeName = '';
86
+ this.storeCode = '';
87
+ }
88
+ }
89
+ }
90
+ omit_special_char(event) {
91
+ var k;
92
+ k = event.charCode; // k = event.keyCode; (Both can be used)
93
+ return k == 8 || k == 32 || (k >= 48 && k <= 57);
94
+ }
95
+ setMaxDate() {
96
+ const today = new Date();
97
+ const yesterday = new Date(today);
98
+ yesterday.setDate(today.getDate() - 1); // Set the max date to yesterday
99
+ this.dateValue = yesterday.toISOString().split('T')[0];
100
+ // Format the date as yyyy-MM-dd
101
+ this.maxDate = yesterday.toISOString().split('T')[0];
102
+ }
103
+ onDateChange(event) {
104
+ const selectedDate = event.target.value;
105
+ if (selectedDate > this.maxDate) {
106
+ this.ts.getErrorToast('Invalid date selected!');
107
+ }
108
+ }
109
+ cancel() {
110
+ this.activeModal.close('close');
111
+ }
112
+ onSubmit() {
113
+ let obj = {
114
+ bills: [
115
+ {
116
+ // storeId: this.storeId,
117
+ storeCode: this.storeCode ? this.storeCode : this.storeId,
118
+ // storeName: this.storeName,
119
+ nobDate: this.dateValue,
120
+ nobCount: Number(this.nobCount)
121
+ }
122
+ ],
123
+ clientId: this.clientId
124
+ };
125
+ this.service.getNOBDataList(obj)?.pipe(takeUntil(this.destroy$))
126
+ .subscribe({
127
+ next: (res) => {
128
+ if (res.code === 200 && res) {
129
+ const allMessages = res.message;
130
+ // .map((item:any) => {
131
+ // const status = item.code === 200 ? '✅' : '❌';
132
+ // const storeInfo = item.storeId ? `${item.storeId}` : '';
133
+ // return `${status} ${storeInfo}: ${item.message}`;
134
+ // })
135
+ // .join('<br>');
136
+ this.ts.getSuccessToast(allMessages);
137
+ this.activeModal.close('submit');
138
+ }
139
+ else {
140
+ this.ts.getErrorToast('Unexpected response format');
141
+ }
142
+ },
143
+ error: (err) => {
144
+ this.ts.getErrorToast(err.error.error ? err.error.error : err.error.error);
145
+ },
146
+ });
147
+ }
148
+ typeNOB = 'single';
149
+ nobStore(type) {
150
+ this.typeNOB = type;
151
+ }
152
+ dataTableShow = false;
153
+ dataTableShow1 = false;
154
+ tableHeaders;
155
+ convertedData;
156
+ inputFile;
157
+ onUpload(event) {
158
+ const file = event.target.files[0];
159
+ const reader = new FileReader();
160
+ reader.onload = (e) => {
161
+ const binaryData = e.target.result;
162
+ try {
163
+ const workbook = XLSX.read(binaryData, { type: 'binary' });
164
+ const sheetName = workbook.SheetNames[0];
165
+ if (sheetName !== 'NOB') {
166
+ this.ts.getErrorToast("Please upload a valid file.");
167
+ this.resetFileInput();
168
+ return;
169
+ }
170
+ const sheet = workbook.Sheets[sheetName];
171
+ const jsonData = XLSX.utils.sheet_to_json(sheet, { header: 1 });
172
+ if (jsonData.length > 100) {
173
+ this.ts.getErrorToast("File contains too many rows. Please limit to 100 rows.");
174
+ this.resetFileInput();
175
+ this.dataTableShow1 = true;
176
+ this.cd.detectChanges();
177
+ return;
178
+ }
179
+ else {
180
+ this.dataTableShow = true;
181
+ this.dataTableShow1 = false;
182
+ }
183
+ const headers = jsonData[0];
184
+ this.tableHeaders = headers;
185
+ const dataRows = jsonData.slice(1);
186
+ this.convertedData = {
187
+ bills: dataRows.map((row) => {
188
+ const obj = {};
189
+ headers.forEach((header, index) => {
190
+ let cellValue = row[index];
191
+ if (header === "NOBDate" && typeof cellValue === "number") {
192
+ cellValue = this.convertExcelDate(cellValue);
193
+ }
194
+ else {
195
+ this.ts.getErrorToast(`Please upload a valid NOB Date Format`);
196
+ }
197
+ if (header === "StoreId" && cellValue != null) {
198
+ cellValue = cellValue.toString();
199
+ }
200
+ obj[header] = cellValue;
201
+ });
202
+ return {
203
+ storeCode: obj["StoreId"],
204
+ nobDate: this.datePipe.transform(obj["NOBDate"], "yyyy-MM-dd"),
205
+ nobCount: Number(obj["NOBCount"]),
206
+ };
207
+ })
208
+ .filter((bill) => bill.nobDate !== null && bill.nobCount !== null),
209
+ clientId: this.clientId
210
+ };
211
+ this.ts.getSuccessToast(`File has been uploaded`);
212
+ this.cd.detectChanges();
213
+ }
214
+ catch (error) {
215
+ this.ts.getErrorToast(`Please upload a valid file: ${error}`);
216
+ }
217
+ this.resetFileInput();
218
+ };
219
+ reader.readAsBinaryString(file);
220
+ }
221
+ resetFileInput() {
222
+ if (this.inputFile && this.inputFile.nativeElement) {
223
+ this.inputFile.nativeElement.value = '';
224
+ }
225
+ }
226
+ convertExcelDate(excelDate) {
227
+ const baseDate = new Date(1900, 0, 1);
228
+ const correctedDate = new Date(baseDate.getTime() + (excelDate - 1) * 86400000);
229
+ return correctedDate.toISOString().split("T")[0];
230
+ }
231
+ proceed() {
232
+ this.service.getNOBDataList(this.convertedData)?.pipe(takeUntil(this.destroy$))
233
+ .subscribe({
234
+ next: (res) => {
235
+ if (res.code === 200 && res) {
236
+ const allMessages = res.message;
237
+ this.ts.getSuccessToast(allMessages);
238
+ this.activeModal.close('submit');
239
+ }
240
+ else {
241
+ this.ts.getErrorToast('Unexpected response format');
242
+ }
243
+ },
244
+ error: (err) => {
245
+ this.ts.getErrorToast(err.error.error);
246
+ },
247
+ });
248
+ }
249
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddNobComponent, deps: [{ token: i1.FormBuilder }, { token: i2.TrafficService }, { token: i3.NgbActiveModal }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }, { token: i5.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
250
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddNobComponent, selector: "lib-add-nob", inputs: { type: "type" }, providers: [DatePipe], viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["inputFile"], descendants: true }], ngImport: i0, template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span *ngIf=\"type !=='add'\">Proceed</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download\">Download Template</span></a></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.CustomSelectComponent, selector: "lib-custom-select", inputs: ["items", "searchField", "multi", "idField", "selectedValues", "disabled", "label"], outputs: ["selected"] }] });
251
+ }
252
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddNobComponent, decorators: [{
253
+ type: Component,
254
+ args: [{ selector: 'lib-add-nob', providers: [DatePipe], template: "<div class=\"card pt-0 pb-3 scroll\">\r\n <div class=\"card-body py-0 d-flex flex-start flex-column p-9 \">\r\n <div class=\"my-5 d-flex\">\r\n <div *ngIf=\"type ==='add'\" class=\"symbol symbol-75px symbol-circle\">\r\n <img alt=\"Pic\" src=\"./assets/tango/Icons/add-store-icon.svg\">\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"symbol symbol-75px symbol-circle\">\r\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M37 31V35C37 35.5304 36.7893 36.0391 36.4142 36.4142C36.0391 36.7893 35.5304 37 35 37H21C20.4696 37 19.9609 36.7893 19.5858 36.4142C19.2107 36.0391 19 35.5304 19 35V31M33 24L28 19M28 19L23 24M28 19V31\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n </div>\r\n <div class=\"row w-100\">\r\n <div *ngIf=\"type ==='add'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Add Single NoB</a>\r\n </div>\r\n <div *ngIf=\"type ==='reupload'\" class=\"col-md-12\">\r\n <a class=\"fs-4 text-gray-800 text-hover-primary fw-bold mb-0 title cursor-pointer\">Upload NoB for</a>\r\n </div>\r\n<div *ngIf=\"type ==='reupload'\" class=\"d-flex align-items-center mt-5\">\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('single')\" [ngClass]=\"typeNOB ==='single' ? 'form-check-inline':'form-check-inline-none'\" >\r\n <svg *ngIf=\"typeNOB ==='single'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='single'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <!-- <input class=\"form-check-input ms-10\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\"> -->\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='single' ? 'form-text-primary ':'form-defult'\">Single Store</span>\r\n </div>\r\n <div class=\"form-check w-50 cursor-pointer ps-5\" (click)=\"nobStore('multiple')\" [ngClass]=\"typeNOB ==='multiple' ? 'form-check-inline':'form-check-inline-none'\">\r\n <svg *ngIf=\"typeNOB ==='multiple'\" style=\"margin-top: -5px !important;\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"#EAF8FF\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#00A3FF\"/>\r\n <circle cx=\"8\" cy=\"8\" r=\"3\" fill=\"#00A3FF\"/>\r\n </svg>\r\n\r\n <svg *ngIf=\"typeNOB !=='multiple'\" style=\"margin-top: -5px !important;\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" fill=\"white\"/>\r\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n </svg>\r\n <span class=\"ms-3 pt-12\" [ngClass]=\"typeNOB ==='multiple' ? 'form-text-primary':'form-defult'\">Multiple Stores</span>\r\n \r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='single'\" class=\"w-100 h-0px scroll\">\r\n <div class=\"mt-5\">\r\n <div class=\"row px-0 me-3\">\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeName\" class=\"form-label\">Store Name<span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeName'\"\r\n [idField]=\"'storeName'\" (selected)=\"onNOBStoreSelect($event, 'storeName')\"\r\n [selectedValues]=\"[{ storeName: storeName }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"storeID\" class=\"form-label\">Store ID /<span *ngIf=\"type !=='add'\"> Store Code</span><span *ngIf=\"type ==='add'\"> Reference Code</span> <span\r\n class=\"alert-required text-danger\"> *</span></label>\r\n <lib-custom-select [items]=\"storeList\" [multi]=\"false\" [searchField]=\"'storeId'\"\r\n [idField]=\"'storeId'\" (selected)=\"onNOBStoreSelect($event, 'storeId')\"\r\n [selectedValues]=\"[{ storeId: storeId }]\">\r\n </lib-custom-select>\r\n </div>\r\n\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"Date\" class=\"form-label\">Select Date <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"date\" class=\"form-control\" id=\"myDate\" [(ngModel)]=\"dateValue\"\r\n (change)=\"onDateChange($event)\" [max]=\"maxDate\">\r\n </div>\r\n <div class=\"col-md-12 col-lg-6 col-xl-6 col-xxl-6 mb-7\">\r\n <label for=\"count\" class=\"form-label\">NOB Count <span\r\n class=\"alert-required text-danger\">*</span></label>\r\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"nobCount\"\r\n (keypress)=\"omit_special_char($event)\">\r\n </div>\r\n <div class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"onSubmit()\"\r\n [disabled]=\"!dateValue || !nobCount || !storeId || !storeName\"><span *ngIf=\"type !=='add'\">Proceed</span><span *ngIf=\"type ==='add'\">Add</span></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex justify-content\">\r\n <div class=\"fw-bold text-gray-500 my-6\">\r\n <ul class=\"text-gray-400 fw-bold fs-6\">\r\n <li class=\"user-text\">Use the template to upload multiple NoB\u2019s at once.</li>\r\n <li class=\"user-text \">Download the template here - <a href=\"../../assets/files/nobUploadTemplate.xlsx\" download><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"21\" viewBox=\"0 0 20 21\" fill=\"none\">\r\n <path d=\"M17.5 13V16.3333C17.5 16.7754 17.3244 17.1993 17.0118 17.5118C16.6993 17.8244 16.2754 18 15.8333 18H4.16667C3.72464 18 3.30072 17.8244 2.98816 17.5118C2.67559 17.1993 2.5 16.7754 2.5 16.3333V13M5.83333 8.83333L10 13M10 13L14.1667 8.83333M10 13V3\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg><span class=\"ms-2 text-download\">Download Template</span></a></li>\r\n <li class=\"user-text \">Add your data to the Template File</li>\r\n <li class=\"user-text\">Upload it below for processing</li>\r\n \r\n </ul>\r\n </div>\r\n </div>\r\n <div *ngIf=\"typeNOB ==='multiple'\"\r\n class=\"mt-3 ms-3 right-bar py-10 d-flex justify-content-center align-items-center flex-column\">\r\n <input name=\"accountType\" type=\"radio\" id=\"kt_create_account_form_account_type_personal\"\r\n value=\"personal\" class=\"btn-check\" ng-reflect-name=\"accountType\"\r\n ng-reflect-form-control-name=\"accountType\" (change)=\"onUpload($event)\"\r\n ng-reflect-value=\"personal\" type=\"file\" #inputFile />\r\n <label for=\"kt_create_account_form_account_type_personal\" class=\" w-50 p-4 mt-5\"><span\r\n class=\"fw-bold text-center w-100 fs-4\">\r\n<div class=\"d-flex justify-content-center align-items-center w-100\">\r\n <svg width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#F2F4F7\" />\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#F9FAFB\"\r\n stroke-width=\"6\" />\r\n <g clip-path=\"url(#clip0_4047_40566)\">\r\n <path\r\n d=\"M26.3333 26.3334L23 23M23 23L19.6666 26.3334M23 23V30.5M29.9916 28.325C30.8044 27.8819 31.4465 27.1808 31.8165 26.3322C32.1866 25.4837 32.2635 24.5361 32.0351 23.6389C31.8068 22.7418 31.2862 21.9463 30.5555 21.3779C29.8248 20.8095 28.9257 20.5006 28 20.5H26.95C26.6977 19.5244 26.2276 18.6186 25.5749 17.8509C24.9222 17.0831 24.104 16.4732 23.1817 16.0672C22.2594 15.6612 21.2571 15.4695 20.2501 15.5066C19.243 15.5437 18.2575 15.8086 17.3676 16.2814C16.4777 16.7542 15.7066 17.4226 15.1122 18.2363C14.5177 19.0501 14.1155 19.988 13.9358 20.9795C13.756 21.9711 13.8034 22.9905 14.0743 23.9611C14.3452 24.9317 14.8327 25.8282 15.5 26.5834\"\r\n stroke=\"#475467\" stroke-width=\"1.66667\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4047_40566\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(13 13)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n <div class=\"nodata-title\"><span class=\"click-upload cursor-pointer\">Click to\r\n upload </span>\r\n <!-- <span class=\"drag-drop\"> or drag and drop the template</span> -->\r\n </div>\r\n \r\n </span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"typeNOB ==='multiple'\" class=\"d-flex mt-3 mb-10\" role=\"group\">\r\n <button class=\"btn btn-outline w-100 me-3\" (click)=\"cancel()\">Cancel</button>\r\n <button class=\"btn btn-primary w-100 ms-3\" id=\"alert-toast\" (click)=\"proceed()\"\r\n >Proceed</button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".scroll{overflow-y:auto;overflow-x:hidden}.title{color:var(--Gray-900, #101828)!important;font-size:18px!important;font-weight:600;line-height:28px}.sub-title{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.teams-title{color:var(--Black, #101828)!important;font-size:18px!important;font-weight:600!important;line-height:28px}.title-header{border-radius:6px!important;border-bottom:2px solid var(--Gray-200, #EAECF0)!important;background:#f2f4f7!important;box-shadow:0 4px 10px #0000000d!important;color:var(--Black, #101828)!important;font-size:20px!important;font-weight:600;line-height:30px;padding:8px 16px}input[type=checkbox]{width:18px!important;height:18px!important;margin:5px;border-radius:4px!important;-webkit-appearance:none;-moz-appearance:none;-o-appearance:none;appearance:none;outline:1px solid var(--gray-300, #D0D5DD);box-shadow:none;font-size:.8em;text-align:center;line-height:1em;background:#fff}input[type=checkbox]:checked{outline:1px solid var(--primary-600, #00A3FF);background-color:var(--primary-50, #EAF8FF)}input[type=checkbox]:checked:after{content:\"\";transform:rotate(45deg);border-bottom:2px solid #00A3FF;border-right:2px solid #00A3FF;display:inline-block;width:.5em;padding-left:0;padding-top:12px;padding-right:6px}.global-label{color:var(--Gray-700, #344054)!important;font-size:16px!important;font-weight:500;line-height:24px}.w-25{width:40%!important}td{color:var(--Black, #101828)!important;font-size:16px!important;font-weight:500!important;line-height:24px}tr,.add-team{border-bottom:1px solid var(--Gray-200, #EAECF0)!important}input[disabled]{pointer-events:none;opacity:.5}input.form-control{margin-bottom:10px}.dropdown-menu{max-height:200px;overflow-y:auto}.dropdown-item{cursor:pointer}.btn-outline-primary{width:100%;text-align:left}.form-check-inline{border-radius:8px;border:1px solid var(--Primary-700, #009BF3);background:var(--Primary-25, #F6FCFF);padding:16px}.form-check-label{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-check-inline-none{border-radius:8px;border:1px solid var(--Gray-300, #D0D5DD);background:var(--White, #FFF);padding:16px;margin-right:1rem}.right-bar{border-radius:8px!important;border:1px solid var(--Gray-200, #EAECF0)!important;background:var(--White, #FFF);padding:16px 24px!important}.drag-drop{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400;line-height:20px}.click-upload{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-decoration-style:solid;text-decoration-skip-ink:none;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font;text-transform:capitalize}.user-text{color:var(--Gray-500, #344054)!important;font-size:14px!important;font-weight:400!important;line-height:28px;list-style:decimal!important}.form-text-primary{color:var(--Primary-700, #009BF3)!important;font-size:16px!important;font-weight:600;line-height:24px}.form-defult{color:var(--Gray-900, #101828)!important;font-size:16px!important;font-weight:600;line-height:24px}\n"] }]
255
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.TrafficService }, { type: i3.NgbActiveModal }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }, { type: i5.DatePipe }], propDecorators: { type: [{
256
+ type: Input
257
+ }], inputFile: [{
258
+ type: ViewChild,
259
+ args: ["inputFile"]
260
+ }] } });
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW5vYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL2FkZC1ub2IvYWRkLW5vYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBYyxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5RyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxlQUFlO0lBS1I7SUFBdUI7SUFBK0I7SUFBb0M7SUFBeUI7SUFBNkI7SUFKM0osSUFBSSxDQUFLO0lBRWxCLE9BQU8sQ0FBWTtJQUNGLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzFDLFlBQW9CLEVBQWMsRUFBUyxPQUFzQixFQUFTLFdBQTJCLEVBQVMsRUFBZ0IsRUFBUyxFQUFvQixFQUFTLFFBQWtCO1FBQWxLLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBUyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVMsT0FBRSxHQUFGLEVBQUUsQ0FBYztRQUFTLE9BQUUsR0FBRixFQUFFLENBQWtCO1FBQVMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUV0TCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElB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LENBQUMsa0lDWnZCLDYwWUF3Sk07OzRGRDFJTyxlQUFlO2tCQU4zQixTQUFTOytCQUNFLGFBQWEsYUFHWixDQUFDLFFBQVEsQ0FBQzs0TkFHZCxJQUFJO3NCQUFaLEtBQUs7Z0JBNElrQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hZGQtbm9iJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYWRkLW5vYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FkZC1ub2IuY29tcG9uZW50LnNjc3MnLFxyXG4gIHByb3ZpZGVyczogW0RhdGVQaXBlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQWRkTm9iQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LE9uRGVzdHJveSB7XHJcbkBJbnB1dCgpIHR5cGU6YW55O1xyXG5cclxubm9iRm9ybTogRm9ybUdyb3VwO1xyXG5wcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcclxuY29uc3RydWN0b3IocHJpdmF0ZSBmYjpGb3JtQnVpbGRlcixwcml2YXRlIHNlcnZpY2U6VHJhZmZpY1NlcnZpY2UscHJpdmF0ZSBhY3RpdmVNb2RhbCA6TmdiQWN0aXZlTW9kYWwscHJpdmF0ZSB0czogVG9hc3RTZXJ2aWNlLHByaXZhdGUgY2Q6Q2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUpe1xyXG5cclxufVxyXG5uZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XHJcbiAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG59XHJcbmNsaWVudElkOmFueTtcclxubWF4RGF0ZTogc3RyaW5nID0gJyc7XHJcbm5nT25Jbml0KCk6IHZvaWQge1xyXG5sZXQgZGF0YTogYW55ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhlYWRlci1maWx0ZXJzXCIpIHx8IFwiXCIpO1xyXG50aGlzLmNsaWVudElkID1kYXRhLmNsaWVudFxyXG50aGlzLmdldE5vYlN0b3JlTGlzdChkYXRhLmNsaWVudCk7XHJcbnRoaXMuc2V0TWF4RGF0ZSgpO1xyXG59XHJcblxyXG5cclxuc3RvcmVMaXN0OmFueVtdPVtdO1xyXG5nZXROb2JTdG9yZUxpc3QoY2xpZW50OmFueSl7XHJcbiAgdGhpcy5zZXJ2aWNlLmdldE5PQlN0b3JlTGlzdChjbGllbnQpPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZihyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgdGhpcy5zdG9yZUxpc3QgPXJlcy5kYXRhLnJlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgXHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuc3RvcmVOYW1lOmFueTtcclxuc3RvcmVJZDphbnk7XHJcbmRhdGVWYWx1ZTphbnk7XHJcbnN0b3JlQ29kZTphbnk7XHJcbm5vYkNvdW50OmFueTtcclxub25OT0JTdG9yZVNlbGVjdChldmVudDogYW55LCB0eXBlOiAnc3RvcmVOYW1lJyB8ICdzdG9yZUlkJyk6IHZvaWQge1xyXG4gIGlmICghZXZlbnQpIHtcclxuICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdCgnc3RvcmVOYW1lIG9yIHN0b3JlSWQgaXMgdW5kZWZpbmVkIG9yIGludmFsaWQnKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgaWYgKHR5cGUgPT09ICdzdG9yZU5hbWUnKSB7XHJcbiAgICB0aGlzLnN0b3JlTmFtZSA9IGV2ZW50LnN0b3JlTmFtZTtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZUxpc3QuZmluZChzdG9yZSA9PiBzdG9yZS5zdG9yZU5hbWUgPT09IGV2ZW50LnN0b3JlTmFtZSk7XHJcbiAgICBpZiAoc3RvcmUpIHtcclxuICAgICAgdGhpcy5zdG9yZUlkID0gc3RvcmUuc3RvcmVJZDtcclxuICAgICAgdGhpcy5zdG9yZUNvZGUgPSBzdG9yZS5zdG9yZUNvZGU7IFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yZUlkID0gJyc7XHJcbiAgICAgIHRoaXMuc3RvcmVDb2RlID0gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbHNlIGlmICh0eXBlID09PSAnc3RvcmVJZCcpIHtcclxuICAgIHRoaXMuc3RvcmVJZCA9IGV2ZW50LnN0b3JlSWQ7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoc3RvcmUgPT4gc3RvcmUuc3RvcmVJZCA9PT0gZXZlbnQuc3RvcmVJZCk7XHJcbiAgICBpZiAoc3RvcmUpIHtcclxuICAgICAgdGhpcy5zdG9yZU5hbWUgPSBzdG9yZS5zdG9yZU5hbWU7XHJcbiAgICAgIHRoaXMuc3RvcmVDb2RlID0gc3RvcmUuc3RvcmVDb2RlOyBcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcmVOYW1lID0gJyc7XHJcbiAgICAgIHRoaXMuc3RvcmVDb2RlID0gJyc7IFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgXHJcbn1cclxub21pdF9zcGVjaWFsX2NoYXIoZXZlbnQ6IGFueSkge1xyXG4gIHZhciBrO1xyXG4gIGsgPSBldmVudC5jaGFyQ29kZTsgLy8gICAgICAgICBrID0gZXZlbnQua2V5Q29kZTsgIChCb3RoIGNhbiBiZSB1c2VkKVxyXG4gIHJldHVybiBrID09IDggfHwgayA9PSAzMiB8fCAoayA+PSA0OCAmJiBrIDw9IDU3KTtcclxufVxyXG5zZXRNYXhEYXRlKCk6IHZvaWQge1xyXG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICBjb25zdCB5ZXN0ZXJkYXkgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgeWVzdGVyZGF5LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMSk7IC8vIFNldCB0aGUgbWF4IGRhdGUgdG8geWVzdGVyZGF5XHJcbiAgdGhpcy5kYXRlVmFsdWUgPSB5ZXN0ZXJkYXkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gIC8vIEZvcm1hdCB0aGUgZGF0ZSBhcyB5eXl5LU1NLWRkXHJcbiAgdGhpcy5tYXhEYXRlID0geWVzdGVyZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxufVxyXG5vbkRhdGVDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICBpZiAoc2VsZWN0ZWREYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoJ0ludmFsaWQgZGF0ZSBzZWxlY3RlZCEnKTtcclxuICB9XHJcbn1cclxuY2FuY2VsKCl7XHJcbiAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnY2xvc2UnKTtcclxufVxyXG5vblN1Ym1pdCgpe1xyXG4gIGxldCBvYmogPXtcclxuICAgIGJpbGxzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICAvLyBzdG9yZUlkOiB0aGlzLnN0b3JlSWQsXHJcbiAgICAgICAgc3RvcmVDb2RlOiB0aGlzLnN0b3JlQ29kZSA/IHRoaXMuc3RvcmVDb2RlIDogdGhpcy5zdG9yZUlkLFxyXG4gICAgICAgIC8vIHN0b3JlTmFtZTogdGhpcy5zdG9yZU5hbWUsXHJcbiAgICAgICAgbm9iRGF0ZTogdGhpcy5kYXRlVmFsdWUsXHJcbiAgICAgICAgbm9iQ291bnQ6IE51bWJlcih0aGlzLm5vYkNvdW50KVxyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWRcclxuICB9XHJcbnRoaXMuc2VydmljZS5nZXROT0JEYXRhTGlzdChvYmopPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuLnN1YnNjcmliZSh7XHJcbiAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMuY29kZSA9PT0gMjAwICYmIHJlcykge1xyXG4gICAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gcmVzLm1lc3NhZ2VcclxuICAgICAgICAgIC8vIC5tYXAoKGl0ZW06YW55KSA9PiB7XHJcbiAgICAgICAgICAvLyAgIGNvbnN0IHN0YXR1cyA9IGl0ZW0uY29kZSA9PT0gMjAwID8gJ+KchScgOiAn4p2MJzsgXHJcbiAgICAgICAgICAvLyAgIGNvbnN0IHN0b3JlSW5mbyA9IGl0ZW0uc3RvcmVJZCA/IGAke2l0ZW0uc3RvcmVJZH1gIDogJyc7XHJcbiAgICAgICAgICAvLyAgIHJldHVybiBgJHtzdGF0dXN9ICR7c3RvcmVJbmZvfTogJHtpdGVtLm1lc3NhZ2V9YDtcclxuICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgICAvLyAuam9pbignPGJyPicpOyBcclxuICAgICAgICB0aGlzLnRzLmdldFN1Y2Nlc3NUb2FzdChhbGxNZXNzYWdlcyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgnc3VibWl0Jyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdCcpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yID8gZXJyLmVycm9yLmVycm9yOmVyci5lcnJvci5lcnJvcik7XHJcbiAgICB9LFxyXG5cclxufSlcclxufVxyXG5cclxuXHJcbnR5cGVOT0IgPSdzaW5nbGUnXHJcbm5vYlN0b3JlKHR5cGU6YW55KXtcclxuICB0aGlzLnR5cGVOT0IgPXR5cGVcclxufVxyXG5kYXRhVGFibGVTaG93ID1mYWxzZTtcclxuZGF0YVRhYmxlU2hvdzEgPWZhbHNlO1xyXG50YWJsZUhlYWRlcnM6YW55O1xyXG5jb252ZXJ0ZWREYXRhOmFueTtcclxuQFZpZXdDaGlsZChcImlucHV0RmlsZVwiKSBpbnB1dEZpbGU6IEVsZW1lbnRSZWY7XHJcbm9uVXBsb2FkKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgIGNvbnN0IGJpbmFyeURhdGE6IHN0cmluZyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0gWExTWC5yZWFkKGJpbmFyeURhdGEsIHsgdHlwZTogJ2JpbmFyeScgfSk7XHJcbiAgICAgIGNvbnN0IHNoZWV0TmFtZTogc3RyaW5nID0gd29ya2Jvb2suU2hlZXROYW1lc1swXTtcclxuXHJcbiAgICAgIGlmIChzaGVldE5hbWUgIT09ICdOT0InKSB7XHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiUGxlYXNlIHVwbG9hZCBhIHZhbGlkIGZpbGUuXCIpO1xyXG4gICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXQoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNoZWV0OiBYTFNYLldvcmtTaGVldCA9IHdvcmtib29rLlNoZWV0c1tzaGVldE5hbWVdO1xyXG4gICAgICBjb25zdCBqc29uRGF0YSA9IFhMU1gudXRpbHMuc2hlZXRfdG9fanNvbihzaGVldCwgeyBoZWFkZXI6IDEgfSk7XHJcbiAgICAgIGlmIChqc29uRGF0YS5sZW5ndGggPiAxMDApIHsgXHJcbiAgICAgICAgdGhpcy50cy5nZXRFcnJvclRvYXN0KFwiRmlsZSBjb250YWlucyB0b28gbWFueSByb3dzLiBQbGVhc2UgbGltaXQgdG8gMTAwIHJvd3MuXCIpO1xyXG4gICAgICAgIHRoaXMucmVzZXRGaWxlSW5wdXQoKTtcclxuICAgICAgICB0aGlzLmRhdGFUYWJsZVNob3cxID0gdHJ1ZTsgXHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlU2hvdyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kYXRhVGFibGVTaG93MSA9IGZhbHNlOyBcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBoZWFkZXJzOiBhbnkgPSBqc29uRGF0YVswXTtcclxuICAgICAgdGhpcy50YWJsZUhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICBjb25zdCBkYXRhUm93cyA9IGpzb25EYXRhLnNsaWNlKDEpO1xyXG4gICAgICB0aGlzLmNvbnZlcnRlZERhdGEgPSB7XHJcbiAgICAgICAgYmlsbHM6IGRhdGFSb3dzLm1hcCgocm93OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgICBoZWFkZXJzLmZvckVhY2goKGhlYWRlcjogYW55LCBpbmRleDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjZWxsVmFsdWUgPSByb3dbaW5kZXhdO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyID09PSBcIk5PQkRhdGVcIiAmJiB0eXBlb2YgY2VsbFZhbHVlID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgICAgY2VsbFZhbHVlID0gdGhpcy5jb252ZXJ0RXhjZWxEYXRlKGNlbGxWYWx1ZSk7IFxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdChgUGxlYXNlIHVwbG9hZCBhIHZhbGlkIE5PQiBEYXRlIEZvcm1hdGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXIgPT09IFwiU3RvcmVJZFwiICYmIGNlbGxWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY2VsbFZhbHVlID0gY2VsbFZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb2JqW2hlYWRlcl0gPSBjZWxsVmFsdWU7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHN0b3JlQ29kZTogb2JqW1wiU3RvcmVJZFwiXSxcclxuICAgICAgICAgICAgbm9iRGF0ZTogdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0ob2JqW1wiTk9CRGF0ZVwiXSwgXCJ5eXl5LU1NLWRkXCIpLFxyXG4gICAgICAgICAgICBub2JDb3VudDogTnVtYmVyKG9ialtcIk5PQkNvdW50XCJdKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuZmlsdGVyKChiaWxsOiBhbnkpID0+IGJpbGwubm9iRGF0ZSAhPT0gbnVsbCAmJiBiaWxsLm5vYkNvdW50ICE9PSBudWxsKSwgXHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWRcclxuICAgICAgfTtcclxuICAgICAgdGhpcy50cy5nZXRTdWNjZXNzVG9hc3QoYEZpbGUgaGFzIGJlZW4gdXBsb2FkZWRgKTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoYFBsZWFzZSB1cGxvYWQgYSB2YWxpZCBmaWxlOiAke2Vycm9yfWApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNldEZpbGVJbnB1dCgpO1xyXG4gIH07XHJcbiAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKTtcclxufVxyXG5yZXNldEZpbGVJbnB1dCgpOiB2b2lkIHtcclxuICBpZiAodGhpcy5pbnB1dEZpbGUgJiYgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudCkge1xyXG4gICAgdGhpcy5pbnB1dEZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxufVxyXG5cclxuY29udmVydEV4Y2VsRGF0ZShleGNlbERhdGU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3QgYmFzZURhdGUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxKTsgXHJcbiAgY29uc3QgY29ycmVjdGVkRGF0ZSA9IG5ldyBEYXRlKGJhc2VEYXRlLmdldFRpbWUoKSArIChleGNlbERhdGUgLSAxKSAqIDg2NDAwMDAwKTtcclxuICByZXR1cm4gY29ycmVjdGVkRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXTsgXHJcbn1cclxuXHJcbnByb2NlZWQoKXtcclxuICB0aGlzLnNlcnZpY2UuZ2V0Tk9CRGF0YUxpc3QodGhpcy5jb252ZXJ0ZWREYXRhKT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLmNvZGUgPT09IDIwMCAmJiByZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGFsbE1lc3NhZ2VzID0gcmVzLm1lc3NhZ2VcclxuICAgICAgICAgIHRoaXMudHMuZ2V0U3VjY2Vzc1RvYXN0KGFsbE1lc3NhZ2VzKTtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3N1Ym1pdCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHMuZ2V0RXJyb3JUb2FzdCgnVW5leHBlY3RlZCByZXNwb25zZSBmb3JtYXQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnRzLmdldEVycm9yVG9hc3QoZXJyLmVycm9yLmVycm9yKTtcclxuICAgICAgfSxcclxuICBcclxuICB9KVxyXG59XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNhcmQgcHQtMCBwYi0zIHNjcm9sbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0wIGQtZmxleCBmbGV4LXN0YXJ0IGZsZXgtY29sdW1uIHAtOSBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXktNSBkLWZsZXhcIj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUgPT09J2FkZCdcIiBjbGFzcz1cInN5bWJvbCBzeW1ib2wtNzVweCBzeW1ib2wtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIGFsdD1cIlBpY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL2FkZC1zdG9yZS1pY29uLnN2Z1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInR5cGUgPT09J3JldXBsb2FkJ1wiIGNsYXNzPVwic3ltYm9sIHN5bWJvbC03NXB4IHN5bWJvbC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1NlwiIGhlaWdodD1cIjU2XCIgdmlld0JveD1cIjAgMCA1NiA1NlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjRcIiB3aWR0aD1cIjQ4XCIgaGVpZ2h0PVwiNDhcIiByeD1cIjI0XCIgZmlsbD1cIiNEQUYxRkZcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjRcIiB5PVwiNFwiIHdpZHRoPVwiNDhcIiBoZWlnaHQ9XCI0OFwiIHJ4PVwiMjRcIiBzdHJva2U9XCIjRUFGOEZGXCIgc3Ryb2tlLXdpZHRoPVwiOFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTM3IDMxVjM1QzM3IDM1LjUzMDQgMzYuNzg5MyAzNi4wMzkxIDM2LjQxNDIgMzYuNDE0MkMzNi4wMzkxIDM2Ljc4OTMgMzUuNTMwNCAzNyAzNSAzN0gyMUMyMC40Njk2IDM3IDE5Ljk2MDkgMzYuNzg5MyAxOS41ODU4IDM2LjQxNDJDMTkuMjEwNyAzNi4wMzkxIDE5IDM1LjUzMDQgMTkgMzVWMzFNMzMgMjRMMjggMTlNMjggMTlMMjMgMjRNMjggMTlWMzFcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyB3LTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZzLTQgdGV4dC1ncmF5LTgwMCB0ZXh0LWhvdmVyLXByaW1hcnkgZnctYm9sZCBtYi0wIHRpdGxlIGN1cnNvci1wb2ludGVyXCI+QWRkIFNpbmdsZSBOb0I8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0ncmV1cGxvYWQnXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZnMtNCB0ZXh0LWdyYXktODAwIHRleHQtaG92ZXItcHJpbWFyeSBmdy1ib2xkIG1iLTAgdGl0bGUgY3Vyc29yLXBvaW50ZXJcIj5VcGxvYWQgTm9CIGZvcjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbjxkaXYgICpuZ0lmPVwidHlwZSA9PT0ncmV1cGxvYWQnXCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgdy01MCBjdXJzb3ItcG9pbnRlciBwcy01XCIgKGNsaWNrKT1cIm5vYlN0b3JlKCdzaW5nbGUnKVwiIFtuZ0NsYXNzXT1cInR5cGVOT0IgPT09J3NpbmdsZScgPyAnZm9ybS1jaGVjay1pbmxpbmUnOidmb3JtLWNoZWNrLWlubGluZS1ub25lJ1wiID5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJ0eXBlTk9CID09PSdzaW5nbGUnXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNXB4ICFpbXBvcnRhbnQ7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBmaWxsPVwiI0VBRjhGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIzXCIgZmlsbD1cIiMwMEEzRkZcIi8+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInR5cGVOT0IgIT09J3NpbmdsZSdcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC01cHggIWltcG9ydGFudDtcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjAuNVwiIHk9XCIwLjVcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiByeD1cIjcuNVwiIGZpbGw9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiI0QwRDVERFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtcy0xMFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJpbmxpbmVSYWRpb09wdGlvbnNcIiBpZD1cImlubGluZVJhZGlvMVwiIHZhbHVlPVwib3B0aW9uMVwiPiAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMyBwdC0xMlwiIFtuZ0NsYXNzXT1cInR5cGVOT0IgPT09J3NpbmdsZScgPyAnZm9ybS10ZXh0LXByaW1hcnkgJzonZm9ybS1kZWZ1bHQnXCI+U2luZ2xlIFN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgIHctNTAgY3Vyc29yLXBvaW50ZXIgcHMtNVwiIChjbGljayk9XCJub2JTdG9yZSgnbXVsdGlwbGUnKVwiIFtuZ0NsYXNzXT1cInR5cGVOT0IgPT09J211bHRpcGxlJyA/ICdmb3JtLWNoZWNrLWlubGluZSc6J2Zvcm0tY2hlY2staW5saW5lLW5vbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAtNXB4ICFpbXBvcnRhbnQ7XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBmaWxsPVwiI0VBRjhGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgc3Ryb2tlPVwiIzAwQTNGRlwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiOFwiIGN5PVwiOFwiIHI9XCIzXCIgZmlsbD1cIiMwMEEzRkZcIi8+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInR5cGVOT0IgIT09J211bHRpcGxlJ1wiIHN0eWxlPVwibWFyZ2luLXRvcDogLTVweCAhaW1wb3J0YW50O1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiNy41XCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIwLjVcIiB5PVwiMC41XCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgcng9XCI3LjVcIiBzdHJva2U9XCIjRDBENUREXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMyBwdC0xMlwiIFtuZ0NsYXNzXT1cInR5cGVOT0IgPT09J211bHRpcGxlJyA/ICdmb3JtLXRleHQtcHJpbWFyeSc6J2Zvcm0tZGVmdWx0J1wiPk11bHRpcGxlIFN0b3Jlczwvc3Bhbj5cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZU5PQiA9PT0nc2luZ2xlJ1wiIGNsYXNzPVwidy0xMDAgaC0wcHggc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtMCBtZS0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdG9yZSBOYW1lPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPiAqPC9zcGFuPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWN1c3RvbS1zZWxlY3QgW2l0ZW1zXT1cInN0b3JlTGlzdFwiIFttdWx0aV09XCJmYWxzZVwiIFtzZWFyY2hGaWVsZF09XCInc3RvcmVOYW1lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkRmllbGRdPVwiJ3N0b3JlTmFtZSdcIiAoc2VsZWN0ZWQpPVwib25OT0JTdG9yZVNlbGVjdCgkZXZlbnQsICdzdG9yZU5hbWUnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVzXT1cIlt7IHN0b3JlTmFtZTogc3RvcmVOYW1lIH1dXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1jdXN0b20tc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZUlEXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U3RvcmUgSUQgLzxzcGFuICpuZ0lmPVwidHlwZSAhPT0nYWRkJ1wiPiBTdG9yZSBDb2RlPC9zcGFuPjxzcGFuICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiPiBSZWZlcmVuY2UgQ29kZTwvc3Bhbj4gIDxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWQgdGV4dC1kYW5nZXJcIj4gKjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jdXN0b20tc2VsZWN0IFtpdGVtc109XCJzdG9yZUxpc3RcIiBbbXVsdGldPVwiZmFsc2VcIiBbc2VhcmNoRmllbGRdPVwiJ3N0b3JlSWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRGaWVsZF09XCInc3RvcmVJZCdcIiAoc2VsZWN0ZWQpPVwib25OT0JTdG9yZVNlbGVjdCgkZXZlbnQsICdzdG9yZUlkJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZFZhbHVlc109XCJbeyBzdG9yZUlkOiBzdG9yZUlkIH1dXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1jdXN0b20tc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJEYXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IERhdGUgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbGVydC1yZXF1aXJlZCB0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJteURhdGVcIiBbKG5nTW9kZWwpXT1cImRhdGVWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkRhdGVDaGFuZ2UoJGV2ZW50KVwiICBbbWF4XT1cIm1heERhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgY29sLWxnLTYgY29sLXhsLTYgY29sLXh4bC02IG1iLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPk5PQiBDb3VudCA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkIHRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIm5vYkNvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwib21pdF9zcGVjaWFsX2NoYXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBtdC0zIG1iLTEwXCIgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIiAoY2xpY2spPVwib25TdWJtaXQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFkYXRlVmFsdWUgfHwgIW5vYkNvdW50IHx8ICFzdG9yZUlkIHx8ICFzdG9yZU5hbWVcIj48c3BhbiAqbmdJZj1cInR5cGUgIT09J2FkZCdcIj5Qcm9jZWVkPC9zcGFuPjxzcGFuICpuZ0lmPVwidHlwZSA9PT0nYWRkJ1wiPkFkZDwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNTAwIG15LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJ0ZXh0LWdyYXktNDAwIGZ3LWJvbGQgZnMtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJ1c2VyLXRleHRcIj5Vc2UgdGhlIHRlbXBsYXRlIHRvIHVwbG9hZCBtdWx0aXBsZSBOb0LigJlzIGF0IG9uY2UuPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0IFwiPkRvd25sb2FkIHRoZSB0ZW1wbGF0ZSBoZXJlIC0gICA8YSBocmVmPVwiLi4vLi4vYXNzZXRzL2ZpbGVzL25vYlVwbG9hZFRlbXBsYXRlLnhsc3hcIiBkb3dubG9hZD48c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDIwIDIxXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNSAxM1YxNi4zMzMzQzE3LjUgMTYuNzc1NCAxNy4zMjQ0IDE3LjE5OTMgMTcuMDExOCAxNy41MTE4QzE2LjY5OTMgMTcuODI0NCAxNi4yNzU0IDE4IDE1LjgzMzMgMThINC4xNjY2N0MzLjcyNDY0IDE4IDMuMzAwNzIgMTcuODI0NCAyLjk4ODE2IDE3LjUxMThDMi42NzU1OSAxNy4xOTkzIDIuNSAxNi43NzU0IDIuNSAxNi4zMzMzVjEzTTUuODMzMzMgOC44MzMzM0wxMCAxM00xMCAxM0wxNC4xNjY3IDguODMzMzNNMTAgMTNWM1wiIHN0cm9rZT1cIiMwMDlCRjNcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjxzcGFuIGNsYXNzPVwibXMtMiB0ZXh0LWRvd25sb2FkXCI+RG93bmxvYWQgVGVtcGxhdGU8L3NwYW4+PC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInVzZXItdGV4dCBcIj5BZGQgeW91ciBkYXRhIHRvIHRoZSBUZW1wbGF0ZSBGaWxlPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwidXNlci10ZXh0XCI+VXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9saT5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHlwZU5PQiA9PT0nbXVsdGlwbGUnXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMyBtcy0zIHJpZ2h0LWJhciBweS0xMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwiYWNjb3VudFR5cGVcIiB0eXBlPVwicmFkaW9cIiBpZD1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInBlcnNvbmFsXCIgY2xhc3M9XCJidG4tY2hlY2tcIiBuZy1yZWZsZWN0LW5hbWU9XCJhY2NvdW50VHlwZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmctcmVmbGVjdC1mb3JtLWNvbnRyb2wtbmFtZT1cImFjY291bnRUeXBlXCIgICAoY2hhbmdlKT1cIm9uVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nLXJlZmxlY3QtdmFsdWU9XCJwZXJzb25hbFwiIHR5cGU9XCJmaWxlXCIgI2lucHV0RmlsZSAvPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImt0X2NyZWF0ZV9hY2NvdW50X2Zvcm1fYWNjb3VudF90eXBlX3BlcnNvbmFsXCIgY2xhc3M9XCIgdy01MCBwLTQgbXQtNVwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWNlbnRlciB3LTEwMCBmcy00XCI+XHJcbjxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjQ2XCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQ2IDQ2XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjNcIiB5PVwiM1wiIHdpZHRoPVwiNDBcIiBoZWlnaHQ9XCI0MFwiIHJ4PVwiMjBcIiBmaWxsPVwiI0YyRjRGN1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIzXCIgd2lkdGg9XCI0MFwiIGhlaWdodD1cIjQwXCIgcng9XCIyMFwiIHN0cm9rZT1cIiNGOUZBRkJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF80MDQ3XzQwNTY2KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMjYuMzMzMyAyNi4zMzM0TDIzIDIzTTIzIDIzTDE5LjY2NjYgMjYuMzMzNE0yMyAyM1YzMC41TTI5Ljk5MTYgMjguMzI1QzMwLjgwNDQgMjcuODgxOSAzMS40NDY1IDI3LjE4MDggMzEuODE2NSAyNi4zMzIyQzMyLjE4NjYgMjUuNDgzNyAzMi4yNjM1IDI0LjUzNjEgMzIuMDM1MSAyMy42Mzg5QzMxLjgwNjggMjIuNzQxOCAzMS4yODYyIDIxLjk0NjMgMzAuNTU1NSAyMS4zNzc5QzI5LjgyNDggMjAuODA5NSAyOC45MjU3IDIwLjUwMDYgMjggMjAuNUgyNi45NUMyNi42OTc3IDE5LjUyNDQgMjYuMjI3NiAxOC42MTg2IDI1LjU3NDkgMTcuODUwOUMyNC45MjIyIDE3LjA4MzEgMjQuMTA0IDE2LjQ3MzIgMjMuMTgxNyAxNi4wNjcyQzIyLjI1OTQgMTUuNjYxMiAyMS4yNTcxIDE1LjQ2OTUgMjAuMjUwMSAxNS41MDY2QzE5LjI0MyAxNS41NDM3IDE4LjI1NzUgMTUuODA4NiAxNy4zNjc2IDE2LjI4MTRDMTYuNDc3NyAxNi43NTQyIDE1LjcwNjYgMTcuNDIyNiAxNS4xMTIyIDE4LjIzNjNDMTQuNTE3NyAxOS4wNTAxIDE0LjExNTUgMTkuOTg4IDEzLjkzNTggMjAuOTc5NUMxMy43NTYgMjEuOTcxMSAxMy44MDM0IDIyLjk5MDUgMTQuMDc0MyAyMy45NjExQzE0LjM0NTIgMjQuOTMxNyAxNC44MzI3IDI1LjgyODIgMTUuNSAyNi41ODM0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzQ3NTQ2N1wiIHN0cm9rZS13aWR0aD1cIjEuNjY2NjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBfNDA0N180MDU2NlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiBmaWxsPVwid2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDEzIDEzKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jbGlwUGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RhdGEtdGl0bGVcIj48c3BhbiBjbGFzcz1cImNsaWNrLXVwbG9hZCBjdXJzb3ItcG9pbnRlclwiPkNsaWNrIHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxzcGFuIGNsYXNzPVwiZHJhZy1kcm9wXCI+IG9yIGRyYWcgYW5kIGRyb3AgdGhlIHRlbXBsYXRlPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAgKm5nSWY9XCJ0eXBlTk9CID09PSdtdWx0aXBsZSdcIiBjbGFzcz1cImQtZmxleCBtdC0zIG1iLTEwXCIgcm9sZT1cImdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwIG1lLTNcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdy0xMDAgbXMtM1wiIGlkPVwiYWxlcnQtdG9hc3RcIiAoY2xpY2spPVwicHJvY2VlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgPlByb2NlZWQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==