@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.
Files changed (72) hide show
  1. package/README.md +24 -0
  2. package/esm2022/doolehealth-service-lib.mjs +5 -0
  3. package/esm2022/lib/configuration.mjs +5 -0
  4. package/esm2022/lib/models/user.mjs +2 -0
  5. package/esm2022/lib/service-lib.component.mjs +19 -0
  6. package/esm2022/lib/service-lib.module.mjs +33 -0
  7. package/esm2022/lib/services/analytics.service.mjs +73 -0
  8. package/esm2022/lib/services/api-endpoints.service.mjs +51 -0
  9. package/esm2022/lib/services/authentication.service.mjs +400 -0
  10. package/esm2022/lib/services/change-endpoints.service.mjs +90 -0
  11. package/esm2022/lib/services/date.service.mjs +419 -0
  12. package/esm2022/lib/services/doole.service.mjs +1299 -0
  13. package/esm2022/lib/services/encryption.service.mjs +31 -0
  14. package/esm2022/lib/services/error.service.mjs +49 -0
  15. package/esm2022/lib/services/events.service.mjs +63 -0
  16. package/esm2022/lib/services/highcharts.service.mjs +621 -0
  17. package/esm2022/lib/services/http.service.mjs +124 -0
  18. package/esm2022/lib/services/language.service.mjs +38 -0
  19. package/esm2022/lib/services/loading.service.mjs +45 -0
  20. package/esm2022/lib/services/logging.service.mjs +28 -0
  21. package/esm2022/lib/services/navigation.service.mjs +41 -0
  22. package/esm2022/lib/services/network.service.mjs +42 -0
  23. package/esm2022/lib/services/notification.service.mjs +202 -0
  24. package/esm2022/lib/services/opentok.service.mjs +25 -0
  25. package/esm2022/lib/services/roles.service.mjs +44 -0
  26. package/esm2022/lib/services/storage.service.mjs +37 -0
  27. package/esm2022/lib/services/token.service.mjs +59 -0
  28. package/esm2022/lib/util/chatParameters.mjs +17 -0
  29. package/esm2022/lib/util/data-store.mjs +54 -0
  30. package/esm2022/lib/util/environment.mjs +29 -0
  31. package/esm2022/lib/util/language.model.mjs +3 -0
  32. package/esm2022/lib/util/notification-options.mjs +245 -0
  33. package/esm2022/lib/util/query-string-parameters.mjs +11 -0
  34. package/esm2022/lib/util/url-builder.mjs +15 -0
  35. package/esm2022/public-api.mjs +30 -0
  36. package/fesm2022/doolehealth-service-lib.mjs +4025 -0
  37. package/fesm2022/doolehealth-service-lib.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/configuration.d.ts +46 -0
  40. package/lib/models/user.d.ts +133 -0
  41. package/lib/service-lib.component.d.ts +5 -0
  42. package/lib/service-lib.module.d.ts +13 -0
  43. package/lib/services/analytics.service.d.ts +17 -0
  44. package/lib/services/api-endpoints.service.d.ts +13 -0
  45. package/lib/services/authentication.service.d.ts +102 -0
  46. package/lib/services/change-endpoints.service.d.ts +38 -0
  47. package/lib/services/date.service.d.ts +58 -0
  48. package/lib/services/doole.service.d.ts +169 -0
  49. package/lib/services/encryption.service.d.ts +9 -0
  50. package/lib/services/error.service.d.ts +11 -0
  51. package/lib/services/events.service.d.ts +32 -0
  52. package/lib/services/highcharts.service.d.ts +69 -0
  53. package/lib/services/http.service.d.ts +28 -0
  54. package/lib/services/language.service.d.ts +15 -0
  55. package/lib/services/loading.service.d.ts +22 -0
  56. package/lib/services/logging.service.d.ts +9 -0
  57. package/lib/services/navigation.service.d.ts +13 -0
  58. package/lib/services/network.service.d.ts +14 -0
  59. package/lib/services/notification.service.d.ts +25 -0
  60. package/lib/services/opentok.service.d.ts +17 -0
  61. package/lib/services/roles.service.d.ts +28 -0
  62. package/lib/services/storage.service.d.ts +10 -0
  63. package/lib/services/token.service.d.ts +16 -0
  64. package/lib/util/chatParameters.d.ts +25 -0
  65. package/lib/util/data-store.d.ts +13 -0
  66. package/lib/util/environment.d.ts +18 -0
  67. package/lib/util/language.model.d.ts +4 -0
  68. package/lib/util/notification-options.d.ts +145 -0
  69. package/lib/util/query-string-parameters.d.ts +6 -0
  70. package/lib/util/url-builder.d.ts +9 -0
  71. package/package.json +38 -0
  72. 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=