@sunbird-cb/access-settings 0.0.1-cbrelease-4.8.26
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/esm2022/lib/_common/access-control/access-control.component.mjs +561 -0
- package/esm2022/lib/_common/access-control/access-control.module.mjs +125 -0
- package/esm2022/lib/_common/dialogs/access-control-guide/access-control-guide.component.mjs +27 -0
- package/esm2022/lib/_common/dialogs/confirm-dialog/confirm-dialog.component.mjs +27 -0
- package/esm2022/lib/_common/dialogs/entity-selections/entity-selections.component.mjs +371 -0
- package/esm2022/lib/_common/dialogs/invite-users/invite-users.component.mjs +116 -0
- package/esm2022/lib/_common/pagination/pagination.component.mjs +168 -0
- package/esm2022/lib/_constants/app.constants.mjs +6 -0
- package/esm2022/lib/_directives/drag-drop.directive.mjs +53 -0
- package/esm2022/lib/_models/access-control.model.mjs +31 -0
- package/esm2022/lib/_models/pagination.model.mjs +2 -0
- package/esm2022/lib/_services/access-control.service.mjs +195 -0
- package/esm2022/lib/_services/cadre-mapping.service.mjs +164 -0
- package/esm2022/lib/access-settings.component.mjs +13 -0
- package/esm2022/lib/access-settings.module.mjs +21 -0
- package/esm2022/lib/components/bulk-upload-karmayogi/bulk-upload-karmayogi.component.mjs +391 -0
- package/esm2022/lib/components/list-table/list-table.component.mjs +148 -0
- package/esm2022/lib/components/snackbar/snackbar.component.mjs +19 -0
- package/esm2022/public-api.mjs +10 -0
- package/esm2022/sunbird-cb-access-settings.mjs +5 -0
- package/fesm2022/sunbird-cb-access-settings.mjs +2331 -0
- package/fesm2022/sunbird-cb-access-settings.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/_common/access-control/access-control.component.d.ts +71 -0
- package/lib/_common/access-control/access-control.component.d.ts.map +1 -0
- package/lib/_common/access-control/access-control.module.d.ts +36 -0
- package/lib/_common/access-control/access-control.module.d.ts.map +1 -0
- package/lib/_common/dialogs/access-control-guide/access-control-guide.component.d.ts +16 -0
- package/lib/_common/dialogs/access-control-guide/access-control-guide.component.d.ts.map +1 -0
- package/lib/_common/dialogs/confirm-dialog/confirm-dialog.component.d.ts +15 -0
- package/lib/_common/dialogs/confirm-dialog/confirm-dialog.component.d.ts.map +1 -0
- package/lib/_common/dialogs/entity-selections/entity-selections.component.d.ts +65 -0
- package/lib/_common/dialogs/entity-selections/entity-selections.component.d.ts.map +1 -0
- package/lib/_common/dialogs/invite-users/invite-users.component.d.ts +40 -0
- package/lib/_common/dialogs/invite-users/invite-users.component.d.ts.map +1 -0
- package/lib/_common/pagination/pagination.component.d.ts +31 -0
- package/lib/_common/pagination/pagination.component.d.ts.map +1 -0
- package/lib/_constants/app.constants.d.ts +6 -0
- package/lib/_constants/app.constants.d.ts.map +1 -0
- package/lib/_directives/drag-drop.directive.d.ts +12 -0
- package/lib/_directives/drag-drop.directive.d.ts.map +1 -0
- package/lib/_models/access-control.model.d.ts +106 -0
- package/lib/_models/access-control.model.d.ts.map +1 -0
- package/lib/_models/pagination.model.d.ts +6 -0
- package/lib/_models/pagination.model.d.ts.map +1 -0
- package/lib/_services/access-control.service.d.ts +72 -0
- package/lib/_services/access-control.service.d.ts.map +1 -0
- package/lib/_services/cadre-mapping.service.d.ts +71 -0
- package/lib/_services/cadre-mapping.service.d.ts.map +1 -0
- package/lib/access-settings.component.d.ts +9 -0
- package/lib/access-settings.component.d.ts.map +1 -0
- package/lib/access-settings.module.d.ts +12 -0
- package/lib/access-settings.module.d.ts.map +1 -0
- package/lib/components/bulk-upload-karmayogi/bulk-upload-karmayogi.component.d.ts +31 -0
- package/lib/components/bulk-upload-karmayogi/bulk-upload-karmayogi.component.d.ts.map +1 -0
- package/lib/components/list-table/list-table.component.d.ts +40 -0
- package/lib/components/list-table/list-table.component.d.ts.map +1 -0
- package/lib/components/snackbar/snackbar.component.d.ts +13 -0
- package/lib/components/snackbar/snackbar.component.d.ts.map +1 -0
- package/package.json +28 -0
- package/public-api.d.ts +7 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-access-settings.d.ts.map +1 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { Component } from "@angular/core";
|
|
2
|
+
import { SnackbarComponent } from "../snackbar/snackbar.component";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../_services/access-control.service";
|
|
5
|
+
import * as i2 from "@angular/material/legacy-snack-bar";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "@angular/material/icon";
|
|
8
|
+
import * as i5 from "@angular/material/legacy-button";
|
|
9
|
+
import * as i6 from "../list-table/list-table.component";
|
|
10
|
+
import * as i7 from "../../_directives/drag-drop.directive";
|
|
11
|
+
export class BulkUploadKarmayogiComponent {
|
|
12
|
+
constructor(accessControlService, snackBar) {
|
|
13
|
+
this.accessControlService = accessControlService;
|
|
14
|
+
this.snackBar = snackBar;
|
|
15
|
+
this.currrentFilterType = "success";
|
|
16
|
+
this.contacts = [];
|
|
17
|
+
this.properties = "";
|
|
18
|
+
this.flag = false;
|
|
19
|
+
this.fileUploading = false;
|
|
20
|
+
this.isSuccessUserlist = [];
|
|
21
|
+
this.isErrorUserlist = [];
|
|
22
|
+
this.fileName = "";
|
|
23
|
+
this.currentDate = new Date();
|
|
24
|
+
this.bulkUploadConfig =
|
|
25
|
+
this.accessControlService.accessControlConfig().bulkUploadKarmayogi;
|
|
26
|
+
}
|
|
27
|
+
downloadSample() {
|
|
28
|
+
const sampleFilePath = this.bulkUploadConfig.downloadSampleFile;
|
|
29
|
+
if (sampleFilePath) {
|
|
30
|
+
const link = document.createElement("a");
|
|
31
|
+
link.href = sampleFilePath.path;
|
|
32
|
+
link.download = sampleFilePath.fileName || "sample.csv";
|
|
33
|
+
document.body.appendChild(link);
|
|
34
|
+
link.click();
|
|
35
|
+
document.body.removeChild(link);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
onDrop(input) {
|
|
39
|
+
this.fileUploading = true;
|
|
40
|
+
const files = [input];
|
|
41
|
+
const fileTypes = ["csv"]; // acceptable file types
|
|
42
|
+
if (files && files.length) {
|
|
43
|
+
const extension = files[0].name.split(".").pop().toLowerCase(); // file extension from input file
|
|
44
|
+
const isSuccess = fileTypes.indexOf(extension) > -1; // is extension in acceptable types
|
|
45
|
+
// console.log(isSuccess)
|
|
46
|
+
console.log("Filename: " + files[0].name);
|
|
47
|
+
this.fileName = files[0].name;
|
|
48
|
+
// console.log('Type: ' + files[0].type)
|
|
49
|
+
// console.log('Size: ' + files[0].size + ' bytes')
|
|
50
|
+
if (isSuccess) {
|
|
51
|
+
const fileToRead = files[0];
|
|
52
|
+
const fileReader = new FileReader();
|
|
53
|
+
fileReader.onload = (event) => {
|
|
54
|
+
this.onFileLoad(event);
|
|
55
|
+
};
|
|
56
|
+
fileReader.readAsText(fileToRead, "UTF-8");
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.fileUploading = false;
|
|
60
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
61
|
+
data: {
|
|
62
|
+
message: "Unsupported File Format. Please upload a CSV file.",
|
|
63
|
+
type: "error",
|
|
64
|
+
},
|
|
65
|
+
duration: 3000,
|
|
66
|
+
panelClass: "course-error-snackbar",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.fileUploading = false;
|
|
72
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
73
|
+
data: {
|
|
74
|
+
message: "Unsupported File Format. Please upload a CSV file.",
|
|
75
|
+
type: "error",
|
|
76
|
+
},
|
|
77
|
+
duration: 3000,
|
|
78
|
+
panelClass: "course-error-snackbar",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async onFileLoad(fileLoadedEvent) {
|
|
83
|
+
this.isSuccessUserlist = [];
|
|
84
|
+
this.isErrorUserlist = [];
|
|
85
|
+
const textFromFileLoaded = fileLoadedEvent.target.result;
|
|
86
|
+
this.csvContent = textFromFileLoaded;
|
|
87
|
+
// Flag is for extracting first line
|
|
88
|
+
let flag = false;
|
|
89
|
+
// Main Data
|
|
90
|
+
const objarray = [];
|
|
91
|
+
// Properties
|
|
92
|
+
const prop = [];
|
|
93
|
+
// Total Length
|
|
94
|
+
let size = 0;
|
|
95
|
+
for (const line of this.csvContent.split(/[\r\n]+/)) {
|
|
96
|
+
if (flag) {
|
|
97
|
+
const obj = {};
|
|
98
|
+
for (let k = 0; k < size; k += 1) {
|
|
99
|
+
// Dynamic Object Properties
|
|
100
|
+
obj[prop[k]] = line.split(",")[k];
|
|
101
|
+
}
|
|
102
|
+
objarray.push(obj);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// First Line of CSV will be having Properties
|
|
106
|
+
for (let k = 0; k < line.split(",").length; k += 1) {
|
|
107
|
+
size = line.split(",").length;
|
|
108
|
+
// Removing all the spaces to make them usefull, also removing any " characters
|
|
109
|
+
prop.push(line.split(",")[k].replace(/ /g, "").replace(/"/g, ""));
|
|
110
|
+
}
|
|
111
|
+
flag = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
this.contacts = objarray;
|
|
115
|
+
if (this.contacts && this.contacts.length > 0) {
|
|
116
|
+
const headerValues = Object.keys(this.contacts[0]);
|
|
117
|
+
if (headerValues.length < 0 || headerValues.length > 2) {
|
|
118
|
+
// NOSONAR
|
|
119
|
+
this.fileUploading = false;
|
|
120
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
121
|
+
data: {
|
|
122
|
+
message: "Field Mismatch. Please ensure your uploaded file matches the sample template provided.",
|
|
123
|
+
type: "error",
|
|
124
|
+
},
|
|
125
|
+
duration: 3000,
|
|
126
|
+
panelClass: "course-error-snackbar",
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!headerValues.includes("Emailid") ||
|
|
131
|
+
!headerValues.includes("Mobilenumber")) {
|
|
132
|
+
this.fileUploading = false;
|
|
133
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
134
|
+
data: {
|
|
135
|
+
message: "Field Mismatch. Please ensure your uploaded file matches the sample template provided.",
|
|
136
|
+
type: "error",
|
|
137
|
+
},
|
|
138
|
+
duration: 3000,
|
|
139
|
+
panelClass: "course-error-snackbar",
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
this.properties = [];
|
|
145
|
+
this.properties = prop;
|
|
146
|
+
// console.log(this.properties)
|
|
147
|
+
const emailIds = [];
|
|
148
|
+
const mobileNumbers = [];
|
|
149
|
+
const bothEmailAndMobile = {};
|
|
150
|
+
this.contacts = this.contacts.filter((ele) => ele.Emailid || ele.Mobilenumber);
|
|
151
|
+
if (this.contacts.length > 30) {
|
|
152
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
153
|
+
data: { message: "More than 30 users are not allowed", type: "error" },
|
|
154
|
+
duration: 3000,
|
|
155
|
+
panelClass: "course-error-snackbar",
|
|
156
|
+
});
|
|
157
|
+
this.fileUploading = false;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await this.contacts.forEach((element) => {
|
|
161
|
+
const emailPattern = new RegExp(`^[\\w\-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$`);
|
|
162
|
+
const mobilePattern = new RegExp(/^(6|7|8|9)\d{9}$/);
|
|
163
|
+
const emailTest = element.Emailid
|
|
164
|
+
? emailPattern.test(element.Emailid)
|
|
165
|
+
: true;
|
|
166
|
+
const mobileTest = element.Mobilenumber
|
|
167
|
+
? mobilePattern.test(element.Mobilenumber)
|
|
168
|
+
: true;
|
|
169
|
+
element["email"] = element.Emailid;
|
|
170
|
+
element["mobile"] = element.Mobilenumber;
|
|
171
|
+
if (mobileTest && element.Mobilenumber) {
|
|
172
|
+
mobileNumbers.push(element.Mobilenumber);
|
|
173
|
+
}
|
|
174
|
+
if (emailTest && element.Emailid) {
|
|
175
|
+
emailIds.push(element.Emailid.toLowerCase());
|
|
176
|
+
}
|
|
177
|
+
if (emailTest && mobileTest) {
|
|
178
|
+
element["status"] = "Success";
|
|
179
|
+
element["userStatus"] = true;
|
|
180
|
+
bothEmailAndMobile[element.Emailid.toLowerCase()] = element;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
if (emailTest || mobileTest) {
|
|
184
|
+
element["status"] = "Success";
|
|
185
|
+
element["userStatus"] = true;
|
|
186
|
+
if ((!emailTest && element.Mobilenumber !== "") ||
|
|
187
|
+
(!emailTest && element.Mobilenumber === "")) {
|
|
188
|
+
element["status"] = "Error";
|
|
189
|
+
element["userStatus"] = false;
|
|
190
|
+
element["message"] = emailPattern.test(element.Emailid)
|
|
191
|
+
? ""
|
|
192
|
+
: "Invalid Email id";
|
|
193
|
+
}
|
|
194
|
+
if ((!mobileTest && element.Emailid !== "") ||
|
|
195
|
+
(!mobileTest && element.Emailid === "")) {
|
|
196
|
+
element["status"] = "Error";
|
|
197
|
+
element["userStatus"] = false;
|
|
198
|
+
element["message"] = mobilePattern.test(element.Mobilenumber)
|
|
199
|
+
? ""
|
|
200
|
+
: "Invalid Mobile number";
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
if (!emailTest && !mobileTest) {
|
|
205
|
+
element["status"] = "Error";
|
|
206
|
+
element["userStatus"] = false;
|
|
207
|
+
element["message"] = "Invalid Email id and Mobile number";
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
element["status"] = "Error";
|
|
211
|
+
element["userStatus"] = false;
|
|
212
|
+
element["message"] = emailPattern.test(element.Emailid)
|
|
213
|
+
? ""
|
|
214
|
+
: "Invalid Email id";
|
|
215
|
+
element["message"] = mobilePattern.test(element.Mobilenumber)
|
|
216
|
+
? ""
|
|
217
|
+
: "Invalid Mobile number";
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
this.flag = true;
|
|
223
|
+
const emailResponseData = await this.callUserCheckApi(emailIds, "primaryEmail");
|
|
224
|
+
const mobileResponseData = await this.callUserCheckApi(mobileNumbers, "mobile");
|
|
225
|
+
if (emailResponseData && mobileResponseData) {
|
|
226
|
+
this.manageData(emailResponseData, mobileResponseData);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.fileUploading = false;
|
|
230
|
+
this.snackBar.openFromComponent(SnackbarComponent, {
|
|
231
|
+
data: {
|
|
232
|
+
message: "Something went wrong! Please try again",
|
|
233
|
+
type: "error",
|
|
234
|
+
},
|
|
235
|
+
duration: 3000,
|
|
236
|
+
panelClass: "course-error-snackbar",
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async callUserCheckApi(userData, key) {
|
|
242
|
+
const request = {
|
|
243
|
+
request: {
|
|
244
|
+
filters: {},
|
|
245
|
+
fields: [
|
|
246
|
+
"userId",
|
|
247
|
+
"email",
|
|
248
|
+
"firstName",
|
|
249
|
+
"lastName",
|
|
250
|
+
"phone",
|
|
251
|
+
"rootOrgId",
|
|
252
|
+
"channel",
|
|
253
|
+
"roles",
|
|
254
|
+
"profileDetails",
|
|
255
|
+
"createdDate",
|
|
256
|
+
"rootOrgName",
|
|
257
|
+
"organisations",
|
|
258
|
+
"username",
|
|
259
|
+
],
|
|
260
|
+
},
|
|
261
|
+
};
|
|
262
|
+
if (key === "primaryEmail") {
|
|
263
|
+
request.request.filters = {
|
|
264
|
+
...request.request.filters,
|
|
265
|
+
email: userData,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
request.request.filters = {
|
|
270
|
+
...request.request.filters,
|
|
271
|
+
phone: userData,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return this.accessControlService
|
|
275
|
+
.validateUser(request)
|
|
276
|
+
.toPromise()
|
|
277
|
+
.then(async (res) => {
|
|
278
|
+
if (res.result.response) {
|
|
279
|
+
return await res.result.response;
|
|
280
|
+
}
|
|
281
|
+
})
|
|
282
|
+
.catch((_err) => { })
|
|
283
|
+
.finally(() => Promise.resolve());
|
|
284
|
+
}
|
|
285
|
+
manageData(userEmailData, userMobileData) {
|
|
286
|
+
this.isSuccessUserlist = [];
|
|
287
|
+
this.isErrorUserlist = [];
|
|
288
|
+
const userEmailMap = {};
|
|
289
|
+
const userEmailMapUserId = {};
|
|
290
|
+
const userMobileMap = {};
|
|
291
|
+
if (userEmailData.count) {
|
|
292
|
+
userEmailData.content.forEach(async (e) => {
|
|
293
|
+
if (e.profileDetails) {
|
|
294
|
+
userEmailMap[e.profileDetails.personalDetails.primaryEmail.toLowerCase()] = e;
|
|
295
|
+
userEmailMapUserId[e.userId] = e;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (userMobileData.count) {
|
|
300
|
+
userMobileData.content.forEach(async (e) => {
|
|
301
|
+
if (e.profileDetails) {
|
|
302
|
+
userMobileMap[e.profileDetails.personalDetails.mobile] = e;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
this.contacts.forEach(async (e) => {
|
|
307
|
+
if (e.userStatus) {
|
|
308
|
+
if (e.email && e.mobile) {
|
|
309
|
+
const userData = userEmailMap[e.email.toLowerCase()];
|
|
310
|
+
if (userData &&
|
|
311
|
+
userData.profileDetails.personalDetails &&
|
|
312
|
+
userData.profileDetails.personalDetails.mobile) {
|
|
313
|
+
if (String(userData.profileDetails.personalDetails.mobile) ===
|
|
314
|
+
String(e.mobile)) {
|
|
315
|
+
e["userId"] = userData.userId;
|
|
316
|
+
e["ministry"] = userData.rootOrgName;
|
|
317
|
+
e["fullName"] = userData.firstName || userData.firstname;
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
e["status"] = "Error";
|
|
321
|
+
e["userStatus"] = false;
|
|
322
|
+
e["message"] = "Given credentials are not matching";
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
e["status"] = "Error";
|
|
327
|
+
e["userStatus"] = false;
|
|
328
|
+
e["message"] = "Given credentials are not matching";
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else if (e.email && userEmailMap[e.email.toLowerCase()]) {
|
|
332
|
+
const userData = userEmailMap[e.email.toLowerCase()];
|
|
333
|
+
e["mobile"] = userData.profileDetails.personalDetails.mobile;
|
|
334
|
+
e["userId"] = userData.userId;
|
|
335
|
+
e["ministry"] = userData.rootOrgName;
|
|
336
|
+
e["fullName"] = userData.firstName || userData.firstname;
|
|
337
|
+
}
|
|
338
|
+
else if (e.mobile && userMobileMap[e.mobile]) {
|
|
339
|
+
const userData = userMobileMap[e.mobile];
|
|
340
|
+
e["email"] = userData.profileDetails.personalDetails.primaryEmail;
|
|
341
|
+
e["userId"] = userData.userId;
|
|
342
|
+
e["ministry"] = userData.rootOrgName;
|
|
343
|
+
e["fullName"] = userData.firstName || userData.firstname;
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
e["status"] = "Error";
|
|
347
|
+
e["userStatus"] = false;
|
|
348
|
+
e["message"] = "Given credentials are not matching";
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
this.fileUploading = false;
|
|
353
|
+
this.isSuccessUserlist = this.contacts.filter((ele) => ele.userStatus);
|
|
354
|
+
this.isErrorUserlist = this.contacts.filter((ele) => !ele.userStatus);
|
|
355
|
+
// this.successUserData.emit(this.isSuccessUserlist);
|
|
356
|
+
this.currrentFilterType = this.isSuccessUserlist.length
|
|
357
|
+
? "success"
|
|
358
|
+
: "error";
|
|
359
|
+
if (this.currrentFilterType === "success") {
|
|
360
|
+
// this.displayedColumns = [
|
|
361
|
+
// "fullName",
|
|
362
|
+
// "email",
|
|
363
|
+
// "ministry",
|
|
364
|
+
// "status",
|
|
365
|
+
// "mobile",
|
|
366
|
+
// ];
|
|
367
|
+
// this.dataSource = new MatTableDataSource<IUserElement>(
|
|
368
|
+
// this.isSuccessUserlist
|
|
369
|
+
// );
|
|
370
|
+
}
|
|
371
|
+
else if (this.currrentFilterType === "error") {
|
|
372
|
+
// this.displayedColumns = ["email", "status", "mobile", "message"];
|
|
373
|
+
// this.dataSource = new MatTableDataSource<IUserElement>(
|
|
374
|
+
// this.isErrorUserlist
|
|
375
|
+
// );
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
onFilterChange(type) {
|
|
379
|
+
this.currrentFilterType = type;
|
|
380
|
+
}
|
|
381
|
+
downloadErrorFile() {
|
|
382
|
+
this.accessControlService.downloadFile(this.isErrorUserlist, "userErrordata");
|
|
383
|
+
}
|
|
384
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BulkUploadKarmayogiComponent, deps: [{ token: i1.AccessControlService }, { token: i2.MatLegacySnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
385
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BulkUploadKarmayogiComponent, selector: "sb-uic-bulk-upload-karmayogi", ngImport: i0, template: "<div class=\"bulk-upload-wrapper\">\n <div class=\"flex gap-4 py-4 px-5 wrapper-border\">\n <div class=\"instructions-download py-4 px-5 border-dotted flex-1\">\n <div class=\"mb-6 text-style\">Open & follow these instruction</div>\n <div class=\"instructions-list\">\n <ul class=\"numbered-list\">\n <ng-container *ngFor=\"let item of bulkUploadConfig?.uploadInstructions\">\n <li>{{item}}</li>\n </ng-container>\n </ul>\n </div>\n <div class=\"download-sample mt-6\">\n <button mat-flat-button (click)=\"downloadSample()\"\n class=\"rounded-full px-4 py-2 font-bold text-sm mat-btn-outline cursor-pointer\">\n Download Sample File\n </button>\n </div>\n </div>\n\n <div class=\"bulk-upload-select py-4 px-5 border-dotted flex-1\">\n <div class=\"right_upload_inner flex flex-col items-center justify-center\" wsAuthDragDrop\n (fileDropped)=\"onDrop($event)\">\n <div class=\"flex flex-row items-center justify-center margin-bottom-s\">\n <mat-icon class=\"svg-ico\" svgIcon=\"excel-sheet\"></mat-icon>\n </div>\n <div class=\"items-center justify-center flex flex-col\">\n <a class=\"new-color cursor-pointer text-sm font-bold mb-1 mt-7\" (click)=\"fileInput.click()\">Browse\n files</a>\n <p class=\"mt-2 text-sm\">Or</p>\n <p class=\"mt-2 ws-mat-black60-text text-base\">Drag file to upload</p>\n <p class=\"text-xs ws-mat-black87-text margin-remove\">Max size: 100 MB</p>\n <p class=\"text-xs ws-mat-black60-text margin-remove\">Supported file types: CSV</p>\n </div>\n <input type=\"file\" #fileInput class=\"inputfile\" accept=\".csv\"\n (change)=\"onDrop($event.target.files[0]); fileInput.value = null\" />\n <div *ngIf=\"file\" class=\"flex flex-middle justify-center flex-column position-relative pt-5 px-5\">\n <mat-icon class=\"ws-mat-primary-text\" svgIcon=\"excel-sheet\">\n </mat-icon>\n <p class=\"margin-left-xs mat-h3 font-weight-500 margin-remove-bottom break\">\n <ng-container *ngIf=\"file; else elseBlock\">\n <span class=\"flex-wrap\"> {{ file?.name }}</span>\n </ng-container>\n <ng-template #elseBlock>\n <span i18n>No file uploaded</span>\n </ng-template>\n </p>\n\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-by-select my-4\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"text-title\">Filter By</div>\n <div class=\"flex gap-2\">\n <button mat-flat-button (click)=\"onFilterChange('success')\"\n [ngClass]=\"currrentFilterType === 'success' ? 'new-bg-color text-white mat-btn-flat': 'mat-btn-outline' \"\n class=\"rounded-full px-4 py-2 font-bold text-sm cursor-pointer \">\n Success\n </button>\n <button (click)=\"onFilterChange('error')\" mat-flat-button\n [ngClass]=\"currrentFilterType === 'error' ? 'new-bg-color text-white mat-btn-flat': 'mat-btn-outline' \"\n class=\"rounded-full px-4 py-2 font-bold text-sm cursor-pointer\">\n Error\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"list-table-bulk-upload\">\n <ng-container *ngIf=\"currrentFilterType === 'success'\">\n <div class=\"flex items-center gap-2 selection-count mb-4 p-2\">\n <span class=\"\">{{isSuccessUserlist.length}}</span>\n <span class=\"text-sm font-normal\">Items Selected</span>\n </div>\n <sb-uic-list-table [data]=\"isSuccessUserlist\" [count]=\"1\"\n [initialPaginationSize]=\"bulkUploadConfig['bulkUploadTable']?.initialPaginationSize\"\n [tableConfig]=\"bulkUploadConfig['bulkUploadTable']\"\n [bulkUploadEntriesCount]=\"{totalCount: isSuccessUserlist?.length + isErrorUserlist?.length, success: isSuccessUserlist?.length}\">\n </sb-uic-list-table>\n </ng-container>\n\n <ng-container *ngIf=\"currrentFilterType === 'error'\">\n <div class=\"wrapper-border rounded-sm p-4\">\n <div class=\"log-history-text\">Log History</div>\n </div>\n <div class=\"information-list py-4 px-6\">\n <!-- <ng-container *ngFor=\"let item of isErrorUserlist\"> -->\n <ng-container>\n <div class=\"rounded-lg wrapper-border py-5 px-4 mb-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"error-log-title flex gap-2 items-center\">\n <span class=\"text-title text-dark\">File Information</span>\n <img src=\"/assets/icons/icon-wrapper.svg\" alt=\"tooltip-icon\">\n </div>\n <button mat-flat-button (click)=\"downloadErrorFile()\"\n class=\"rounded-full px-4 py-2 font-bold text-sm mat-btn-outline cursor-pointer\">\n <mat-icon class=\"new-color\">file_download</mat-icon>\n Download error log\n </button>\n </div>\n <div class=\"my-4 meta-info\">\n <div class=\"flex gap-2 items-center\">\n <span class=\"text-title text-dark\">{{fileName}}</span>\n <img src=\"/assets/icons/error-icon.svg\" alt=\"error-icon\">\n </div>\n <div class=\"text-style text-dark\">Theress an error occurred while uploading this file.</div>\n </div>\n <div class=\"flex gap-x-6 gap-y-4 falied-records-info\">\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Name</p>\n <p class=\"font-medium break-all text-dark\">\n {{fileName}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500\">Total Records</p>\n <p class=\"font-medium text-dark\">{{isSuccessUserlist?.length +\n isErrorUserlist?.length}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500 mt-2\">Failed Records</p>\n <p class=\"font-medium text-dark\">{{isErrorUserlist?.length}}</p>\n </div>\n </div>\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Status</p>\n <p class=\"text-red-600 font-normal\">FAILED</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500\">Created On</p>\n <p class=\"font-medium text-dark\">{{currentDate | date: 'medium'}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500 mt-2\">Updated On</p>\n <p class=\"font-medium text-dark\">{{currentDate | date: 'medium'}}</p>\n </div>\n </div>\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Success Records</p>\n <p class=\"font-medium text-dark\">{{isSuccessUserlist?.length}}</p>\n </div>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</div>", styles: [".wrapper-border{border:1px solid rgba(0,0,0,.0784313725)}.numbered-list{list-style:none;counter-reset:list-counter;padding-left:0}.numbered-list li{counter-increment:list-counter;margin-bottom:16px}.numbered-list li:before{content:counter(list-counter) \". \"}.text-style,.numbered-list li{color:#000000de;font-family:Lato;font-weight:400;font-size:14px}.border-dotted{border:1px dashed rgba(0,0,0,.1607843137)}.svg-ico{width:75px;height:75px}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.inputfile+label{font-size:1.25em;color:#fff;display:inline-block;cursor:pointer}.browse_link{color:#1b4ca1;padding:6px 15px;text-align:center;border-radius:4px}.or-text{margin-bottom:0!important}.ws-mat-black87-text{color:#000000de}.text-title,.log-history-text{font-family:Montserrat;font-weight:600;font-size:16px;text-align:center;color:#1b4ca1}.selection-count{border:1px solid rgba(0,0,0,.0784313725);background:#d1dbec}.selection-count span{font-family:Lato;font-weight:400}.selection-count span:first-child{background:#d1dbec;border:1px solid rgba(0,0,0,.1607843137);border-radius:50%;padding:4px;height:18px;width:18px;display:flex;align-items:center;justify-content:center;font-size:10px;color:#0009}.selection-count span:nth-child(2){font-size:14px;color:#000000de}.log-history-text{font-size:14px;color:#1b2133;text-align:start}.information-list{border:1px solid rgba(0,0,0,.0784313725)}.meta-info{background:#d1392429;border:1px solid rgba(0,0,0,.0784313725);border-radius:12px;padding:18px 16px}.falied-records-info p{margin-bottom:8px!important}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.ListTableComponent, selector: "sb-uic-list-table", inputs: ["data", "count", "initialPaginationSize", "initialPaginationSizeOptions", "tableConfig", "selected", "bulkUploadEntriesCount"], outputs: ["selectedDataChange", "pageChange", "removeSelectedData"] }, { kind: "directive", type: i7.DragDropDirective, selector: "[wsAuthDragDrop]", outputs: ["fileDropped"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }] }); }
|
|
386
|
+
}
|
|
387
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BulkUploadKarmayogiComponent, decorators: [{
|
|
388
|
+
type: Component,
|
|
389
|
+
args: [{ selector: "sb-uic-bulk-upload-karmayogi", template: "<div class=\"bulk-upload-wrapper\">\n <div class=\"flex gap-4 py-4 px-5 wrapper-border\">\n <div class=\"instructions-download py-4 px-5 border-dotted flex-1\">\n <div class=\"mb-6 text-style\">Open & follow these instruction</div>\n <div class=\"instructions-list\">\n <ul class=\"numbered-list\">\n <ng-container *ngFor=\"let item of bulkUploadConfig?.uploadInstructions\">\n <li>{{item}}</li>\n </ng-container>\n </ul>\n </div>\n <div class=\"download-sample mt-6\">\n <button mat-flat-button (click)=\"downloadSample()\"\n class=\"rounded-full px-4 py-2 font-bold text-sm mat-btn-outline cursor-pointer\">\n Download Sample File\n </button>\n </div>\n </div>\n\n <div class=\"bulk-upload-select py-4 px-5 border-dotted flex-1\">\n <div class=\"right_upload_inner flex flex-col items-center justify-center\" wsAuthDragDrop\n (fileDropped)=\"onDrop($event)\">\n <div class=\"flex flex-row items-center justify-center margin-bottom-s\">\n <mat-icon class=\"svg-ico\" svgIcon=\"excel-sheet\"></mat-icon>\n </div>\n <div class=\"items-center justify-center flex flex-col\">\n <a class=\"new-color cursor-pointer text-sm font-bold mb-1 mt-7\" (click)=\"fileInput.click()\">Browse\n files</a>\n <p class=\"mt-2 text-sm\">Or</p>\n <p class=\"mt-2 ws-mat-black60-text text-base\">Drag file to upload</p>\n <p class=\"text-xs ws-mat-black87-text margin-remove\">Max size: 100 MB</p>\n <p class=\"text-xs ws-mat-black60-text margin-remove\">Supported file types: CSV</p>\n </div>\n <input type=\"file\" #fileInput class=\"inputfile\" accept=\".csv\"\n (change)=\"onDrop($event.target.files[0]); fileInput.value = null\" />\n <div *ngIf=\"file\" class=\"flex flex-middle justify-center flex-column position-relative pt-5 px-5\">\n <mat-icon class=\"ws-mat-primary-text\" svgIcon=\"excel-sheet\">\n </mat-icon>\n <p class=\"margin-left-xs mat-h3 font-weight-500 margin-remove-bottom break\">\n <ng-container *ngIf=\"file; else elseBlock\">\n <span class=\"flex-wrap\"> {{ file?.name }}</span>\n </ng-container>\n <ng-template #elseBlock>\n <span i18n>No file uploaded</span>\n </ng-template>\n </p>\n\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"filter-by-select my-4\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"text-title\">Filter By</div>\n <div class=\"flex gap-2\">\n <button mat-flat-button (click)=\"onFilterChange('success')\"\n [ngClass]=\"currrentFilterType === 'success' ? 'new-bg-color text-white mat-btn-flat': 'mat-btn-outline' \"\n class=\"rounded-full px-4 py-2 font-bold text-sm cursor-pointer \">\n Success\n </button>\n <button (click)=\"onFilterChange('error')\" mat-flat-button\n [ngClass]=\"currrentFilterType === 'error' ? 'new-bg-color text-white mat-btn-flat': 'mat-btn-outline' \"\n class=\"rounded-full px-4 py-2 font-bold text-sm cursor-pointer\">\n Error\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"list-table-bulk-upload\">\n <ng-container *ngIf=\"currrentFilterType === 'success'\">\n <div class=\"flex items-center gap-2 selection-count mb-4 p-2\">\n <span class=\"\">{{isSuccessUserlist.length}}</span>\n <span class=\"text-sm font-normal\">Items Selected</span>\n </div>\n <sb-uic-list-table [data]=\"isSuccessUserlist\" [count]=\"1\"\n [initialPaginationSize]=\"bulkUploadConfig['bulkUploadTable']?.initialPaginationSize\"\n [tableConfig]=\"bulkUploadConfig['bulkUploadTable']\"\n [bulkUploadEntriesCount]=\"{totalCount: isSuccessUserlist?.length + isErrorUserlist?.length, success: isSuccessUserlist?.length}\">\n </sb-uic-list-table>\n </ng-container>\n\n <ng-container *ngIf=\"currrentFilterType === 'error'\">\n <div class=\"wrapper-border rounded-sm p-4\">\n <div class=\"log-history-text\">Log History</div>\n </div>\n <div class=\"information-list py-4 px-6\">\n <!-- <ng-container *ngFor=\"let item of isErrorUserlist\"> -->\n <ng-container>\n <div class=\"rounded-lg wrapper-border py-5 px-4 mb-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"error-log-title flex gap-2 items-center\">\n <span class=\"text-title text-dark\">File Information</span>\n <img src=\"/assets/icons/icon-wrapper.svg\" alt=\"tooltip-icon\">\n </div>\n <button mat-flat-button (click)=\"downloadErrorFile()\"\n class=\"rounded-full px-4 py-2 font-bold text-sm mat-btn-outline cursor-pointer\">\n <mat-icon class=\"new-color\">file_download</mat-icon>\n Download error log\n </button>\n </div>\n <div class=\"my-4 meta-info\">\n <div class=\"flex gap-2 items-center\">\n <span class=\"text-title text-dark\">{{fileName}}</span>\n <img src=\"/assets/icons/error-icon.svg\" alt=\"error-icon\">\n </div>\n <div class=\"text-style text-dark\">Theress an error occurred while uploading this file.</div>\n </div>\n <div class=\"flex gap-x-6 gap-y-4 falied-records-info\">\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Name</p>\n <p class=\"font-medium break-all text-dark\">\n {{fileName}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500\">Total Records</p>\n <p class=\"font-medium text-dark\">{{isSuccessUserlist?.length +\n isErrorUserlist?.length}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500 mt-2\">Failed Records</p>\n <p class=\"font-medium text-dark\">{{isErrorUserlist?.length}}</p>\n </div>\n </div>\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Status</p>\n <p class=\"text-red-600 font-normal\">FAILED</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500\">Created On</p>\n <p class=\"font-medium text-dark\">{{currentDate | date: 'medium'}}</p>\n </div>\n <div>\n <p class=\"text-sm text-gray-500 mt-2\">Updated On</p>\n <p class=\"font-medium text-dark\">{{currentDate | date: 'medium'}}</p>\n </div>\n </div>\n <div class=\"flex flex-column gap-4 flex-grow-1\">\n <div>\n <p class=\"text-sm text-gray-500\">Success Records</p>\n <p class=\"font-medium text-dark\">{{isSuccessUserlist?.length}}</p>\n </div>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n</div>", styles: [".wrapper-border{border:1px solid rgba(0,0,0,.0784313725)}.numbered-list{list-style:none;counter-reset:list-counter;padding-left:0}.numbered-list li{counter-increment:list-counter;margin-bottom:16px}.numbered-list li:before{content:counter(list-counter) \". \"}.text-style,.numbered-list li{color:#000000de;font-family:Lato;font-weight:400;font-size:14px}.border-dotted{border:1px dashed rgba(0,0,0,.1607843137)}.svg-ico{width:75px;height:75px}.inputfile{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.inputfile+label{font-size:1.25em;color:#fff;display:inline-block;cursor:pointer}.browse_link{color:#1b4ca1;padding:6px 15px;text-align:center;border-radius:4px}.or-text{margin-bottom:0!important}.ws-mat-black87-text{color:#000000de}.text-title,.log-history-text{font-family:Montserrat;font-weight:600;font-size:16px;text-align:center;color:#1b4ca1}.selection-count{border:1px solid rgba(0,0,0,.0784313725);background:#d1dbec}.selection-count span{font-family:Lato;font-weight:400}.selection-count span:first-child{background:#d1dbec;border:1px solid rgba(0,0,0,.1607843137);border-radius:50%;padding:4px;height:18px;width:18px;display:flex;align-items:center;justify-content:center;font-size:10px;color:#0009}.selection-count span:nth-child(2){font-size:14px;color:#000000de}.log-history-text{font-size:14px;color:#1b2133;text-align:start}.information-list{border:1px solid rgba(0,0,0,.0784313725)}.meta-info{background:#d1392429;border:1px solid rgba(0,0,0,.0784313725);border-radius:12px;padding:18px 16px}.falied-records-info p{margin-bottom:8px!important}\n"] }]
|
|
390
|
+
}], ctorParameters: function () { return [{ type: i1.AccessControlService }, { type: i2.MatLegacySnackBar }]; } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay11cGxvYWQta2FybWF5b2dpLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9hY2Nlc3Mtc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2J1bGstdXBsb2FkLWthcm1heW9naS9idWxrLXVwbG9hZC1rYXJtYXlvZ2kuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2FjY2Vzcy1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvYnVsay11cGxvYWQta2FybWF5b2dpL2J1bGstdXBsb2FkLWthcm1heW9naS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7QUFRbkUsTUFBTSxPQUFPLDRCQUE0QjtJQWN2QyxZQUNVLG9CQUEwQyxFQUMxQyxRQUFxQjtRQURyQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLGFBQVEsR0FBUixRQUFRLENBQWE7UUFaL0IsdUJBQWtCLEdBQUcsU0FBUyxDQUFDO1FBRS9CLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUNyQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2Isa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsc0JBQWlCLEdBQVEsRUFBRSxDQUFDO1FBQzVCLG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBQzFCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBS3ZCLElBQUksQ0FBQyxnQkFBZ0I7WUFDbkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixFQUFFLENBQUMs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RyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTTtZQUNyRCxDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDWixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7WUFDekMsNEJBQTRCO1lBQzVCLGdCQUFnQjtZQUNoQixhQUFhO1lBQ2IsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxjQUFjO1lBQ2QsS0FBSztZQUNMLDBEQUEwRDtZQUMxRCwyQkFBMkI7WUFDM0IsS0FBSztTQUNOO2FBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssT0FBTyxFQUFFO1lBQzlDLG9FQUFvRTtZQUNwRSwwREFBMEQ7WUFDMUQseUJBQXlCO1lBQ3pCLEtBQUs7U0FDTjtJQUNILENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUNwQyxJQUFJLENBQUMsZUFBZSxFQUNwQixlQUFlLENBQ2hCLENBQUM7SUFDSixDQUFDOytHQWhaVSw0QkFBNEI7bUdBQTVCLDRCQUE0QixvRUNYekMsNHlSQTBKTTs7NEZEL0lPLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSw4QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vX3NlcnZpY2VzL2FjY2Vzcy1jb250cm9sLnNlcnZpY2VcIjtcbmltcG9ydCB7IE5zQWNjZXNzQ29udHJvbENvbmZpZyB9IGZyb20gXCIuLi8uLi9fbW9kZWxzL2FjY2Vzcy1jb250cm9sLm1vZGVsXCI7XG5pbXBvcnQgeyBTbmFja2JhckNvbXBvbmVudCB9IGZyb20gXCIuLi9zbmFja2Jhci9zbmFja2Jhci5jb21wb25lbnRcIjtcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIGFzIE1hdFNuYWNrQmFyIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcInNiLXVpYy1idWxrLXVwbG9hZC1rYXJtYXlvZ2lcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9idWxrLXVwbG9hZC1rYXJtYXlvZ2kuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2J1bGstdXBsb2FkLWthcm1heW9naS5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgQnVsa1VwbG9hZEthcm1heW9naUNvbXBvbmVudCB7XG4gIGJ1bGtVcGxvYWRDb25maWc6IE5zQWNjZXNzQ29udHJvbENvbmZpZy5JQnVsa1VwbG9hZEthcm1heW9naTtcbiAgZmlsZSE6IEZpbGUgfCBudWxsO1xuXG4gIGN1cnJyZW50RmlsdGVyVHlwZSA9IFwic3VjY2Vzc1wiO1xuICBjc3ZDb250ZW50OiBhbnk7XG4gIGNvbnRhY3RzOiBhbnkgPSBbXTtcbiAgcHJvcGVydGllczogYW55ID0gXCJcIjtcbiAgZmxhZyA9IGZhbHNlO1xuICBmaWxlVXBsb2FkaW5nID0gZmFsc2U7XG4gIGlzU3VjY2Vzc1VzZXJsaXN0OiBhbnkgPSBbXTtcbiAgaXNFcnJvclVzZXJsaXN0OiBhbnkgPSBbXTtcbiAgZmlsZU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gIGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2Nlc3NDb250cm9sU2VydmljZTogQWNjZXNzQ29udHJvbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXJcbiAgKSB7XG4gICAgdGhpcy5idWxrVXBsb2FkQ29uZmlnID1cbiAgICAgIHRoaXMuYWNjZXNzQ29udHJvbFNlcnZpY2UuYWNjZXNzQ29udHJvbENvbmZpZygpLmJ1bGtVcGxvYWRLYXJtYXlvZ2k7XG4gIH1cblxuICBkb3dubG9hZFNhbXBsZSgpIHtcbiAgICBjb25zdCBzYW1wbGVGaWxlUGF0aCA9IHRoaXMuYnVsa1VwbG9hZENvbmZpZy5kb3dubG9hZFNhbXBsZUZpbGU7XG4gICAgaWYgKHNhbXBsZUZpbGVQYXRoKSB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgICBsaW5rLmhyZWYgPSBzYW1wbGVGaWxlUGF0aC5wYXRoO1xuICAgICAgbGluay5kb3dubG9hZCA9IHNhbXBsZUZpbGVQYXRoLmZpbGVOYW1lIHx8IFwic2FtcGxlLmNzdlwiO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgfVxuICB9XG5cbiAgb25Ecm9wKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgdGhpcy5maWxlVXBsb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBmaWxlczogYW55ID0gW2lucHV0XTtcbiAgICBjb25zdCBmaWxlVHlwZXMgPSBbXCJjc3ZcIl07IC8vIGFjY2VwdGFibGUgZmlsZSB0eXBlc1xuICAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGVzWzBdLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpLnRvTG93ZXJDYXNlKCk7IC8vIGZpbGUgZXh0ZW5zaW9uIGZyb20gaW5wdXQgZmlsZVxuICAgICAgY29uc3QgaXNTdWNjZXNzID0gZmlsZVR5cGVzLmluZGV4T2YoZXh0ZW5zaW9uKSA+IC0xOyAvLyBpcyBleHRlbnNpb24gaW4gYWNjZXB0YWJsZSB0eXBlc1xuICAgICAgLy8gY29uc29sZS5sb2coaXNTdWNjZXNzKVxuICAgICAgY29uc29sZS5sb2coXCJGaWxlbmFtZTogXCIgKyBmaWxlc1swXS5uYW1lKTtcbiAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlc1swXS5uYW1lO1xuICAgICAgLy8gY29uc29sZS5sb2coJ1R5cGU6ICcgKyBmaWxlc1swXS50eXBlKVxuICAgICAgLy8gY29uc29sZS5sb2coJ1NpemU6ICcgKyBmaWxlc1swXS5zaXplICsgJyBieXRlcycpXG4gICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVUb1JlYWQgPSBmaWxlc1swXTtcbiAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLm9uRmlsZUxvYWQoZXZlbnQpO1xuICAgICAgICB9O1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc1RleHQoZmlsZVRvUmVhZCwgXCJVVEYtOFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmlsZVVwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW5Gcm9tQ29tcG9uZW50KFNuYWNrYmFyQ29tcG9uZW50LCB7XG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgbWVzc2FnZTogXCJVbnN1cHBvcnRlZCBGaWxlIEZvcm1hdC4gUGxlYXNlIHVwbG9hZCBhIENTViBmaWxlLlwiLFxuICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogXCJjb3Vyc2UtZXJyb3Itc25hY2tiYXJcIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZVVwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zbmFja0Jhci5vcGVuRnJvbUNvbXBvbmVudChTbmFja2JhckNvbXBvbmVudCwge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbWVzc2FnZTogXCJVbnN1cHBvcnRlZCBGaWxlIEZvcm1hdC4gUGxlYXNlIHVwbG9hZCBhIENTViBmaWxlLlwiLFxuICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgfSxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFwiY291cnNlLWVycm9yLXNuYWNrYmFyXCIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkZpbGVMb2FkKGZpbGVMb2FkZWRFdmVudDogYW55KSB7XG4gICAgdGhpcy5pc1N1Y2Nlc3NVc2VybGlzdCA9IFtdO1xuICAgIHRoaXMuaXNFcnJvclVzZXJsaXN0ID0gW107XG4gICAgY29uc3QgdGV4dEZyb21GaWxlTG9hZGVkID0gZmlsZUxvYWRlZEV2ZW50LnRhcmdldC5yZXN1bHQ7XG4gICAgdGhpcy5jc3ZDb250ZW50ID0gdGV4dEZyb21GaWxlTG9hZGVkO1xuXG4gICAgLy8gRmxhZyBpcyBmb3IgZXh0cmFjdGluZyBmaXJzdCBsaW5lXG4gICAgbGV0IGZsYWcgPSBmYWxzZTtcbiAgICAvLyBNYWluIERhdGFcbiAgICBjb25zdCBvYmphcnJheTogYW55ID0gW107XG4gICAgLy8gUHJvcGVydGllc1xuICAgIGNvbnN0IHByb3A6IGFueSA9IFtdO1xuICAgIC8vIFRvdGFsIExlbmd0aFxuICAgIGxldCBzaXplOiBhbnkgPSAwO1xuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuY3N2Q29udGVudC5zcGxpdCgvW1xcclxcbl0rLykpIHtcbiAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgIGNvbnN0IG9iajogYW55ID0ge307XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc2l6ZTsgayArPSAxKSB7XG4gICAgICAgICAgLy8gRHluYW1pYyBPYmplY3QgUHJvcGVydGllc1xuICAgICAgICAgIG9ialtwcm9wW2tdXSA9IGxpbmUuc3BsaXQoXCIsXCIpW2tdO1xuICAgICAgICB9XG4gICAgICAgIG9iamFycmF5LnB1c2gob2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpcnN0IExpbmUgb2YgQ1NWIHdpbGwgYmUgaGF2aW5nIFByb3BlcnRpZXNcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLnNwbGl0KFwiLFwiKS5sZW5ndGg7IGsgKz0gMSkge1xuICAgICAgICAgIHNpemUgPSBsaW5lLnNwbGl0KFwiLFwiKS5sZW5ndGg7XG4gICAgICAgICAgLy8gUmVtb3ZpbmcgYWxsIHRoZSBzcGFjZXMgdG8gbWFrZSB0aGVtIHVzZWZ1bGwsIGFsc28gcmVtb3ZpbmcgYW55IFwiIGNoYXJhY3RlcnNcbiAgICAgICAgICBwcm9wLnB1c2gobGluZS5zcGxpdChcIixcIilba10ucmVwbGFjZSgvIC9nLCBcIlwiKS5yZXBsYWNlKC9cIi9nLCBcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGFjdHMgPSBvYmphcnJheTtcbiAgICBpZiAodGhpcy5jb250YWN0cyAmJiB0aGlzLmNvbnRhY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGhlYWRlclZhbHVlcyA9IE9iamVjdC5rZXlzKHRoaXMuY29udGFjdHNbMF0pO1xuICAgICAgaWYgKGhlYWRlclZhbHVlcy5sZW5ndGggPCAwIHx8IGhlYWRlclZhbHVlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgIC8vIE5PU09OQVJcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoU25hY2tiYXJDb21wb25lbnQsIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBcIkZpZWxkIE1pc21hdGNoLiBQbGVhc2UgZW5zdXJlIHlvdXIgdXBsb2FkZWQgZmlsZSBtYXRjaGVzIHRoZSBzYW1wbGUgdGVtcGxhdGUgcHJvdmlkZWQuXCIsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBcImNvdXJzZS1lcnJvci1zbmFja2JhclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhaGVhZGVyVmFsdWVzLmluY2x1ZGVzKFwiRW1haWxpZFwiKSB8fFxuICAgICAgICAhaGVhZGVyVmFsdWVzLmluY2x1ZGVzKFwiTW9iaWxlbnVtYmVyXCIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5maWxlVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoU25hY2tiYXJDb21wb25lbnQsIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBcIkZpZWxkIE1pc21hdGNoLiBQbGVhc2UgZW5zdXJlIHlvdXIgdXBsb2FkZWQgZmlsZSBtYXRjaGVzIHRoZSBzYW1wbGUgdGVtcGxhdGUgcHJvdmlkZWQuXCIsXG4gICAgICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBcImNvdXJzZS1lcnJvci1zbmFja2JhclwiLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcblxuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3A7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5wcm9wZXJ0aWVzKVxuICAgIGNvbnN0IGVtYWlsSWRzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBtb2JpbGVOdW1iZXJzOiBhbnkgPSBbXTtcbiAgICBjb25zdCBib3RoRW1haWxBbmRNb2JpbGU6IGFueSA9IHt9O1xuICAgIHRoaXMuY29udGFjdHMgPSB0aGlzLmNvbnRhY3RzLmZpbHRlcihcbiAgICAgIChlbGU6IGFueSkgPT4gZWxlLkVtYWlsaWQgfHwgZWxlLk1vYmlsZW51bWJlclxuICAgICk7XG4gICAgaWYgKHRoaXMuY29udGFjdHMubGVuZ3RoID4gMzApIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoU25hY2tiYXJDb21wb25lbnQsIHtcbiAgICAgICAgZGF0YTogeyBtZXNzYWdlOiBcIk1vcmUgdGhhbiAzMCB1c2VycyBhcmUgbm90IGFsbG93ZWRcIiwgdHlwZTogXCJlcnJvclwiIH0sXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICBwYW5lbENsYXNzOiBcImNvdXJzZS1lcnJvci1zbmFja2JhclwiLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jb250YWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICBgXltcXFxcd1xcLVxcXFwuXStAKFtcXFxcdy1dK1xcXFwuKStbXFxcXHctXXsyLDR9JGBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbW9iaWxlUGF0dGVybiA9IG5ldyBSZWdFeHAoL14oNnw3fDh8OSlcXGR7OX0kLyk7XG4gICAgICAgIGNvbnN0IGVtYWlsVGVzdCA9IGVsZW1lbnQuRW1haWxpZFxuICAgICAgICAgID8gZW1haWxQYXR0ZXJuLnRlc3QoZWxlbWVudC5FbWFpbGlkKVxuICAgICAgICAgIDogdHJ1ZTtcbiAgICAgICAgY29uc3QgbW9iaWxlVGVzdCA9IGVsZW1lbnQuTW9iaWxlbnVtYmVyXG4gICAgICAgICAgPyBtb2JpbGVQYXR0ZXJuLnRlc3QoZWxlbWVudC5Nb2JpbGVudW1iZXIpXG4gICAgICAgICAgOiB0cnVlO1xuICAgICAgICBlbGVtZW50W1wiZW1haWxcIl0gPSBlbGVtZW50LkVtYWlsaWQ7XG4gICAgICAgIGVsZW1lbnRbXCJtb2JpbGVcIl0gPSBlbGVtZW50Lk1vYmlsZW51bWJlcjtcbiAgICAgICAgaWYgKG1vYmlsZVRlc3QgJiYgZWxlbWVudC5Nb2JpbGVudW1iZXIpIHtcbiAgICAgICAgICBtb2JpbGVOdW1iZXJzLnB1c2goZWxlbWVudC5Nb2JpbGVudW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbWFpbFRlc3QgJiYgZWxlbWVudC5FbWFpbGlkKSB7XG4gICAgICAgICAgZW1haWxJZHMucHVzaChlbGVtZW50LkVtYWlsaWQudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVtYWlsVGVzdCAmJiBtb2JpbGVUZXN0KSB7XG4gICAgICAgICAgZWxlbWVudFtcInN0YXR1c1wiXSA9IFwiU3VjY2Vzc1wiO1xuICAgICAgICAgIGVsZW1lbnRbXCJ1c2VyU3RhdHVzXCJdID0gdHJ1ZTtcbiAgICAgICAgICBib3RoRW1haWxBbmRNb2JpbGVbZWxlbWVudC5FbWFpbGlkLnRvTG93ZXJDYXNlKCldID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZW1haWxUZXN0IHx8IG1vYmlsZVRlc3QpIHtcbiAgICAgICAgICAgIGVsZW1lbnRbXCJzdGF0dXNcIl0gPSBcIlN1Y2Nlc3NcIjtcbiAgICAgICAgICAgIGVsZW1lbnRbXCJ1c2VyU3RhdHVzXCJdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKCFlbWFpbFRlc3QgJiYgZWxlbWVudC5Nb2JpbGVudW1iZXIgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgICghZW1haWxUZXN0ICYmIGVsZW1lbnQuTW9iaWxlbnVtYmVyID09PSBcIlwiKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnRbXCJzdGF0dXNcIl0gPSBcIkVycm9yXCI7XG4gICAgICAgICAgICAgIGVsZW1lbnRbXCJ1c2VyU3RhdHVzXCJdID0gZmFsc2U7XG4gICAgICAgICAgICAgIGVsZW1lbnRbXCJtZXNzYWdlXCJdID0gZW1haWxQYXR0ZXJuLnRlc3QoZWxlbWVudC5FbWFpbGlkKVxuICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgIDogXCJJbnZhbGlkIEVtYWlsIGlkXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICghbW9iaWxlVGVzdCAmJiBlbGVtZW50LkVtYWlsaWQgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgICghbW9iaWxlVGVzdCAmJiBlbGVtZW50LkVtYWlsaWQgPT09IFwiXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZWxlbWVudFtcInN0YXR1c1wiXSA9IFwiRXJyb3JcIjtcbiAgICAgICAgICAgICAgZWxlbWVudFtcInVzZXJTdGF0dXNcIl0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgZWxlbWVudFtcIm1lc3NhZ2VcIl0gPSBtb2JpbGVQYXR0ZXJuLnRlc3QoZWxlbWVudC5Nb2JpbGVudW1iZXIpXG4gICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgOiBcIkludmFsaWQgTW9iaWxlIG51bWJlclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWVtYWlsVGVzdCAmJiAhbW9iaWxlVGVzdCkge1xuICAgICAgICAgICAgICBlbGVtZW50W1wic3RhdHVzXCJdID0gXCJFcnJvclwiO1xuICAgICAgICAgICAgICBlbGVtZW50W1widXNlclN0YXR1c1wiXSA9IGZhbHNlO1xuICAgICAgICAgICAgICBlbGVtZW50W1wibWVzc2FnZVwiXSA9IFwiSW52YWxpZCBFbWFpbCBpZCBhbmQgTW9iaWxlIG51bWJlclwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudFtcInN0YXR1c1wiXSA9IFwiRXJyb3JcIjtcbiAgICAgICAgICAgICAgZWxlbWVudFtcInVzZXJTdGF0dXNcIl0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgZWxlbWVudFtcIm1lc3NhZ2VcIl0gPSBlbWFpbFBhdHRlcm4udGVzdChlbGVtZW50LkVtYWlsaWQpXG4gICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgOiBcIkludmFsaWQgRW1haWwgaWRcIjtcbiAgICAgICAgICAgICAgZWxlbWVudFtcIm1lc3NhZ2VcIl0gPSBtb2JpbGVQYXR0ZXJuLnRlc3QoZWxlbWVudC5Nb2JpbGVudW1iZXIpXG4gICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgOiBcIkludmFsaWQgTW9iaWxlIG51bWJlclwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZsYWcgPSB0cnVlO1xuICAgICAgY29uc3QgZW1haWxSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmNhbGxVc2VyQ2hlY2tBcGkoXG4gICAgICAgIGVtYWlsSWRzLFxuICAgICAgICBcInByaW1hcnlFbWFpbFwiXG4gICAgICApO1xuICAgICAgY29uc3QgbW9iaWxlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5jYWxsVXNlckNoZWNrQXBpKFxuICAgICAgICBtb2JpbGVOdW1iZXJzLFxuICAgICAgICBcIm1vYmlsZVwiXG4gICAgICApO1xuICAgICAgaWYgKGVtYWlsUmVzcG9uc2VEYXRhICYmIG1vYmlsZVJlc3BvbnNlRGF0YSkge1xuICAgICAgICB0aGlzLm1hbmFnZURhdGEoZW1haWxSZXNwb25zZURhdGEsIG1vYmlsZVJlc3BvbnNlRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuRnJvbUNvbXBvbmVudChTbmFja2JhckNvbXBvbmVudCwge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiU29tZXRoaW5nIHdlbnQgd3JvbmchIFBsZWFzZSB0cnkgYWdhaW5cIixcbiAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFwiY291cnNlLWVycm9yLXNuYWNrYmFyXCIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBhc3luYyBjYWxsVXNlckNoZWNrQXBpKHVzZXJEYXRhOiBhbnksIGtleTogYW55KSB7XG4gICAgY29uc3QgcmVxdWVzdDogYW55ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBmaWx0ZXJzOiB7fSxcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgXCJ1c2VySWRcIixcbiAgICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgICAgXCJmaXJzdE5hbWVcIixcbiAgICAgICAgICBcImxhc3ROYW1lXCIsXG4gICAgICAgICAgXCJwaG9uZVwiLFxuICAgICAgICAgIFwicm9vdE9yZ0lkXCIsXG4gICAgICAgICAgXCJjaGFubmVsXCIsXG4gICAgICAgICAgXCJyb2xlc1wiLFxuICAgICAgICAgIFwicHJvZmlsZURldGFpbHNcIixcbiAgICAgICAgICBcImNyZWF0ZWREYXRlXCIsXG4gICAgICAgICAgXCJyb290T3JnTmFtZVwiLFxuICAgICAgICAgIFwib3JnYW5pc2F0aW9uc1wiLFxuICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoa2V5ID09PSBcInByaW1hcnlFbWFpbFwiKSB7XG4gICAgICByZXF1ZXN0LnJlcXVlc3QuZmlsdGVycyA9IHtcbiAgICAgICAgLi4ucmVxdWVzdC5yZXF1ZXN0LmZpbHRlcnMsXG4gICAgICAgIGVtYWlsOiB1c2VyRGF0YSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QucmVxdWVzdC5maWx0ZXJzID0ge1xuICAgICAgICAuLi5yZXF1ZXN0LnJlcXVlc3QuZmlsdGVycyxcbiAgICAgICAgcGhvbmU6IHVzZXJEYXRhLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzQ29udHJvbFNlcnZpY2VcbiAgICAgIC52YWxpZGF0ZVVzZXIocmVxdWVzdClcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4oYXN5bmMgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlcy5yZXN1bHQucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKF9lcnI6IGFueSkgPT4ge30pXG4gICAgICAuZmluYWxseSgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG4gIH1cblxuICBtYW5hZ2VEYXRhKHVzZXJFbWFpbERhdGE6IGFueSwgdXNlck1vYmlsZURhdGE6IGFueSkge1xuICAgIHRoaXMuaXNTdWNjZXNzVXNlcmxpc3QgPSBbXTtcbiAgICB0aGlzLmlzRXJyb3JVc2VybGlzdCA9IFtdO1xuICAgIGNvbnN0IHVzZXJFbWFpbE1hcDogYW55ID0ge307XG4gICAgY29uc3QgdXNlckVtYWlsTWFwVXNlcklkOiBhbnkgPSB7fTtcbiAgICBjb25zdCB1c2VyTW9iaWxlTWFwOiBhbnkgPSB7fTtcbiAgICBpZiAodXNlckVtYWlsRGF0YS5jb3VudCkge1xuICAgICAgdXNlckVtYWlsRGF0YS5jb250ZW50LmZvckVhY2goYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZS5wcm9maWxlRGV0YWlscykge1xuICAgICAgICAgIHVzZXJFbWFpbE1hcFtcbiAgICAgICAgICAgIGUucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgXSA9IGU7XG4gICAgICAgICAgdXNlckVtYWlsTWFwVXNlcklkW2UudXNlcklkXSA9IGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXNlck1vYmlsZURhdGEuY291bnQpIHtcbiAgICAgIHVzZXJNb2JpbGVEYXRhLmNvbnRlbnQuZm9yRWFjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChlLnByb2ZpbGVEZXRhaWxzKSB7XG4gICAgICAgICAgdXNlck1vYmlsZU1hcFtlLnByb2ZpbGVEZXRhaWxzLnBlcnNvbmFsRGV0YWlscy5tb2JpbGVdID0gZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29udGFjdHMuZm9yRWFjaChhc3luYyAoZTogYW55KSA9PiB7XG4gICAgICBpZiAoZS51c2VyU3RhdHVzKSB7XG4gICAgICAgIGlmIChlLmVtYWlsICYmIGUubW9iaWxlKSB7XG4gICAgICAgICAgY29uc3QgdXNlckRhdGEgPSB1c2VyRW1haWxNYXBbZS5lbWFpbC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1c2VyRGF0YSAmJlxuICAgICAgICAgICAgdXNlckRhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzICYmXG4gICAgICAgICAgICB1c2VyRGF0YS5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMubW9iaWxlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFN0cmluZyh1c2VyRGF0YS5wcm9maWxlRGV0YWlscy5wZXJzb25hbERldGFpbHMubW9iaWxlKSA9PT1cbiAgICAgICAgICAgICAgU3RyaW5nKGUubW9iaWxlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGVbXCJ1c2VySWRcIl0gPSB1c2VyRGF0YS51c2VySWQ7XG4gICAgICAgICAgICAgIGVbXCJtaW5pc3RyeVwiXSA9IHVzZXJEYXRhLnJvb3RPcmdOYW1lO1xuICAgICAgICAgICAgICBlW1wiZnVsbE5hbWVcIl0gPSB1c2VyRGF0YS5maXJzdE5hbWUgfHwgdXNlckRhdGEuZmlyc3RuYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZVtcInN0YXR1c1wiXSA9IFwiRXJyb3JcIjtcbiAgICAgICAgICAgICAgZVtcInVzZXJTdGF0dXNcIl0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgZVtcIm1lc3NhZ2VcIl0gPSBcIkdpdmVuIGNyZWRlbnRpYWxzIGFyZSBub3QgbWF0Y2hpbmdcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZVtcInN0YXR1c1wiXSA9IFwiRXJyb3JcIjtcbiAgICAgICAgICAgIGVbXCJ1c2VyU3RhdHVzXCJdID0gZmFsc2U7XG4gICAgICAgICAgICBlW1wibWVzc2FnZVwiXSA9IFwiR2l2ZW4gY3JlZGVudGlhbHMgYXJlIG5vdCBtYXRjaGluZ1wiO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlLmVtYWlsICYmIHVzZXJFbWFpbE1hcFtlLmVtYWlsLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgY29uc3QgdXNlckRhdGEgPSB1c2VyRW1haWxNYXBbZS5lbWFpbC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgICBlW1wibW9iaWxlXCJdID0gdXNlckRhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLm1vYmlsZTtcblxuICAgICAgICAgIGVbXCJ1c2VySWRcIl0gPSB1c2VyRGF0YS51c2VySWQ7XG4gICAgICAgICAgZVtcIm1pbmlzdHJ5XCJdID0gdXNlckRhdGEucm9vdE9yZ05hbWU7XG4gICAgICAgICAgZVtcImZ1bGxOYW1lXCJdID0gdXNlckRhdGEuZmlyc3ROYW1lIHx8IHVzZXJEYXRhLmZpcnN0bmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChlLm1vYmlsZSAmJiB1c2VyTW9iaWxlTWFwW2UubW9iaWxlXSkge1xuICAgICAgICAgIGNvbnN0IHVzZXJEYXRhID0gdXNlck1vYmlsZU1hcFtlLm1vYmlsZV07XG4gICAgICAgICAgZVtcImVtYWlsXCJdID0gdXNlckRhdGEucHJvZmlsZURldGFpbHMucGVyc29uYWxEZXRhaWxzLnByaW1hcnlFbWFpbDtcbiAgICAgICAgICBlW1widXNlcklkXCJdID0gdXNlckRhdGEudXNlcklkO1xuICAgICAgICAgIGVbXCJtaW5pc3RyeVwiXSA9IHVzZXJEYXRhLnJvb3RPcmdOYW1lO1xuICAgICAgICAgIGVbXCJmdWxsTmFtZVwiXSA9IHVzZXJEYXRhLmZpcnN0TmFtZSB8fCB1c2VyRGF0YS5maXJzdG5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZVtcInN0YXR1c1wiXSA9IFwiRXJyb3JcIjtcbiAgICAgICAgICBlW1widXNlclN0YXR1c1wiXSA9IGZhbHNlO1xuICAgICAgICAgIGVbXCJtZXNzYWdlXCJdID0gXCJHaXZlbiBjcmVkZW50aWFscyBhcmUgbm90IG1hdGNoaW5nXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmZpbGVVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzU3VjY2Vzc1VzZXJsaXN0ID0gdGhpcy5jb250YWN0cy5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUudXNlclN0YXR1cyk7XG4gICAgdGhpcy5pc0Vycm9yVXNlcmxpc3QgPSB0aGlzLmNvbnRhY3RzLmZpbHRlcigoZWxlOiBhbnkpID0+ICFlbGUudXNlclN0YXR1cyk7XG5cbiAgICAvLyB0aGlzLnN1Y2Nlc3NVc2VyRGF0YS5lbWl0KHRoaXMuaXNTdWNjZXNzVXNlcmxpc3QpO1xuICAgIHRoaXMuY3VycnJlbnRGaWx0ZXJUeXBlID0gdGhpcy5pc1N1Y2Nlc3NVc2VybGlzdC5sZW5ndGhcbiAgICAgID8gXCJzdWNjZXNzXCJcbiAgICAgIDogXCJlcnJvclwiO1xuICAgIGlmICh0aGlzLmN1cnJyZW50RmlsdGVyVHlwZSA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgIC8vIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IFtcbiAgICAgIC8vICAgXCJmdWxsTmFtZVwiLFxuICAgICAgLy8gICBcImVtYWlsXCIsXG4gICAgICAvLyAgIFwibWluaXN0cnlcIixcbiAgICAgIC8vICAgXCJzdGF0dXNcIixcbiAgICAgIC8vICAgXCJtb2JpbGVcIixcbiAgICAgIC8vIF07XG4gICAgICAvLyB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPElVc2VyRWxlbWVudD4oXG4gICAgICAvLyAgIHRoaXMuaXNTdWNjZXNzVXNlcmxpc3RcbiAgICAgIC8vICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJyZW50RmlsdGVyVHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAvLyB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBbXCJlbWFpbFwiLCBcInN0YXR1c1wiLCBcIm1vYmlsZVwiLCBcIm1lc3NhZ2VcIl07XG4gICAgICAvLyB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPElVc2VyRWxlbWVudD4oXG4gICAgICAvLyAgIHRoaXMuaXNFcnJvclVzZXJsaXN0XG4gICAgICAvLyApO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsdGVyQ2hhbmdlKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMuY3VycnJlbnRGaWx0ZXJUeXBlID0gdHlwZTtcbiAgfVxuXG4gIGRvd25sb2FkRXJyb3JGaWxlKCkge1xuICAgIHRoaXMuYWNjZXNzQ29udHJvbFNlcnZpY2UuZG93bmxvYWRGaWxlKFxuICAgICAgdGhpcy5pc0Vycm9yVXNlcmxpc3QsXG4gICAgICBcInVzZXJFcnJvcmRhdGFcIlxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJidWxrLXVwbG9hZC13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgcHktNCBweC01IHdyYXBwZXItYm9yZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbnMtZG93bmxvYWQgcHktNCBweC01IGJvcmRlci1kb3R0ZWQgZmxleC0xXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNiB0ZXh0LXN0eWxlXCI+T3BlbiAmIGZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc3RydWN0aW9ucy1saXN0XCI+XG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibnVtYmVyZWQtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGJ1bGtVcGxvYWRDb25maWc/LnVwbG9hZEluc3RydWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPnt7aXRlbX19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvd25sb2FkLXNhbXBsZSBtdC02XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cImRvd25sb2FkU2FtcGxlKClcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtZnVsbCBweC00IHB5LTIgZm9udC1ib2xkIHRleHQtc20gbWF0LWJ0bi1vdXRsaW5lIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIERvd25sb2FkIFNhbXBsZSBGaWxlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1bGstdXBsb2FkLXNlbGVjdCBweS00IHB4LTUgYm9yZGVyLWRvdHRlZCBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodF91cGxvYWRfaW5uZXIgZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiB3c0F1dGhEcmFnRHJvcFxuICAgICAgICAgICAgICAgIChmaWxlRHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtYXJnaW4tYm90dG9tLXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic3ZnLWljb1wiIHN2Z0ljb249XCJleGNlbC1zaGVldFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmV3LWNvbG9yIGN1cnNvci1wb2ludGVyIHRleHQtc20gZm9udC1ib2xkIG1iLTEgbXQtN1wiIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPkJyb3dzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXM8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiB0ZXh0LXNtXCI+T3I8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiB3cy1tYXQtYmxhY2s2MC10ZXh0IHRleHQtYmFzZVwiPkRyYWcgZmlsZSB0byB1cGxvYWQ8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC14cyB3cy1tYXQtYmxhY2s4Ny10ZXh0IG1hcmdpbi1yZW1vdmVcIj5NYXggc2l6ZTogMTAwIE1CPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgd3MtbWF0LWJsYWNrNjAtdGV4dCBtYXJnaW4tcmVtb3ZlXCI+U3VwcG9ydGVkIGZpbGUgdHlwZXM6IENTVjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0IGNsYXNzPVwiaW5wdXRmaWxlXCIgYWNjZXB0PVwiLmNzdlwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ecm9wKCRldmVudC50YXJnZXQuZmlsZXNbMF0pOyBmaWxlSW5wdXQudmFsdWUgPSBudWxsXCIgLz5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsZVwiIGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSBqdXN0aWZ5LWNlbnRlciBmbGV4LWNvbHVtbiBwb3NpdGlvbi1yZWxhdGl2ZSBwdC01IHB4LTVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid3MtbWF0LXByaW1hcnktdGV4dFwiIHN2Z0ljb249XCJleGNlbC1zaGVldFwiPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1sZWZ0LXhzIG1hdC1oMyBmb250LXdlaWdodC01MDAgbWFyZ2luLXJlbW92ZS1ib3R0b20gYnJlYWtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWxlOyBlbHNlIGVsc2VCbG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC13cmFwXCI+IHt7IGZpbGU/Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4+Tm8gZmlsZSB1cGxvYWRlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZpbHRlci1ieS1zZWxlY3QgbXktNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRpdGxlXCI+RmlsdGVyIEJ5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIChjbGljayk9XCJvbkZpbHRlckNoYW5nZSgnc3VjY2VzcycpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VycnJlbnRGaWx0ZXJUeXBlID09PSAnc3VjY2VzcycgPyAnbmV3LWJnLWNvbG9yIHRleHQtd2hpdGUgbWF0LWJ0bi1mbGF0JzogJ21hdC1idG4tb3V0bGluZScgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcHgtNCBweS0yIGZvbnQtYm9sZCB0ZXh0LXNtICBjdXJzb3ItcG9pbnRlciBcIj5cbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uRmlsdGVyQ2hhbmdlKCdlcnJvcicpXCIgbWF0LWZsYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1cnJyZW50RmlsdGVyVHlwZSA9PT0gJ2Vycm9yJyA/ICduZXctYmctY29sb3IgdGV4dC13aGl0ZSBtYXQtYnRuLWZsYXQnOiAnbWF0LWJ0bi1vdXRsaW5lJyBcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtZnVsbCBweC00IHB5LTIgZm9udC1ib2xkIHRleHQtc20gY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgRXJyb3JcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJsaXN0LXRhYmxlLWJ1bGstdXBsb2FkXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJycmVudEZpbHRlclR5cGUgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHNlbGVjdGlvbi1jb3VudCBtYi00IHAtMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiXCI+e3tpc1N1Y2Nlc3NVc2VybGlzdC5sZW5ndGh9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1ub3JtYWxcIj5JdGVtcyBTZWxlY3RlZDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNiLXVpYy1saXN0LXRhYmxlIFtkYXRhXT1cImlzU3VjY2Vzc1VzZXJsaXN0XCIgW2NvdW50XT1cIjFcIlxuICAgICAgICAgICAgICAgIFtpbml0aWFsUGFnaW5hdGlvblNpemVdPVwiYnVsa1VwbG9hZENvbmZpZ1snYnVsa1VwbG9hZFRhYmxlJ10/LmluaXRpYWxQYWdpbmF0aW9uU2l6ZVwiXG4gICAgICAgICAgICAgICAgW3RhYmxlQ29uZmlnXT1cImJ1bGtVcGxvYWRDb25maWdbJ2J1bGtVcGxvYWRUYWJsZSddXCJcbiAgICAgICAgICAgICAgICBbYnVsa1VwbG9hZEVudHJpZXNDb3VudF09XCJ7dG90YWxDb3VudDogaXNTdWNjZXNzVXNlcmxpc3Q/Lmxlbmd0aCArIGlzRXJyb3JVc2VybGlzdD8ubGVuZ3RoLCBzdWNjZXNzOiBpc1N1Y2Nlc3NVc2VybGlzdD8ubGVuZ3RofVwiPlxuICAgICAgICAgICAgPC9zYi11aWMtbGlzdC10YWJsZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJyZW50RmlsdGVyVHlwZSA9PT0gJ2Vycm9yJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXItYm9yZGVyIHJvdW5kZWQtc20gcC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZy1oaXN0b3J5LXRleHRcIj5Mb2cgSGlzdG9yeTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mb3JtYXRpb24tbGlzdCBweS00IHB4LTZcIj5cbiAgICAgICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXNFcnJvclVzZXJsaXN0XCI+IC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3VuZGVkLWxnIHdyYXBwZXItYm9yZGVyIHB5LTUgcHgtNCBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWxvZy10aXRsZSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdGl0bGUgdGV4dC1kYXJrXCI+RmlsZSBJbmZvcm1hdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2ljb24td3JhcHBlci5zdmdcIiBhbHQ9XCJ0b29sdGlwLWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwiZG93bmxvYWRFcnJvckZpbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1mdWxsIHB4LTQgcHktMiBmb250LWJvbGQgdGV4dC1zbSBtYXQtYnRuLW91dGxpbmUgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibmV3LWNvbG9yXCI+ZmlsZV9kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkIGVycm9yIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXktNCBtZXRhLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRpdGxlIHRleHQtZGFya1wiPnt7ZmlsZU5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2Vycm9yLWljb24uc3ZnXCIgYWx0PVwiZXJyb3ItaWNvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN0eWxlIHRleHQtZGFya1wiPlRoZXJlc3MgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdXBsb2FkaW5nIHRoaXMgZmlsZS48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLXgtNiBnYXAteS00IGZhbGllZC1yZWNvcmRzLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtNCBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5OYW1lPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LW1lZGl1bSBicmVhay1hbGwgdGV4dC1kYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tmaWxlTmFtZX19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+VG90YWwgUmVjb3JkczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC1kYXJrXCI+e3tpc1N1Y2Nlc3NVc2VybGlzdD8ubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Vycm9yVXNlcmxpc3Q/Lmxlbmd0aH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwIG10LTJcIj5GYWlsZWQgUmVjb3JkczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1tZWRpdW0gdGV4dC1kYXJrXCI+e3tpc0Vycm9yVXNlcmxpc3Q/Lmxlbmd0aH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtNCBmbGV4LWdyb3ctMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5TdGF0dXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtcmVkLTYwMCBmb250LW5vcm1hbFwiPkZBSUxFRDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTUwMFwiPkNyZWF0ZWQgT248L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbWVkaXVtIHRleHQtZGFya1wiPnt7Y3VycmVudERhdGUgfCBkYXRlOiAnbWVkaXVtJ319PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwIG10LTJcIj5VcGRhdGVkIE9uPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LW1lZGl1bSB0ZXh0LWRhcmtcIj57e2N1cnJlbnREYXRlIHwgZGF0ZTogJ21lZGl1bSd9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTQgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+U3VjY2VzcyBSZWNvcmRzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJmb250LW1lZGl1bSB0ZXh0LWRhcmtcIj57e2lzU3VjY2Vzc1VzZXJsaXN0Py5sZW5ndGh9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|