@doolehealth/service-lib 0.0.1
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/doolehealth-service-lib.mjs +5 -0
- package/esm2022/lib/configuration.mjs +5 -0
- package/esm2022/lib/models/user.mjs +2 -0
- package/esm2022/lib/service-lib.component.mjs +19 -0
- package/esm2022/lib/service-lib.module.mjs +33 -0
- package/esm2022/lib/services/analytics.service.mjs +73 -0
- package/esm2022/lib/services/api-endpoints.service.mjs +51 -0
- package/esm2022/lib/services/authentication.service.mjs +400 -0
- package/esm2022/lib/services/change-endpoints.service.mjs +90 -0
- package/esm2022/lib/services/date.service.mjs +419 -0
- package/esm2022/lib/services/doole.service.mjs +1299 -0
- package/esm2022/lib/services/encryption.service.mjs +31 -0
- package/esm2022/lib/services/error.service.mjs +49 -0
- package/esm2022/lib/services/events.service.mjs +63 -0
- package/esm2022/lib/services/highcharts.service.mjs +621 -0
- package/esm2022/lib/services/http.service.mjs +124 -0
- package/esm2022/lib/services/language.service.mjs +38 -0
- package/esm2022/lib/services/loading.service.mjs +45 -0
- package/esm2022/lib/services/logging.service.mjs +28 -0
- package/esm2022/lib/services/navigation.service.mjs +41 -0
- package/esm2022/lib/services/network.service.mjs +42 -0
- package/esm2022/lib/services/notification.service.mjs +202 -0
- package/esm2022/lib/services/opentok.service.mjs +25 -0
- package/esm2022/lib/services/roles.service.mjs +44 -0
- package/esm2022/lib/services/storage.service.mjs +37 -0
- package/esm2022/lib/services/token.service.mjs +59 -0
- package/esm2022/lib/util/chatParameters.mjs +17 -0
- package/esm2022/lib/util/data-store.mjs +54 -0
- package/esm2022/lib/util/environment.mjs +29 -0
- package/esm2022/lib/util/language.model.mjs +3 -0
- package/esm2022/lib/util/notification-options.mjs +245 -0
- package/esm2022/lib/util/query-string-parameters.mjs +11 -0
- package/esm2022/lib/util/url-builder.mjs +15 -0
- package/esm2022/public-api.mjs +30 -0
- package/fesm2022/doolehealth-service-lib.mjs +4025 -0
- package/fesm2022/doolehealth-service-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/configuration.d.ts +46 -0
- package/lib/models/user.d.ts +133 -0
- package/lib/service-lib.component.d.ts +5 -0
- package/lib/service-lib.module.d.ts +13 -0
- package/lib/services/analytics.service.d.ts +17 -0
- package/lib/services/api-endpoints.service.d.ts +13 -0
- package/lib/services/authentication.service.d.ts +102 -0
- package/lib/services/change-endpoints.service.d.ts +38 -0
- package/lib/services/date.service.d.ts +58 -0
- package/lib/services/doole.service.d.ts +169 -0
- package/lib/services/encryption.service.d.ts +9 -0
- package/lib/services/error.service.d.ts +11 -0
- package/lib/services/events.service.d.ts +32 -0
- package/lib/services/highcharts.service.d.ts +69 -0
- package/lib/services/http.service.d.ts +28 -0
- package/lib/services/language.service.d.ts +15 -0
- package/lib/services/loading.service.d.ts +22 -0
- package/lib/services/logging.service.d.ts +9 -0
- package/lib/services/navigation.service.d.ts +13 -0
- package/lib/services/network.service.d.ts +14 -0
- package/lib/services/notification.service.d.ts +25 -0
- package/lib/services/opentok.service.d.ts +17 -0
- package/lib/services/roles.service.d.ts +28 -0
- package/lib/services/storage.service.d.ts +10 -0
- package/lib/services/token.service.d.ts +16 -0
- package/lib/util/chatParameters.d.ts +25 -0
- package/lib/util/data-store.d.ts +13 -0
- package/lib/util/environment.d.ts +18 -0
- package/lib/util/language.model.d.ts +4 -0
- package/lib/util/notification-options.d.ts +145 -0
- package/lib/util/query-string-parameters.d.ts +6 -0
- package/lib/util/url-builder.d.ts +9 -0
- package/package.json +38 -0
- package/public-api.d.ts +23 -0
|
@@ -0,0 +1,1299 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { Capacitor } from '@capacitor/core';
|
|
4
|
+
import { map } from 'rxjs/operators';
|
|
5
|
+
import { HttpParams } from '@angular/common/http';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "../services/authentication.service";
|
|
8
|
+
import * as i2 from "@awesome-cordova-plugins/file-transfer/ngx";
|
|
9
|
+
import * as i3 from "@awesome-cordova-plugins/file/ngx";
|
|
10
|
+
import * as i4 from "./http.service";
|
|
11
|
+
import * as i5 from "../services/api-endpoints.service";
|
|
12
|
+
import * as i6 from "./events.service";
|
|
13
|
+
import * as i7 from "@ionic/angular";
|
|
14
|
+
import * as i8 from "@angular/router";
|
|
15
|
+
export class DooleService {
|
|
16
|
+
constructor(authService, transfer, file, http, api, events, platform, router, alertController) {
|
|
17
|
+
this.authService = authService;
|
|
18
|
+
this.transfer = transfer;
|
|
19
|
+
this.file = file;
|
|
20
|
+
this.http = http;
|
|
21
|
+
this.api = api;
|
|
22
|
+
this.events = events;
|
|
23
|
+
this.platform = platform;
|
|
24
|
+
this.router = router;
|
|
25
|
+
this.alertController = alertController;
|
|
26
|
+
}
|
|
27
|
+
uploadFile(image, id) {
|
|
28
|
+
console.log("uploading ", image);
|
|
29
|
+
const token = localStorage.getItem('token');
|
|
30
|
+
let options = {
|
|
31
|
+
fileKey: 'file',
|
|
32
|
+
fileName: 'name.jpg',
|
|
33
|
+
headers: {
|
|
34
|
+
'Authorization': 'Bearer ' + token,
|
|
35
|
+
'Accept': 'application/json',
|
|
36
|
+
},
|
|
37
|
+
params: {
|
|
38
|
+
id: id
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const fileTransfer = this.transfer.create();
|
|
42
|
+
// Add files for new or saved diagnostics.
|
|
43
|
+
// uses diagnostic/media when diagnostic is new
|
|
44
|
+
//const endpoint = id ? this.api.getEndpoint('diagnostic/media'):this.api.getDooleEndpoint('media/upload/temp') ;
|
|
45
|
+
const endpoint = this.api.getEndpoint('media/upload/temp');
|
|
46
|
+
//console.log("* uploadFile endpoint", endpoint);
|
|
47
|
+
return new Promise(function (resolve, reject) {
|
|
48
|
+
fileTransfer.upload(image, endpoint, options).then(data => {
|
|
49
|
+
console.log(data);
|
|
50
|
+
resolve(JSON.parse(data.response));
|
|
51
|
+
}, (err) => {
|
|
52
|
+
console.log(err);
|
|
53
|
+
reject(err);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
postAPIAddMedia(params) {
|
|
58
|
+
const endpoint = this.api.getEndpoint('media/add');
|
|
59
|
+
return this.http.postForm(endpoint, params).pipe(map((res) => {
|
|
60
|
+
console.log(`[DooleService] postAPIAddMedia(${endpoint}) res: `, res);
|
|
61
|
+
return res;
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
uploadFileToModel(image, name, params) {
|
|
65
|
+
//console.log("uploading ", image);
|
|
66
|
+
const token = localStorage.getItem('token');
|
|
67
|
+
let options = {
|
|
68
|
+
fileKey: 'file',
|
|
69
|
+
fileName: name,
|
|
70
|
+
headers: {
|
|
71
|
+
'Authorization': 'Bearer ' + token,
|
|
72
|
+
'Accept': 'application/json',
|
|
73
|
+
},
|
|
74
|
+
params
|
|
75
|
+
};
|
|
76
|
+
const fileTransfer = this.transfer.create();
|
|
77
|
+
const endpoint = this.api.getEndpoint('media/add');
|
|
78
|
+
return new Promise(function (resolve, reject) {
|
|
79
|
+
fileTransfer.upload(image, endpoint, options).then(data => {
|
|
80
|
+
console.log(JSON.parse(data.response));
|
|
81
|
+
resolve(JSON.parse(data.response));
|
|
82
|
+
}, (err) => {
|
|
83
|
+
console.log(err);
|
|
84
|
+
reject(err);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
uploadMessageImage(idMessageHeader, idUserTo, message, fileUrl, id_usuari_amiq) {
|
|
89
|
+
const token = localStorage.getItem('token');
|
|
90
|
+
let options = {
|
|
91
|
+
fileKey: 'file',
|
|
92
|
+
fileName: 'name.pdf', //TODO: 'name.jpg'
|
|
93
|
+
headers: {
|
|
94
|
+
'Authorization': 'Bearer ' + token,
|
|
95
|
+
'Accept': 'application/json',
|
|
96
|
+
},
|
|
97
|
+
params: {
|
|
98
|
+
idUser: id_usuari_amiq,
|
|
99
|
+
secret: token,
|
|
100
|
+
value: "",
|
|
101
|
+
id: idMessageHeader
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
//console.log("options: ", options);
|
|
105
|
+
const fileTransfer = this.transfer.create();
|
|
106
|
+
fileTransfer.onProgress((progressEvent) => {
|
|
107
|
+
if (progressEvent.lengthComputable) {
|
|
108
|
+
var perc = Math.floor(progressEvent.loaded / progressEvent.total * 100);
|
|
109
|
+
this.events.publish("uploadMessageImage", { fileUrl, perc });
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
//console.log("progressEvent - ", progressEvent);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
const endpoint = this.api.getEndpoint('message');
|
|
116
|
+
return new Promise(function (resolve, reject) {
|
|
117
|
+
fileTransfer.upload(fileUrl, endpoint, options)
|
|
118
|
+
.then(data => {
|
|
119
|
+
//console.log("success fileTransfer.upload", JSON.parse(data.response));
|
|
120
|
+
resolve(JSON.parse(data.response));
|
|
121
|
+
}, (err) => {
|
|
122
|
+
//console.log("** error ** fileTransfer.upload: ", err);
|
|
123
|
+
reject(fileTransfer.upload);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
b64toBlob(b64Data, contentType = '', sliceSize = 512) {
|
|
128
|
+
const byteCharacters = atob(b64Data);
|
|
129
|
+
const byteArrays = [];
|
|
130
|
+
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
|
|
131
|
+
const slice = byteCharacters.slice(offset, offset + sliceSize);
|
|
132
|
+
const byteNumbers = new Array(slice.length);
|
|
133
|
+
for (let i = 0; i < slice.length; i++) {
|
|
134
|
+
byteNumbers[i] = slice.charCodeAt(i);
|
|
135
|
+
}
|
|
136
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
137
|
+
byteArrays.push(byteArray);
|
|
138
|
+
}
|
|
139
|
+
const blob = new Blob(byteArrays, { type: contentType });
|
|
140
|
+
return blob;
|
|
141
|
+
}
|
|
142
|
+
downloadFile(url, destination) {
|
|
143
|
+
var result = [];
|
|
144
|
+
const fileTransfer = this.transfer.create();
|
|
145
|
+
var path = null;
|
|
146
|
+
if (this.platform.is('ios')) {
|
|
147
|
+
path = this.file.documentsDirectory;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
path = this.file.dataDirectory;
|
|
151
|
+
}
|
|
152
|
+
//console.log("downloadFile", url, destination, 'path,destination', path, destination);
|
|
153
|
+
return new Observable((observer) => {
|
|
154
|
+
//console.log("before CheckFile", this.file);
|
|
155
|
+
this.file.checkFile(path, destination).then(res => {
|
|
156
|
+
//console.log("*res*", res);
|
|
157
|
+
if (res) {
|
|
158
|
+
//console.log("exists", res);
|
|
159
|
+
result["success"] = true;
|
|
160
|
+
result["downloaded"] = true;
|
|
161
|
+
result["file"] = path + destination; //normalizeURL(this.file.cacheDirectory + destination);
|
|
162
|
+
result["fileNormalized"] = Capacitor.convertFileSrc(path + destination);
|
|
163
|
+
return observer.next(result);
|
|
164
|
+
}
|
|
165
|
+
}, error => {
|
|
166
|
+
//console.log("not exists");
|
|
167
|
+
fileTransfer.onProgress(event => {
|
|
168
|
+
if (event.lengthComputable) {
|
|
169
|
+
//console.log(event.loaded / event.total);
|
|
170
|
+
result["status"] = "downloading";
|
|
171
|
+
result["downloaded"] = false;
|
|
172
|
+
result["percent"] = Math.round((event.loaded / event.total) * 100);
|
|
173
|
+
return observer.next(result);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return fileTransfer.download(url, path + destination).then((entry) => {
|
|
177
|
+
//console.log('*download:* ' + url + " " + entry.toURL());
|
|
178
|
+
result["success"] = true;
|
|
179
|
+
result["downloaded"] = true;
|
|
180
|
+
result["file"] = entry.toURL(); //normalizeURL(this.file.cacheDirectory + destination);
|
|
181
|
+
result["fileNormalized"] = Capacitor.convertFileSrc(path + destination);
|
|
182
|
+
return observer.next(result);
|
|
183
|
+
}, (error) => {
|
|
184
|
+
//console.log(error);
|
|
185
|
+
result["success"] = false;
|
|
186
|
+
result["downloaded"] = false;
|
|
187
|
+
//console.log("error download " + url);
|
|
188
|
+
//console.log(result);
|
|
189
|
+
return observer.next(result);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
deleteFile(id) {
|
|
195
|
+
let path = `media/${id}`;
|
|
196
|
+
const endpoint = this.api.getEndpoint(path);
|
|
197
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
198
|
+
console.log(`[DooleService] deleteFile(${path}) res: ${res}`, JSON.stringify(res));
|
|
199
|
+
return res;
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
showAlert(message) {
|
|
203
|
+
return this.alertController.create({
|
|
204
|
+
header: 'Info',
|
|
205
|
+
message: message,
|
|
206
|
+
backdropDismiss: false,
|
|
207
|
+
buttons: ['OK']
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
async showAlertAndReturn(header, message, isDismiss, route) {
|
|
211
|
+
//console.log(`[DooleService] showAlertAndReturn()`);
|
|
212
|
+
let dismiss = (isDismiss !== undefined) ? isDismiss : false;
|
|
213
|
+
const alert = await this.alertController.create({
|
|
214
|
+
header: header,
|
|
215
|
+
message: message,
|
|
216
|
+
backdropDismiss: dismiss,
|
|
217
|
+
buttons: [
|
|
218
|
+
{
|
|
219
|
+
text: 'OK',
|
|
220
|
+
handler: (blah) => {
|
|
221
|
+
// console.log('Confirm OK: blah');
|
|
222
|
+
if (route !== undefined && route !== null)
|
|
223
|
+
this.router.navigateByUrl(route);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
});
|
|
228
|
+
await alert.present();
|
|
229
|
+
}
|
|
230
|
+
async presentAlert(message, button) {
|
|
231
|
+
let buttonName = (button !== undefined) ? button : 'Ok';
|
|
232
|
+
const alert = await this.alertController.create({
|
|
233
|
+
cssClass: 'my-alert-class',
|
|
234
|
+
message: message,
|
|
235
|
+
buttons: [buttonName]
|
|
236
|
+
});
|
|
237
|
+
await alert.present();
|
|
238
|
+
}
|
|
239
|
+
getFamilyUnitID() {
|
|
240
|
+
let httpParams = new HttpParams();
|
|
241
|
+
let user = this.authService?.user;
|
|
242
|
+
return httpParams = (user.familyUnit) ? httpParams.append('user', user.familyUnit) : httpParams;
|
|
243
|
+
}
|
|
244
|
+
getAPILegalInformation() {
|
|
245
|
+
let path = 'user/legalTerm/lastAccepted';
|
|
246
|
+
const endpoint = this.api.getEndpoint(path);
|
|
247
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
248
|
+
console.log(`[DooleService] getAPILegalInformation(${path}) res: `, res);
|
|
249
|
+
return res;
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
postAPILegalConfirmation(params) {
|
|
253
|
+
let path = 'user/legalTerm/lastAccepted';
|
|
254
|
+
const endpoint = this.api.getEndpoint(path);
|
|
255
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
256
|
+
//console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
|
|
257
|
+
return res;
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
postAPIRejectLegalConfirmation(params) {
|
|
261
|
+
let path = 'user/legalTerm/lastDeclined';
|
|
262
|
+
const endpoint = this.api.getEndpoint(path);
|
|
263
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
264
|
+
//console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
|
|
265
|
+
return res;
|
|
266
|
+
}));
|
|
267
|
+
}
|
|
268
|
+
postAPIpasswordRecovery(params) {
|
|
269
|
+
let path = 'patient/forgot';
|
|
270
|
+
const endpoint = this.api.getEndpoint(path);
|
|
271
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
272
|
+
//console.log(`[DooleService] postAPIpasswordRecovery(${path}) res: `, res);
|
|
273
|
+
return res;
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
getAPIStaffSlots(params) {
|
|
277
|
+
let path = `staff/${params.id}/availability`;
|
|
278
|
+
let endpoint;
|
|
279
|
+
if (params.date !== "") {
|
|
280
|
+
endpoint = this.api.getEndpointWithParameters(path, (qs) => qs.push('date', params.date));
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
endpoint = this.api.getEndpoint(path);
|
|
284
|
+
}
|
|
285
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
286
|
+
//console.log(`[DooleService] getAPIStaffSlots(${path}) res: `, res);
|
|
287
|
+
return res;
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
getAPIgoals() {
|
|
291
|
+
let path = 'user/element/goals';
|
|
292
|
+
const endpoint = this.api.getEndpoint(path);
|
|
293
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
294
|
+
//console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
|
|
295
|
+
return res;
|
|
296
|
+
}));
|
|
297
|
+
}
|
|
298
|
+
getAPIvideocall(id) {
|
|
299
|
+
let path = 'user/agenda/' + id + '/videocallSession';
|
|
300
|
+
const endpoint = this.api.getEndpoint(path);
|
|
301
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
302
|
+
console.log(`[DooleService] getAPIvideocall(${path}) res: `, res);
|
|
303
|
+
return res;
|
|
304
|
+
}));
|
|
305
|
+
}
|
|
306
|
+
postAPIPendingConnect() {
|
|
307
|
+
let path = 'user/videocall/pendingConnect';
|
|
308
|
+
const endpoint = this.api.getEndpoint(path);
|
|
309
|
+
return this.http.post(endpoint).pipe(map((res) => {
|
|
310
|
+
console.log(`[DooleService] getAPIPendingConnect(${path}) res: `, res);
|
|
311
|
+
return res;
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
314
|
+
/* getAPIinformationUser(): Observable<any>{
|
|
315
|
+
|
|
316
|
+
let path = 'user/informationUser'
|
|
317
|
+
const endpoint = this.api.getEndpoint(path);
|
|
318
|
+
return this.http.get(endpoint).pipe(
|
|
319
|
+
map((res: any) => {
|
|
320
|
+
//console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
|
|
321
|
+
return res;
|
|
322
|
+
})
|
|
323
|
+
)
|
|
324
|
+
} */
|
|
325
|
+
getAPIinformationSummary(params) {
|
|
326
|
+
let path = 'home';
|
|
327
|
+
const endpoint = this.api.getEndpoint(path);
|
|
328
|
+
console.log('home params', params);
|
|
329
|
+
return this.http.post(endpoint, params).pipe(map(res => res));
|
|
330
|
+
}
|
|
331
|
+
getAPIinformationSummaryOld(params) {
|
|
332
|
+
let path = 'home';
|
|
333
|
+
const endpoint = this.api.getEndpoint(path);
|
|
334
|
+
return this.http.post(endpoint, params).pipe(map(res => res));
|
|
335
|
+
}
|
|
336
|
+
getAPIuserProfile() {
|
|
337
|
+
let path = 'v2/user/profile';
|
|
338
|
+
//let httpParams = this.getFamilyUnitID()
|
|
339
|
+
const endpoint = this.api.getEndpoint(path);
|
|
340
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
341
|
+
//console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
|
|
342
|
+
return res;
|
|
343
|
+
}));
|
|
344
|
+
}
|
|
345
|
+
postAPIChangePassword(params) {
|
|
346
|
+
let path = 'user/changePassword';
|
|
347
|
+
let httpParams = this.getFamilyUnitID();
|
|
348
|
+
const endpoint = this.api.getEndpoint(path);
|
|
349
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
350
|
+
//console.log(`[DooleService] postAPIChangePassword(${path}) res: `, res);
|
|
351
|
+
return res;
|
|
352
|
+
}));
|
|
353
|
+
}
|
|
354
|
+
getAPInotificationConfigurations() {
|
|
355
|
+
let path = 'user/configuration';
|
|
356
|
+
const endpoint = this.api.getEndpoint(path);
|
|
357
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
358
|
+
//console.log(`[DooleService] getAPInotificationConfigurations(${path}) res: `, res);
|
|
359
|
+
return res;
|
|
360
|
+
}));
|
|
361
|
+
}
|
|
362
|
+
postAPIConfiguration(params) {
|
|
363
|
+
let path = 'user/configuration';
|
|
364
|
+
const endpoint = this.api.getEndpoint(path);
|
|
365
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
366
|
+
//console.log(`[DooleService] postAPIConfiguration(${path}) res: `, res);
|
|
367
|
+
return res;
|
|
368
|
+
}));
|
|
369
|
+
}
|
|
370
|
+
getAPIlanguagesCenter() {
|
|
371
|
+
let path = 'center/languages';
|
|
372
|
+
const endpoint = this.api.getEndpoint(path);
|
|
373
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
374
|
+
//console.log(`[DooleService] getAPIlanguagesCenter(${path}) res: `, res);
|
|
375
|
+
return res;
|
|
376
|
+
}));
|
|
377
|
+
}
|
|
378
|
+
getAPIFaqs() {
|
|
379
|
+
let path = 'center/faq';
|
|
380
|
+
const endpoint = this.api.getEndpoint(path);
|
|
381
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
382
|
+
//console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
|
|
383
|
+
return res;
|
|
384
|
+
}));
|
|
385
|
+
}
|
|
386
|
+
getAPIFamilyUnit() {
|
|
387
|
+
let path = 'user/familyUnit';
|
|
388
|
+
const endpoint = this.api.getEndpoint(path);
|
|
389
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
390
|
+
//console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
|
|
391
|
+
return res;
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
394
|
+
getAPIFamilyUnit2() {
|
|
395
|
+
let path = 'v2/user/familyUnit';
|
|
396
|
+
const endpoint = this.api.getEndpoint(path);
|
|
397
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
398
|
+
console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
|
|
399
|
+
return res;
|
|
400
|
+
}));
|
|
401
|
+
}
|
|
402
|
+
postAPIReportProblem(params) {
|
|
403
|
+
let path = 'user/reportProblem'; // 'media/upload/temp'
|
|
404
|
+
const endpoint = this.api.getEndpoint(path);
|
|
405
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
406
|
+
console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
|
|
407
|
+
return res;
|
|
408
|
+
}));
|
|
409
|
+
}
|
|
410
|
+
postAPIemailVerification(params) {
|
|
411
|
+
let path = 'user/email_verification';
|
|
412
|
+
const endpoint = this.api.getEndpoint(path);
|
|
413
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
414
|
+
console.log(`[DooleService] postAPIemailVerification(${path}) res: `, res);
|
|
415
|
+
return res;
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
getAPICodeByEmail() {
|
|
419
|
+
let path = 'user/resendTwoFactorCode';
|
|
420
|
+
const endpoint = this.api.getEndpoint(path);
|
|
421
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
422
|
+
console.log(`[DooleService] getAPICodeByEmail(${path}) res: `, res);
|
|
423
|
+
return res;
|
|
424
|
+
}));
|
|
425
|
+
}
|
|
426
|
+
postAPIcodeVerification(params) {
|
|
427
|
+
let path = 'user/verifyTwoFactor';
|
|
428
|
+
//let path = 'user/codeVerification';
|
|
429
|
+
const endpoint = this.api.getEndpoint(path);
|
|
430
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
431
|
+
console.log(`[DooleService] postAPIcodeVerification(${path}) res: `, res);
|
|
432
|
+
return res;
|
|
433
|
+
}));
|
|
434
|
+
}
|
|
435
|
+
getAPIhealthCardTypes() {
|
|
436
|
+
let path = 'center/healthCardTypes';
|
|
437
|
+
const endpoint = this.api.getEndpoint(path);
|
|
438
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
439
|
+
console.log(`[DooleService] getAPIhealthCardTypes(${path}) res: `, res);
|
|
440
|
+
return res;
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
getAPIhealthCards() {
|
|
444
|
+
let path = 'user/healthcards';
|
|
445
|
+
const endpoint = this.api.getEndpoint(path);
|
|
446
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
447
|
+
console.log(`[DooleService] getAPhealthCards(${path}) res: `, res);
|
|
448
|
+
return res;
|
|
449
|
+
}));
|
|
450
|
+
}
|
|
451
|
+
getAPIhealthCardId(id) {
|
|
452
|
+
let path = `user/healthcard/${id}`;
|
|
453
|
+
const endpoint = this.api.getEndpoint(path);
|
|
454
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
455
|
+
console.log(`[DooleService] getAPIhealthCard(${path}) res: `, res);
|
|
456
|
+
return res;
|
|
457
|
+
}));
|
|
458
|
+
}
|
|
459
|
+
postAPIhealthCards(params) {
|
|
460
|
+
let path = 'user/healthcard';
|
|
461
|
+
const endpoint = this.api.getEndpoint(path);
|
|
462
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
463
|
+
console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
|
|
464
|
+
return res;
|
|
465
|
+
}));
|
|
466
|
+
}
|
|
467
|
+
putAPIhealthCard(params) {
|
|
468
|
+
let path = `user/healthcard/${params.id}`;
|
|
469
|
+
const endpoint = this.api.getEndpoint(path);
|
|
470
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
471
|
+
console.log(`[DooleService] putAPIhealthCard(${path}) res: `, res);
|
|
472
|
+
return res;
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
deleteAPIhealthCard(params) {
|
|
476
|
+
let path = `user/healthcard/${params.id}`;
|
|
477
|
+
const endpoint = this.api.getEndpoint(path);
|
|
478
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
479
|
+
console.log(`[DooleService] deleteAPIhealthCard(${path}) res: ${res}`, JSON.stringify(res));
|
|
480
|
+
return res;
|
|
481
|
+
}));
|
|
482
|
+
}
|
|
483
|
+
getAPISocialRelationType() {
|
|
484
|
+
let path = 'center/socialRelationType';
|
|
485
|
+
const endpoint = this.api.getEndpoint(path);
|
|
486
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
487
|
+
console.log(`[DooleService] getAPISocialRelationType(${path}) res: `, res);
|
|
488
|
+
return res;
|
|
489
|
+
}));
|
|
490
|
+
}
|
|
491
|
+
getAPIemergencyContact() {
|
|
492
|
+
let path = 'user/EmergencyContacts';
|
|
493
|
+
const endpoint = this.api.getEndpoint(path);
|
|
494
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
495
|
+
console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
|
|
496
|
+
return res;
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
getAPIemergencyContactID(id) {
|
|
500
|
+
let path = `user/EmergencyContact/${id}`;
|
|
501
|
+
const endpoint = this.api.getEndpoint(path);
|
|
502
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
503
|
+
console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
|
|
504
|
+
return res;
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
postAPIemergencyContact(params) {
|
|
508
|
+
let path = 'user/EmergencyContact';
|
|
509
|
+
const endpoint = this.api.getEndpoint(path);
|
|
510
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
511
|
+
console.log(`[DooleService] postAPIemergencyContact(${path}) res: `, res);
|
|
512
|
+
return res;
|
|
513
|
+
}));
|
|
514
|
+
}
|
|
515
|
+
putAPIemergencyContact(id, params) {
|
|
516
|
+
let path = `user/EmergencyContact/${id}`;
|
|
517
|
+
console.log('[DooleService] putAPIemergencyContact()', params);
|
|
518
|
+
const endpoint = this.api.getEndpoint(path);
|
|
519
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
520
|
+
console.log(`[DooleService] putAPIemergencyContact(${path}) res: `, res);
|
|
521
|
+
return res;
|
|
522
|
+
}));
|
|
523
|
+
}
|
|
524
|
+
deleteAPIemergencyContact(id) {
|
|
525
|
+
let path = `user/EmergencyContact/${id}`;
|
|
526
|
+
const endpoint = this.api.getEndpoint(path);
|
|
527
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
528
|
+
console.log(`[DooleService] deleteAPIemergencyContact(${path}) res: ${res}`, JSON.stringify(res));
|
|
529
|
+
return res;
|
|
530
|
+
}));
|
|
531
|
+
}
|
|
532
|
+
getAPIaboutUs() {
|
|
533
|
+
let path = 'center/about';
|
|
534
|
+
const endpoint = this.api.getEndpoint(path);
|
|
535
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
536
|
+
console.log(`[DooleService] getAPIaboutUs(${path}) res: `, res);
|
|
537
|
+
return res;
|
|
538
|
+
}));
|
|
539
|
+
}
|
|
540
|
+
getAPIappointmentAgenda() {
|
|
541
|
+
let path = 'user/agenda';
|
|
542
|
+
const endpoint = this.api.getEndpoint(path);
|
|
543
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
544
|
+
//console.log(`[DooleService] getAPIappointmentAgenda(${path}) res: `, res);
|
|
545
|
+
return res;
|
|
546
|
+
}));
|
|
547
|
+
}
|
|
548
|
+
//documents-Tracking
|
|
549
|
+
getAPIdiagnosticTests() {
|
|
550
|
+
let path = 'user/diagnosticTests';
|
|
551
|
+
const endpoint = this.api.getEndpoint(path);
|
|
552
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
553
|
+
//console.log(`[DooleService] getAPIdiagnosticTests(${path}) res: `, res);
|
|
554
|
+
return res;
|
|
555
|
+
}));
|
|
556
|
+
}
|
|
557
|
+
getAPIdiagnosticTestTypesAvailable() {
|
|
558
|
+
let path = 'diagnosticTestTypes/available';
|
|
559
|
+
const endpoint = this.api.getEndpoint(path);
|
|
560
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
561
|
+
console.log(`[DooleService] getAPIdiagnosticTestTypesAvailable(${path}) res: `, res);
|
|
562
|
+
return res;
|
|
563
|
+
}));
|
|
564
|
+
}
|
|
565
|
+
getAPIdiagnosticTestID(id) {
|
|
566
|
+
let path = 'v2/user/diagnosticTest/' + id;
|
|
567
|
+
const endpoint = this.api.getEndpoint(path);
|
|
568
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
569
|
+
console.log(`[DooleService] getAPIdiagnosticTestID(${path}) res: `, res);
|
|
570
|
+
return res;
|
|
571
|
+
}));
|
|
572
|
+
}
|
|
573
|
+
postAPIdiagnosticTest(params) {
|
|
574
|
+
let path = 'v2/user/diagnosticTests/';
|
|
575
|
+
const endpoint = this.api.getEndpoint(path);
|
|
576
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
577
|
+
console.log(`[DooleService] postAPIdiagnosticTest(${path}) res: `, res);
|
|
578
|
+
return res;
|
|
579
|
+
}));
|
|
580
|
+
}
|
|
581
|
+
putAPIdiagnosticTest(id, params) {
|
|
582
|
+
let path = `user/diagnosticTest/${id}`;
|
|
583
|
+
const endpoint = this.api.getEndpoint(path);
|
|
584
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
585
|
+
console.log(`[DooleService] putAPIdiagnosticTest(${path}) res: `, res);
|
|
586
|
+
return res;
|
|
587
|
+
}));
|
|
588
|
+
}
|
|
589
|
+
deleteAPIdiagnosticTest(id) {
|
|
590
|
+
let path = `user/diagnosticTest/${id}`;
|
|
591
|
+
const endpoint = this.api.getEndpoint(path);
|
|
592
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
593
|
+
console.log(`[DooleService] deleteAPIdiagnosticTest(${path}) res: ${res}`, JSON.stringify(res));
|
|
594
|
+
return res;
|
|
595
|
+
}));
|
|
596
|
+
}
|
|
597
|
+
getAPIfilteredDiagnosticTest(params) {
|
|
598
|
+
let path = 'user/diagnosticTests';
|
|
599
|
+
const endpoint = this.api.getEndpoint(path);
|
|
600
|
+
let httpParams = new HttpParams();
|
|
601
|
+
// Begin assigning parameters
|
|
602
|
+
if (params !== undefined) {
|
|
603
|
+
httpParams = (params.start_date) ? httpParams.append('from_date', params.start_date) : httpParams;
|
|
604
|
+
httpParams = (params.end_date) ? httpParams.append('to_date', params.end_date) : httpParams;
|
|
605
|
+
if (params.diagnosticTestTypes) {
|
|
606
|
+
params.diagnosticTestTypes.forEach(element => {
|
|
607
|
+
httpParams = httpParams.append('diagnostic_test_type_id[]', element);
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
612
|
+
console.log(`[DooleService] getAPIfilteredDiagnosticTest(${path}) res: `, res);
|
|
613
|
+
return res;
|
|
614
|
+
}));
|
|
615
|
+
}
|
|
616
|
+
//forms-Tracking
|
|
617
|
+
getAPIformLists() {
|
|
618
|
+
let path = 'forms/user';
|
|
619
|
+
const endpoint = this.api.getEndpoint(path);
|
|
620
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
621
|
+
console.log(`[DooleService] getAPIformLists(${path}) res: `, res);
|
|
622
|
+
return res;
|
|
623
|
+
}));
|
|
624
|
+
}
|
|
625
|
+
//graphics-Tracking
|
|
626
|
+
getAPIelementsList(filter) {
|
|
627
|
+
let path = 'user/elements'; /* 'user/elementsList/v2' */
|
|
628
|
+
let httpParams = new HttpParams();
|
|
629
|
+
httpParams = (filter?.only_with_values) ? httpParams.append('only_with_values', filter?.only_with_values) : httpParams;
|
|
630
|
+
httpParams = (filter?.grouped) ? httpParams.append('grouped', filter?.grouped) : httpParams;
|
|
631
|
+
httpParams = (filter?.filter) ? httpParams.append('filter', filter?.filter) : httpParams;
|
|
632
|
+
const endpoint = this.api.getEndpoint(path);
|
|
633
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
634
|
+
console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
|
|
635
|
+
return res;
|
|
636
|
+
}));
|
|
637
|
+
}
|
|
638
|
+
/** get elements with query by parameter date */
|
|
639
|
+
getAPIelementsListByDate(params) {
|
|
640
|
+
let path = 'user/elementsList/v2'; /* 'user/elementsList' */
|
|
641
|
+
let httpParams = new HttpParams();
|
|
642
|
+
if (params.filter == '1')
|
|
643
|
+
httpParams = httpParams.append('filter', '1');
|
|
644
|
+
const endpoint = this.api.getEndpoint(path);
|
|
645
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
646
|
+
//console.log(`[DooleService] getAPIelementsListByDate(${path}) res: `, res);
|
|
647
|
+
return res;
|
|
648
|
+
}));
|
|
649
|
+
}
|
|
650
|
+
postAPIaddElement(id, params) {
|
|
651
|
+
let path = 'user/element/' + id + '/value/add';
|
|
652
|
+
const endpoint = this.api.getEndpoint(path);
|
|
653
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
654
|
+
//console.log(`[DooleService] postAPIaddElement(${path}) res: `, res);
|
|
655
|
+
return res;
|
|
656
|
+
}));
|
|
657
|
+
}
|
|
658
|
+
getAPIgraphicsElement(id, query) {
|
|
659
|
+
let path = 'user/element/' + id;
|
|
660
|
+
let httpParams = new HttpParams();
|
|
661
|
+
httpParams = (query) ? httpParams.append('interval', query) : httpParams;
|
|
662
|
+
const endpoint = this.api.getEndpoint(path);
|
|
663
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
664
|
+
//console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
|
|
665
|
+
return res;
|
|
666
|
+
}));
|
|
667
|
+
}
|
|
668
|
+
getAPIelementID(id, params) {
|
|
669
|
+
let path = `v2/user/element/${id}`;
|
|
670
|
+
let httpParams = new HttpParams();
|
|
671
|
+
httpParams = (params?.interval) ? httpParams.append('interval', params?.interval) : httpParams;
|
|
672
|
+
httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
|
|
673
|
+
httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
|
|
674
|
+
httpParams = (params?.version) ? httpParams.append('version', params?.version) : httpParams;
|
|
675
|
+
const endpoint = this.api.getEndpoint(path);
|
|
676
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
677
|
+
//console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
|
|
678
|
+
return res;
|
|
679
|
+
}));
|
|
680
|
+
}
|
|
681
|
+
getAPIelementAvailableID(id) {
|
|
682
|
+
let path = `element/available/${id}`;
|
|
683
|
+
const endpoint = this.api.getEndpoint(path);
|
|
684
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
685
|
+
//console.log(`[DooleService] getAPIelementAvailableID(${path}) res: `, res);
|
|
686
|
+
return res;
|
|
687
|
+
}));
|
|
688
|
+
}
|
|
689
|
+
getAPIcategory() {
|
|
690
|
+
let path = 'user/element_category';
|
|
691
|
+
const endpoint = this.api.getEndpoint(path);
|
|
692
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
693
|
+
//console.log(`[DooleService] getAPIcategory(${path}) res: `, res);
|
|
694
|
+
return res;
|
|
695
|
+
}));
|
|
696
|
+
}
|
|
697
|
+
getAPIelementGroupID(id, filter) {
|
|
698
|
+
let path = `center/elementGroup/${id}/elements`;
|
|
699
|
+
let httpParams = new HttpParams();
|
|
700
|
+
httpParams = (filter) ? httpParams.append('filter', filter) : httpParams;
|
|
701
|
+
const endpoint = this.api.getEndpoint(path);
|
|
702
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
703
|
+
//console.log(`[DooleService] getAPIelementGroupID(${path}) res: `, res);
|
|
704
|
+
return res;
|
|
705
|
+
}));
|
|
706
|
+
}
|
|
707
|
+
searchAPIelementGroup(params) {
|
|
708
|
+
let path = 'center/elementGroups';
|
|
709
|
+
let httpParams = new HttpParams();
|
|
710
|
+
httpParams = (params?.filter) ? httpParams.append('filter', params?.filter) : httpParams;
|
|
711
|
+
const endpoint = this.api.getEndpoint(path);
|
|
712
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
713
|
+
//console.log(`[DooleService] getAPIelementGroup(${path}) res: `, res);
|
|
714
|
+
return res;
|
|
715
|
+
}));
|
|
716
|
+
}
|
|
717
|
+
/** get diets with query by parameter date */
|
|
718
|
+
getAPIlistDietsByDate(params) {
|
|
719
|
+
let path = 'user/diets';
|
|
720
|
+
const endpoint = this.api.getEndpoint(path);
|
|
721
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
722
|
+
//console.log(`[DooleService] getAPIlistDietsByDate(${path}) res: `, res);
|
|
723
|
+
return res;
|
|
724
|
+
}));
|
|
725
|
+
}
|
|
726
|
+
getAPIdietsByDate(params) {
|
|
727
|
+
let path = `user/dietaryIntakes`;
|
|
728
|
+
let httpParams = new HttpParams();
|
|
729
|
+
httpParams = (params?.date) ? httpParams.append('date', params.date) : httpParams;
|
|
730
|
+
httpParams = (params?.grouped_by_times) ? httpParams.append('grouped_by_times', params.grouped_by_times) : httpParams;
|
|
731
|
+
const endpoint = this.api.getEndpoint(path);
|
|
732
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
733
|
+
//console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
|
|
734
|
+
return res;
|
|
735
|
+
}));
|
|
736
|
+
}
|
|
737
|
+
getAPIdetailDiets(id) {
|
|
738
|
+
let path = `diet/${id}`;
|
|
739
|
+
const endpoint = this.api.getEndpoint(path);
|
|
740
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
741
|
+
//console.log(`[DooleService] getAPIdetailDiets(${path}) res: `, res);
|
|
742
|
+
return res;
|
|
743
|
+
}));
|
|
744
|
+
}
|
|
745
|
+
getAPIdetailRecipe(id) {
|
|
746
|
+
let path = `diet/receipt/${id}`;
|
|
747
|
+
const endpoint = this.api.getEndpoint(path);
|
|
748
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
749
|
+
//console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
|
|
750
|
+
return res;
|
|
751
|
+
}));
|
|
752
|
+
}
|
|
753
|
+
/** get advices **/
|
|
754
|
+
getAPIlistAdvices(params) {
|
|
755
|
+
let path = 'user/advices';
|
|
756
|
+
const endpoint = this.api.getEndpoint(path);
|
|
757
|
+
let httpParams = new HttpParams()
|
|
758
|
+
.set('tags', params.tags)
|
|
759
|
+
.set('interactions', params.interactions)
|
|
760
|
+
.set('readingTime', params.readingTime);
|
|
761
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
762
|
+
//console.log(`[DooleService] getAPIlistAdvices(${path}) res: `, res);
|
|
763
|
+
return res;
|
|
764
|
+
}));
|
|
765
|
+
}
|
|
766
|
+
/** get news **/
|
|
767
|
+
getAPIlistNews() {
|
|
768
|
+
let path = 'user/news';
|
|
769
|
+
const endpoint = this.api.getEndpoint(path);
|
|
770
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
771
|
+
//console.log(`[DooleService] getAPIlistNews(${path}) res: `, res);
|
|
772
|
+
return res;
|
|
773
|
+
}));
|
|
774
|
+
}
|
|
775
|
+
getAPIdetailNew(id) {
|
|
776
|
+
let path = `user/new/${id}`;
|
|
777
|
+
const endpoint = this.api.getEndpoint(path);
|
|
778
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
779
|
+
//console.log(`[DooleService] getAPIdetailNew(${path}) res: `, res);
|
|
780
|
+
return res;
|
|
781
|
+
}));
|
|
782
|
+
}
|
|
783
|
+
getAPISearchNews(query) {
|
|
784
|
+
let path = 'news';
|
|
785
|
+
let httpParams = new HttpParams();
|
|
786
|
+
httpParams = (query) ? httpParams.append('search', query) : httpParams;
|
|
787
|
+
const endpoint = this.api.getEndpoint(path);
|
|
788
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
789
|
+
//console.log(`[DooleService] getAPISearchNews(${path}) res: `, res);
|
|
790
|
+
return res;
|
|
791
|
+
}));
|
|
792
|
+
}
|
|
793
|
+
getAPIAppLatestVersion(version, platform) {
|
|
794
|
+
let path = 'app/versions/must-update?version=' + version + '&platform=' + platform;
|
|
795
|
+
console.log(path);
|
|
796
|
+
const endpoint = this.api.getEndpoint(path);
|
|
797
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
798
|
+
return res;
|
|
799
|
+
}));
|
|
800
|
+
}
|
|
801
|
+
getAPISearchAdvices(query) {
|
|
802
|
+
let path = 'advices';
|
|
803
|
+
let httpParams = new HttpParams();
|
|
804
|
+
httpParams = (query) ? httpParams.append('search', query) : httpParams;
|
|
805
|
+
const endpoint = this.api.getEndpoint(path);
|
|
806
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
807
|
+
//console.log(`[DooleService] getAPISearchAdvices(${path}) res: `, res);
|
|
808
|
+
return res;
|
|
809
|
+
}));
|
|
810
|
+
}
|
|
811
|
+
getAPIdetailAdvices(id) {
|
|
812
|
+
let path = `advice/${id}`;
|
|
813
|
+
const endpoint = this.api.getEndpoint(path);
|
|
814
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
815
|
+
//console.log(`[DooleService] getAPIdetailAdvices(${path}) res: `, res);
|
|
816
|
+
return res;
|
|
817
|
+
}));
|
|
818
|
+
}
|
|
819
|
+
getAPIdrugsList(query) {
|
|
820
|
+
let path = `drugIntake/list`;
|
|
821
|
+
let httpParams = new HttpParams();
|
|
822
|
+
httpParams = (query) ? httpParams.append('search', query) : httpParams;
|
|
823
|
+
const endpoint = this.api.getEndpoint(path);
|
|
824
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
825
|
+
//console.log(`[DooleService] getAPIdrugsList(${path}) res: `, res);
|
|
826
|
+
return res;
|
|
827
|
+
}));
|
|
828
|
+
}
|
|
829
|
+
getAPIdrugIntakeByDate(params) {
|
|
830
|
+
let path = 'user/drugIntake/date';
|
|
831
|
+
const endpoint = this.api.getEndpoint(path);
|
|
832
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
833
|
+
//console.log(`[DooleService] getAPIdrugIntakeByDate(${path}) res: `, res);
|
|
834
|
+
return res;
|
|
835
|
+
}));
|
|
836
|
+
}
|
|
837
|
+
// send medication list
|
|
838
|
+
getAPImedicationList(query) {
|
|
839
|
+
let path = `sendmedication/list`;
|
|
840
|
+
let httpParams = new HttpParams();
|
|
841
|
+
httpParams = (query) ? httpParams.append('search', query) : httpParams;
|
|
842
|
+
const endpoint = this.api.getEndpoint(path);
|
|
843
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
844
|
+
console.log(`[DooleService] getAPImedicationList(${path}) res: `, res);
|
|
845
|
+
return res;
|
|
846
|
+
}));
|
|
847
|
+
}
|
|
848
|
+
getAPIdirectionsList() {
|
|
849
|
+
let path = `user/addresses`;
|
|
850
|
+
// let httpParams = new HttpParams();
|
|
851
|
+
// httpParams = (query) ? httpParams.append('search', query) : httpParams
|
|
852
|
+
const endpoint = this.api.getEndpoint(path);
|
|
853
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
854
|
+
console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
|
|
855
|
+
return res;
|
|
856
|
+
}));
|
|
857
|
+
}
|
|
858
|
+
getAPImedicationsList() {
|
|
859
|
+
let path = `sendmedication/list`;
|
|
860
|
+
// let httpParams = new HttpParams();
|
|
861
|
+
// httpParams = (query) ? httpParams.append('search', query) : httpParams
|
|
862
|
+
const endpoint = this.api.getEndpoint(path);
|
|
863
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
864
|
+
console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
|
|
865
|
+
return res;
|
|
866
|
+
}));
|
|
867
|
+
}
|
|
868
|
+
postAPIsendDirection(params) {
|
|
869
|
+
let path = 'user/address';
|
|
870
|
+
const endpoint = this.api.getEndpoint(path);
|
|
871
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
872
|
+
console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
|
|
873
|
+
return res;
|
|
874
|
+
}));
|
|
875
|
+
}
|
|
876
|
+
putAPIsendDirection(id, params) {
|
|
877
|
+
let path = `user/address/${id}`;
|
|
878
|
+
const endpoint = this.api.getEndpoint(path);
|
|
879
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
880
|
+
//console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
|
|
881
|
+
return res;
|
|
882
|
+
}));
|
|
883
|
+
}
|
|
884
|
+
deleteAPIsendDirection(id) {
|
|
885
|
+
let path = `user/address/${id}`;
|
|
886
|
+
const endpoint = this.api.getEndpoint(path);
|
|
887
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
888
|
+
//console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
|
|
889
|
+
return res;
|
|
890
|
+
}));
|
|
891
|
+
}
|
|
892
|
+
postAPImedicationSendPetition(params) {
|
|
893
|
+
let path = 'sendmedication';
|
|
894
|
+
const endpoint = this.api.getEndpoint(path);
|
|
895
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
896
|
+
console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
|
|
897
|
+
return res;
|
|
898
|
+
}));
|
|
899
|
+
}
|
|
900
|
+
postAPIdrugIntake(params) {
|
|
901
|
+
let path = 'user/drugIntake';
|
|
902
|
+
const endpoint = this.api.getEndpoint(path);
|
|
903
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
904
|
+
//console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
|
|
905
|
+
return res;
|
|
906
|
+
}));
|
|
907
|
+
}
|
|
908
|
+
postAPIchangeStatedrugIntake(id, state) {
|
|
909
|
+
let path = `user/drugIntake/${id}/set/${state}`;
|
|
910
|
+
const endpoint = this.api.getEndpoint(path);
|
|
911
|
+
return this.http.post(endpoint).pipe(map((res) => {
|
|
912
|
+
//console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
|
|
913
|
+
return res;
|
|
914
|
+
}));
|
|
915
|
+
}
|
|
916
|
+
postAPImedicationPlan(params) {
|
|
917
|
+
let path = `user/medicationPlan`;
|
|
918
|
+
const endpoint = this.api.getEndpoint(path);
|
|
919
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
920
|
+
//console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
|
|
921
|
+
return res;
|
|
922
|
+
}));
|
|
923
|
+
}
|
|
924
|
+
putAPImedicationPlan(id, params) {
|
|
925
|
+
let path = `user/medicationPlan/${id}`;
|
|
926
|
+
const endpoint = this.api.getEndpoint(path);
|
|
927
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
928
|
+
//console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
|
|
929
|
+
return res;
|
|
930
|
+
}));
|
|
931
|
+
}
|
|
932
|
+
deleteAPImedicationPlan(id) {
|
|
933
|
+
let path = `user/medicationPlan/${id}`;
|
|
934
|
+
const endpoint = this.api.getEndpoint(path);
|
|
935
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
936
|
+
//console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
|
|
937
|
+
return res;
|
|
938
|
+
}));
|
|
939
|
+
}
|
|
940
|
+
getAPImedicationPlan(id) {
|
|
941
|
+
let path = `user/medicationPlan/${id}`;
|
|
942
|
+
const endpoint = this.api.getEndpoint(path);
|
|
943
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
944
|
+
//console.log(`[DooleService] getAPImedicationPlan(${path}) res: `, res);
|
|
945
|
+
return res;
|
|
946
|
+
}));
|
|
947
|
+
}
|
|
948
|
+
getAPIgames() {
|
|
949
|
+
let path = 'user/games';
|
|
950
|
+
const endpoint = this.api.getEndpoint(path);
|
|
951
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
952
|
+
//console.log(`[DooleService] getAPIgames(${path}) res: `, res);
|
|
953
|
+
return res;
|
|
954
|
+
}));
|
|
955
|
+
}
|
|
956
|
+
/** get games with query by parameter date */
|
|
957
|
+
getAPIgamesByDate(from_date, to_date) {
|
|
958
|
+
let path = 'user/gamePlays/scheduled';
|
|
959
|
+
let httpParams = new HttpParams();
|
|
960
|
+
httpParams = (from_date) ? httpParams.append('from_date', from_date) : httpParams;
|
|
961
|
+
httpParams = (to_date) ? httpParams.append('to_date', to_date) : httpParams;
|
|
962
|
+
const endpoint = this.api.getEndpoint(path);
|
|
963
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
964
|
+
//console.log(`[DooleService] getAPIgames(${path}) res: `, res);
|
|
965
|
+
return res;
|
|
966
|
+
}));
|
|
967
|
+
}
|
|
968
|
+
getAPIgameId(id) {
|
|
969
|
+
let path = `user/game/${id}`;
|
|
970
|
+
const endpoint = this.api.getEndpoint(path);
|
|
971
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
972
|
+
//console.log(`[DooleService] getAPIgameId(${path}) res: `, res);
|
|
973
|
+
return res;
|
|
974
|
+
}));
|
|
975
|
+
}
|
|
976
|
+
getAPIagenda() {
|
|
977
|
+
let path = 'user/agenda';
|
|
978
|
+
const endpoint = this.api.getEndpoint(path);
|
|
979
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
980
|
+
//console.log(`[DooleService] getAPIagenda(${path}) res: `, res);
|
|
981
|
+
return res;
|
|
982
|
+
}));
|
|
983
|
+
}
|
|
984
|
+
getAPIallAgenda(params) {
|
|
985
|
+
let path = 'user/agenda/v2';
|
|
986
|
+
let httpParams = new HttpParams();
|
|
987
|
+
httpParams = params?.from_date ? httpParams.append('from_date', params?.from_date) : httpParams;
|
|
988
|
+
httpParams = params?.to_date ? httpParams.append('to_date', params?.to_date) : httpParams;
|
|
989
|
+
httpParams = params?.filter_by_date ? httpParams.append('filter_by_date', params?.filter_by_date) : httpParams;
|
|
990
|
+
httpParams = (params?.with_medical_procedures != undefined) ? httpParams.append('with_medical_procedures', params?.with_medical_procedures) : httpParams;
|
|
991
|
+
httpParams = (params?.order != undefined) ? httpParams.append('order', params?.order) : httpParams;
|
|
992
|
+
const endpoint = this.api.getEndpoint(path);
|
|
993
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
994
|
+
console.log(`[DooleService] getAPIappointmentAgendaV2(${path}) res: `, res);
|
|
995
|
+
return res;
|
|
996
|
+
}));
|
|
997
|
+
}
|
|
998
|
+
getAPIagendaID(id) {
|
|
999
|
+
let path = `user/agenda/${id}`;
|
|
1000
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1001
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1002
|
+
//console.log(`[DooleService] getAPIagendaID(${path}) res: `, res);
|
|
1003
|
+
return res;
|
|
1004
|
+
}));
|
|
1005
|
+
}
|
|
1006
|
+
postAPIaddAgenda(params) {
|
|
1007
|
+
let path = 'user/agenda/';
|
|
1008
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1009
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1010
|
+
//console.log(`[DooleService] postAPIaddAgenda(${path}) res: `, res);
|
|
1011
|
+
return res;
|
|
1012
|
+
}));
|
|
1013
|
+
}
|
|
1014
|
+
deleteAPIaddAgenda(id) {
|
|
1015
|
+
let params = { agenda: id };
|
|
1016
|
+
let path = 'user/agenda/delete';
|
|
1017
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1018
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1019
|
+
//console.log(`[DooleService] deleteAPIaddAgenda(${path}) res: `, res);
|
|
1020
|
+
return res;
|
|
1021
|
+
}));
|
|
1022
|
+
}
|
|
1023
|
+
putAPIagenda(id, params) {
|
|
1024
|
+
let path = `user/agenda/${id}`;
|
|
1025
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1026
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
1027
|
+
//console.log(`[DooleService] putAPIagenda(${path}) res: `, res);
|
|
1028
|
+
return res;
|
|
1029
|
+
}));
|
|
1030
|
+
}
|
|
1031
|
+
getAPIallowedContacts() {
|
|
1032
|
+
let path = `user/allowedContacts`;
|
|
1033
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1034
|
+
let httpParams = new HttpParams();
|
|
1035
|
+
httpParams = httpParams.append('withDepartments', '1');
|
|
1036
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
1037
|
+
console.log(`[DooleService] getAPIallowedContacts(${path}) res: `, res);
|
|
1038
|
+
let allowed = res.allowed;
|
|
1039
|
+
if (res.allowed === undefined)
|
|
1040
|
+
allowed = [];
|
|
1041
|
+
return allowed;
|
|
1042
|
+
}));
|
|
1043
|
+
}
|
|
1044
|
+
getAPIstaffId(id) {
|
|
1045
|
+
let path = `staff/${id}`;
|
|
1046
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1047
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1048
|
+
//console.log(`[DooleService] getAPIstaffId(${path}) res: `, res);
|
|
1049
|
+
return res;
|
|
1050
|
+
}));
|
|
1051
|
+
}
|
|
1052
|
+
/** get games with query by parameter date */
|
|
1053
|
+
getAPIUserMessages() {
|
|
1054
|
+
let path = 'message/user';
|
|
1055
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1056
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1057
|
+
console.log(`[DooleService] getAPIUserMessages(${path}) res: `, res);
|
|
1058
|
+
if (res.length == 0)
|
|
1059
|
+
return res;
|
|
1060
|
+
return res.messages;
|
|
1061
|
+
}));
|
|
1062
|
+
}
|
|
1063
|
+
// get the company details, a subset of the user data
|
|
1064
|
+
getUserSubsetData() {
|
|
1065
|
+
let path = 'message/user';
|
|
1066
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1067
|
+
const dataObservable = this.http.get(endpoint);
|
|
1068
|
+
return dataObservable.pipe(map((jsonResponse) => {
|
|
1069
|
+
const filteredData = {
|
|
1070
|
+
...jsonResponse.messages
|
|
1071
|
+
};
|
|
1072
|
+
return filteredData;
|
|
1073
|
+
}));
|
|
1074
|
+
}
|
|
1075
|
+
/** Reminders */
|
|
1076
|
+
getAPIreminders() {
|
|
1077
|
+
let path = 'user/reminder';
|
|
1078
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1079
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1080
|
+
//console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
|
|
1081
|
+
return res;
|
|
1082
|
+
}));
|
|
1083
|
+
}
|
|
1084
|
+
getAPIreminderID(id) {
|
|
1085
|
+
let path = `user/reminder/${id}`;
|
|
1086
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1087
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1088
|
+
//console.log(`[DooleService] getAPIreminderID(${path}) res: `, res);
|
|
1089
|
+
return res;
|
|
1090
|
+
}));
|
|
1091
|
+
}
|
|
1092
|
+
postAPIaddReminder(params) {
|
|
1093
|
+
let path = 'user/reminder/';
|
|
1094
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1095
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1096
|
+
//console.log(`[DooleService] postAPIaddReminder(${path}) res: `, res);
|
|
1097
|
+
return res;
|
|
1098
|
+
}));
|
|
1099
|
+
}
|
|
1100
|
+
deleteAPIReminder(id) {
|
|
1101
|
+
let path = `user/reminder/${id}`;
|
|
1102
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1103
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
1104
|
+
//console.log(`[DooleService] deleteAPIReminder(${path}) res: ${res}`, JSON.stringify(res));
|
|
1105
|
+
return res;
|
|
1106
|
+
}));
|
|
1107
|
+
}
|
|
1108
|
+
updateAPIReminder(id, params) {
|
|
1109
|
+
let path = `user/reminder/${id}`;
|
|
1110
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1111
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
1112
|
+
//console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
|
|
1113
|
+
return res;
|
|
1114
|
+
}));
|
|
1115
|
+
}
|
|
1116
|
+
updateAPIuser(params) {
|
|
1117
|
+
let path = `user`;
|
|
1118
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1119
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
1120
|
+
//console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
|
|
1121
|
+
return res;
|
|
1122
|
+
}));
|
|
1123
|
+
}
|
|
1124
|
+
updateAPIImageuser(params) {
|
|
1125
|
+
let path = `user/image`;
|
|
1126
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1127
|
+
return this.http.put(endpoint, params).pipe(map((res) => {
|
|
1128
|
+
//console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
|
|
1129
|
+
return res;
|
|
1130
|
+
}));
|
|
1131
|
+
}
|
|
1132
|
+
deleteAPIImageuser() {
|
|
1133
|
+
let path = `user/image`;
|
|
1134
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1135
|
+
return this.http.delete(endpoint).pipe(map((res) => {
|
|
1136
|
+
//console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
|
|
1137
|
+
return res;
|
|
1138
|
+
}));
|
|
1139
|
+
}
|
|
1140
|
+
postAPIContentStatus(params) {
|
|
1141
|
+
let path = 'content/status';
|
|
1142
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1143
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1144
|
+
//console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
|
|
1145
|
+
return res;
|
|
1146
|
+
}));
|
|
1147
|
+
}
|
|
1148
|
+
getAPIpatients() {
|
|
1149
|
+
let path = 'user/patients';
|
|
1150
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1151
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1152
|
+
//console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
|
|
1153
|
+
return res;
|
|
1154
|
+
}));
|
|
1155
|
+
}
|
|
1156
|
+
getAPILevelInfo(challengeId, levelId, params) {
|
|
1157
|
+
let path = 'user/challenge/' + challengeId + '/level/' + levelId + '/goals';
|
|
1158
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1159
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1160
|
+
console.log(`[DooleService] getAPILevelInfo(${path}) res: `, res);
|
|
1161
|
+
return res;
|
|
1162
|
+
}));
|
|
1163
|
+
}
|
|
1164
|
+
getAPIChallenge(challengeId, params) {
|
|
1165
|
+
let path = 'user/challenge/' + challengeId;
|
|
1166
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1167
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1168
|
+
console.log(`[DooleService] getAPIChallenge(${path}) res: `, res);
|
|
1169
|
+
return res;
|
|
1170
|
+
}));
|
|
1171
|
+
}
|
|
1172
|
+
getAPIChallenges(params) {
|
|
1173
|
+
let path = 'user/challenges';
|
|
1174
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1175
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1176
|
+
console.log(`[DooleService] getAPIChallenges(${path}) res: `, res);
|
|
1177
|
+
return res;
|
|
1178
|
+
}));
|
|
1179
|
+
}
|
|
1180
|
+
getAPImessage(id, params) {
|
|
1181
|
+
let path = 'user/message/' + id;
|
|
1182
|
+
let httpParams = new HttpParams();
|
|
1183
|
+
httpParams = params?.page ? httpParams.append('page', params?.page) : httpParams;
|
|
1184
|
+
httpParams = params?.user ? httpParams.append('user', params?.user) : httpParams;
|
|
1185
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1186
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
1187
|
+
//console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
|
|
1188
|
+
return res;
|
|
1189
|
+
}));
|
|
1190
|
+
}
|
|
1191
|
+
getAPIFormJSON(form, params) {
|
|
1192
|
+
let path = `form/${form}/formFields`;
|
|
1193
|
+
let httpParams = new HttpParams();
|
|
1194
|
+
httpParams = (params?.formAnswer) ? httpParams.append('formAnswer', params?.formAnswer) : httpParams;
|
|
1195
|
+
httpParams = (params?.game_play_id) ? httpParams.append('game_play_id', params?.game_play_id) : httpParams;
|
|
1196
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1197
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
1198
|
+
//console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
|
|
1199
|
+
return res;
|
|
1200
|
+
}));
|
|
1201
|
+
}
|
|
1202
|
+
postAPIFormJSON(form, params) {
|
|
1203
|
+
let path = `formfield/conditional/${form}/field/${params.formField}`;
|
|
1204
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1205
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1206
|
+
//console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
|
|
1207
|
+
return res;
|
|
1208
|
+
}));
|
|
1209
|
+
}
|
|
1210
|
+
postAPIFormFill(params) {
|
|
1211
|
+
let path = `form/fill/`;
|
|
1212
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1213
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1214
|
+
//console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
|
|
1215
|
+
return res;
|
|
1216
|
+
}));
|
|
1217
|
+
}
|
|
1218
|
+
getAPINotificationsCount() {
|
|
1219
|
+
let path = 'user/notifications/count';
|
|
1220
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1221
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1222
|
+
//console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
|
|
1223
|
+
return res;
|
|
1224
|
+
}));
|
|
1225
|
+
}
|
|
1226
|
+
getAPINotifications(params) {
|
|
1227
|
+
let path = 'user/notifications';
|
|
1228
|
+
let httpParams = new HttpParams();
|
|
1229
|
+
httpParams = (params?.read) ? httpParams.append('read', params?.read) : httpParams;
|
|
1230
|
+
httpParams = (params?.withPaginate == 1) ? httpParams.append('withPaginate', params?.withPaginate) : httpParams;
|
|
1231
|
+
httpParams = (params?.page > 0) ? httpParams.append('page', params?.page) : httpParams;
|
|
1232
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1233
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
1234
|
+
//console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
|
|
1235
|
+
return res;
|
|
1236
|
+
}));
|
|
1237
|
+
}
|
|
1238
|
+
postAPINotificationRead(id) {
|
|
1239
|
+
let path = `user/notification/read`;
|
|
1240
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1241
|
+
return this.http.post(endpoint, id).pipe(map((res) => {
|
|
1242
|
+
return res;
|
|
1243
|
+
}));
|
|
1244
|
+
}
|
|
1245
|
+
get(endpt) {
|
|
1246
|
+
const endpoint = this.api.getEndpoint(endpt);
|
|
1247
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1248
|
+
return res;
|
|
1249
|
+
}));
|
|
1250
|
+
}
|
|
1251
|
+
post(endpt, items) {
|
|
1252
|
+
const endpoint = this.api.getEndpoint(endpt);
|
|
1253
|
+
return this.http.post(endpoint, items).pipe(map((res) => {
|
|
1254
|
+
return res;
|
|
1255
|
+
}));
|
|
1256
|
+
}
|
|
1257
|
+
setPushNotification(pushNotification) {
|
|
1258
|
+
this.pushNotification = pushNotification;
|
|
1259
|
+
}
|
|
1260
|
+
getPushNotification() {
|
|
1261
|
+
return this.pushNotification;
|
|
1262
|
+
}
|
|
1263
|
+
getAPIUserImage() {
|
|
1264
|
+
let path = 'user/image';
|
|
1265
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1266
|
+
return this.http.get(endpoint).pipe(map((res) => {
|
|
1267
|
+
//console.log(`[DooleService] getAPIgames(${path}) res: `, res);
|
|
1268
|
+
return res;
|
|
1269
|
+
}));
|
|
1270
|
+
}
|
|
1271
|
+
getAPIFormsByDate(params) {
|
|
1272
|
+
let path = `rehabilify/sharedcareplan/forms`;
|
|
1273
|
+
let httpParams = new HttpParams();
|
|
1274
|
+
httpParams = (params?.date) ? httpParams.append('date', params.date) : httpParams;
|
|
1275
|
+
httpParams = (params?.grouped_by_times) ? httpParams.append('grouped_by_times', params.grouped_by_times) : httpParams;
|
|
1276
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1277
|
+
return this.http.get(endpoint, httpParams).pipe(map((res) => {
|
|
1278
|
+
//console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
|
|
1279
|
+
return res;
|
|
1280
|
+
}));
|
|
1281
|
+
}
|
|
1282
|
+
postAPImedicalProcedures(params) {
|
|
1283
|
+
let path = `user/medicalProcedures`;
|
|
1284
|
+
const endpoint = this.api.getEndpoint(path);
|
|
1285
|
+
return this.http.post(endpoint, params).pipe(map((res) => {
|
|
1286
|
+
//console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
|
|
1287
|
+
return res;
|
|
1288
|
+
}));
|
|
1289
|
+
}
|
|
1290
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DooleService, deps: [{ token: i1.AuthenticationService }, { token: i2.FileTransfer }, { token: i3.File }, { token: i4.HttpService }, { token: i5.ApiEndpointsService }, { token: i6.Events }, { token: i7.Platform }, { token: i8.Router }, { token: i7.AlertController }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1291
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DooleService, providedIn: 'root' }); }
|
|
1292
|
+
}
|
|
1293
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DooleService, decorators: [{
|
|
1294
|
+
type: Injectable,
|
|
1295
|
+
args: [{
|
|
1296
|
+
providedIn: 'root'
|
|
1297
|
+
}]
|
|
1298
|
+
}], ctorParameters: () => [{ type: i1.AuthenticationService }, { type: i2.FileTransfer }, { type: i3.File }, { type: i4.HttpService }, { type: i5.ApiEndpointsService }, { type: i6.Events }, { type: i7.Platform }, { type: i8.Router }, { type: i7.AlertController }] });
|
|
1299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9vbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZpY2UtbGliL3NyYy9saWIvc2VydmljZXMvZG9vbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzNDLE9BQU8sRUFBRSxVQUFVLEVBQWdDLE1BQU0sTUFBTSxDQUFDO0FBR2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQTZCLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRzFFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7OztBQVEvRCxNQUFNLE9BQU8sWUFBWTtJQUV2QixZQUNVLFdBQWtDLEVBQ2xDLFFBQXNCLEVBQ3RCLElBQVUsRUFDVixJQUFpQixFQUNqQixHQUF3QixFQUN6QixNQUFjLEVBQ2IsUUFBa0IsRUFDbkIsTUFBYyxFQUNkLGVBQWdDO1FBUi9CLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ3RCLFNBQUksR0FBSixJQUFJLENBQU07UUFDVixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFFBQUcsR0FBSCxHQUFHLENBQXFCO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDYixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7SUFBSSxDQUFDO0lBRzlDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsRUFBVztRQUVuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVD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Q2Ysc0VBQXNFO1lBQ3RFLE9BQU8sR0FBRyxDQUFDO1FBRWIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7K0dBNXFEVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbGVUcmFuc2ZlciwgRmlsZVVwbG9hZE9wdGlvbnMsIEZpbGVUcmFuc2Zlck9iamVjdCB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9maWxlLXRyYW5zZmVyL25neCc7XG5pbXBvcnQgeyBBcGlFbmRwb2ludHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXBpLWVuZHBvaW50cy5zZXJ2aWNlJ1xuaW1wb3J0IHsgRXZlbnRzIH0gZnJvbSAnLi9ldmVudHMuc2VydmljZSc7XG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4vaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBGaWxlIH0gZnJvbSAnQGF3ZXNvbWUtY29yZG92YS1wbHVnaW5zL2ZpbGUvbmd4JztcbmltcG9ydCB7IENhcGFjaXRvciB9IGZyb20gJ0BjYXBhY2l0b3IvY29yZSc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSGVhbHRoQ2FyZCB9IGZyb20gJy4uL21vZGVscy91c2VyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB9IGZyb20gJy4uL3V0aWwvcXVlcnktc3RyaW5nLXBhcmFtZXRlcnMnO1xuaW1wb3J0IHsgU2hlbGxDaGF0TW9kZWwsIFNoZWxsTWVzc2FnZU1vZGVsLCBTaGVsbFJlY2lwaWVudE1vZGVsIH0gZnJvbSAnLi4vdXRpbC9jaGF0UGFyYW1ldGVycyc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJ1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEb29sZVNlcnZpY2Uge1xuICBwdXNoTm90aWZpY2F0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zZmVyOiBGaWxlVHJhbnNmZXIsXG4gICAgcHJpdmF0ZSBmaWxlOiBGaWxlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcGk6IEFwaUVuZHBvaW50c1NlcnZpY2UsXG4gICAgcHVibGljIGV2ZW50czogRXZlbnRzLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIpIHsgfVxuICBwdWJsaWMgc2VsZWN0ZWREYXRlOiBEYXRlO1xuXG4gIHVwbG9hZEZpbGUoaW1hZ2U6IHN0cmluZywgaWQ/OiBzdHJpbmcpIHtcblxuICAgIGNvbnNvbGUubG9nKFwidXBsb2FkaW5nIFwiLCBpbWFnZSk7XG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICBsZXQgb3B0aW9uczogRmlsZVVwbG9hZE9wdGlvbnMgPSB7XG4gICAgICBmaWxlS2V5OiAnZmlsZScsXG4gICAgICBmaWxlTmFtZTogJ25hbWUuanBnJyxcblxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIHRva2VuLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBpZDogaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaWxlVHJhbnNmZXI6IEZpbGVUcmFuc2Zlck9iamVjdCA9IHRoaXMudHJhbnNmZXIuY3JlYXRlKCk7XG4gICAgLy8gQWRkIGZpbGVzIGZvciBuZXcgb3Igc2F2ZWQgZGlhZ25vc3RpY3MuXG4gICAgLy8gdXNlcyBkaWFnbm9zdGljL21lZGlhIHdoZW4gZGlhZ25vc3RpYyBpcyBuZXdcbiAgICAvL2NvbnN0IGVuZHBvaW50ID0gaWQgPyB0aGlzLmFwaS5nZXRFbmRwb2ludCgnZGlhZ25vc3RpYy9tZWRpYScpOnRoaXMuYXBpLmdldERvb2xlRW5kcG9pbnQoJ21lZGlhL3VwbG9hZC90ZW1wJykgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQoJ21lZGlhL3VwbG9hZC90ZW1wJyk7XG4gICAgLy9jb25zb2xlLmxvZyhcIiogdXBsb2FkRmlsZSBlbmRwb2ludFwiLCBlbmRwb2ludCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZmlsZVRyYW5zZmVyLnVwbG9hZChpbWFnZSwgZW5kcG9pbnQsIG9wdGlvbnMpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoZGF0YS5yZXNwb25zZSkpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pXG4gICAgfSlcblxuICB9XG5cblxuXG4gIHBvc3RBUElBZGRNZWRpYShwYXJhbXM6IE9iamVjdCl7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVkaWEvYWRkJyk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3RGb3JtKGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJQWRkTWVkaWEoJHtlbmRwb2ludH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwbG9hZEZpbGVUb01vZGVsKGltYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcGFyYW1zOiBhbnkpIHtcbiAgICAvL2NvbnNvbGUubG9nKFwidXBsb2FkaW5nIFwiLCBpbWFnZSk7XG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcbiAgICBsZXQgb3B0aW9uczogRmlsZVVwbG9hZE9wdGlvbnMgPSB7XG4gICAgICBmaWxlS2V5OiAnZmlsZScsXG4gICAgICBmaWxlTmFtZTogbmFtZSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0b2tlbixcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBwYXJhbXNcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlVHJhbnNmZXI6IEZpbGVUcmFuc2Zlck9iamVjdCA9IHRoaXMudHJhbnNmZXIuY3JlYXRlKCk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVkaWEvYWRkJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZpbGVUcmFuc2Zlci51cGxvYWQoaW1hZ2UsIGVuZHBvaW50LCBvcHRpb25zKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KVxuICAgIH0pXG5cbiAgfVxuXG4gIHVwbG9hZE1lc3NhZ2VJbWFnZShpZE1lc3NhZ2VIZWFkZXIsIGlkVXNlclRvLCBtZXNzYWdlLCBmaWxlVXJsLCBpZF91c3VhcmlfYW1pcSkge1xuXG4gICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndG9rZW4nKTtcblxuICAgIGxldCBvcHRpb25zOiBGaWxlVXBsb2FkT3B0aW9ucyA9IHtcbiAgICAgIGZpbGVLZXk6ICdmaWxlJyxcbiAgICAgIGZpbGVOYW1lOiAnbmFtZS5wZGYnLCAvL1RPRE86ICduYW1lLmpwZydcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiAnQmVhcmVyICcgKyB0b2tlbixcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgaWRVc2VyOiBpZF91c3VhcmlfYW1pcSxcbiAgICAgICAgc2VjcmV0OiB0b2tlbixcbiAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgIGlkOiBpZE1lc3NhZ2VIZWFkZXJcbiAgICAgIH1cbiAgICB9XG4gICAgLy9jb25zb2xlLmxvZyhcIm9wdGlvbnM6IFwiLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IGZpbGVUcmFuc2ZlcjogRmlsZVRyYW5zZmVyT2JqZWN0ID0gdGhpcy50cmFuc2Zlci5jcmVhdGUoKTtcblxuICAgIGZpbGVUcmFuc2Zlci5vblByb2dyZXNzKChwcm9ncmVzc0V2ZW50KSA9PiB7XG4gICAgICBpZiAocHJvZ3Jlc3NFdmVudC5sZW5ndGhDb21wdXRhYmxlKSB7XG4gICAgICAgIHZhciBwZXJjID0gTWF0aC5mbG9vcihwcm9ncmVzc0V2ZW50LmxvYWRlZCAvIHByb2dyZXNzRXZlbnQudG90YWwgKiAxMDApO1xuICAgICAgICB0aGlzLmV2ZW50cy5wdWJsaXNoKFwidXBsb2FkTWVzc2FnZUltYWdlXCIsIHsgZmlsZVVybCwgcGVyYyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJwcm9ncmVzc0V2ZW50IC0gXCIsIHByb2dyZXNzRXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVzc2FnZScpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZpbGVUcmFuc2Zlci51cGxvYWQoZmlsZVVybCwgZW5kcG9pbnQsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJzdWNjZXNzIGZpbGVUcmFuc2Zlci51cGxvYWRcIiwgSlNPTi5wYXJzZShkYXRhLnJlc3BvbnNlKSk7XG4gICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCIqKiBlcnJvciAqKiBmaWxlVHJhbnNmZXIudXBsb2FkOiBcIiwgZXJyKTtcbiAgICAgICAgICByZWplY3QoZmlsZVRyYW5zZmVyLnVwbG9hZCk7XG4gICAgICAgIH0pXG4gICAgfSlcblxuICB9XG5cbiAgYjY0dG9CbG9iKGI2NERhdGEsIGNvbnRlbnRUeXBlID0gJycsIHNsaWNlU2l6ZSA9IDUxMikge1xuICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgICBjb25zdCBieXRlQXJyYXlzID0gW107XG5cbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IG9mZnNldCArPSBzbGljZVNpemUpIHtcbiAgICAgIGNvbnN0IHNsaWNlID0gYnl0ZUNoYXJhY3RlcnMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzbGljZVNpemUpO1xuXG4gICAgICBjb25zdCBieXRlTnVtYmVycyA9IG5ldyBBcnJheShzbGljZS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGljZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTtcbiAgICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihieXRlQXJyYXlzLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuICAgIHJldHVybiBibG9iO1xuICB9XG5cbiAgZG93bmxvYWRGaWxlKHVybCwgZGVzdGluYXRpb24pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IFtdO1xuICAgIGNvbnN0IGZpbGVUcmFuc2ZlcjogRmlsZVRyYW5zZmVyT2JqZWN0ID0gdGhpcy50cmFuc2Zlci5jcmVhdGUoKTtcbiAgICB2YXIgcGF0aCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pcygnaW9zJykpIHtcbiAgICAgIHBhdGggPSB0aGlzLmZpbGUuZG9jdW1lbnRzRGlyZWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoID0gdGhpcy5maWxlLmRhdGFEaXJlY3Rvcnk7XG4gICAgfVxuXG4gICAgLy9jb25zb2xlLmxvZyhcImRvd25sb2FkRmlsZVwiLCB1cmwsIGRlc3RpbmF0aW9uLCAncGF0aCxkZXN0aW5hdGlvbicsIHBhdGgsIGRlc3RpbmF0aW9uKTtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIENoZWNrRmlsZVwiLCB0aGlzLmZpbGUpO1xuICAgICAgdGhpcy5maWxlLmNoZWNrRmlsZShwYXRoLCBkZXN0aW5hdGlvbikudGhlbihyZXMgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiKnJlcypcIiwgcmVzKTtcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJleGlzdHNcIiwgcmVzKTtcbiAgICAgICAgICByZXN1bHRbXCJzdWNjZXNzXCJdID0gdHJ1ZTtcbiAgICAgICAgICByZXN1bHRbXCJkb3dubG9hZGVkXCJdID0gdHJ1ZTtcbiAgICAgICAgICByZXN1bHRbXCJmaWxlXCJdID0gcGF0aCArIGRlc3RpbmF0aW9uOy8vbm9ybWFsaXplVVJMKHRoaXMuZmlsZS5jYWNoZURpcmVjdG9yeSArIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgICByZXN1bHRbXCJmaWxlTm9ybWFsaXplZFwiXSA9IENhcGFjaXRvci5jb252ZXJ0RmlsZVNyYyhwYXRoICsgZGVzdGluYXRpb24pO1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIm5vdCBleGlzdHNcIik7XG4gICAgICAgIGZpbGVUcmFuc2Zlci5vblByb2dyZXNzKGV2ZW50ID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGVzY2FycmVndWVtXG4gICAgICAgICAgaWYgKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpO1xuICAgICAgICAgICAgcmVzdWx0W1wic3RhdHVzXCJdID0gXCJkb3dubG9hZGluZ1wiO1xuICAgICAgICAgICAgcmVzdWx0W1wiZG93bmxvYWRlZFwiXSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0W1wicGVyY2VudFwiXSA9IE1hdGgucm91bmQoKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKSAqIDEwMCk7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIubmV4dChyZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZpbGVUcmFuc2Zlci5kb3dubG9hZCh1cmwsIHBhdGggKyBkZXN0aW5hdGlvbikudGhlbigoZW50cnkpID0+IHtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKCcqZG93bmxvYWQ6KiAnICsgdXJsICsgXCIgXCIgKyBlbnRyeS50b1VSTCgpKTtcbiAgICAgICAgICByZXN1bHRbXCJzdWNjZXNzXCJdID0gdHJ1ZTtcbiAgICAgICAgICByZXN1bHRbXCJkb3dubG9hZGVkXCJdID0gdHJ1ZTtcbiAgICAgICAgICByZXN1bHRbXCJmaWxlXCJdID0gZW50cnkudG9VUkwoKTsvL25vcm1hbGl6ZVVSTCh0aGlzLmZpbGUuY2FjaGVEaXJlY3RvcnkgKyBkZXN0aW5hdGlvbik7XG4gICAgICAgICAgcmVzdWx0W1wiZmlsZU5vcm1hbGl6ZWRcIl0gPSBDYXBhY2l0b3IuY29udmVydEZpbGVTcmMocGF0aCArIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIubmV4dChyZXN1bHQpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAvL2NvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICByZXN1bHRbXCJzdWNjZXNzXCJdID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0W1wiZG93bmxvYWRlZFwiXSA9IGZhbHNlO1xuICAgICAgICAgIC8vY29uc29sZS5sb2coXCJlcnJvciBkb3dubG9hZCBcIiArIHVybCk7XG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlbGV0ZUZpbGUoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYG1lZGlhLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlRmlsZSgke3BhdGh9KSByZXM6ICR7cmVzfWAsIEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzaG93QWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XG5cbiAgICByZXR1cm4gdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogJ0luZm8nLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgICBidXR0b25zOiBbJ09LJ11cbiAgICB9KTtcblxuICB9XG5cbiAgYXN5bmMgc2hvd0FsZXJ0QW5kUmV0dXJuKGhlYWRlcjogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGlzRGlzbWlzcz86IGJvb2xlYW4sIHJvdXRlPzogc3RyaW5nKSB7XG4gICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gc2hvd0FsZXJ0QW5kUmV0dXJuKClgKTtcbiAgICBsZXQgZGlzbWlzcyA9IChpc0Rpc21pc3MgIT09IHVuZGVmaW5lZCkgPyBpc0Rpc21pc3MgOiBmYWxzZVxuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZGlzbWlzcyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdPSycsXG4gICAgICAgICAgaGFuZGxlcjogKGJsYWgpID0+IHtcbiAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ0NvbmZpcm0gT0s6IGJsYWgnKTtcbiAgICAgICAgICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkICYmIHJvdXRlICE9PSBudWxsKVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJvdXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBwcmVzZW50QWxlcnQobWVzc2FnZSwgYnV0dG9uPzogc3RyaW5nKSB7XG4gICAgbGV0IGJ1dHRvbk5hbWUgPSAoYnV0dG9uICE9PSB1bmRlZmluZWQpID8gYnV0dG9uIDogJ09rJ1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNzc0NsYXNzOiAnbXktYWxlcnQtY2xhc3MnLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGJ1dHRvbnM6IFtidXR0b25OYW1lXVxuICAgIH0pO1xuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgfVxuXG4gIGdldEZhbWlseVVuaXRJRCgpOiBIdHRwUGFyYW1zIHtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgbGV0IHVzZXIgPSB0aGlzLmF1dGhTZXJ2aWNlPy51c2VyXG4gICAgcmV0dXJuIGh0dHBQYXJhbXMgPSAodXNlci5mYW1pbHlVbml0KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCd1c2VyJywgdXNlci5mYW1pbHlVbml0KSA6IGh0dHBQYXJhbXNcbiAgfVxuXG4gIGdldEFQSUxlZ2FsSW5mb3JtYXRpb24oKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2xlZ2FsVGVybS9sYXN0QWNjZXB0ZWQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElMZWdhbEluZm9ybWF0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcG9zdEFQSUxlZ2FsQ29uZmlybWF0aW9uKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2xlZ2FsVGVybS9sYXN0QWNjZXB0ZWQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb25maXJtYXRpb25MZWdhbCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElSZWplY3RMZWdhbENvbmZpcm1hdGlvbihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9sZWdhbFRlcm0vbGFzdERlY2xpbmVkJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJQ29uZmlybWF0aW9uTGVnYWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJcGFzc3dvcmRSZWNvdmVyeShwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAncGF0aWVudC9mb3Jnb3QnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSXBhc3N3b3JkUmVjb3ZlcnkoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJU3RhZmZTbG90cyhwYXJhbXM6IHsgaWQ6IG51bWJlciwgZGF0ZTogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgbGV0IHBhdGggPSBgc3RhZmYvJHtwYXJhbXMuaWR9L2F2YWlsYWJpbGl0eWA7XG4gICAgbGV0IGVuZHBvaW50OiBzdHJpbmc7XG4gICAgaWYgKHBhcmFtcy5kYXRlICE9PSBcIlwiKSB7XG4gICAgICBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50V2l0aFBhcmFtZXRlcnMocGF0aCwgKHFzOiBRdWVyeVN0cmluZ1BhcmFtZXRlcnMpID0+IHFzLnB1c2goJ2RhdGUnLCBwYXJhbXMuZGF0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElTdGFmZlNsb3RzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJZ29hbHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VsZW1lbnQvZ29hbHMnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJaG9tZUluaXRpYWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBnZXRBUEl2aWRlb2NhbGwoaWQ6c3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+e1xuICAgIGxldCBwYXRoID0gJ3VzZXIvYWdlbmRhLycraWQrJy92aWRlb2NhbGxTZXNzaW9uJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEl2aWRlb2NhbGwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuXG4gIHBvc3RBUElQZW5kaW5nQ29ubmVjdCgpOiBPYnNlcnZhYmxlPGFueT57XG4gICAgbGV0IHBhdGggPSAndXNlci92aWRlb2NhbGwvcGVuZGluZ0Nvbm5lY3QnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElQZW5kaW5nQ29ubmVjdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4vKiAgIGdldEFQSWluZm9ybWF0aW9uVXNlcigpOiBPYnNlcnZhYmxlPGFueT57XG5cbiAgICBsZXQgcGF0aCA9ICd1c2VyL2luZm9ybWF0aW9uVXNlcidcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElob21lSW5pdGlhbCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgIClcbiAgfSAqL1xuXG5cbiAgZ2V0QVBJaW5mb3JtYXRpb25TdW1tYXJ5KHBhcmFtczogT2JqZWN0KXtcbiAgICBsZXQgcGF0aCA9ICdob21lJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgY29uc29sZS5sb2coJ2hvbWUgcGFyYW1zJywgcGFyYW1zKVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMpXG4gICAgKTtcbiAgfVxuICBnZXRBUElpbmZvcm1hdGlvblN1bW1hcnlPbGQocGFyYW1zOiBPYmplY3Qpe1xuICAgIGxldCBwYXRoID0gJ2hvbWUnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzKVxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSXVzZXJQcm9maWxlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndjIvdXNlci9wcm9maWxlJ1xuICAgIC8vbGV0IGh0dHBQYXJhbXMgPSB0aGlzLmdldEZhbWlseVVuaXRJRCgpXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJaG9tZUluaXRpYWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwb3N0QVBJQ2hhbmdlUGFzc3dvcmQocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvY2hhbmdlUGFzc3dvcmQnO1xuICAgIGxldCBodHRwUGFyYW1zID0gdGhpcy5nZXRGYW1pbHlVbml0SUQoKVxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDaGFuZ2VQYXNzd29yZCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSW5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25zKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9jb25maWd1cmF0aW9uJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSW5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25zKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcG9zdEFQSUNvbmZpZ3VyYXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvY29uZmlndXJhdGlvbic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSUNvbmZpZ3VyYXRpb24oJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElsYW5ndWFnZXNDZW50ZXIoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvbGFuZ3VhZ2VzJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWxhbmd1YWdlc0NlbnRlcigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIGdldEFQSUZhcXMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvZmFxJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWhvbWVJbml0aWFsKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJRmFtaWx5VW5pdCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZmFtaWx5VW5pdCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJRmFtaWx5VW5pdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgZ2V0QVBJRmFtaWx5VW5pdDIoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd2Mi91c2VyL2ZhbWlseVVuaXQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElGYW1pbHlVbml0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElSZXBvcnRQcm9ibGVtKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL3JlcG9ydFByb2JsZW0nOyAvLyAnbWVkaWEvdXBsb2FkL3RlbXAnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElSZXBvcnRQcm9ibGVtKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWVtYWlsVmVyaWZpY2F0aW9uKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VtYWlsX3ZlcmlmaWNhdGlvbic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUEllbWFpbFZlcmlmaWNhdGlvbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUNvZGVCeUVtYWlsKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9yZXNlbmRUd29GYWN0b3JDb2RlJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQ29kZUJ5RW1haWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWNvZGVWZXJpZmljYXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvdmVyaWZ5VHdvRmFjdG9yJztcbiAgICAvL2xldCBwYXRoID0gJ3VzZXIvY29kZVZlcmlmaWNhdGlvbic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUEljb2RlVmVyaWZpY2F0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cblxuICBnZXRBUEloZWFsdGhDYXJkVHlwZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvaGVhbHRoQ2FyZFR5cGVzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJaGVhbHRoQ2FyZFR5cGVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWhlYWx0aENhcmRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9oZWFsdGhjYXJkcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQaGVhbHRoQ2FyZHMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJaGVhbHRoQ2FyZElkKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2hlYWx0aGNhcmQvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEloZWFsdGhDYXJkKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUEloZWFsdGhDYXJkcyhwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9oZWFsdGhjYXJkJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSVJlcG9ydFByb2JsZW0oJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUEloZWFsdGhDYXJkKHBhcmFtczogSGVhbHRoQ2FyZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9oZWFsdGhjYXJkLyR7cGFyYW1zLmlkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcHV0QVBJaGVhbHRoQ2FyZCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSWhlYWx0aENhcmQocGFyYW1zOiBIZWFsdGhDYXJkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2hlYWx0aGNhcmQvJHtwYXJhbXMuaWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJaGVhbHRoQ2FyZCgke3BhdGh9KSByZXM6ICR7cmVzfWAsIEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElTb2NpYWxSZWxhdGlvblR5cGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvc29jaWFsUmVsYXRpb25UeXBlJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJU29jaWFsUmVsYXRpb25UeXBlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWVtZXJnZW5jeUNvbnRhY3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL0VtZXJnZW5jeUNvbnRhY3RzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZW1lcmdlbmN5Q29udGFjdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUEllbWVyZ2VuY3lDb250YWN0SUQoaWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9FbWVyZ2VuY3lDb250YWN0LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZW1lcmdlbmN5Q29udGFjdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJZW1lcmdlbmN5Q29udGFjdChwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9FbWVyZ2VuY3lDb250YWN0JztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUEllbWVyZ2VuY3lDb250YWN0KGlkOiBhbnksIHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL0VtZXJnZW5jeUNvbnRhY3QvJHtpZH1gO1xuICAgIGNvbnNvbGUubG9nKCdbRG9vbGVTZXJ2aWNlXSBwdXRBUEllbWVyZ2VuY3lDb250YWN0KCknLCBwYXJhbXMpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHB1dEFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBUEllbWVyZ2VuY3lDb250YWN0KGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvRW1lcmdlbmN5Q29udGFjdC8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cblxuICBnZXRBUElhYm91dFVzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2Fib3V0JztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJYWJvdXRVcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElhcHBvaW50bWVudEFnZW5kYSgpOiBPYnNlcnZhYmxlPGFueT57XG4gICAgbGV0IHBhdGggPSAndXNlci9hZ2VuZGEnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWFwcG9pbnRtZW50QWdlbmRhKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8vZG9jdW1lbnRzLVRyYWNraW5nXG4gIGdldEFQSWRpYWdub3N0aWNUZXN0cygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZGlhZ25vc3RpY1Rlc3RzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaWFnbm9zdGljVGVzdHMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZGlhZ25vc3RpY1Rlc3RUeXBlc0F2YWlsYWJsZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2RpYWdub3N0aWNUZXN0VHlwZXMvYXZhaWxhYmxlJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGlhZ25vc3RpY1Rlc3RUeXBlc0F2YWlsYWJsZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkaWFnbm9zdGljVGVzdElEKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3YyL3VzZXIvZGlhZ25vc3RpY1Rlc3QvJyArIGlkO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaWFnbm9zdGljVGVzdElEKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElkaWFnbm9zdGljVGVzdChwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndjIvdXNlci9kaWFnbm9zdGljVGVzdHMvJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWRpYWdub3N0aWNUZXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHV0QVBJZGlhZ25vc3RpY1Rlc3QoaWQsIHBhcmFtczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2RpYWdub3N0aWNUZXN0LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwdXRBUElkaWFnbm9zdGljVGVzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSWRpYWdub3N0aWNUZXN0KGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2RpYWdub3N0aWNUZXN0LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJZGlhZ25vc3RpY1Rlc3QoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZmlsdGVyZWREaWFnbm9zdGljVGVzdChwYXJhbXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9kaWFnbm9zdGljVGVzdHMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIC8vIEJlZ2luIGFzc2lnbmluZyBwYXJhbWV0ZXJzXG4gICAgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodHRwUGFyYW1zID0gKHBhcmFtcy5zdGFydF9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBwYXJhbXMuc3RhcnRfZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgICBodHRwUGFyYW1zID0gKHBhcmFtcy5lbmRfZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHBhcmFtcy5lbmRfZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgICBpZiAocGFyYW1zLmRpYWdub3N0aWNUZXN0VHlwZXMpIHtcbiAgICAgICAgcGFyYW1zLmRpYWdub3N0aWNUZXN0VHlwZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoJ2RpYWdub3N0aWNfdGVzdF90eXBlX2lkW10nLCBlbGVtZW50KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElmaWx0ZXJlZERpYWdub3N0aWNUZXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIC8vZm9ybXMtVHJhY2tpbmdcbiAgZ2V0QVBJZm9ybUxpc3RzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnZm9ybXMvdXNlcic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWZvcm1MaXN0cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgLy9ncmFwaGljcy1UcmFja2luZ1xuXG4gIGdldEFQSWVsZW1lbnRzTGlzdChmaWx0ZXI/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VsZW1lbnRzJyAgLyogJ3VzZXIvZWxlbWVudHNMaXN0L3YyJyAgKi9cbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChmaWx0ZXI/Lm9ubHlfd2l0aF92YWx1ZXMpPyBodHRwUGFyYW1zLmFwcGVuZCgnb25seV93aXRoX3ZhbHVlcycsIGZpbHRlcj8ub25seV93aXRoX3ZhbHVlcyk6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKGZpbHRlcj8uZ3JvdXBlZCk/IGh0dHBQYXJhbXMuYXBwZW5kKCdncm91cGVkJywgZmlsdGVyPy5ncm91cGVkKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKGZpbHRlcj8uZmlsdGVyKT8gaHR0cFBhcmFtcy5hcHBlbmQoJ2ZpbHRlcicsIGZpbHRlcj8uZmlsdGVyKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZWxlbWVudHNMaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBnZXQgZWxlbWVudHMgd2l0aCBxdWVyeSBieSBwYXJhbWV0ZXIgZGF0ZSAgKi9cbiAgZ2V0QVBJZWxlbWVudHNMaXN0QnlEYXRlKHBhcmFtczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VsZW1lbnRzTGlzdC92MicgIC8qICd1c2VyL2VsZW1lbnRzTGlzdCcgICovXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGlmKHBhcmFtcy5maWx0ZXIgPT0gJzEnKSBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoJ2ZpbHRlcicsICcxJylcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWVsZW1lbnRzTGlzdEJ5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJYWRkRWxlbWVudChpZCwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudC8nICsgaWQgKyAnL3ZhbHVlL2FkZCdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJYWRkRWxlbWVudCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElncmFwaGljc0VsZW1lbnQoaWQ6IE9iamVjdCwgcXVlcnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudC8nICsgaWQ7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocXVlcnkpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2ludGVydmFsJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZ3JhcGhpY3NFbGVtZW50KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWVsZW1lbnRJRChpZDogT2JqZWN0LCBwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB2Mi91c2VyL2VsZW1lbnQvJHtpZH1gO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uaW50ZXJ2YWwpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2ludGVydmFsJywgcGFyYW1zPy5pbnRlcnZhbCkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LmZyb21fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnZnJvbV9kYXRlJywgcGFyYW1zPy5mcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy50b19kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCd0b19kYXRlJywgcGFyYW1zPy50b19kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8udmVyc2lvbikgPyBodHRwUGFyYW1zLmFwcGVuZCgndmVyc2lvbicsIHBhcmFtcz8udmVyc2lvbikgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCxodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElncmFwaGljc0VsZW1lbnQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZWxlbWVudEF2YWlsYWJsZUlEKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGVsZW1lbnQvYXZhaWxhYmxlLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbGVtZW50QXZhaWxhYmxlSUQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJY2F0ZWdvcnkoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VsZW1lbnRfY2F0ZWdvcnknO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWNhdGVnb3J5KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWVsZW1lbnRHcm91cElEKGlkOiBPYmplY3QsIGZpbHRlcj8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGNlbnRlci9lbGVtZW50R3JvdXAvJHtpZH0vZWxlbWVudHNgO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKGZpbHRlcikgPyBodHRwUGFyYW1zLmFwcGVuZCgnZmlsdGVyJywgZmlsdGVyKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbGVtZW50R3JvdXBJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzZWFyY2hBUEllbGVtZW50R3JvdXAocGFyYW1zOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgXG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2VsZW1lbnRHcm91cHMnXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5maWx0ZXIpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2ZpbHRlcicsIHBhcmFtcz8uZmlsdGVyKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbGVtZW50R3JvdXAoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIC8qKiBnZXQgZGlldHMgd2l0aCBxdWVyeSBieSBwYXJhbWV0ZXIgZGF0ZSAgKi9cbiAgZ2V0QVBJbGlzdERpZXRzQnlEYXRlKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2RpZXRzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElsaXN0RGlldHNCeURhdGUoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZGlldHNCeURhdGUocGFyYW1zOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZGlldGFyeUludGFrZXNgXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdkYXRlJywgcGFyYW1zLmRhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5ncm91cGVkX2J5X3RpbWVzKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdncm91cGVkX2J5X3RpbWVzJywgcGFyYW1zLmdyb3VwZWRfYnlfdGltZXMpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRpZXRzQnlEYXRlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWRldGFpbERpZXRzKGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGRpZXQvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRldGFpbERpZXRzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWRldGFpbFJlY2lwZShpZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBkaWV0L3JlY2VpcHQvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRldGFpbFJlY2lwZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiogZ2V0IGFkdmljZXMgICoqL1xuICBnZXRBUElsaXN0QWR2aWNlcyhwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvYWR2aWNlcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICAuc2V0KCd0YWdzJywgcGFyYW1zLnRhZ3MpXG4gICAgLnNldCgnaW50ZXJhY3Rpb25zJywgcGFyYW1zLmludGVyYWN0aW9ucylcbiAgICAuc2V0KCdyZWFkaW5nVGltZScsIHBhcmFtcy5yZWFkaW5nVGltZSk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWxpc3RBZHZpY2VzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gICAgLyoqIGdldCBuZXdzICAqKi9cbiAgZ2V0QVBJbGlzdE5ld3MoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL25ld3MnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWxpc3ROZXdzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWRldGFpbE5ldyhpZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL25ldy8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsTmV3KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSVNlYXJjaE5ld3MocXVlcnk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnbmV3cyc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocXVlcnkpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3NlYXJjaCcsIHF1ZXJ5KSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElTZWFyY2hOZXdzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUFwcExhdGVzdFZlcnNpb24odmVyc2lvbiwgcGxhdGZvcm0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2FwcC92ZXJzaW9ucy9tdXN0LXVwZGF0ZT92ZXJzaW9uPScrdmVyc2lvbisnJnBsYXRmb3JtPScrcGxhdGZvcm07XG4gICAgY29uc29sZS5sb2cocGF0aCk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBnZXRBUElTZWFyY2hBZHZpY2VzKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2FkdmljZXMnO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHF1ZXJ5KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBxdWVyeSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJU2VhcmNoQWR2aWNlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkZXRhaWxBZHZpY2VzKGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGFkdmljZS8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsQWR2aWNlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkcnVnc0xpc3QocXVlcnk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgZHJ1Z0ludGFrZS9saXN0YDtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRydWdzTGlzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSWRydWdJbnRha2VCeURhdGUocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZHJ1Z0ludGFrZS9kYXRlJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkcnVnSW50YWtlQnlEYXRlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG4vLyBzZW5kIG1lZGljYXRpb24gbGlzdFxuICBnZXRBUEltZWRpY2F0aW9uTGlzdChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBzZW5kbWVkaWNhdGlvbi9saXN0YDtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEltZWRpY2F0aW9uTGlzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkaXJlY3Rpb25zTGlzdCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWRkcmVzc2VzYDtcbiAgICAvLyBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgLy8gaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaXJlY3Rpb25MaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBnZXRBUEltZWRpY2F0aW9uc0xpc3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBzZW5kbWVkaWNhdGlvbi9saXN0YDtcbiAgICAvLyBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgLy8gaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaXJlY3Rpb25MaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElzZW5kRGlyZWN0aW9uKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FkZHJlc3MnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJc2VuZERpcmVjdGlvbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1dEFQSXNlbmREaXJlY3Rpb24oaWQ6IGFueSwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWRkcmVzcy8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwdXRBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlQVBJc2VuZERpcmVjdGlvbihpZDogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2FkZHJlc3MvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSW1lZGljYXRpb25QbGFuKCR7cGF0aH0pIHJlczogJHtyZXN9YCwgSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJbWVkaWNhdGlvblNlbmRQZXRpdGlvbihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnc2VuZG1lZGljYXRpb24nO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJc2VuZERpcmVjdGlvbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElkcnVnSW50YWtlKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2RydWdJbnRha2UnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWNoYW5nZVN0YXRlZHJ1Z0ludGFrZShpZDogT2JqZWN0LCBzdGF0ZTogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2RydWdJbnRha2UvJHtpZH0vc2V0LyR7c3RhdGV9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWRydWdJbnRha2UoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJbWVkaWNhdGlvblBsYW4ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW5gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHV0QVBJbWVkaWNhdGlvblBsYW4oaWQ6IGFueSwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW4vJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcHV0QVBJZHJ1Z0ludGFrZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSW1lZGljYXRpb25QbGFuKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW4vJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSW1lZGljYXRpb25QbGFuKCR7cGF0aH0pIHJlczogJHtyZXN9YCwgSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUEltZWRpY2F0aW9uUGxhbihpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9tZWRpY2F0aW9uUGxhbi8ke2lkfWBcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEltZWRpY2F0aW9uUGxhbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElnYW1lcygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZ2FtZXMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICAvKiogZ2V0IGdhbWVzIHdpdGggcXVlcnkgYnkgcGFyYW1ldGVyIGRhdGUgICovXG4gIGdldEFQSWdhbWVzQnlEYXRlKGZyb21fZGF0ZTogYW55LCB0b19kYXRlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZ2FtZVBsYXlzL3NjaGVkdWxlZCc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAoZnJvbV9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBmcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAodG9fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBnZXRBUElnYW1lSWQoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZ2FtZS8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZ2FtZUlkKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWFnZW5kYSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvYWdlbmRhJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElhZ2VuZGEoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJYWxsQWdlbmRhKHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT57XG4gICAgbGV0IHBhdGggPSAndXNlci9hZ2VuZGEvdjInO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gcGFyYW1zPy5mcm9tX2RhdGU/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBwYXJhbXM/LmZyb21fZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IHBhcmFtcz8udG9fZGF0ZT8gaHR0cFBhcmFtcy5hcHBlbmQoJ3RvX2RhdGUnLCBwYXJhbXM/LnRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSBwYXJhbXM/LmZpbHRlcl9ieV9kYXRlPyBodHRwUGFyYW1zLmFwcGVuZCgnZmlsdGVyX2J5X2RhdGUnLCBwYXJhbXM/LmZpbHRlcl9ieV9kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8ud2l0aF9tZWRpY2FsX3Byb2NlZHVyZXMgIT0gdW5kZWZpbmVkKT8gaHR0cFBhcmFtcy5hcHBlbmQoJ3dpdGhfbWVkaWNhbF9wcm9jZWR1cmVzJywgcGFyYW1zPy53aXRoX21lZGljYWxfcHJvY2VkdXJlcykgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/Lm9yZGVyICE9IHVuZGVmaW5lZCk/IGh0dHBQYXJhbXMuYXBwZW5kKCdvcmRlcicsIHBhcmFtcz8ub3JkZXIpIDogaHR0cFBhcmFtc1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWFwcG9pbnRtZW50QWdlbmRhVjIoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJYWdlbmRhSUQoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWdlbmRhLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElhZ2VuZGFJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJYWRkQWdlbmRhKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FnZW5kYS8nXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWFkZEFnZW5kYSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBUElhZGRBZ2VuZGEoaWQ6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhcmFtcyA9IHsgYWdlbmRhOiBpZCB9XG4gICAgbGV0IHBhdGggPSAndXNlci9hZ2VuZGEvZGVsZXRlJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSWFkZEFnZW5kYSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUElhZ2VuZGEoaWQ6IGFueSwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWdlbmRhLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHB1dEFQSWFnZW5kYSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElhbGxvd2VkQ29udGFjdHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2FsbG93ZWRDb250YWN0c2A7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKCd3aXRoRGVwYXJ0bWVudHMnLCAnMScpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWFsbG93ZWRDb250YWN0cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIGxldCBhbGxvd2VkID0gcmVzLmFsbG93ZWRcbiAgICAgICAgaWYocmVzLmFsbG93ZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgYWxsb3dlZCA9IFtdXG4gICAgICAgIHJldHVybiBhbGxvd2VkO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElzdGFmZklkKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBzdGFmZi8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJc3RhZmZJZCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKiogZ2V0IGdhbWVzIHdpdGggcXVlcnkgYnkgcGFyYW1ldGVyIGRhdGUgICovXG4gIGdldEFQSVVzZXJNZXNzYWdlcygpOiBPYnNlcnZhYmxlPFNoZWxsQ2hhdE1vZGVsW10+IHtcblxuICAgIGxldCBwYXRoID0gJ21lc3NhZ2UvdXNlcic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcblxuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJVXNlck1lc3NhZ2VzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgaWYocmVzLmxlbmd0aCA9PSAwKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICAgIHJldHVybiByZXMubWVzc2FnZXMgYXMgU2hlbGxDaGF0TW9kZWxbXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICAvLyBnZXQgdGhlIGNvbXBhbnkgZGV0YWlscywgYSBzdWJzZXQgb2YgdGhlIHVzZXIgZGF0YVxuICBnZXRVc2VyU3Vic2V0RGF0YSgpOiBPYnNlcnZhYmxlPFNoZWxsQ2hhdE1vZGVsPiB7XG4gICAgbGV0IHBhdGggPSAnbWVzc2FnZS91c2VyJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuXG4gICAgY29uc3QgZGF0YU9ic2VydmFibGUgPSB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KTtcblxuICAgIHJldHVybiBkYXRhT2JzZXJ2YWJsZS5waXBlKFxuICAgICAgbWFwKChqc29uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhOiBTaGVsbENoYXRNb2RlbCA9IHtcbiAgICAgICAgICAuLi5qc29uUmVzcG9uc2UubWVzc2FnZXNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuLyoqIFJlbWluZGVycyAqL1xuICBnZXRBUElyZW1pbmRlcnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL3JlbWluZGVyJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElyZW1pbmRlcnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJcmVtaW5kZXJJRChpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9yZW1pbmRlci8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJcmVtaW5kZXJJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJYWRkUmVtaW5kZXIocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcmVtaW5kZXIvJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElhZGRSZW1pbmRlcigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBUElSZW1pbmRlcihpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9yZW1pbmRlci8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJUmVtaW5kZXIoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUFQSVJlbWluZGVyKGlkOiBhbnksIHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL3JlbWluZGVyLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHVwZGF0ZUFQSVJlbWluZGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlQVBJdXNlcihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlcmA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSB1cGRhdGVBUElSZW1pbmRlcigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUFQSUltYWdldXNlcihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9pbWFnZWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSB1cGRhdGVBUElSZW1pbmRlcigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSUltYWdldXNlcigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvaW1hZ2VgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHVwZGF0ZUFQSVJlbWluZGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIHBvc3RBUElDb250ZW50U3RhdHVzKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjb250ZW50L3N0YXR1cydcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJQ29udGVudFN0YXR1cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElwYXRpZW50cygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcGF0aWVudHMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSXJlbWluZGVycygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElMZXZlbEluZm8oY2hhbGxlbmdlSWQsIGxldmVsSWQsIHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvY2hhbGxlbmdlLycrY2hhbGxlbmdlSWQrJy9sZXZlbC8nKyBsZXZlbElkKycvZ29hbHMnXG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJTGV2ZWxJbmZvKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUNoYWxsZW5nZShjaGFsbGVuZ2VJZCwgcGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9jaGFsbGVuZ2UvJytjaGFsbGVuZ2VJZFxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUNoYWxsZW5nZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElDaGFsbGVuZ2VzKCBwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NoYWxsZW5nZXMnXG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQ2hhbGxlbmdlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG5cblxuICBnZXRBUEltZXNzYWdlKGlkLCBwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvbWVzc2FnZS8nICsgaWRcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IHBhcmFtcz8ucGFnZT8gaHR0cFBhcmFtcy5hcHBlbmQoJ3BhZ2UnLCBwYXJhbXM/LnBhZ2UpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSBwYXJhbXM/LnVzZXI/IGh0dHBQYXJhbXMuYXBwZW5kKCd1c2VyJywgcGFyYW1zPy51c2VyKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbGVtZW50c0xpc3QoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJRm9ybUpTT04oZm9ybSwgcGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgZm9ybS8ke2Zvcm19L2Zvcm1GaWVsZHNgO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZm9ybUFuc3dlcikgPyBodHRwUGFyYW1zLmFwcGVuZCgnZm9ybUFuc3dlcicsIHBhcmFtcz8uZm9ybUFuc3dlcikgIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5nYW1lX3BsYXlfaWQpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2dhbWVfcGxheV9pZCcsIHBhcmFtcz8uZ2FtZV9wbGF5X2lkKSAgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJcmVtaW5kZXJzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElGb3JtSlNPTihmb3JtLCBwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGZvcm1maWVsZC9jb25kaXRpb25hbC8ke2Zvcm19L2ZpZWxkLyR7cGFyYW1zLmZvcm1GaWVsZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb250ZW50U3RhdHVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElGb3JtRmlsbChwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGZvcm0vZmlsbC9gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb250ZW50U3RhdHVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSU5vdGlmaWNhdGlvbnNDb3VudCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvbm90aWZpY2F0aW9ucy9jb3VudCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJTm90aWZpY2F0aW9ucygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElOb3RpZmljYXRpb25zKHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvbm90aWZpY2F0aW9ucyc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5yZWFkKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdyZWFkJywgcGFyYW1zPy5yZWFkKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8ud2l0aFBhZ2luYXRlID09IDEpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3dpdGhQYWdpbmF0ZScsIHBhcmFtcz8ud2l0aFBhZ2luYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8ucGFnZSA+IDApID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3BhZ2UnLCBwYXJhbXM/LnBhZ2UpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSU5vdGlmaWNhdGlvbnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSU5vdGlmaWNhdGlvblJlYWQoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbm90aWZpY2F0aW9uL3JlYWRgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBpZCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldChlbmRwdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChlbmRwdCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0KGVuZHB0LCBpdGVtcyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChlbmRwdCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBpdGVtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldFB1c2hOb3RpZmljYXRpb24ocHVzaE5vdGlmaWNhdGlvbjogYW55KXtcbiAgICB0aGlzLnB1c2hOb3RpZmljYXRpb24gPSBwdXNoTm90aWZpY2F0aW9uO1xuICB9XG5cbiAgZ2V0UHVzaE5vdGlmaWNhdGlvbigpe1xuICAgcmV0dXJuIHRoaXMucHVzaE5vdGlmaWNhdGlvbjtcbiAgfVxuXG4gIGdldEFQSVVzZXJJbWFnZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvaW1hZ2UnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUZvcm1zQnlEYXRlKHBhcmFtczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGByZWhhYmlsaWZ5L3NoYXJlZGNhcmVwbGFuL2Zvcm1zYDtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LmRhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2RhdGUnLCBwYXJhbXMuZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/Lmdyb3VwZWRfYnlfdGltZXMpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2dyb3VwZWRfYnlfdGltZXMnLCBwYXJhbXMuZ3JvdXBlZF9ieV90aW1lcykgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGlldHNCeURhdGUoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSW1lZGljYWxQcm9jZWR1cmVzKHBhcmFtcz86IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9tZWRpY2FsUHJvY2VkdXJlc2A7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWRydWdJbnRha2UoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG59XG4iXX0=
|