@doolehealth/service-lib 0.0.4 → 0.0.6

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 (90) hide show
  1. package/README.md +112 -13
  2. package/esm2022/lib/configuration.mjs +1 -1
  3. package/esm2022/lib/models/notifications/notification-options.mjs +192 -0
  4. package/esm2022/lib/models/shared-care-plan.mjs +223 -0
  5. package/esm2022/lib/models/user.mjs +1 -1
  6. package/esm2022/lib/service-lib.component.mjs +5 -5
  7. package/esm2022/lib/service-lib.module.mjs +4 -4
  8. package/esm2022/lib/services/analytics.service.mjs +20 -11
  9. package/esm2022/lib/services/api-endpoints.service.mjs +22 -6
  10. package/esm2022/lib/services/authentication.service.mjs +74 -52
  11. package/esm2022/lib/services/change-endpoints.service.mjs +46 -22
  12. package/esm2022/lib/services/date.service.mjs +106 -45
  13. package/esm2022/lib/services/doole.service.mjs +658 -221
  14. package/esm2022/lib/services/encryption.service.mjs +3 -3
  15. package/esm2022/lib/services/error.service.mjs +3 -3
  16. package/esm2022/lib/services/events.service.mjs +5 -5
  17. package/esm2022/lib/services/firebase/auth/firebase-auth.service.mjs +154 -0
  18. package/esm2022/lib/services/firebase/auth/firebase-profile.model.mjs +7 -0
  19. package/esm2022/lib/services/health.service.mjs +303 -0
  20. package/esm2022/lib/services/highcharts.service.mjs +37 -67
  21. package/esm2022/lib/services/http.service.mjs +14 -14
  22. package/esm2022/lib/services/language.model.mjs +3 -0
  23. package/esm2022/lib/services/language.service.mjs +6 -6
  24. package/esm2022/lib/services/loading.service.mjs +3 -3
  25. package/esm2022/lib/services/logging.service.mjs +4 -4
  26. package/esm2022/lib/services/navigation.service.mjs +108 -9
  27. package/esm2022/lib/services/network.service.mjs +7 -7
  28. package/esm2022/lib/services/notification.service.mjs +10 -96
  29. package/esm2022/lib/services/opentok.service.mjs +10 -7
  30. package/esm2022/lib/services/permission.service.mjs +94 -0
  31. package/esm2022/lib/services/roles.service.mjs +9 -8
  32. package/esm2022/lib/services/shared-care-plan/shared-care-plan.service.mjs +103 -0
  33. package/esm2022/lib/services/storage.service.mjs +3 -3
  34. package/esm2022/lib/services/token.service.mjs +7 -7
  35. package/esm2022/lib/utils/chatParameters.mjs +17 -0
  36. package/esm2022/lib/utils/data-store.mjs +62 -0
  37. package/esm2022/lib/utils/query-string-parameters.mjs +11 -0
  38. package/esm2022/lib/utils/url-builder.mjs +15 -0
  39. package/esm2022/public-api.mjs +8 -9
  40. package/fesm2022/doolehealth-service-lib.mjs +2055 -1228
  41. package/fesm2022/doolehealth-service-lib.mjs.map +1 -1
  42. package/lib/configuration.d.ts +4 -2
  43. package/lib/{util → models/notifications}/notification-options.d.ts +0 -32
  44. package/lib/models/shared-care-plan.d.ts +206 -0
  45. package/lib/models/user.d.ts +2 -0
  46. package/lib/service-lib.component.d.ts +1 -1
  47. package/lib/services/analytics.service.d.ts +6 -3
  48. package/lib/services/api-endpoints.service.d.ts +3 -0
  49. package/lib/services/authentication.service.d.ts +27 -25
  50. package/lib/services/change-endpoints.service.d.ts +1 -0
  51. package/lib/services/date.service.d.ts +15 -8
  52. package/lib/services/doole.service.d.ts +64 -23
  53. package/lib/services/{auth → firebase/auth}/firebase-auth.service.d.ts +1 -1
  54. package/lib/services/{auth → firebase/auth}/firebase-profile.model.d.ts +1 -1
  55. package/lib/services/health.service.d.ts +49 -0
  56. package/lib/services/highcharts.service.d.ts +1 -2
  57. package/lib/services/http.service.d.ts +1 -1
  58. package/lib/services/language.service.d.ts +1 -1
  59. package/lib/services/navigation.service.d.ts +6 -1
  60. package/lib/services/notification.service.d.ts +2 -7
  61. package/lib/services/permission.service.d.ts +33 -0
  62. package/lib/services/roles.service.d.ts +3 -2
  63. package/lib/services/shared-care-plan/shared-care-plan.service.d.ts +20 -0
  64. package/lib/{util → utils}/data-store.d.ts +3 -1
  65. package/package.json +2 -15
  66. package/public-api.d.ts +7 -8
  67. package/esm2022/lib/services/auth/firebase-auth.service.mjs +0 -155
  68. package/esm2022/lib/services/auth/firebase-profile.model.mjs +0 -7
  69. package/esm2022/lib/services/pusher/pusher-alarm.service.mjs +0 -39
  70. package/esm2022/lib/services/pusher/pusher-challenge-notifications.service.mjs +0 -110
  71. package/esm2022/lib/services/pusher/pusher-connection.service.mjs +0 -73
  72. package/esm2022/lib/services/pusher/pusher-message.service.mjs +0 -27
  73. package/esm2022/lib/services/pusher/pusher-notification.service.mjs +0 -116
  74. package/esm2022/lib/util/chatParameters.mjs +0 -17
  75. package/esm2022/lib/util/data-store.mjs +0 -54
  76. package/esm2022/lib/util/environment.mjs +0 -29
  77. package/esm2022/lib/util/language.model.mjs +0 -3
  78. package/esm2022/lib/util/notification-options.mjs +0 -245
  79. package/esm2022/lib/util/query-string-parameters.mjs +0 -11
  80. package/esm2022/lib/util/url-builder.mjs +0 -15
  81. package/lib/services/pusher/pusher-alarm.service.d.ts +0 -16
  82. package/lib/services/pusher/pusher-challenge-notifications.service.d.ts +0 -40
  83. package/lib/services/pusher/pusher-connection.service.d.ts +0 -24
  84. package/lib/services/pusher/pusher-message.service.d.ts +0 -13
  85. package/lib/services/pusher/pusher-notification.service.d.ts +0 -32
  86. package/lib/util/environment.d.ts +0 -18
  87. /package/lib/{util → services}/language.model.d.ts +0 -0
  88. /package/lib/{util → utils}/chatParameters.d.ts +0 -0
  89. /package/lib/{util → utils}/query-string-parameters.d.ts +0 -0
  90. /package/lib/{util → utils}/url-builder.d.ts +0 -0
@@ -1,19 +1,20 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { Observable } from 'rxjs';
2
+ import { Observable, of, throwError, TimeoutError } from 'rxjs';
3
3
  import { Capacitor } from '@capacitor/core';
4
- import { map } from 'rxjs/operators';
4
+ import { map, mergeMap } from 'rxjs/operators';
5
5
  import { HttpParams } from '@angular/common/http';
6
6
  import * as i0 from "@angular/core";
7
- import * as i1 from "../services/authentication.service";
7
+ import * as i1 from "./authentication.service";
8
8
  import * as i2 from "@awesome-cordova-plugins/file-transfer/ngx";
9
9
  import * as i3 from "@awesome-cordova-plugins/file/ngx";
10
10
  import * as i4 from "./http.service";
11
- import * as i5 from "../services/api-endpoints.service";
11
+ import * as i5 from "./api-endpoints.service";
12
12
  import * as i6 from "./events.service";
13
13
  import * as i7 from "@ionic/angular";
14
14
  import * as i8 from "@angular/router";
15
+ import * as i9 from "@ngx-translate/core";
15
16
  export class DooleService {
16
- constructor(authService, transfer, file, http, api, events, platform, router, alertController) {
17
+ constructor(authService, transfer, file, http, api, events, platform, router, alertController, translate) {
17
18
  this.authService = authService;
18
19
  this.transfer = transfer;
19
20
  this.file = file;
@@ -23,9 +24,10 @@ export class DooleService {
23
24
  this.platform = platform;
24
25
  this.router = router;
25
26
  this.alertController = alertController;
27
+ this.translate = translate;
26
28
  }
27
29
  uploadFile(image, id) {
28
- console.log("uploading ", image);
30
+ ////console.log("uploading ", image);
29
31
  const token = localStorage.getItem('token');
30
32
  let options = {
31
33
  fileKey: 'file',
@@ -39,17 +41,17 @@ export class DooleService {
39
41
  }
40
42
  };
41
43
  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') ;
44
+ // Add files for new or saved diagnostics.
45
+ // uses diagnostic/media when diagnostic is new
46
+ //const endpoint = id ? this.api.getEndpoint('diagnostic/media'):this.api.getEndpoint('media/upload/temp') ;
45
47
  const endpoint = this.api.getEndpoint('media/upload/temp');
46
- //console.log("* uploadFile endpoint", endpoint);
48
+ //////console.log("* uploadFile endpoint", endpoint);
47
49
  return new Promise(function (resolve, reject) {
48
50
  fileTransfer.upload(image, endpoint, options).then(data => {
49
- console.log(data);
51
+ ////console.log(data);
50
52
  resolve(JSON.parse(data.response));
51
53
  }, (err) => {
52
- console.log(err);
54
+ ////console.log(err);
53
55
  reject(err);
54
56
  });
55
57
  });
@@ -57,12 +59,12 @@ export class DooleService {
57
59
  postAPIAddMedia(params) {
58
60
  const endpoint = this.api.getEndpoint('media/add');
59
61
  return this.http.postForm(endpoint, params).pipe(map((res) => {
60
- console.log(`[DooleService] postAPIAddMedia(${endpoint}) res: `, res);
62
+ ////console.log(`[DooleService] postAPIAddMedia(${endpoint}) res: `, res);
61
63
  return res;
62
64
  }));
63
65
  }
64
66
  uploadFileToModel(image, name, params) {
65
- //console.log("uploading ", image);
67
+ //////console.log("uploading ", image);
66
68
  const token = localStorage.getItem('token');
67
69
  let options = {
68
70
  fileKey: 'file',
@@ -77,10 +79,10 @@ export class DooleService {
77
79
  const endpoint = this.api.getEndpoint('media/add');
78
80
  return new Promise(function (resolve, reject) {
79
81
  fileTransfer.upload(image, endpoint, options).then(data => {
80
- console.log(JSON.parse(data.response));
82
+ ////console.log(JSON.parse(data.response));
81
83
  resolve(JSON.parse(data.response));
82
84
  }, (err) => {
83
- console.log(err);
85
+ ////console.log(err);
84
86
  reject(err);
85
87
  });
86
88
  });
@@ -101,7 +103,7 @@ export class DooleService {
101
103
  id: idMessageHeader
102
104
  }
103
105
  };
104
- //console.log("options: ", options);
106
+ //////console.log("options: ", options);
105
107
  const fileTransfer = this.transfer.create();
106
108
  fileTransfer.onProgress((progressEvent) => {
107
109
  if (progressEvent.lengthComputable) {
@@ -109,17 +111,17 @@ export class DooleService {
109
111
  this.events.publish("uploadMessageImage", { fileUrl, perc });
110
112
  }
111
113
  else {
112
- //console.log("progressEvent - ", progressEvent);
114
+ //////console.log("progressEvent - ", progressEvent);
113
115
  }
114
116
  });
115
117
  const endpoint = this.api.getEndpoint('message');
116
118
  return new Promise(function (resolve, reject) {
117
119
  fileTransfer.upload(fileUrl, endpoint, options)
118
120
  .then(data => {
119
- //console.log("success fileTransfer.upload", JSON.parse(data.response));
121
+ //////console.log("success fileTransfer.upload", JSON.parse(data.response));
120
122
  resolve(JSON.parse(data.response));
121
123
  }, (err) => {
122
- //console.log("** error ** fileTransfer.upload: ", err);
124
+ //////console.log("** error ** fileTransfer.upload: ", err);
123
125
  reject(fileTransfer.upload);
124
126
  });
125
127
  });
@@ -139,6 +141,21 @@ export class DooleService {
139
141
  const blob = new Blob(byteArrays, { type: contentType });
140
142
  return blob;
141
143
  }
144
+ download(url) {
145
+ const fileTransfer = this.transfer.create();
146
+ var path = null;
147
+ if (this.platform.is('ios')) {
148
+ path = this.file.documentsDirectory;
149
+ }
150
+ else {
151
+ path = this.file.dataDirectory;
152
+ }
153
+ fileTransfer.download(url, path + 'file.pdf').then((entry) => {
154
+ ////console.log('download complete: ' + entry.toURL());
155
+ }, (error) => {
156
+ // handle error
157
+ });
158
+ }
142
159
  downloadFile(url, destination) {
143
160
  var result = [];
144
161
  const fileTransfer = this.transfer.create();
@@ -149,13 +166,13 @@ export class DooleService {
149
166
  else {
150
167
  path = this.file.dataDirectory;
151
168
  }
152
- //console.log("downloadFile", url, destination, 'path,destination', path, destination);
169
+ //////console.log("downloadFile", url, destination, 'path,destination', path, destination);
153
170
  return new Observable((observer) => {
154
- //console.log("before CheckFile", this.file);
171
+ //////console.log("before CheckFile", this.file);
155
172
  this.file.checkFile(path, destination).then(res => {
156
- //console.log("*res*", res);
173
+ //////console.log("*res*", res);
157
174
  if (res) {
158
- //console.log("exists", res);
175
+ //////console.log("exists", res);
159
176
  result["success"] = true;
160
177
  result["downloaded"] = true;
161
178
  result["file"] = path + destination; //normalizeURL(this.file.cacheDirectory + destination);
@@ -163,10 +180,10 @@ export class DooleService {
163
180
  return observer.next(result);
164
181
  }
165
182
  }, error => {
166
- //console.log("not exists");
183
+ //////console.log("not exists");
167
184
  fileTransfer.onProgress(event => {
168
185
  if (event.lengthComputable) {
169
- //console.log(event.loaded / event.total);
186
+ //////console.log(event.loaded / event.total);
170
187
  result["status"] = "downloading";
171
188
  result["downloaded"] = false;
172
189
  result["percent"] = Math.round((event.loaded / event.total) * 100);
@@ -174,18 +191,18 @@ export class DooleService {
174
191
  }
175
192
  });
176
193
  return fileTransfer.download(url, path + destination).then((entry) => {
177
- //console.log('*download:* ' + url + " " + entry.toURL());
194
+ //////console.log('*download:* ' + url + " " + entry.toURL());
178
195
  result["success"] = true;
179
196
  result["downloaded"] = true;
180
197
  result["file"] = entry.toURL(); //normalizeURL(this.file.cacheDirectory + destination);
181
198
  result["fileNormalized"] = Capacitor.convertFileSrc(path + destination);
182
199
  return observer.next(result);
183
200
  }, (error) => {
184
- //console.log(error);
201
+ //////console.log(error);
185
202
  result["success"] = false;
186
203
  result["downloaded"] = false;
187
- //console.log("error download " + url);
188
- //console.log(result);
204
+ //////console.log("error download " + url);
205
+ //////console.log(result);
189
206
  return observer.next(result);
190
207
  });
191
208
  });
@@ -195,30 +212,43 @@ export class DooleService {
195
212
  let path = `media/${id}`;
196
213
  const endpoint = this.api.getEndpoint(path);
197
214
  return this.http.delete(endpoint).pipe(map((res) => {
198
- console.log(`[DooleService] deleteFile(${path}) res: ${res}`, JSON.stringify(res));
215
+ ////console.log(`[DooleService] deleteFile(${path}) res: ${res}`, JSON.stringify(res));
199
216
  return res;
200
217
  }));
201
218
  }
202
219
  showAlert(message) {
203
220
  return this.alertController.create({
221
+ cssClass: 'my-alert-class',
222
+ //mode: 'ios',
204
223
  header: 'Info',
205
224
  message: message,
206
225
  backdropDismiss: false,
207
- buttons: ['OK']
226
+ buttons: [
227
+ {
228
+ text: 'Aceptar',
229
+ role: 'confirm',
230
+ cssClass: 'onlyButton',
231
+ handler: (blah) => {
232
+ ////console.log('[LandingPage] AlertConfirm Cancel');
233
+ }
234
+ }
235
+ ]
208
236
  });
209
237
  }
210
238
  async showAlertAndReturn(header, message, isDismiss, route) {
211
239
  //console.log(`[DooleService] showAlertAndReturn()`);
212
240
  let dismiss = (isDismiss !== undefined) ? isDismiss : false;
213
241
  const alert = await this.alertController.create({
242
+ cssClass: 'my-alert-class',
243
+ //mode: 'ios',
214
244
  header: header,
215
245
  message: message,
216
246
  backdropDismiss: dismiss,
217
247
  buttons: [
218
248
  {
219
- text: 'OK',
249
+ text: 'Aceptar',
220
250
  handler: (blah) => {
221
- // console.log('Confirm OK: blah');
251
+ //console.log('Confirm OK: blah');
222
252
  if (route !== undefined && route !== null)
223
253
  this.router.navigateByUrl(route);
224
254
  }
@@ -228,11 +258,21 @@ export class DooleService {
228
258
  await alert.present();
229
259
  }
230
260
  async presentAlert(message, button) {
231
- let buttonName = (button !== undefined) ? button : 'Ok';
261
+ let buttonName = (button !== undefined) ? button : this.translate.instant('landing.accept-btn');
232
262
  const alert = await this.alertController.create({
233
263
  cssClass: 'my-alert-class',
264
+ //mode: 'ios',
234
265
  message: message,
235
- buttons: [buttonName]
266
+ buttons: [
267
+ {
268
+ text: buttonName,
269
+ role: 'confirm',
270
+ cssClass: 'onlyButton',
271
+ handler: (blah) => {
272
+ ////console.log('[LandingPage] AlertConfirm Cancel');
273
+ }
274
+ }
275
+ ]
236
276
  });
237
277
  await alert.present();
238
278
  }
@@ -241,11 +281,19 @@ export class DooleService {
241
281
  let user = this.authService?.user;
242
282
  return httpParams = (user.familyUnit) ? httpParams.append('user', user.familyUnit) : httpParams;
243
283
  }
284
+ getAPILegalAndPolicy() {
285
+ let path = 'center/legal-term-and-privacy-policy/last';
286
+ const endpoint = this.api.getEndpoint(path);
287
+ return this.http.get(endpoint).pipe(map((res) => {
288
+ //////console.log(`[DooleService] getAPILegalAndPolicy(${path}) res: `, res);
289
+ return res;
290
+ }));
291
+ }
244
292
  getAPILegalInformation() {
245
293
  let path = 'user/legalTerm/lastAccepted';
246
294
  const endpoint = this.api.getEndpoint(path);
247
295
  return this.http.get(endpoint).pipe(map((res) => {
248
- console.log(`[DooleService] getAPILegalInformation(${path}) res: `, res);
296
+ //////console.log(`[DooleService] getAPILegalInformation(${path}) res: `, res);
249
297
  return res;
250
298
  }));
251
299
  }
@@ -253,7 +301,7 @@ export class DooleService {
253
301
  let path = 'user/legalTerm/lastAccepted';
254
302
  const endpoint = this.api.getEndpoint(path);
255
303
  return this.http.post(endpoint, params).pipe(map((res) => {
256
- //console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
304
+ //////console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
257
305
  return res;
258
306
  }));
259
307
  }
@@ -261,7 +309,7 @@ export class DooleService {
261
309
  let path = 'user/legalTerm/lastDeclined';
262
310
  const endpoint = this.api.getEndpoint(path);
263
311
  return this.http.post(endpoint, params).pipe(map((res) => {
264
- //console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
312
+ //////console.log(`[DooleService] postAPIConfirmationLegal(${path}) res: `, res);
265
313
  return res;
266
314
  }));
267
315
  }
@@ -269,7 +317,7 @@ export class DooleService {
269
317
  let path = 'patient/forgot';
270
318
  const endpoint = this.api.getEndpoint(path);
271
319
  return this.http.post(endpoint, params).pipe(map((res) => {
272
- //console.log(`[DooleService] postAPIpasswordRecovery(${path}) res: `, res);
320
+ //////console.log(`[DooleService] postAPIpasswordRecovery(${path}) res: `, res);
273
321
  return res;
274
322
  }));
275
323
  }
@@ -283,15 +331,16 @@ export class DooleService {
283
331
  endpoint = this.api.getEndpoint(path);
284
332
  }
285
333
  return this.http.get(endpoint).pipe(map((res) => {
286
- //console.log(`[DooleService] getAPIStaffSlots(${path}) res: `, res);
334
+ //////console.log(`[DooleService] getAPIStaffSlots(${path}) res: `, res);
287
335
  return res;
288
336
  }));
289
337
  }
290
338
  getAPIgoals() {
291
339
  let path = 'user/element/goals';
340
+ //let path = 'user/goals/elements'
292
341
  const endpoint = this.api.getEndpoint(path);
293
342
  return this.http.get(endpoint).pipe(map((res) => {
294
- //console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
343
+ //////console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
295
344
  return res;
296
345
  }));
297
346
  }
@@ -299,7 +348,7 @@ export class DooleService {
299
348
  let path = 'user/agenda/' + id + '/videocallSession';
300
349
  const endpoint = this.api.getEndpoint(path);
301
350
  return this.http.get(endpoint).pipe(map((res) => {
302
- console.log(`[DooleService] getAPIvideocall(${path}) res: `, res);
351
+ ////console.log(`[DooleService] getAPIvideocall(${path}) res: `, res);
303
352
  return res;
304
353
  }));
305
354
  }
@@ -307,7 +356,7 @@ export class DooleService {
307
356
  let path = 'user/videocall/pendingConnect';
308
357
  const endpoint = this.api.getEndpoint(path);
309
358
  return this.http.post(endpoint).pipe(map((res) => {
310
- console.log(`[DooleService] getAPIPendingConnect(${path}) res: `, res);
359
+ ////console.log(`[DooleService] getAPIPendingConnect(${path}) res: `, res);
311
360
  return res;
312
361
  }));
313
362
  }
@@ -317,16 +366,31 @@ export class DooleService {
317
366
  const endpoint = this.api.getEndpoint(path);
318
367
  return this.http.get(endpoint).pipe(
319
368
  map((res: any) => {
320
- //console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
369
+ //////console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
321
370
  return res;
322
371
  })
323
372
  )
324
373
  } */
374
+ updateAPIImageuser(params) {
375
+ let path = `user/image`;
376
+ const endpoint = this.api.getEndpoint(path);
377
+ return this.http.put(endpoint, params).pipe(map((res) => {
378
+ //////console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
379
+ return res;
380
+ }));
381
+ }
382
+ deleteAPIImageuser() {
383
+ let path = `user/image`;
384
+ const endpoint = this.api.getEndpoint(path);
385
+ return this.http.delete(endpoint).pipe(map((res) => {
386
+ //////console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
387
+ return res;
388
+ }));
389
+ }
325
390
  getAPIinformationSummary(params) {
326
391
  let path = 'home';
327
392
  const endpoint = this.api.getEndpoint(path);
328
- console.log('home params', params);
329
- return this.http.post(endpoint, params).pipe(map(res => res));
393
+ return this.http.post(endpoint, params).pipe(mergeMap((v) => v instanceof TimeoutError ? throwError(v) : of(v)));
330
394
  }
331
395
  getAPIinformationSummaryOld(params) {
332
396
  let path = 'home';
@@ -338,7 +402,7 @@ export class DooleService {
338
402
  //let httpParams = this.getFamilyUnitID()
339
403
  const endpoint = this.api.getEndpoint(path);
340
404
  return this.http.get(endpoint).pipe(map((res) => {
341
- //console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
405
+ //////console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
342
406
  return res;
343
407
  }));
344
408
  }
@@ -347,7 +411,7 @@ export class DooleService {
347
411
  let httpParams = this.getFamilyUnitID();
348
412
  const endpoint = this.api.getEndpoint(path);
349
413
  return this.http.post(endpoint, params).pipe(map((res) => {
350
- //console.log(`[DooleService] postAPIChangePassword(${path}) res: `, res);
414
+ //////console.log(`[DooleService] postAPIChangePassword(${path}) res: `, res);
351
415
  return res;
352
416
  }));
353
417
  }
@@ -355,7 +419,7 @@ export class DooleService {
355
419
  let path = 'user/configuration';
356
420
  const endpoint = this.api.getEndpoint(path);
357
421
  return this.http.get(endpoint).pipe(map((res) => {
358
- //console.log(`[DooleService] getAPInotificationConfigurations(${path}) res: `, res);
422
+ //////console.log(`[DooleService] getAPInotificationConfigurations(${path}) res: `, res);
359
423
  return res;
360
424
  }));
361
425
  }
@@ -363,7 +427,7 @@ export class DooleService {
363
427
  let path = 'user/configuration';
364
428
  const endpoint = this.api.getEndpoint(path);
365
429
  return this.http.post(endpoint, params).pipe(map((res) => {
366
- //console.log(`[DooleService] postAPIConfiguration(${path}) res: `, res);
430
+ //////console.log(`[DooleService] postAPIConfiguration(${path}) res: `, res);
367
431
  return res;
368
432
  }));
369
433
  }
@@ -371,7 +435,7 @@ export class DooleService {
371
435
  let path = 'center/languages';
372
436
  const endpoint = this.api.getEndpoint(path);
373
437
  return this.http.get(endpoint).pipe(map((res) => {
374
- //console.log(`[DooleService] getAPIlanguagesCenter(${path}) res: `, res);
438
+ //////console.log(`[DooleService] getAPIlanguagesCenter(${path}) res: `, res);
375
439
  return res;
376
440
  }));
377
441
  }
@@ -379,7 +443,7 @@ export class DooleService {
379
443
  let path = 'center/faq';
380
444
  const endpoint = this.api.getEndpoint(path);
381
445
  return this.http.get(endpoint).pipe(map((res) => {
382
- //console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
446
+ //////console.log(`[DooleService] getAPIhomeInitial(${path}) res: `, res);
383
447
  return res;
384
448
  }));
385
449
  }
@@ -387,7 +451,7 @@ export class DooleService {
387
451
  let path = 'user/familyUnit';
388
452
  const endpoint = this.api.getEndpoint(path);
389
453
  return this.http.get(endpoint).pipe(map((res) => {
390
- //console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
454
+ //////console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
391
455
  return res;
392
456
  }));
393
457
  }
@@ -395,15 +459,15 @@ export class DooleService {
395
459
  let path = 'v2/user/familyUnit';
396
460
  const endpoint = this.api.getEndpoint(path);
397
461
  return this.http.get(endpoint).pipe(map((res) => {
398
- console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
462
+ ////console.log(`[DooleService] getAPIFamilyUnit(${path}) res: `, res);
399
463
  return res;
400
464
  }));
401
465
  }
402
466
  postAPIReportProblem(params) {
403
- let path = 'user/reportProblem'; // 'media/upload/temp'
467
+ let path = 'user/reportProblem'; // 'media/upload/temp'
404
468
  const endpoint = this.api.getEndpoint(path);
405
469
  return this.http.post(endpoint, params).pipe(map((res) => {
406
- console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
470
+ ////console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
407
471
  return res;
408
472
  }));
409
473
  }
@@ -411,7 +475,7 @@ export class DooleService {
411
475
  let path = 'user/email_verification';
412
476
  const endpoint = this.api.getEndpoint(path);
413
477
  return this.http.post(endpoint, params).pipe(map((res) => {
414
- console.log(`[DooleService] postAPIemailVerification(${path}) res: `, res);
478
+ ////console.log(`[DooleService] postAPIemailVerification(${path}) res: `, res);
415
479
  return res;
416
480
  }));
417
481
  }
@@ -419,16 +483,16 @@ export class DooleService {
419
483
  let path = 'user/resendTwoFactorCode';
420
484
  const endpoint = this.api.getEndpoint(path);
421
485
  return this.http.get(endpoint).pipe(map((res) => {
422
- console.log(`[DooleService] getAPICodeByEmail(${path}) res: `, res);
486
+ ////console.log(`[DooleService] getAPICodeByEmail(${path}) res: `, res);
423
487
  return res;
424
488
  }));
425
489
  }
426
490
  postAPIcodeVerification(params) {
427
491
  let path = 'user/verifyTwoFactor';
428
- //let path = 'user/codeVerification';
492
+ //let path = 'user/codeVerification';
429
493
  const endpoint = this.api.getEndpoint(path);
430
494
  return this.http.post(endpoint, params).pipe(map((res) => {
431
- console.log(`[DooleService] postAPIcodeVerification(${path}) res: `, res);
495
+ ////console.log(`[DooleService] postAPIcodeVerification(${path}) res: `, res);
432
496
  return res;
433
497
  }));
434
498
  }
@@ -436,7 +500,7 @@ export class DooleService {
436
500
  let path = 'center/healthCardTypes';
437
501
  const endpoint = this.api.getEndpoint(path);
438
502
  return this.http.get(endpoint).pipe(map((res) => {
439
- console.log(`[DooleService] getAPIhealthCardTypes(${path}) res: `, res);
503
+ ////console.log(`[DooleService] getAPIhealthCardTypes(${path}) res: `, res);
440
504
  return res;
441
505
  }));
442
506
  }
@@ -444,7 +508,7 @@ export class DooleService {
444
508
  let path = 'user/healthcards';
445
509
  const endpoint = this.api.getEndpoint(path);
446
510
  return this.http.get(endpoint).pipe(map((res) => {
447
- console.log(`[DooleService] getAPhealthCards(${path}) res: `, res);
511
+ ////console.log(`[DooleService] getAPhealthCards(${path}) res: `, res);
448
512
  return res;
449
513
  }));
450
514
  }
@@ -452,7 +516,7 @@ export class DooleService {
452
516
  let path = `user/healthcard/${id}`;
453
517
  const endpoint = this.api.getEndpoint(path);
454
518
  return this.http.get(endpoint).pipe(map((res) => {
455
- console.log(`[DooleService] getAPIhealthCard(${path}) res: `, res);
519
+ ////console.log(`[DooleService] getAPIhealthCard(${path}) res: `, res);
456
520
  return res;
457
521
  }));
458
522
  }
@@ -460,7 +524,7 @@ export class DooleService {
460
524
  let path = 'user/healthcard';
461
525
  const endpoint = this.api.getEndpoint(path);
462
526
  return this.http.post(endpoint, params).pipe(map((res) => {
463
- console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
527
+ ////console.log(`[DooleService] postAPIReportProblem(${path}) res: `, res);
464
528
  return res;
465
529
  }));
466
530
  }
@@ -468,7 +532,7 @@ export class DooleService {
468
532
  let path = `user/healthcard/${params.id}`;
469
533
  const endpoint = this.api.getEndpoint(path);
470
534
  return this.http.put(endpoint, params).pipe(map((res) => {
471
- console.log(`[DooleService] putAPIhealthCard(${path}) res: `, res);
535
+ ////console.log(`[DooleService] putAPIhealthCard(${path}) res: `, res);
472
536
  return res;
473
537
  }));
474
538
  }
@@ -476,7 +540,7 @@ export class DooleService {
476
540
  let path = `user/healthcard/${params.id}`;
477
541
  const endpoint = this.api.getEndpoint(path);
478
542
  return this.http.delete(endpoint).pipe(map((res) => {
479
- console.log(`[DooleService] deleteAPIhealthCard(${path}) res: ${res}`, JSON.stringify(res));
543
+ ////console.log(`[DooleService] deleteAPIhealthCard(${path}) res: ${res}`, JSON.stringify(res));
480
544
  return res;
481
545
  }));
482
546
  }
@@ -484,7 +548,7 @@ export class DooleService {
484
548
  let path = 'center/socialRelationType';
485
549
  const endpoint = this.api.getEndpoint(path);
486
550
  return this.http.get(endpoint).pipe(map((res) => {
487
- console.log(`[DooleService] getAPISocialRelationType(${path}) res: `, res);
551
+ ////console.log(`[DooleService] getAPISocialRelationType(${path}) res: `, res);
488
552
  return res;
489
553
  }));
490
554
  }
@@ -492,7 +556,7 @@ export class DooleService {
492
556
  let path = 'user/EmergencyContacts';
493
557
  const endpoint = this.api.getEndpoint(path);
494
558
  return this.http.get(endpoint).pipe(map((res) => {
495
- console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
559
+ ////console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
496
560
  return res;
497
561
  }));
498
562
  }
@@ -500,7 +564,7 @@ export class DooleService {
500
564
  let path = `user/EmergencyContact/${id}`;
501
565
  const endpoint = this.api.getEndpoint(path);
502
566
  return this.http.get(endpoint).pipe(map((res) => {
503
- console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
567
+ ////console.log(`[DooleService] getAPIemergencyContact(${path}) res: `, res);
504
568
  return res;
505
569
  }));
506
570
  }
@@ -508,16 +572,16 @@ export class DooleService {
508
572
  let path = 'user/EmergencyContact';
509
573
  const endpoint = this.api.getEndpoint(path);
510
574
  return this.http.post(endpoint, params).pipe(map((res) => {
511
- console.log(`[DooleService] postAPIemergencyContact(${path}) res: `, res);
575
+ ////console.log(`[DooleService] postAPIemergencyContact(${path}) res: `, res);
512
576
  return res;
513
577
  }));
514
578
  }
515
579
  putAPIemergencyContact(id, params) {
516
580
  let path = `user/EmergencyContact/${id}`;
517
- console.log('[DooleService] putAPIemergencyContact()', params);
581
+ ////console.log('[DooleService] putAPIemergencyContact()', params);
518
582
  const endpoint = this.api.getEndpoint(path);
519
583
  return this.http.put(endpoint, params).pipe(map((res) => {
520
- console.log(`[DooleService] putAPIemergencyContact(${path}) res: `, res);
584
+ ////console.log(`[DooleService] putAPIemergencyContact(${path}) res: `, res);
521
585
  return res;
522
586
  }));
523
587
  }
@@ -525,7 +589,7 @@ export class DooleService {
525
589
  let path = `user/EmergencyContact/${id}`;
526
590
  const endpoint = this.api.getEndpoint(path);
527
591
  return this.http.delete(endpoint).pipe(map((res) => {
528
- console.log(`[DooleService] deleteAPIemergencyContact(${path}) res: ${res}`, JSON.stringify(res));
592
+ ////console.log(`[DooleService] deleteAPIemergencyContact(${path}) res: ${res}`, JSON.stringify(res));
529
593
  return res;
530
594
  }));
531
595
  }
@@ -533,7 +597,7 @@ export class DooleService {
533
597
  let path = 'center/about';
534
598
  const endpoint = this.api.getEndpoint(path);
535
599
  return this.http.get(endpoint).pipe(map((res) => {
536
- console.log(`[DooleService] getAPIaboutUs(${path}) res: `, res);
600
+ ////console.log(`[DooleService] getAPIaboutUs(${path}) res: `, res);
537
601
  return res;
538
602
  }));
539
603
  }
@@ -541,7 +605,7 @@ export class DooleService {
541
605
  let path = 'user/agenda';
542
606
  const endpoint = this.api.getEndpoint(path);
543
607
  return this.http.get(endpoint).pipe(map((res) => {
544
- //console.log(`[DooleService] getAPIappointmentAgenda(${path}) res: `, res);
608
+ //////console.log(`[DooleService] getAPIappointmentAgenda(${path}) res: `, res);
545
609
  return res;
546
610
  }));
547
611
  }
@@ -550,7 +614,15 @@ export class DooleService {
550
614
  let path = 'user/diagnosticTests';
551
615
  const endpoint = this.api.getEndpoint(path);
552
616
  return this.http.get(endpoint).pipe(map((res) => {
553
- //console.log(`[DooleService] getAPIdiagnosticTests(${path}) res: `, res);
617
+ //////console.log(`[DooleService] getAPIdiagnosticTests(${path}) res: `, res);
618
+ return res;
619
+ }));
620
+ }
621
+ getAPIdiagnosticTestsLast() {
622
+ let path = 'user/diagnosticTests/last-done';
623
+ const endpoint = this.api.getEndpoint(path);
624
+ return this.http.get(endpoint).pipe(map((res) => {
625
+ //////console.log(`[DooleService] getAPIdiagnosticTests(${path}) res: `, res);
554
626
  return res;
555
627
  }));
556
628
  }
@@ -558,7 +630,7 @@ export class DooleService {
558
630
  let path = 'diagnosticTestTypes/available';
559
631
  const endpoint = this.api.getEndpoint(path);
560
632
  return this.http.get(endpoint).pipe(map((res) => {
561
- console.log(`[DooleService] getAPIdiagnosticTestTypesAvailable(${path}) res: `, res);
633
+ ////console.log(`[DooleService] getAPIdiagnosticTestTypesAvailable(${path}) res: `, res);
562
634
  return res;
563
635
  }));
564
636
  }
@@ -566,15 +638,16 @@ export class DooleService {
566
638
  let path = 'v2/user/diagnosticTest/' + id;
567
639
  const endpoint = this.api.getEndpoint(path);
568
640
  return this.http.get(endpoint).pipe(map((res) => {
569
- console.log(`[DooleService] getAPIdiagnosticTestID(${path}) res: `, res);
641
+ ////console.log(`[DooleService] getAPIdiagnosticTestID(${path}) res: `, res);
570
642
  return res;
571
643
  }));
572
644
  }
573
645
  postAPIdiagnosticTest(params) {
574
646
  let path = 'v2/user/diagnosticTests/';
575
647
  const endpoint = this.api.getEndpoint(path);
648
+ ////console.log("POST: ",params);
576
649
  return this.http.post(endpoint, params).pipe(map((res) => {
577
- console.log(`[DooleService] postAPIdiagnosticTest(${path}) res: `, res);
650
+ ////console.log(`[DooleService] postAPIdiagnosticTest(${path}) res: `, res);
578
651
  return res;
579
652
  }));
580
653
  }
@@ -582,7 +655,7 @@ export class DooleService {
582
655
  let path = `user/diagnosticTest/${id}`;
583
656
  const endpoint = this.api.getEndpoint(path);
584
657
  return this.http.put(endpoint, params).pipe(map((res) => {
585
- console.log(`[DooleService] putAPIdiagnosticTest(${path}) res: `, res);
658
+ ////console.log(`[DooleService] putAPIdiagnosticTest(${path}) res: `, res);
586
659
  return res;
587
660
  }));
588
661
  }
@@ -590,7 +663,7 @@ export class DooleService {
590
663
  let path = `user/diagnosticTest/${id}`;
591
664
  const endpoint = this.api.getEndpoint(path);
592
665
  return this.http.delete(endpoint).pipe(map((res) => {
593
- console.log(`[DooleService] deleteAPIdiagnosticTest(${path}) res: ${res}`, JSON.stringify(res));
666
+ ////console.log(`[DooleService] deleteAPIdiagnosticTest(${path}) res: ${res}`, JSON.stringify(res));
594
667
  return res;
595
668
  }));
596
669
  }
@@ -609,16 +682,60 @@ export class DooleService {
609
682
  }
610
683
  }
611
684
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
612
- console.log(`[DooleService] getAPIfilteredDiagnosticTest(${path}) res: `, res);
685
+ ////console.log(`[DooleService] getAPIfilteredDiagnosticTest(${path}) res: `, res);
686
+ return res;
687
+ }));
688
+ }
689
+ getAPIformPending(params) {
690
+ let path = 'forms/pending/user';
691
+ const endpoint = this.api.getEndpoint(path);
692
+ return this.http.post(endpoint, params).pipe(map((res) => {
693
+ //////console.log(`[DooleService] getAPIformPending(${path}) res: `, res);
613
694
  return res;
614
695
  }));
615
696
  }
616
697
  //forms-Tracking
698
+ getAPISharedcareFormList(patient) {
699
+ let path = `/rehabilify/sharedcareplan/monitoring/${patient}`;
700
+ const endpoint = this.api.getEndpoint(path);
701
+ return this.http.get(endpoint).pipe(map((res) => {
702
+ //////console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
703
+ return res;
704
+ }));
705
+ }
617
706
  getAPIformLists() {
618
707
  let path = 'forms/user';
619
708
  const endpoint = this.api.getEndpoint(path);
620
709
  return this.http.get(endpoint).pipe(map((res) => {
621
- console.log(`[DooleService] getAPIformLists(${path}) res: `, res);
710
+ ////console.log(`[DooleService] getAPIformLists(${path}) res: `, res);
711
+ return res;
712
+ }));
713
+ }
714
+ getAPIFormJSON(form, params) {
715
+ let path = `form/${form}/formFields`;
716
+ let httpParams = new HttpParams();
717
+ httpParams = (params?.formAnswer) ? httpParams.append('formAnswer', params?.formAnswer) : httpParams;
718
+ httpParams = (params?.game_play_id) ? httpParams.append('game_play_id', params?.game_play_id) : httpParams;
719
+ httpParams = (params?.started_app) ? httpParams.append('started_app', params?.started_app) : httpParams;
720
+ const endpoint = this.api.getEndpoint(path);
721
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
722
+ //////console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
723
+ return res;
724
+ }));
725
+ }
726
+ postAPIFormJSON(form, params) {
727
+ let path = `formfield/conditional/${form}/field/${params.formField}`;
728
+ const endpoint = this.api.getEndpoint(path);
729
+ return this.http.post(endpoint, params).pipe(map((res) => {
730
+ //////console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
731
+ return res;
732
+ }));
733
+ }
734
+ postAPIFormFill(params) {
735
+ let path = `form/fill/`;
736
+ const endpoint = this.api.getEndpoint(path);
737
+ return this.http.post(endpoint, params).pipe(map((res) => {
738
+ //////console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
622
739
  return res;
623
740
  }));
624
741
  }
@@ -631,7 +748,7 @@ export class DooleService {
631
748
  httpParams = (filter?.filter) ? httpParams.append('filter', filter?.filter) : httpParams;
632
749
  const endpoint = this.api.getEndpoint(path);
633
750
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
634
- console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
751
+ ////console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
635
752
  return res;
636
753
  }));
637
754
  }
@@ -643,7 +760,20 @@ export class DooleService {
643
760
  httpParams = httpParams.append('filter', '1');
644
761
  const endpoint = this.api.getEndpoint(path);
645
762
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
646
- //console.log(`[DooleService] getAPIelementsListByDate(${path}) res: `, res);
763
+ //////console.log(`[DooleService] getAPIelementsListByDate(${path}) res: `, res);
764
+ return res;
765
+ }));
766
+ }
767
+ getAPIelementsByGroup(filter) {
768
+ let path = 'center/elementGroup/elements';
769
+ let httpParams = new HttpParams();
770
+ if (filter == '1' || filter == '0')
771
+ httpParams = httpParams.append('filter', filter);
772
+ else
773
+ httpParams = httpParams.append('filter', '1');
774
+ const endpoint = this.api.getEndpoint(path);
775
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
776
+ //////console.log(`[DooleService] getAPIelementsListByDate(${path}) res: `, res);
647
777
  return res;
648
778
  }));
649
779
  }
@@ -651,7 +781,7 @@ export class DooleService {
651
781
  let path = 'user/element/' + id + '/value/add';
652
782
  const endpoint = this.api.getEndpoint(path);
653
783
  return this.http.post(endpoint, params).pipe(map((res) => {
654
- //console.log(`[DooleService] postAPIaddElement(${path}) res: `, res);
784
+ //////console.log(`[DooleService] postAPIaddElement(${path}) res: `, res);
655
785
  return res;
656
786
  }));
657
787
  }
@@ -661,7 +791,7 @@ export class DooleService {
661
791
  httpParams = (query) ? httpParams.append('interval', query) : httpParams;
662
792
  const endpoint = this.api.getEndpoint(path);
663
793
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
664
- //console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
794
+ //////console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
665
795
  return res;
666
796
  }));
667
797
  }
@@ -674,7 +804,7 @@ export class DooleService {
674
804
  httpParams = (params?.version) ? httpParams.append('version', params?.version) : httpParams;
675
805
  const endpoint = this.api.getEndpoint(path);
676
806
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
677
- //console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
807
+ //////console.log(`[DooleService] getAPIgraphicsElement(${path}) res: `, res);
678
808
  return res;
679
809
  }));
680
810
  }
@@ -682,7 +812,7 @@ export class DooleService {
682
812
  let path = `element/available/${id}`;
683
813
  const endpoint = this.api.getEndpoint(path);
684
814
  return this.http.get(endpoint).pipe(map((res) => {
685
- //console.log(`[DooleService] getAPIelementAvailableID(${path}) res: `, res);
815
+ //////console.log(`[DooleService] getAPIelementAvailableID(${path}) res: `, res);
686
816
  return res;
687
817
  }));
688
818
  }
@@ -690,7 +820,7 @@ export class DooleService {
690
820
  let path = 'user/element_category';
691
821
  const endpoint = this.api.getEndpoint(path);
692
822
  return this.http.get(endpoint).pipe(map((res) => {
693
- //console.log(`[DooleService] getAPIcategory(${path}) res: `, res);
823
+ //////console.log(`[DooleService] getAPIcategory(${path}) res: `, res);
694
824
  return res;
695
825
  }));
696
826
  }
@@ -700,17 +830,25 @@ export class DooleService {
700
830
  httpParams = (filter) ? httpParams.append('filter', filter) : httpParams;
701
831
  const endpoint = this.api.getEndpoint(path);
702
832
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
703
- //console.log(`[DooleService] getAPIelementGroupID(${path}) res: `, res);
833
+ //////console.log(`[DooleService] getAPIelementGroupID(${path}) res: `, res);
704
834
  return res;
705
835
  }));
706
836
  }
707
837
  searchAPIelementGroup(params) {
838
+ let path = 'center/elementGroups';
839
+ const endpoint = this.api.getEndpoint(path);
840
+ return this.http.post(endpoint, params).pipe(map((res) => {
841
+ //////console.log(`[DooleService] searchAPIelementGroup(${path}) res: `, res);
842
+ return res;
843
+ }));
844
+ }
845
+ getAPIelementGroup(params) {
708
846
  let path = 'center/elementGroups';
709
847
  let httpParams = new HttpParams();
710
848
  httpParams = (params?.filter) ? httpParams.append('filter', params?.filter) : httpParams;
711
849
  const endpoint = this.api.getEndpoint(path);
712
850
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
713
- //console.log(`[DooleService] getAPIelementGroup(${path}) res: `, res);
851
+ //////console.log(`[DooleService] getAPIelementGroup(${path}) res: `, res);
714
852
  return res;
715
853
  }));
716
854
  }
@@ -719,10 +857,36 @@ export class DooleService {
719
857
  let path = 'user/diets';
720
858
  const endpoint = this.api.getEndpoint(path);
721
859
  return this.http.get(endpoint).pipe(map((res) => {
722
- //console.log(`[DooleService] getAPIlistDietsByDate(${path}) res: `, res);
860
+ //////console.log(`[DooleService] getAPIlistDietsByDate(${path}) res: `, res);
723
861
  return res;
724
862
  }));
725
863
  }
864
+ getAPIListRecipe(params) {
865
+ let path = `user/diets/receipts`;
866
+ const endpoint = this.api.getEndpoint(path);
867
+ let httpParams = new HttpParams()
868
+ .set('tags', params.tags)
869
+ .set('interactions', params.interactions)
870
+ .set('readingTime', params.readingTime)
871
+ .set('from_date', params.from_date)
872
+ .set('to_date', params.to_date);
873
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
874
+ //////console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
875
+ return res;
876
+ }));
877
+ }
878
+ /*getAPIdietsByDate(date: any): Observable<any> {
879
+ let path = `user/dietaryIntakes`
880
+ let httpParams = new HttpParams();
881
+ httpParams = (date) ? httpParams.append('date', date) : httpParams
882
+ const endpoint = this.api.getEndpoint(path);
883
+ return this.http.get(endpoint, httpParams).pipe(
884
+ map((res: any) => {
885
+ //////console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
886
+ return res;
887
+ })
888
+ );
889
+ }*/
726
890
  getAPIdietsByDate(params) {
727
891
  let path = `user/dietaryIntakes`;
728
892
  let httpParams = new HttpParams();
@@ -730,7 +894,18 @@ export class DooleService {
730
894
  httpParams = (params?.grouped_by_times) ? httpParams.append('grouped_by_times', params.grouped_by_times) : httpParams;
731
895
  const endpoint = this.api.getEndpoint(path);
732
896
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
733
- //console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
897
+ //////console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
898
+ return res;
899
+ }));
900
+ }
901
+ getAPIFormsByDate(params) {
902
+ let path = `rehabilify/sharedcareplan/forms`;
903
+ let httpParams = new HttpParams();
904
+ httpParams = (params?.date) ? httpParams.append('date', params.date) : httpParams;
905
+ httpParams = (params?.grouped_by_times) ? httpParams.append('grouped_by_times', params.grouped_by_times) : httpParams;
906
+ const endpoint = this.api.getEndpoint(path);
907
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
908
+ //////console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
734
909
  return res;
735
910
  }));
736
911
  }
@@ -738,7 +913,7 @@ export class DooleService {
738
913
  let path = `diet/${id}`;
739
914
  const endpoint = this.api.getEndpoint(path);
740
915
  return this.http.get(endpoint).pipe(map((res) => {
741
- //console.log(`[DooleService] getAPIdetailDiets(${path}) res: `, res);
916
+ //////console.log(`[DooleService] getAPIdetailDiets(${path}) res: `, res);
742
917
  return res;
743
918
  }));
744
919
  }
@@ -746,7 +921,31 @@ export class DooleService {
746
921
  let path = `diet/receipt/${id}`;
747
922
  const endpoint = this.api.getEndpoint(path);
748
923
  return this.http.get(endpoint).pipe(map((res) => {
749
- //console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
924
+ //////console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
925
+ return res;
926
+ }));
927
+ }
928
+ getAPIlistTestimonials(params) {
929
+ let path = `user/testimonials`;
930
+ const endpoint = this.api.getEndpoint(path);
931
+ let httpParams = new HttpParams()
932
+ .set('tags', params.tags)
933
+ .set('interactions', params.interactions)
934
+ .set('readingTime', params.readingTime);
935
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
936
+ //////console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
937
+ return res;
938
+ }));
939
+ }
940
+ getAPIdetailTestimonial(id, params) {
941
+ let path = `user/testimony/${id}`;
942
+ const endpoint = this.api.getEndpoint(path);
943
+ let httpParams = new HttpParams()
944
+ .set('tags', params.tags)
945
+ .set('interactions', params.interactions)
946
+ .set('readingTime', params.readingTime);
947
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
948
+ ////console.log(`[DooleService] getAPIdetailRecipe(${path}) res: `, res);
750
949
  return res;
751
950
  }));
752
951
  }
@@ -759,16 +958,20 @@ export class DooleService {
759
958
  .set('interactions', params.interactions)
760
959
  .set('readingTime', params.readingTime);
761
960
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
762
- //console.log(`[DooleService] getAPIlistAdvices(${path}) res: `, res);
961
+ //////console.log(`[DooleService] getAPIlistAdvices(${path}) res: `, res);
763
962
  return res;
764
963
  }));
765
964
  }
766
965
  /** get news **/
767
- getAPIlistNews() {
966
+ getAPIlistNews(params) {
768
967
  let path = 'user/news';
769
968
  const endpoint = this.api.getEndpoint(path);
770
- return this.http.get(endpoint).pipe(map((res) => {
771
- //console.log(`[DooleService] getAPIlistNews(${path}) res: `, res);
969
+ let httpParams = new HttpParams()
970
+ .set('tags', params.tags)
971
+ .set('interactions', params.interactions)
972
+ .set('readingTime', params.readingTime);
973
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
974
+ //////console.log(`[DooleService] getAPIlistNews(${path}) res: `, res);
772
975
  return res;
773
976
  }));
774
977
  }
@@ -776,25 +979,28 @@ export class DooleService {
776
979
  let path = `user/new/${id}`;
777
980
  const endpoint = this.api.getEndpoint(path);
778
981
  return this.http.get(endpoint).pipe(map((res) => {
779
- //console.log(`[DooleService] getAPIdetailNew(${path}) res: `, res);
982
+ //////console.log(`[DooleService] getAPIdetailNew(${path}) res: `, res);
780
983
  return res;
781
984
  }));
782
985
  }
783
- getAPISearchNews(query) {
784
- let path = 'news';
785
- let httpParams = new HttpParams();
786
- httpParams = (query) ? httpParams.append('search', query) : httpParams;
986
+ getAPIdetailAdvices(id) {
987
+ let path = `advice/${id}`;
787
988
  const endpoint = this.api.getEndpoint(path);
788
- return this.http.get(endpoint, httpParams).pipe(map((res) => {
789
- //console.log(`[DooleService] getAPISearchNews(${path}) res: `, res);
989
+ return this.http.get(endpoint).pipe(map((res) => {
990
+ //////console.log(`[DooleService] getAPIdetailAdvices(${path}) res: `, res);
790
991
  return res;
791
992
  }));
792
993
  }
793
- getAPIAppLatestVersion(version, platform) {
794
- let path = 'app/versions/must-update?version=' + version + '&platform=' + platform;
795
- console.log(path);
994
+ getAPISearchNews(query, params) {
995
+ let path = 'news';
996
+ let httpParams = new HttpParams()
997
+ .set('tags', params.tags)
998
+ .set('interactions', params.interactions)
999
+ .set('readingTime', params.readingTime);
1000
+ httpParams = (query) ? httpParams.append('search', query) : httpParams;
796
1001
  const endpoint = this.api.getEndpoint(path);
797
- return this.http.get(endpoint).pipe(map((res) => {
1002
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1003
+ //////console.log(`[DooleService] getAPISearchNews(${path}) res: `, res);
798
1004
  return res;
799
1005
  }));
800
1006
  }
@@ -804,15 +1010,7 @@ export class DooleService {
804
1010
  httpParams = (query) ? httpParams.append('search', query) : httpParams;
805
1011
  const endpoint = this.api.getEndpoint(path);
806
1012
  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);
1013
+ ////console.log(`[DooleService] getAPISearchAdvices(${path}) res: `, res);
816
1014
  return res;
817
1015
  }));
818
1016
  }
@@ -822,7 +1020,17 @@ export class DooleService {
822
1020
  httpParams = (query) ? httpParams.append('search', query) : httpParams;
823
1021
  const endpoint = this.api.getEndpoint(path);
824
1022
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
825
- //console.log(`[DooleService] getAPIdrugsList(${path}) res: `, res);
1023
+ //////console.log(`[DooleService] getAPIdrugsList(${path}) res: `, res);
1024
+ return res;
1025
+ }));
1026
+ }
1027
+ getAPIdrugsListInteraction(query) {
1028
+ const endpoint = `https://n6ibaazevnsixfcs4prl7z7wra0oonma.lambda-url.eu-central-1.on.aws/`;
1029
+ // const endpoint = `https://n6ibaazevnsixfcs4prl7z7wra0oonma.lambda-url.eu-central-1.on.aws/?drug=DB01363`;
1030
+ //let httpParams = new HttpParams().set('drug', query);
1031
+ let httpParams = new HttpParams()
1032
+ .set('drug', query);
1033
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
826
1034
  return res;
827
1035
  }));
828
1036
  }
@@ -830,7 +1038,7 @@ export class DooleService {
830
1038
  let path = 'user/drugIntake/date';
831
1039
  const endpoint = this.api.getEndpoint(path);
832
1040
  return this.http.post(endpoint, params).pipe(map((res) => {
833
- //console.log(`[DooleService] getAPIdrugIntakeByDate(${path}) res: `, res);
1041
+ //////console.log(`[DooleService] getAPIdrugIntakeByDate(${path}) res: `, res);
834
1042
  return res;
835
1043
  }));
836
1044
  }
@@ -841,7 +1049,7 @@ export class DooleService {
841
1049
  httpParams = (query) ? httpParams.append('search', query) : httpParams;
842
1050
  const endpoint = this.api.getEndpoint(path);
843
1051
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
844
- console.log(`[DooleService] getAPImedicationList(${path}) res: `, res);
1052
+ ////console.log(`[DooleService] getAPImedicationList(${path}) res: `, res);
845
1053
  return res;
846
1054
  }));
847
1055
  }
@@ -851,7 +1059,7 @@ export class DooleService {
851
1059
  // httpParams = (query) ? httpParams.append('search', query) : httpParams
852
1060
  const endpoint = this.api.getEndpoint(path);
853
1061
  return this.http.get(endpoint).pipe(map((res) => {
854
- console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
1062
+ ////console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
855
1063
  return res;
856
1064
  }));
857
1065
  }
@@ -861,7 +1069,7 @@ export class DooleService {
861
1069
  // httpParams = (query) ? httpParams.append('search', query) : httpParams
862
1070
  const endpoint = this.api.getEndpoint(path);
863
1071
  return this.http.get(endpoint).pipe(map((res) => {
864
- console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
1072
+ ////console.log(`[DooleService] getAPIdirectionList(${path}) res: `, res);
865
1073
  return res;
866
1074
  }));
867
1075
  }
@@ -869,7 +1077,7 @@ export class DooleService {
869
1077
  let path = 'user/address';
870
1078
  const endpoint = this.api.getEndpoint(path);
871
1079
  return this.http.post(endpoint, params).pipe(map((res) => {
872
- console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
1080
+ ////console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
873
1081
  return res;
874
1082
  }));
875
1083
  }
@@ -877,7 +1085,7 @@ export class DooleService {
877
1085
  let path = `user/address/${id}`;
878
1086
  const endpoint = this.api.getEndpoint(path);
879
1087
  return this.http.put(endpoint, params).pipe(map((res) => {
880
- //console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
1088
+ //////console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
881
1089
  return res;
882
1090
  }));
883
1091
  }
@@ -885,7 +1093,7 @@ export class DooleService {
885
1093
  let path = `user/address/${id}`;
886
1094
  const endpoint = this.api.getEndpoint(path);
887
1095
  return this.http.delete(endpoint).pipe(map((res) => {
888
- //console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
1096
+ //////console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
889
1097
  return res;
890
1098
  }));
891
1099
  }
@@ -893,7 +1101,7 @@ export class DooleService {
893
1101
  let path = 'sendmedication';
894
1102
  const endpoint = this.api.getEndpoint(path);
895
1103
  return this.http.post(endpoint, params).pipe(map((res) => {
896
- console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
1104
+ ////console.log(`[DooleService] postAPIsendDirection(${path}) res: `, res);
897
1105
  return res;
898
1106
  }));
899
1107
  }
@@ -901,7 +1109,7 @@ export class DooleService {
901
1109
  let path = 'user/drugIntake';
902
1110
  const endpoint = this.api.getEndpoint(path);
903
1111
  return this.http.post(endpoint, params).pipe(map((res) => {
904
- //console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1112
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
905
1113
  return res;
906
1114
  }));
907
1115
  }
@@ -909,7 +1117,7 @@ export class DooleService {
909
1117
  let path = `user/drugIntake/${id}/set/${state}`;
910
1118
  const endpoint = this.api.getEndpoint(path);
911
1119
  return this.http.post(endpoint).pipe(map((res) => {
912
- //console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1120
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
913
1121
  return res;
914
1122
  }));
915
1123
  }
@@ -917,7 +1125,7 @@ export class DooleService {
917
1125
  let path = `user/medicationPlan`;
918
1126
  const endpoint = this.api.getEndpoint(path);
919
1127
  return this.http.post(endpoint, params).pipe(map((res) => {
920
- //console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1128
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
921
1129
  return res;
922
1130
  }));
923
1131
  }
@@ -925,7 +1133,7 @@ export class DooleService {
925
1133
  let path = `user/medicationPlan/${id}`;
926
1134
  const endpoint = this.api.getEndpoint(path);
927
1135
  return this.http.put(endpoint, params).pipe(map((res) => {
928
- //console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
1136
+ //////console.log(`[DooleService] putAPIdrugIntake(${path}) res: `, res);
929
1137
  return res;
930
1138
  }));
931
1139
  }
@@ -933,7 +1141,7 @@ export class DooleService {
933
1141
  let path = `user/medicationPlan/${id}`;
934
1142
  const endpoint = this.api.getEndpoint(path);
935
1143
  return this.http.delete(endpoint).pipe(map((res) => {
936
- //console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
1144
+ //////console.log(`[DooleService] deleteAPImedicationPlan(${path}) res: ${res}`, JSON.stringify(res));
937
1145
  return res;
938
1146
  }));
939
1147
  }
@@ -941,7 +1149,113 @@ export class DooleService {
941
1149
  let path = `user/medicationPlan/${id}`;
942
1150
  const endpoint = this.api.getEndpoint(path);
943
1151
  return this.http.get(endpoint).pipe(map((res) => {
944
- //console.log(`[DooleService] getAPImedicationPlan(${path}) res: `, res);
1152
+ //////console.log(`[DooleService] getAPImedicationPlan(${path}) res: `, res);
1153
+ return res;
1154
+ }));
1155
+ }
1156
+ getAPImedicationPlans(params) {
1157
+ let path = `user/medicationPlans`;
1158
+ let httpParams = new HttpParams();
1159
+ httpParams = (params?.onDate === 0 || params?.onDate === 1) ? httpParams.append('onDate', params?.onDate) : httpParams;
1160
+ httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
1161
+ httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
1162
+ const endpoint = this.api.getEndpoint(path);
1163
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1164
+ ////console.log(`[DooleService] getAPImedicationPlan(${path}) res: `, res);
1165
+ return res;
1166
+ }));
1167
+ }
1168
+ //todos los medicamentos asignados a esa persona
1169
+ getAPImedicationAlls() {
1170
+ let path = `user/medicationPlans`;
1171
+ const endpoint = this.api.getEndpoint(path);
1172
+ return this.http.get(endpoint).pipe(map((res) => {
1173
+ ////console.log(`[DooleService] getAPImedicationPlan(${path}) res: `, res);
1174
+ return res;
1175
+ }));
1176
+ }
1177
+ // activatePendingMedicationPlans
1178
+ getAPIPendingMedicationPlans(params) {
1179
+ let path = `user/pending/medicationPlans`;
1180
+ let httpParams = new HttpParams();
1181
+ httpParams = (params?.onlyCount === 1 || params?.onlyCount === 0) ? httpParams.append('onlyCount', params?.onlyCount) : httpParams;
1182
+ httpParams = (params?.onlyCount === undefined) ? httpParams.append('onlyCount', '0') : httpParams;
1183
+ const endpoint = this.api.getEndpoint(path);
1184
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1185
+ ////console.log(`[DooleService] getAPIPendingMedicationPlans(${path}) res: `, res);
1186
+ return res;
1187
+ }));
1188
+ }
1189
+ getAPIFrequenciesMedicationPlansHPC(params) {
1190
+ let path = `hpc/medicationPlan/frequencies`;
1191
+ let httpParams = new HttpParams();
1192
+ const endpoint = this.api.getEndpoint(path);
1193
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1194
+ ////console.log(`[DooleService] getAPIFrequenciesMedicationPlansHPC(${path}) res: `, res);
1195
+ return res;
1196
+ }));
1197
+ }
1198
+ getAPIDrugUnits(id, search) {
1199
+ let path = `drug/${id}/units`;
1200
+ let httpParams = new HttpParams();
1201
+ httpParams = search ? httpParams.append('search', search) : httpParams;
1202
+ const endpoint = this.api.getEndpoint(path);
1203
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1204
+ ////console.log(`[DooleService] getAPIDrugUnits(${path}) res: `, res);
1205
+ return res;
1206
+ }));
1207
+ }
1208
+ getAPIDiagnostic(params) {
1209
+ let path = 'user/diagnostics'; //'v2/diagnostic/user';
1210
+ let httpParams = new HttpParams();
1211
+ httpParams = (params?.onDate === 0 || params?.onDate === 1) ? httpParams.append('onDate', params?.onDate) : httpParams;
1212
+ httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
1213
+ httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
1214
+ const endpoint = this.api.getEndpoint(path);
1215
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1216
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1217
+ return res;
1218
+ }));
1219
+ }
1220
+ getAPICenterAllergies(search) {
1221
+ let path = 'center/allergies';
1222
+ let httpParams = new HttpParams();
1223
+ httpParams = (search) ? httpParams.append('search', search) : httpParams;
1224
+ const endpoint = this.api.getEndpoint(path);
1225
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1226
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1227
+ return res;
1228
+ }));
1229
+ }
1230
+ getAPIAllergies() {
1231
+ let path = 'user/allergies';
1232
+ const endpoint = this.api.getEndpoint(path);
1233
+ return this.http.get(endpoint).pipe(map((res) => {
1234
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1235
+ return res;
1236
+ }));
1237
+ }
1238
+ postAPIAllergies(params) {
1239
+ let path = `user/allergy/create`;
1240
+ const endpoint = this.api.getEndpoint(path);
1241
+ return this.http.post(endpoint, params).pipe(map((res) => {
1242
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1243
+ return res;
1244
+ }));
1245
+ }
1246
+ putAPIAllergy(id, params) {
1247
+ let path = `user/allergy/${id}`;
1248
+ const endpoint = this.api.getEndpoint(path);
1249
+ return this.http.put(endpoint, params).pipe(map((res) => {
1250
+ //////console.log(`[DooleService] putAPIAllergy(${path}) res: `, res);
1251
+ return res;
1252
+ }));
1253
+ }
1254
+ deleteAPIAllergy(id) {
1255
+ let path = `user/allergy/${id}`;
1256
+ const endpoint = this.api.getEndpoint(path);
1257
+ return this.http.delete(endpoint).pipe(map((res) => {
1258
+ ////console.log(`[DooleService] deleteAPIAllergy(${path}) res: ${res}`, JSON.stringify(res));
945
1259
  return res;
946
1260
  }));
947
1261
  }
@@ -949,7 +1263,7 @@ export class DooleService {
949
1263
  let path = 'user/games';
950
1264
  const endpoint = this.api.getEndpoint(path);
951
1265
  return this.http.get(endpoint).pipe(map((res) => {
952
- //console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1266
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
953
1267
  return res;
954
1268
  }));
955
1269
  }
@@ -961,7 +1275,7 @@ export class DooleService {
961
1275
  httpParams = (to_date) ? httpParams.append('to_date', to_date) : httpParams;
962
1276
  const endpoint = this.api.getEndpoint(path);
963
1277
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
964
- //console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1278
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
965
1279
  return res;
966
1280
  }));
967
1281
  }
@@ -969,7 +1283,7 @@ export class DooleService {
969
1283
  let path = `user/game/${id}`;
970
1284
  const endpoint = this.api.getEndpoint(path);
971
1285
  return this.http.get(endpoint).pipe(map((res) => {
972
- //console.log(`[DooleService] getAPIgameId(${path}) res: `, res);
1286
+ //////console.log(`[DooleService] getAPIgameId(${path}) res: `, res);
973
1287
  return res;
974
1288
  }));
975
1289
  }
@@ -977,10 +1291,12 @@ export class DooleService {
977
1291
  let path = 'user/agenda';
978
1292
  const endpoint = this.api.getEndpoint(path);
979
1293
  return this.http.get(endpoint).pipe(map((res) => {
980
- //console.log(`[DooleService] getAPIagenda(${path}) res: `, res);
1294
+ //////console.log(`[DooleService] getAPIagenda(${path}) res: `, res);
981
1295
  return res;
982
1296
  }));
983
1297
  }
1298
+ //reminders
1299
+ //user/reminder
984
1300
  getAPIallAgenda(params) {
985
1301
  let path = 'user/agenda/v2';
986
1302
  let httpParams = new HttpParams();
@@ -991,7 +1307,7 @@ export class DooleService {
991
1307
  httpParams = (params?.order != undefined) ? httpParams.append('order', params?.order) : httpParams;
992
1308
  const endpoint = this.api.getEndpoint(path);
993
1309
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
994
- console.log(`[DooleService] getAPIappointmentAgendaV2(${path}) res: `, res);
1310
+ ////console.log(`[DooleService] getAPIappointmentAgendaV2(${path}) res: `, res);
995
1311
  return res;
996
1312
  }));
997
1313
  }
@@ -999,7 +1315,7 @@ export class DooleService {
999
1315
  let path = `user/agenda/${id}`;
1000
1316
  const endpoint = this.api.getEndpoint(path);
1001
1317
  return this.http.get(endpoint).pipe(map((res) => {
1002
- //console.log(`[DooleService] getAPIagendaID(${path}) res: `, res);
1318
+ //////console.log(`[DooleService] getAPIagendaID(${path}) res: `, res);
1003
1319
  return res;
1004
1320
  }));
1005
1321
  }
@@ -1007,7 +1323,7 @@ export class DooleService {
1007
1323
  let path = 'user/agenda/';
1008
1324
  const endpoint = this.api.getEndpoint(path);
1009
1325
  return this.http.post(endpoint, params).pipe(map((res) => {
1010
- //console.log(`[DooleService] postAPIaddAgenda(${path}) res: `, res);
1326
+ //////console.log(`[DooleService] postAPIaddAgenda(${path}) res: `, res);
1011
1327
  return res;
1012
1328
  }));
1013
1329
  }
@@ -1016,7 +1332,7 @@ export class DooleService {
1016
1332
  let path = 'user/agenda/delete';
1017
1333
  const endpoint = this.api.getEndpoint(path);
1018
1334
  return this.http.post(endpoint, params).pipe(map((res) => {
1019
- //console.log(`[DooleService] deleteAPIaddAgenda(${path}) res: `, res);
1335
+ //////console.log(`[DooleService] deleteAPIaddAgenda(${path}) res: `, res);
1020
1336
  return res;
1021
1337
  }));
1022
1338
  }
@@ -1024,7 +1340,7 @@ export class DooleService {
1024
1340
  let path = `user/agenda/${id}`;
1025
1341
  const endpoint = this.api.getEndpoint(path);
1026
1342
  return this.http.put(endpoint, params).pipe(map((res) => {
1027
- //console.log(`[DooleService] putAPIagenda(${path}) res: `, res);
1343
+ //////console.log(`[DooleService] putAPIagenda(${path}) res: `, res);
1028
1344
  return res;
1029
1345
  }));
1030
1346
  }
@@ -1034,7 +1350,7 @@ export class DooleService {
1034
1350
  let httpParams = new HttpParams();
1035
1351
  httpParams = httpParams.append('withDepartments', '1');
1036
1352
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
1037
- console.log(`[DooleService] getAPIallowedContacts(${path}) res: `, res);
1353
+ ////console.log(`[DooleService] getAPIallowedContacts(${path}) res: `, res);
1038
1354
  let allowed = res.allowed;
1039
1355
  if (res.allowed === undefined)
1040
1356
  allowed = [];
@@ -1045,7 +1361,7 @@ export class DooleService {
1045
1361
  let path = `staff/${id}`;
1046
1362
  const endpoint = this.api.getEndpoint(path);
1047
1363
  return this.http.get(endpoint).pipe(map((res) => {
1048
- //console.log(`[DooleService] getAPIstaffId(${path}) res: `, res);
1364
+ //////console.log(`[DooleService] getAPIstaffId(${path}) res: `, res);
1049
1365
  return res;
1050
1366
  }));
1051
1367
  }
@@ -1054,7 +1370,7 @@ export class DooleService {
1054
1370
  let path = 'message/user';
1055
1371
  const endpoint = this.api.getEndpoint(path);
1056
1372
  return this.http.get(endpoint).pipe(map((res) => {
1057
- console.log(`[DooleService] getAPIUserMessages(${path}) res: `, res);
1373
+ ////console.log(`[DooleService] getAPIUserMessages(${path}) res: `, res);
1058
1374
  if (res.length == 0)
1059
1375
  return res;
1060
1376
  return res.messages;
@@ -1077,7 +1393,7 @@ export class DooleService {
1077
1393
  let path = 'user/reminder';
1078
1394
  const endpoint = this.api.getEndpoint(path);
1079
1395
  return this.http.get(endpoint).pipe(map((res) => {
1080
- //console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
1396
+ //////console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
1081
1397
  return res;
1082
1398
  }));
1083
1399
  }
@@ -1085,7 +1401,7 @@ export class DooleService {
1085
1401
  let path = `user/reminder/${id}`;
1086
1402
  const endpoint = this.api.getEndpoint(path);
1087
1403
  return this.http.get(endpoint).pipe(map((res) => {
1088
- //console.log(`[DooleService] getAPIreminderID(${path}) res: `, res);
1404
+ //////console.log(`[DooleService] getAPIreminderID(${path}) res: `, res);
1089
1405
  return res;
1090
1406
  }));
1091
1407
  }
@@ -1093,7 +1409,7 @@ export class DooleService {
1093
1409
  let path = 'user/reminder/';
1094
1410
  const endpoint = this.api.getEndpoint(path);
1095
1411
  return this.http.post(endpoint, params).pipe(map((res) => {
1096
- //console.log(`[DooleService] postAPIaddReminder(${path}) res: `, res);
1412
+ //////console.log(`[DooleService] postAPIaddReminder(${path}) res: `, res);
1097
1413
  return res;
1098
1414
  }));
1099
1415
  }
@@ -1101,7 +1417,7 @@ export class DooleService {
1101
1417
  let path = `user/reminder/${id}`;
1102
1418
  const endpoint = this.api.getEndpoint(path);
1103
1419
  return this.http.delete(endpoint).pipe(map((res) => {
1104
- //console.log(`[DooleService] deleteAPIReminder(${path}) res: ${res}`, JSON.stringify(res));
1420
+ //////console.log(`[DooleService] deleteAPIReminder(${path}) res: ${res}`, JSON.stringify(res));
1105
1421
  return res;
1106
1422
  }));
1107
1423
  }
@@ -1109,7 +1425,7 @@ export class DooleService {
1109
1425
  let path = `user/reminder/${id}`;
1110
1426
  const endpoint = this.api.getEndpoint(path);
1111
1427
  return this.http.put(endpoint, params).pipe(map((res) => {
1112
- //console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1428
+ //////console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1113
1429
  return res;
1114
1430
  }));
1115
1431
  }
@@ -1117,101 +1433,119 @@ export class DooleService {
1117
1433
  let path = `user`;
1118
1434
  const endpoint = this.api.getEndpoint(path);
1119
1435
  return this.http.put(endpoint, params).pipe(map((res) => {
1120
- //console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1436
+ //////console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1121
1437
  return res;
1122
1438
  }));
1123
1439
  }
1124
- updateAPIImageuser(params) {
1125
- let path = `user/image`;
1440
+ postAPIContentStatus(params) {
1441
+ let path = 'content/status';
1126
1442
  const endpoint = this.api.getEndpoint(path);
1127
- return this.http.put(endpoint, params).pipe(map((res) => {
1128
- //console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1443
+ return this.http.post(endpoint, params).pipe(map((res) => {
1444
+ //////console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
1129
1445
  return res;
1130
1446
  }));
1131
1447
  }
1132
- deleteAPIImageuser() {
1133
- let path = `user/image`;
1448
+ postAPIuserRegister(params) {
1449
+ let path = 'hpc/user/store';
1134
1450
  const endpoint = this.api.getEndpoint(path);
1135
- return this.http.delete(endpoint).pipe(map((res) => {
1136
- //console.log(`[DooleService] updateAPIReminder(${path}) res: `, res);
1451
+ return this.http.post(endpoint, params).pipe(map((res) => {
1452
+ ////console.log(`[DooleService] postAPIsendRegister(${path}) res: `, res);
1137
1453
  return res;
1138
1454
  }));
1139
1455
  }
1140
- postAPIContentStatus(params) {
1141
- let path = 'content/status';
1456
+ getAPITypeDocument() {
1457
+ let path = 'center/documentTypes';
1142
1458
  const endpoint = this.api.getEndpoint(path);
1143
- return this.http.post(endpoint, params).pipe(map((res) => {
1144
- //console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
1459
+ return this.http.get(endpoint).pipe(map((res) => {
1460
+ //////console.log(`[DooleService] getAPITypeDocument(${path}) res: `, res);
1145
1461
  return res;
1146
1462
  }));
1147
1463
  }
1148
- getAPIpatients() {
1149
- let path = 'user/patients';
1464
+ getAPImessage(id, params) {
1465
+ let path = 'user/message/' + id;
1466
+ let httpParams = new HttpParams();
1467
+ httpParams = httpParams ? httpParams.append('page', params) : httpParams;
1150
1468
  const endpoint = this.api.getEndpoint(path);
1151
- return this.http.get(endpoint).pipe(map((res) => {
1152
- //console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
1469
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1470
+ //////console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
1153
1471
  return res;
1154
1472
  }));
1155
1473
  }
1156
- getAPILevelInfo(challengeId, levelId, params) {
1157
- let path = 'user/challenge/' + challengeId + '/level/' + levelId + '/goals';
1474
+ getAPIEvents(params) {
1475
+ let path = 'hpc/user/episodes';
1476
+ let httpParams = new HttpParams();
1477
+ httpParams = (params?.onDate === 0 || params?.onDate === 1) ? httpParams.append('onDate', params?.onDate) : httpParams;
1478
+ httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
1479
+ httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
1158
1480
  const endpoint = this.api.getEndpoint(path);
1159
- return this.http.get(endpoint).pipe(map((res) => {
1160
- console.log(`[DooleService] getAPILevelInfo(${path}) res: `, res);
1481
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1482
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1161
1483
  return res;
1162
1484
  }));
1163
1485
  }
1164
- getAPIChallenge(challengeId, params) {
1165
- let path = 'user/challenge/' + challengeId;
1486
+ postAPImedicalProcedures(params) {
1487
+ let path = `user/medicalProcedures`;
1166
1488
  const endpoint = this.api.getEndpoint(path);
1167
- return this.http.get(endpoint).pipe(map((res) => {
1168
- console.log(`[DooleService] getAPIChallenge(${path}) res: `, res);
1489
+ return this.http.post(endpoint, params).pipe(map((res) => {
1490
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1169
1491
  return res;
1170
1492
  }));
1171
1493
  }
1172
- getAPIChallenges(params) {
1173
- let path = 'user/challenges';
1494
+ getAPImedicalProcedures2(params) {
1495
+ let path = `hpc/user/medicalProcedures`;
1174
1496
  const endpoint = this.api.getEndpoint(path);
1175
- return this.http.get(endpoint).pipe(map((res) => {
1176
- console.log(`[DooleService] getAPIChallenges(${path}) res: `, res);
1497
+ let httpParams = new HttpParams();
1498
+ httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
1499
+ httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
1500
+ httpParams = (params?.user) ? httpParams.append('user', params?.user) : httpParams;
1501
+ return this.http.get(endpoint, params).pipe(map((res) => {
1502
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1177
1503
  return res;
1178
1504
  }));
1179
1505
  }
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;
1506
+ postAPINextMedicalProcedure(params) {
1507
+ let path = `user/medicalProcedure/next`;
1185
1508
  const endpoint = this.api.getEndpoint(path);
1186
- return this.http.get(endpoint, httpParams).pipe(map((res) => {
1187
- //console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
1509
+ return this.http.post(endpoint, params).pipe(map((res) => {
1510
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1188
1511
  return res;
1189
1512
  }));
1190
1513
  }
1191
- getAPIFormJSON(form, params) {
1192
- let path = `form/${form}/formFields`;
1514
+ getAPImedicalProcedures(params) {
1515
+ let path = `hpc/user/medicalProcedure`;
1193
1516
  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;
1517
+ httpParams = (params?.byEpisode === 0 || params?.byEpisode === 1) ? httpParams.append('byEpisode', params?.byEpisode) : httpParams;
1518
+ httpParams = (params?.medical_procedure_id && params?.byEpisode === 0) ? httpParams.append('medical_procedure_id', params?.medical_procedure_id) : httpParams;
1519
+ httpParams = (params?.episode_id && params?.byEpisode === 1) ? httpParams.append('episode_id', params?.episode_id) : httpParams;
1196
1520
  const endpoint = this.api.getEndpoint(path);
1197
1521
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
1198
- //console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
1522
+ //////console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1199
1523
  return res;
1200
1524
  }));
1201
1525
  }
1202
- postAPIFormJSON(form, params) {
1203
- let path = `formfield/conditional/${form}/field/${params.formField}`;
1526
+ getAPIpreexistingConditions(params) {
1527
+ let path = 'user/preexistingConditions';
1528
+ let httpParams = new HttpParams();
1529
+ httpParams = (params?.onDate === 0 || params?.onDate === 1) ? httpParams.append('onDate', params?.onDate) : httpParams;
1530
+ httpParams = (params?.from_date) ? httpParams.append('from_date', params?.from_date) : httpParams;
1531
+ httpParams = (params?.to_date) ? httpParams.append('to_date', params?.to_date) : httpParams;
1532
+ //httpParams = (params?.preexistingConditionTypes) ? httpParams.append('preexistingConditionTypes[]', params?.preexistingConditionTypes) : httpParams
1533
+ if (params?.preexistingConditionTypes && params?.preexistingConditionTypes?.length) {
1534
+ params.preexistingConditionTypes.forEach(element => {
1535
+ httpParams = httpParams.append('preexistingConditionTypes[]', element);
1536
+ });
1537
+ }
1204
1538
  const endpoint = this.api.getEndpoint(path);
1205
- return this.http.post(endpoint, params).pipe(map((res) => {
1206
- //console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
1539
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1540
+ //////console.log(`[DooleService] getAPIelementsList(${path}) res: `, res);
1207
1541
  return res;
1208
1542
  }));
1209
1543
  }
1210
- postAPIFormFill(params) {
1211
- let path = `form/fill/`;
1544
+ getAPIpreexistingConditionsType() {
1545
+ let path = 'center/preexistingConditionTypes';
1212
1546
  const endpoint = this.api.getEndpoint(path);
1213
- return this.http.post(endpoint, params).pipe(map((res) => {
1214
- //console.log(`[DooleService] postAPIContentStatus(${path}) res: `, res);
1547
+ return this.http.get(endpoint).pipe(map((res) => {
1548
+ //////console.log(`[DooleService] getAPIpreexistingConditionsType(${path}) res: `, res);
1215
1549
  return res;
1216
1550
  }));
1217
1551
  }
@@ -1219,7 +1553,7 @@ export class DooleService {
1219
1553
  let path = 'user/notifications/count';
1220
1554
  const endpoint = this.api.getEndpoint(path);
1221
1555
  return this.http.get(endpoint).pipe(map((res) => {
1222
- //console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
1556
+ //////console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
1223
1557
  return res;
1224
1558
  }));
1225
1559
  }
@@ -1231,7 +1565,15 @@ export class DooleService {
1231
1565
  httpParams = (params?.page > 0) ? httpParams.append('page', params?.page) : httpParams;
1232
1566
  const endpoint = this.api.getEndpoint(path);
1233
1567
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
1234
- //console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
1568
+ //////console.log(`[DooleService] getAPINotifications(${path}) res: `, res);
1569
+ return res;
1570
+ }));
1571
+ }
1572
+ getAPIUserImage() {
1573
+ let path = 'user/image';
1574
+ const endpoint = this.api.getEndpoint(path);
1575
+ return this.http.get(endpoint).pipe(map((res) => {
1576
+ //////console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1235
1577
  return res;
1236
1578
  }));
1237
1579
  }
@@ -1260,40 +1602,135 @@ export class DooleService {
1260
1602
  getPushNotification() {
1261
1603
  return this.pushNotification;
1262
1604
  }
1263
- getAPIUserImage() {
1264
- let path = 'user/image';
1605
+ getAPIExerciseDetail(id, params) {
1606
+ let path = `user/exercise/${id}`;
1607
+ let httpParams = new HttpParams();
1608
+ httpParams = (params?.programable_play) ? httpParams.append('programable_play', params?.programable_play) : httpParams;
1609
+ httpParams = (params?.challenge_id) ? httpParams.append('challenge_id', params?.challenge_id) : httpParams;
1610
+ const endpoint = this.api.getEndpoint(path);
1611
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1612
+ ////console.log(`[DooleService] getAPIExercises(${path}) res: `, res);
1613
+ return res;
1614
+ }));
1615
+ }
1616
+ getAPIExercisesByDate(from_date, to_date) {
1617
+ let path = 'user/exercises/scheduled';
1618
+ let httpParams = new HttpParams();
1619
+ httpParams = httpParams ? httpParams.append('from_date', from_date) : httpParams;
1620
+ httpParams = httpParams ? httpParams.append('to_date', to_date) : httpParams;
1621
+ const endpoint = this.api.getEndpoint(path);
1622
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1623
+ ////console.log(`[DooleService] getAPIExercises(${path}) res: `, res);
1624
+ return res;
1625
+ }));
1626
+ }
1627
+ getAPIExercises() {
1628
+ let path = 'user/exercises';
1265
1629
  const endpoint = this.api.getEndpoint(path);
1266
1630
  return this.http.get(endpoint).pipe(map((res) => {
1267
- //console.log(`[DooleService] getAPIgames(${path}) res: `, res);
1631
+ ////console.log(`[DooleService] getAPIExercises(${path}) res: `, res);
1268
1632
  return res;
1269
1633
  }));
1270
1634
  }
1271
- getAPIFormsByDate(params) {
1272
- let path = `rehabilify/sharedcareplan/forms`;
1635
+ getAPIChallenge(challengeId, params) {
1636
+ let path = 'user/challenge/' + challengeId;
1637
+ const endpoint = this.api.getEndpoint(path);
1638
+ return this.http.get(endpoint).pipe(map((res) => {
1639
+ ////console.log(`[DooleService] getAPIChallenge(${path}) res: `, res);
1640
+ return res;
1641
+ }));
1642
+ }
1643
+ getAPIChallenges(params) {
1644
+ let path = 'user/challenges';
1273
1645
  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;
1646
+ if (params?.onlyAccepted)
1647
+ httpParams = httpParams.append('onlyAccepted', params.onlyAccepted);
1276
1648
  const endpoint = this.api.getEndpoint(path);
1277
1649
  return this.http.get(endpoint, httpParams).pipe(map((res) => {
1278
- //console.log(`[DooleService] getAPIdietsByDate(${path}) res: `, res);
1650
+ ////console.log(`[DooleService] getAPIChallenges(${path}) res: `, res);
1279
1651
  return res;
1280
1652
  }));
1281
1653
  }
1282
- postAPImedicalProcedures(params) {
1283
- let path = `user/medicalProcedures`;
1654
+ getAPIChallenges2() {
1655
+ let path = 'user/challenges/goals';
1284
1656
  const endpoint = this.api.getEndpoint(path);
1285
- return this.http.post(endpoint, params).pipe(map((res) => {
1286
- //console.log(`[DooleService] postAPIdrugIntake(${path}) res: `, res);
1657
+ return this.http.get(endpoint).pipe(map((res) => {
1658
+ ////console.log(`[DooleService] getAPIChallenges2(${path}) res: `, res);
1659
+ return res;
1660
+ }));
1661
+ }
1662
+ getAPIAppLatestVersion(version, platform) {
1663
+ let path = 'app/versions/must-update?version=' + version + '&platform=' + platform;
1664
+ ////console.log(path);
1665
+ const endpoint = this.api.getEndpoint(path);
1666
+ return this.http.get(endpoint).pipe(map((res) => {
1667
+ return res;
1668
+ }));
1669
+ }
1670
+ getAPIpatients() {
1671
+ let path = 'user/patients';
1672
+ const endpoint = this.api.getEndpoint(path);
1673
+ return this.http.get(endpoint).pipe(map((res) => {
1674
+ //////console.log(`[DooleService] getAPIreminders(${path}) res: `, res);
1675
+ return res;
1676
+ }));
1677
+ }
1678
+ getAPI_SCP_goals() {
1679
+ let path = `sharecareplan/goals`;
1680
+ const endpoint = this.api.getEndpoint(path);
1681
+ return this.http.get(endpoint).pipe(map((res) => {
1682
+ //////console.log(`[DooleService] getAPIagendaID(${path}) res: `, res);
1683
+ return res;
1684
+ }));
1685
+ }
1686
+ getAPI_prescribedApps_ByDate(from_date, to_date) {
1687
+ let path = 'rehabilify/prescribed-apps/activities/pending';
1688
+ let httpParams = new HttpParams();
1689
+ httpParams = httpParams ? httpParams.append('from', from_date) : httpParams;
1690
+ httpParams = httpParams ? httpParams.append('to', to_date) : httpParams;
1691
+ const endpoint = this.api.getEndpoint(path);
1692
+ return this.http.get(endpoint, httpParams).pipe(map((res) => {
1693
+ ////console.log(`[DooleService] getAPI_prescribedApps_ByDate(${path}) res: `, res);
1694
+ return res;
1695
+ }));
1696
+ }
1697
+ getAPIallowedDepartments() {
1698
+ let path = `user/departments`;
1699
+ const endpoint = this.api.getEndpoint(path);
1700
+ return this.http.get(endpoint).pipe(map((res) => {
1701
+ return res;
1702
+ }));
1703
+ }
1704
+ getAPIdetailDepartments(id) {
1705
+ let path = `department/show/${id}`;
1706
+ const endpoint = this.api.getEndpoint(path);
1707
+ return this.http.get(endpoint).pipe(map((res) => {
1708
+ return res;
1709
+ }));
1710
+ }
1711
+ getAPIAnswers(id) {
1712
+ let path = `user/form/${id}/answers/detail?html=true`;
1713
+ const endpoint = this.api.getEndpoint(path);
1714
+ return this.http.get(endpoint).pipe(map((res) => {
1715
+ ////console.log(`[DooleService] getAPIAnswers(${path}) res: `, res);
1716
+ return res;
1717
+ }));
1718
+ }
1719
+ getAPIDayPhrase() {
1720
+ let path = `user/dayPhrase`;
1721
+ const endpoint = this.api.getEndpoint(path);
1722
+ return this.http.get(endpoint).pipe(map((res) => {
1723
+ ////console.log(`[DooleService] getAPIDayPhrase(${path}) res: `, res);
1287
1724
  return res;
1288
1725
  }));
1289
1726
  }
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' }); }
1727
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", 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 }, { token: i9.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1728
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DooleService, providedIn: 'root' }); }
1292
1729
  }
1293
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DooleService, decorators: [{
1730
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DooleService, decorators: [{
1294
1731
  type: Injectable,
1295
1732
  args: [{
1296
1733
  providedIn: 'root'
1297
1734
  }]
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=
1735
+ }], 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 }, { type: i9.TranslateService }] });
1736
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9vbGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZpY2UtbGliL3NyYy9saWIvc2VydmljZXMvZG9vbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBNkIsR0FBRyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFFLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFTL0QsTUFBTSxPQUFPLFlBQVk7SUFFdkIsWUFDVSxXQUFrQyxFQUNsQyxRQUFzQixFQUN0QixJQUFVLEVBQ1YsSUFBaUIsRUFDakIsR0FBd0IsRUFDekIsTUFBYyxFQUNiLFFBQWtCLEVBQ25CLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxTQUEyQjtRQVQxQixnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBYztRQUN0QixTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1YsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixRQUFHLEdBQUgsR0FBRyxDQUFxQjtRQUN6QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQUksQ0FBQztJQUl6QyxVQUFVLENBQUMsS0FBYSxFQUFFLEVBQVc7UUFFbkMscUNBQXFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFH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QUM7SUFDSixDQUFDO0lBR0QsZUFBZTtRQUNiLElBQUksSUFBSSxHQUFHLGdCQUFnQixDQUFDO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNqQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNmLHNFQUFzRTtZQUN0RSxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQWh1RVUsWUFBWTttSEFBWixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWxlVHJhbnNmZXIsIEZpbGVVcGxvYWRPcHRpb25zLCBGaWxlVHJhbnNmZXJPYmplY3QgfSBmcm9tICdAYXdlc29tZS1jb3Jkb3ZhLXBsdWdpbnMvZmlsZS10cmFuc2Zlci9uZ3gnO1xuaW1wb3J0IHsgQXBpRW5kcG9pbnRzU2VydmljZSB9IGZyb20gJy4vYXBpLWVuZHBvaW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50cyB9IGZyb20gJy4vZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cFNlcnZpY2UgfSBmcm9tICcuL2h0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRmlsZSB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9maWxlL25neCc7XG5pbXBvcnQgeyBDYXBhY2l0b3IgfSBmcm9tICdAY2FwYWNpdG9yL2NvcmUnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVsYXksIGZpbHRlciwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEhlYWx0aENhcmQgfSBmcm9tICcuLi9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBRdWVyeVN0cmluZ1BhcmFtZXRlcnMgfSBmcm9tICcuLi91dGlscy9xdWVyeS1zdHJpbmctcGFyYW1ldGVycyc7XG5pbXBvcnQgeyBTaGVsbENoYXRNb2RlbCwgU2hlbGxNZXNzYWdlTW9kZWwsIFNoZWxsUmVjaXBpZW50TW9kZWwgfSBmcm9tICcuLi91dGlscy9jaGF0UGFyYW1ldGVycyc7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL2F1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEb29sZVNlcnZpY2Uge1xuICBwdXNoTm90aWZpY2F0aW9uOiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zZmVyOiBGaWxlVHJhbnNmZXIsXG4gICAgcHJpdmF0ZSBmaWxlOiBGaWxlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcGk6IEFwaUVuZHBvaW50c1NlcnZpY2UsXG4gICAgcHVibGljIGV2ZW50czogRXZlbnRzLFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwdWJsaWMgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkgeyB9XG5cbiAgcHVibGljIHNlbGVjdGVkRGF0ZTogRGF0ZTtcblxuICB1cGxvYWRGaWxlKGltYWdlOiBzdHJpbmcsIGlkPzogc3RyaW5nKSB7XG5cbiAgICAvLy8vY29uc29sZS5sb2coXCJ1cGxvYWRpbmcgXCIsIGltYWdlKTtcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuICAgIGxldCBvcHRpb25zOiBGaWxlVXBsb2FkT3B0aW9ucyA9IHtcbiAgICAgIGZpbGVLZXk6ICdmaWxlJyxcbiAgICAgIGZpbGVOYW1lOiAnbmFtZS5qcGcnLFxuXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgdG9rZW4sXG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGlkOiBpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVUcmFuc2ZlcjogRmlsZVRyYW5zZmVyT2JqZWN0ID0gdGhpcy50cmFuc2Zlci5jcmVhdGUoKTtcbiAgICAvLyBBZGQgZmlsZXMgZm9yIG5ldyBvciBzYXZlZCBkaWFnbm9zdGljcy4gXG4gICAgLy8gdXNlcyBkaWFnbm9zdGljL21lZGlhIHdoZW4gZGlhZ25vc3RpYyBpcyBuZXcgXG4gICAgLy9jb25zdCBlbmRwb2ludCA9IGlkID8gdGhpcy5hcGkuZ2V0RW5kcG9pbnQoJ2RpYWdub3N0aWMvbWVkaWEnKTp0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVkaWEvdXBsb2FkL3RlbXAnKSA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVkaWEvdXBsb2FkL3RlbXAnKTtcbiAgICAvLy8vLy9jb25zb2xlLmxvZyhcIiogdXBsb2FkRmlsZSBlbmRwb2ludFwiLCBlbmRwb2ludCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZmlsZVRyYW5zZmVyLnVwbG9hZChpbWFnZSwgZW5kcG9pbnQsIG9wdGlvbnMpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhkYXRhKTtcbiAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGVycik7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSlcbiAgICB9KVxuXG4gIH1cblxuICBcblxuICBwb3N0QVBJQWRkTWVkaWEocGFyYW1zOiBPYmplY3Qpe1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQoJ21lZGlhL2FkZCcpO1xuICAgXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0Rm9ybShlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElBZGRNZWRpYSgke2VuZHBvaW50fSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIFxuICB1cGxvYWRGaWxlVG9Nb2RlbChpbWFnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KSB7XG4gICAgLy8vLy8vY29uc29sZS5sb2coXCJ1cGxvYWRpbmcgXCIsIGltYWdlKTtcbiAgICBjb25zdCB0b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0b2tlbicpO1xuICAgIGxldCBvcHRpb25zOiBGaWxlVXBsb2FkT3B0aW9ucyA9IHtcbiAgICAgIGZpbGVLZXk6ICdmaWxlJyxcbiAgICAgIGZpbGVOYW1lOiBuYW1lLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIHRva2VuLFxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIHBhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVUcmFuc2ZlcjogRmlsZVRyYW5zZmVyT2JqZWN0ID0gdGhpcy50cmFuc2Zlci5jcmVhdGUoKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KCdtZWRpYS9hZGQnKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZmlsZVRyYW5zZmVyLnVwbG9hZChpbWFnZSwgZW5kcG9pbnQsIG9wdGlvbnMpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGRhdGEucmVzcG9uc2UpKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGVycik7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSlcbiAgICB9KVxuXG4gIH1cblxuICB1cGxvYWRNZXNzYWdlSW1hZ2UoaWRNZXNzYWdlSGVhZGVyLCBpZFVzZXJUbywgbWVzc2FnZSwgZmlsZVVybCwgaWRfdXN1YXJpX2FtaXEpIHtcblxuICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Rva2VuJyk7XG5cbiAgICBsZXQgb3B0aW9uczogRmlsZVVwbG9hZE9wdGlvbnMgPSB7XG4gICAgICBmaWxlS2V5OiAnZmlsZScsXG4gICAgICBmaWxlTmFtZTogJ25hbWUucGRmJywgLy9UT0RPOiAnbmFtZS5qcGcnXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBdXRob3JpemF0aW9uJzogJ0JlYXJlciAnICsgdG9rZW4sXG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9LFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGlkVXNlcjogaWRfdXN1YXJpX2FtaXEsXG4gICAgICAgIHNlY3JldDogdG9rZW4sXG4gICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICBpZDogaWRNZXNzYWdlSGVhZGVyXG4gICAgICB9XG4gICAgfVxuICAgIC8vLy8vL2NvbnNvbGUubG9nKFwib3B0aW9uczogXCIsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgZmlsZVRyYW5zZmVyOiBGaWxlVHJhbnNmZXJPYmplY3QgPSB0aGlzLnRyYW5zZmVyLmNyZWF0ZSgpO1xuXG4gICAgZmlsZVRyYW5zZmVyLm9uUHJvZ3Jlc3MoKHByb2dyZXNzRXZlbnQpID0+IHtcbiAgICAgIGlmIChwcm9ncmVzc0V2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgdmFyIHBlcmMgPSBNYXRoLmZsb29yKHByb2dyZXNzRXZlbnQubG9hZGVkIC8gcHJvZ3Jlc3NFdmVudC50b3RhbCAqIDEwMCk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1Ymxpc2goXCJ1cGxvYWRNZXNzYWdlSW1hZ2VcIiwgeyBmaWxlVXJsLCBwZXJjIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coXCJwcm9ncmVzc0V2ZW50IC0gXCIsIHByb2dyZXNzRXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludCgnbWVzc2FnZScpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZpbGVUcmFuc2Zlci51cGxvYWQoZmlsZVVybCwgZW5kcG9pbnQsIG9wdGlvbnMpXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKFwic3VjY2VzcyBmaWxlVHJhbnNmZXIudXBsb2FkXCIsIEpTT04ucGFyc2UoZGF0YS5yZXNwb25zZSkpO1xuICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShkYXRhLnJlc3BvbnNlKSk7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhcIioqIGVycm9yICoqIGZpbGVUcmFuc2Zlci51cGxvYWQ6IFwiLCBlcnIpO1xuICAgICAgICAgIHJlamVjdChmaWxlVHJhbnNmZXIudXBsb2FkKTtcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gIH1cblxuICBiNjR0b0Jsb2IoYjY0RGF0YSwgY29udGVudFR5cGUgPSAnJywgc2xpY2VTaXplID0gNTEyKSB7XG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGI2NERhdGEpO1xuICAgIGNvbnN0IGJ5dGVBcnJheXMgPSBbXTtcblxuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsaWNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGJ5dGVOdW1iZXJzW2ldID0gc2xpY2UuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuICAgICAgYnl0ZUFycmF5cy5wdXNoKGJ5dGVBcnJheSk7XG4gICAgfVxuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGJ5dGVBcnJheXMsIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG4gICAgcmV0dXJuIGJsb2I7XG4gIH1cblxuICBkb3dubG9hZCh1cmwpIHtcbiAgICBjb25zdCBmaWxlVHJhbnNmZXI6IEZpbGVUcmFuc2Zlck9iamVjdCA9IHRoaXMudHJhbnNmZXIuY3JlYXRlKCk7XG4gICAgdmFyIHBhdGggPSBudWxsO1xuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdpb3MnKSkge1xuICAgICAgcGF0aCA9IHRoaXMuZmlsZS5kb2N1bWVudHNEaXJlY3Rvcnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggPSB0aGlzLmZpbGUuZGF0YURpcmVjdG9yeTtcbiAgICB9XG4gICAgZmlsZVRyYW5zZmVyLmRvd25sb2FkKHVybCwgcGF0aCArICdmaWxlLnBkZicpLnRoZW4oKGVudHJ5KSA9PiB7XG4gICAgICAvLy8vY29uc29sZS5sb2coJ2Rvd25sb2FkIGNvbXBsZXRlOiAnICsgZW50cnkudG9VUkwoKSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAvLyBoYW5kbGUgZXJyb3JcbiAgICB9KTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZSh1cmwsIGRlc3RpbmF0aW9uKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICB2YXIgcmVzdWx0OiBhbnkgPSBbXTtcbiAgICBjb25zdCBmaWxlVHJhbnNmZXI6IEZpbGVUcmFuc2Zlck9iamVjdCA9IHRoaXMudHJhbnNmZXIuY3JlYXRlKCk7XG4gICAgdmFyIHBhdGggPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2lvcycpKSB7XG4gICAgICBwYXRoID0gdGhpcy5maWxlLmRvY3VtZW50c0RpcmVjdG9yeTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IHRoaXMuZmlsZS5kYXRhRGlyZWN0b3J5O1xuICAgIH1cblxuICAgIC8vLy8vL2NvbnNvbGUubG9nKFwiZG93bmxvYWRGaWxlXCIsIHVybCwgZGVzdGluYXRpb24sICdwYXRoLGRlc3RpbmF0aW9uJywgcGF0aCwgZGVzdGluYXRpb24pO1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIC8vLy8vL2NvbnNvbGUubG9nKFwiYmVmb3JlIENoZWNrRmlsZVwiLCB0aGlzLmZpbGUpO1xuICAgICAgdGhpcy5maWxlLmNoZWNrRmlsZShwYXRoLCBkZXN0aW5hdGlvbikudGhlbihyZXMgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhcIipyZXMqXCIsIHJlcyk7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhcImV4aXN0c1wiLCByZXMpO1xuICAgICAgICAgIHJlc3VsdFtcInN1Y2Nlc3NcIl0gPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdFtcImRvd25sb2FkZWRcIl0gPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdFtcImZpbGVcIl0gPSBwYXRoICsgZGVzdGluYXRpb247Ly9ub3JtYWxpemVVUkwodGhpcy5maWxlLmNhY2hlRGlyZWN0b3J5ICsgZGVzdGluYXRpb24pO1xuICAgICAgICAgIHJlc3VsdFtcImZpbGVOb3JtYWxpemVkXCJdID0gQ2FwYWNpdG9yLmNvbnZlcnRGaWxlU3JjKHBhdGggKyBkZXN0aW5hdGlvbik7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhcIm5vdCBleGlzdHNcIik7XG4gICAgICAgIGZpbGVUcmFuc2Zlci5vblByb2dyZXNzKGV2ZW50ID0+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGVzY2FycmVndWVtXG4gICAgICAgICAgaWYgKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKTtcbiAgICAgICAgICAgIHJlc3VsdFtcInN0YXR1c1wiXSA9IFwiZG93bmxvYWRpbmdcIjtcbiAgICAgICAgICAgIHJlc3VsdFtcImRvd25sb2FkZWRcIl0gPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdFtcInBlcmNlbnRcIl0gPSBNYXRoLnJvdW5kKChldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCkgKiAxMDApO1xuICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmaWxlVHJhbnNmZXIuZG93bmxvYWQodXJsLCBwYXRoICsgZGVzdGluYXRpb24pLnRoZW4oKGVudHJ5KSA9PiB7XG4gICAgICAgICAgLy8vLy8vY29uc29sZS5sb2coJypkb3dubG9hZDoqICcgKyB1cmwgKyBcIiBcIiArIGVudHJ5LnRvVVJMKCkpO1xuICAgICAgICAgIHJlc3VsdFtcInN1Y2Nlc3NcIl0gPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdFtcImRvd25sb2FkZWRcIl0gPSB0cnVlO1xuICAgICAgICAgIHJlc3VsdFtcImZpbGVcIl0gPSBlbnRyeS50b1VSTCgpOy8vbm9ybWFsaXplVVJMKHRoaXMuZmlsZS5jYWNoZURpcmVjdG9yeSArIGRlc3RpbmF0aW9uKTtcbiAgICAgICAgICByZXN1bHRbXCJmaWxlTm9ybWFsaXplZFwiXSA9IENhcGFjaXRvci5jb252ZXJ0RmlsZVNyYyhwYXRoICsgZGVzdGluYXRpb24pO1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlci5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICByZXN1bHRbXCJzdWNjZXNzXCJdID0gZmFsc2U7XG4gICAgICAgICAgcmVzdWx0W1wiZG93bmxvYWRlZFwiXSA9IGZhbHNlO1xuICAgICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKFwiZXJyb3IgZG93bmxvYWQgXCIgKyB1cmwpO1xuICAgICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQocmVzdWx0KTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRmlsZShpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgbWVkaWEvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlRmlsZSgke3BhdGh9KSByZXM6ICR7cmVzfWAsIEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzaG93QWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XG5cbiAgICByZXR1cm4gdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNzc0NsYXNzOiAnbXktYWxlcnQtY2xhc3MnLFxuICAgICAgLy9tb2RlOiAnaW9zJyxcbiAgICAgIGhlYWRlcjogJ0luZm8nLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnQWNlcHRhcicsXG4gICAgICAgICAgcm9sZTogJ2NvbmZpcm0nLFxuICAgICAgICAgIGNzc0NsYXNzOiAnb25seUJ1dHRvbicsXG4gICAgICAgICAgaGFuZGxlcjogKGJsYWgpID0+IHtcbiAgICAgICAgICAgIC8vLy9jb25zb2xlLmxvZygnW0xhbmRpbmdQYWdlXSBBbGVydENvbmZpcm0gQ2FuY2VsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgfVxuXG4gIGFzeW5jIHNob3dBbGVydEFuZFJldHVybihoZWFkZXI6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBpc0Rpc21pc3M/OiBib29sZWFuLCByb3V0ZT86IHN0cmluZykge1xuICAgIC8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHNob3dBbGVydEFuZFJldHVybigpYCk7XG4gICAgbGV0IGRpc21pc3MgPSAoaXNEaXNtaXNzICE9PSB1bmRlZmluZWQpID8gaXNEaXNtaXNzIDogZmFsc2VcbiAgICBjb25zdCBhbGVydCA9IGF3YWl0IHRoaXMuYWxlcnRDb250cm9sbGVyLmNyZWF0ZSh7XG4gICAgICBjc3NDbGFzczogJ215LWFsZXJ0LWNsYXNzJyxcbiAgICAgIC8vbW9kZTogJ2lvcycsXG4gICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGRpc21pc3MsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnQWNlcHRhcicsXG4gICAgICAgICAgaGFuZGxlcjogKGJsYWgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0NvbmZpcm0gT0s6IGJsYWgnKTtcbiAgICAgICAgICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkICYmIHJvdXRlICE9PSBudWxsKVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHJvdXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBwcmVzZW50QWxlcnQobWVzc2FnZSwgYnV0dG9uPzogc3RyaW5nKSB7XG4gICAgbGV0IGJ1dHRvbk5hbWUgPSAoYnV0dG9uICE9PSB1bmRlZmluZWQpID8gYnV0dG9uIDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbGFuZGluZy5hY2NlcHQtYnRuJyk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgY3NzQ2xhc3M6ICdteS1hbGVydC1jbGFzcycsXG4gICAgICAvL21vZGU6ICdpb3MnLFxuICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IGJ1dHRvbk5hbWUsXG4gICAgICAgICAgcm9sZTogJ2NvbmZpcm0nLFxuICAgICAgICAgIGNzc0NsYXNzOiAnb25seUJ1dHRvbicsXG4gICAgICAgICAgaGFuZGxlcjogKGJsYWgpID0+IHtcbiAgICAgICAgICAgIC8vLy9jb25zb2xlLmxvZygnW0xhbmRpbmdQYWdlXSBBbGVydENvbmZpcm0gQ2FuY2VsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICB9XG5cbiAgZ2V0RmFtaWx5VW5pdElEKCk6IEh0dHBQYXJhbXMge1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBsZXQgdXNlciA9IHRoaXMuYXV0aFNlcnZpY2U/LnVzZXJcbiAgICByZXR1cm4gaHR0cFBhcmFtcyA9ICh1c2VyLmZhbWlseVVuaXQpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3VzZXInLCB1c2VyLmZhbWlseVVuaXQpIDogaHR0cFBhcmFtc1xuICB9XG5cbiAgZ2V0QVBJTGVnYWxBbmRQb2xpY3koKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvbGVnYWwtdGVybS1hbmQtcHJpdmFjeS1wb2xpY3kvbGFzdCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUxlZ2FsQW5kUG9saWN5KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJTGVnYWxJbmZvcm1hdGlvbigpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvbGVnYWxUZXJtL2xhc3RBY2NlcHRlZCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUxlZ2FsSW5mb3JtYXRpb24oJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cbiAgcG9zdEFQSUxlZ2FsQ29uZmlybWF0aW9uKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2xlZ2FsVGVybS9sYXN0QWNjZXB0ZWQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJQ29uZmlybWF0aW9uTGVnYWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJUmVqZWN0TGVnYWxDb25maXJtYXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvbGVnYWxUZXJtL2xhc3REZWNsaW5lZCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb25maXJtYXRpb25MZWdhbCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElwYXNzd29yZFJlY292ZXJ5KHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdwYXRpZW50L2ZvcmdvdCdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSXBhc3N3b3JkUmVjb3ZlcnkoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJU3RhZmZTbG90cyhwYXJhbXM6IHsgaWQ6IG51bWJlciwgZGF0ZTogc3RyaW5nIH0pIHtcblxuICAgIGxldCBwYXRoID0gYHN0YWZmLyR7cGFyYW1zLmlkfS9hdmFpbGFiaWxpdHlgO1xuICAgIGxldCBlbmRwb2ludDogc3RyaW5nO1xuICAgIGlmIChwYXJhbXMuZGF0ZSAhPT0gXCJcIikge1xuICAgICAgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludFdpdGhQYXJhbWV0ZXJzKHBhdGgsIChxczogUXVlcnlTdHJpbmdQYXJhbWV0ZXJzKSA9PiBxcy5wdXNoKCdkYXRlJywgcGFyYW1zLmRhdGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSVN0YWZmU2xvdHMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBnZXRBUElnb2FscygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudC9nb2FscydcbiAgICAvL2xldCBwYXRoID0gJ3VzZXIvZ29hbHMvZWxlbWVudHMnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWhvbWVJbml0aWFsKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJdmlkZW9jYWxsKGlkOnN0cmluZyk6IE9ic2VydmFibGU8YW55PntcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FnZW5kYS8nK2lkKycvdmlkZW9jYWxsU2Vzc2lvbidcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSXZpZGVvY2FsbCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG5cbiAgcG9zdEFQSVBlbmRpbmdDb25uZWN0KCk6IE9ic2VydmFibGU8YW55PntcbiAgICBsZXQgcGF0aCA9ICd1c2VyL3ZpZGVvY2FsbC9wZW5kaW5nQ29ubmVjdCdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElQZW5kaW5nQ29ubmVjdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4vKiAgIGdldEFQSWluZm9ybWF0aW9uVXNlcigpOiBPYnNlcnZhYmxlPGFueT57XG5cbiAgICBsZXQgcGF0aCA9ICd1c2VyL2luZm9ybWF0aW9uVXNlcidcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJaG9tZUluaXRpYWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH0gKi9cbiAgXG4gIHVwZGF0ZUFQSUltYWdldXNlcihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9pbWFnZWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gdXBkYXRlQVBJUmVtaW5kZXIoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBUElJbWFnZXVzZXIoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2ltYWdlYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gdXBkYXRlQVBJUmVtaW5kZXIoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElpbmZvcm1hdGlvblN1bW1hcnkocGFyYW1zOiBPYmplY3Qpe1xuICAgIGxldCBwYXRoID0gJ2hvbWUnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1lcmdlTWFwKCh2KSA9PiB2IGluc3RhbmNlb2YgVGltZW91dEVycm9yID8gdGhyb3dFcnJvcih2KSA6IG9mKHYpKSBcbiAgICApO1xuICB9XG4gIGdldEFQSWluZm9ybWF0aW9uU3VtbWFyeU9sZChwYXJhbXM6IE9iamVjdCl7XG4gICAgbGV0IHBhdGggPSAnaG9tZSdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKHJlcyA9PiByZXMpIFxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSXVzZXJQcm9maWxlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndjIvdXNlci9wcm9maWxlJ1xuICAgIC8vbGV0IGh0dHBQYXJhbXMgPSB0aGlzLmdldEZhbWlseVVuaXRJRCgpXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWhvbWVJbml0aWFsKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcG9zdEFQSUNoYW5nZVBhc3N3b3JkKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NoYW5nZVBhc3N3b3JkJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IHRoaXMuZ2V0RmFtaWx5VW5pdElEKClcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSUNoYW5nZVBhc3N3b3JkKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJbm90aWZpY2F0aW9uQ29uZmlndXJhdGlvbnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NvbmZpZ3VyYXRpb24nXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSW5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25zKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcG9zdEFQSUNvbmZpZ3VyYXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvY29uZmlndXJhdGlvbic7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb25maWd1cmF0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJbGFuZ3VhZ2VzQ2VudGVyKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2xhbmd1YWdlcydcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJbGFuZ3VhZ2VzQ2VudGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJRmFxcygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2NlbnRlci9mYXEnXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWhvbWVJbml0aWFsKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgZ2V0QVBJRmFtaWx5VW5pdCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZmFtaWx5VW5pdCc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUZhbWlseVVuaXQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGdldEFQSUZhbWlseVVuaXQyKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndjIvdXNlci9mYW1pbHlVbml0JztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUZhbWlseVVuaXQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSVJlcG9ydFByb2JsZW0ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcmVwb3J0UHJvYmxlbSc7IC8vICdtZWRpYS91cGxvYWQvdGVtcCcgXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJUmVwb3J0UHJvYmxlbSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUEllbWFpbFZlcmlmaWNhdGlvbihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9lbWFpbF92ZXJpZmljYXRpb24nO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWVtYWlsVmVyaWZpY2F0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJQ29kZUJ5RW1haWwoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL3Jlc2VuZFR3b0ZhY3RvckNvZGUnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQ29kZUJ5RW1haWwoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWNvZGVWZXJpZmljYXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvdmVyaWZ5VHdvRmFjdG9yJztcbiAgICAvL2xldCBwYXRoID0gJ3VzZXIvY29kZVZlcmlmaWNhdGlvbic7IFxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWNvZGVWZXJpZmljYXRpb24oJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSWhlYWx0aENhcmRUeXBlcygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2NlbnRlci9oZWFsdGhDYXJkVHlwZXMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJaGVhbHRoQ2FyZFR5cGVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWhlYWx0aENhcmRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9oZWFsdGhjYXJkcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUGhlYWx0aENhcmRzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWhlYWx0aENhcmRJZChpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9oZWFsdGhjYXJkLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWhlYWx0aENhcmQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWhlYWx0aENhcmRzKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2hlYWx0aGNhcmQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSVJlcG9ydFByb2JsZW0oJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUEloZWFsdGhDYXJkKHBhcmFtczogSGVhbHRoQ2FyZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9oZWFsdGhjYXJkLyR7cGFyYW1zLmlkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHB1dEFQSWhlYWx0aENhcmQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBUEloZWFsdGhDYXJkKHBhcmFtczogSGVhbHRoQ2FyZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9oZWFsdGhjYXJkLyR7cGFyYW1zLmlkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBkZWxldGVBUEloZWFsdGhDYXJkKCR7cGF0aH0pIHJlczogJHtyZXN9YCwgSlNPTi5zdHJpbmdpZnkocmVzKSk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSVNvY2lhbFJlbGF0aW9uVHlwZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2NlbnRlci9zb2NpYWxSZWxhdGlvblR5cGUnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJU29jaWFsUmVsYXRpb25UeXBlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWVtZXJnZW5jeUNvbnRhY3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL0VtZXJnZW5jeUNvbnRhY3RzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZW1lcmdlbmN5Q29udGFjdElEKGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvRW1lcmdlbmN5Q29udGFjdC8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbWVyZ2VuY3lDb250YWN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUEllbWVyZ2VuY3lDb250YWN0KHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL0VtZXJnZW5jeUNvbnRhY3QnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUEllbWVyZ2VuY3lDb250YWN0KGlkOiBhbnksIHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL0VtZXJnZW5jeUNvbnRhY3QvJHtpZH1gO1xuICAgIC8vLy9jb25zb2xlLmxvZygnW0Rvb2xlU2VydmljZV0gcHV0QVBJZW1lcmdlbmN5Q29udGFjdCgpJywgcGFyYW1zKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcHV0QVBJZW1lcmdlbmN5Q29udGFjdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSWVtZXJnZW5jeUNvbnRhY3QoaWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9FbWVyZ2VuY3lDb250YWN0LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSWVtZXJnZW5jeUNvbnRhY3QoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cblxuICBnZXRBUElhYm91dFVzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2Fib3V0JztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWFib3V0VXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJYXBwb2ludG1lbnRBZ2VuZGEoKTogT2JzZXJ2YWJsZTxhbnk+e1xuICAgIGxldCBwYXRoID0gJ3VzZXIvYWdlbmRhJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJYXBwb2ludG1lbnRBZ2VuZGEoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy9kb2N1bWVudHMtVHJhY2tpbmdcbiAgZ2V0QVBJZGlhZ25vc3RpY1Rlc3RzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9kaWFnbm9zdGljVGVzdHMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaWFnbm9zdGljVGVzdHMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZGlhZ25vc3RpY1Rlc3RzTGFzdCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZGlhZ25vc3RpY1Rlc3RzL2xhc3QtZG9uZSc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRpYWdub3N0aWNUZXN0cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkaWFnbm9zdGljVGVzdFR5cGVzQXZhaWxhYmxlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnZGlhZ25vc3RpY1Rlc3RUeXBlcy9hdmFpbGFibGUnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGlhZ25vc3RpY1Rlc3RUeXBlc0F2YWlsYWJsZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElkaWFnbm9zdGljVGVzdElEKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3YyL3VzZXIvZGlhZ25vc3RpY1Rlc3QvJyArIGlkO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGlhZ25vc3RpY1Rlc3RJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJZGlhZ25vc3RpY1Rlc3QocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3YyL3VzZXIvZGlhZ25vc3RpY1Rlc3RzLyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICAvLy8vY29uc29sZS5sb2coXCJQT1NUOiBcIixwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkaWFnbm9zdGljVGVzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1dEFQSWRpYWdub3N0aWNUZXN0KGlkLCBwYXJhbXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9kaWFnbm9zdGljVGVzdC8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHB1dEFQSWRpYWdub3N0aWNUZXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlQVBJZGlhZ25vc3RpY1Rlc3QoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZGlhZ25vc3RpY1Rlc3QvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJZGlhZ25vc3RpY1Rlc3QoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZmlsdGVyZWREaWFnbm9zdGljVGVzdChwYXJhbXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9kaWFnbm9zdGljVGVzdHMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIC8vIEJlZ2luIGFzc2lnbmluZyBwYXJhbWV0ZXJzXG4gICAgaWYgKHBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBodHRwUGFyYW1zID0gKHBhcmFtcy5zdGFydF9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBwYXJhbXMuc3RhcnRfZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgICBodHRwUGFyYW1zID0gKHBhcmFtcy5lbmRfZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHBhcmFtcy5lbmRfZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgICBpZiAocGFyYW1zLmRpYWdub3N0aWNUZXN0VHlwZXMpIHtcbiAgICAgICAgcGFyYW1zLmRpYWdub3N0aWNUZXN0VHlwZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoJ2RpYWdub3N0aWNfdGVzdF90eXBlX2lkW10nLCBlbGVtZW50KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZmlsdGVyZWREaWFnbm9zdGljVGVzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWZvcm1QZW5kaW5nKHBhcmFtcyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnZm9ybXMvcGVuZGluZy91c2VyJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZm9ybVBlbmRpbmcoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIFxuICAvL2Zvcm1zLVRyYWNraW5nXG4gIGdldEFQSVNoYXJlZGNhcmVGb3JtTGlzdChwYXRpZW50KXtcbiAgICBsZXQgcGF0aCA9IGAvcmVoYWJpbGlmeS9zaGFyZWRjYXJlcGxhbi9tb25pdG9yaW5nLyR7cGF0aWVudH1gOyAgIFxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElyZW1pbmRlcnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cblxuXG4gIGdldEFQSWZvcm1MaXN0cygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2Zvcm1zL3VzZXInO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZm9ybUxpc3RzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUZvcm1KU09OKGZvcm0sIHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGZvcm0vJHtmb3JtfS9mb3JtRmllbGRzYDtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LmZvcm1BbnN3ZXIpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2Zvcm1BbnN3ZXInLCBwYXJhbXM/LmZvcm1BbnN3ZXIpICA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZ2FtZV9wbGF5X2lkKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdnYW1lX3BsYXlfaWQnLCBwYXJhbXM/LmdhbWVfcGxheV9pZCkgIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5zdGFydGVkX2FwcCkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc3RhcnRlZF9hcHAnLCBwYXJhbXM/LnN0YXJ0ZWRfYXBwKSAgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSXJlbWluZGVycygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJRm9ybUpTT04oZm9ybSwgcGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBmb3JtZmllbGQvY29uZGl0aW9uYWwvJHtmb3JtfS9maWVsZC8ke3BhcmFtcy5mb3JtRmllbGR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSUNvbnRlbnRTdGF0dXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSUZvcm1GaWxsKHBhcmFtcyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgZm9ybS9maWxsL2A7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElDb250ZW50U3RhdHVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICAvL2dyYXBoaWNzLVRyYWNraW5nXG5cbiAgZ2V0QVBJZWxlbWVudHNMaXN0KGZpbHRlcj8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudHMnICAvKiAndXNlci9lbGVtZW50c0xpc3QvdjInICAqL1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKGZpbHRlcj8ub25seV93aXRoX3ZhbHVlcyk/IGh0dHBQYXJhbXMuYXBwZW5kKCdvbmx5X3dpdGhfdmFsdWVzJywgZmlsdGVyPy5vbmx5X3dpdGhfdmFsdWVzKTogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAoZmlsdGVyPy5ncm91cGVkKT8gaHR0cFBhcmFtcy5hcHBlbmQoJ2dyb3VwZWQnLCBmaWx0ZXI/Lmdyb3VwZWQpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAoZmlsdGVyPy5maWx0ZXIpPyBodHRwUGFyYW1zLmFwcGVuZCgnZmlsdGVyJywgZmlsdGVyPy5maWx0ZXIpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZWxlbWVudHNMaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBcbiAgLyoqIGdldCBlbGVtZW50cyB3aXRoIHF1ZXJ5IGJ5IHBhcmFtZXRlciBkYXRlICAqL1xuICBnZXRBUEllbGVtZW50c0xpc3RCeURhdGUocGFyYW1zOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudHNMaXN0L3YyJyAgLyogJ3VzZXIvZWxlbWVudHNMaXN0JyAgKi9cbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYocGFyYW1zLmZpbHRlciA9PSAnMScpIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZCgnZmlsdGVyJywgJzEnKVxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWVsZW1lbnRzTGlzdEJ5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUEllbGVtZW50c0J5R3JvdXAoZmlsdGVyPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2VsZW1lbnRHcm91cC9lbGVtZW50cydcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYoZmlsdGVyID09ICcxJyB8fCBmaWx0ZXIgPT0gJzAnKSBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoJ2ZpbHRlcicsIGZpbHRlcilcbiAgICBlbHNlIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZCgnZmlsdGVyJywgJzEnKVxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWVsZW1lbnRzTGlzdEJ5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJYWRkRWxlbWVudChpZCwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZWxlbWVudC8nICsgaWQgKyAnL3ZhbHVlL2FkZCdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWFkZEVsZW1lbnQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZ3JhcGhpY3NFbGVtZW50KGlkOiBPYmplY3QsIHF1ZXJ5KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2VsZW1lbnQvJyArIGlkO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHF1ZXJ5KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdpbnRlcnZhbCcsIHF1ZXJ5KSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElncmFwaGljc0VsZW1lbnQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZWxlbWVudElEKGlkOiBPYmplY3QsIHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHYyL3VzZXIvZWxlbWVudC8ke2lkfWA7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5pbnRlcnZhbCkgPyBodHRwUGFyYW1zLmFwcGVuZCgnaW50ZXJ2YWwnLCBwYXJhbXM/LmludGVydmFsKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZnJvbV9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBwYXJhbXM/LmZyb21fZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LnRvX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3RvX2RhdGUnLCBwYXJhbXM/LnRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy52ZXJzaW9uKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCd2ZXJzaW9uJywgcGFyYW1zPy52ZXJzaW9uKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElncmFwaGljc0VsZW1lbnQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZWxlbWVudEF2YWlsYWJsZUlEKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGVsZW1lbnQvYXZhaWxhYmxlLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZWxlbWVudEF2YWlsYWJsZUlEKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWNhdGVnb3J5KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9lbGVtZW50X2NhdGVnb3J5JztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJY2F0ZWdvcnkoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZWxlbWVudEdyb3VwSUQoaWQ6IE9iamVjdCwgZmlsdGVyPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgY2VudGVyL2VsZW1lbnRHcm91cC8ke2lkfS9lbGVtZW50c2A7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAoZmlsdGVyKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmaWx0ZXInLCBmaWx0ZXIpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEllbGVtZW50R3JvdXBJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzZWFyY2hBUEllbGVtZW50R3JvdXAocGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvZWxlbWVudEdyb3VwcydcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gc2VhcmNoQVBJZWxlbWVudEdyb3VwKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWVsZW1lbnRHcm91cChwYXJhbXM/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2NlbnRlci9lbGVtZW50R3JvdXBzJ1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZmlsdGVyKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmaWx0ZXInLCBwYXJhbXM/LmZpbHRlcikgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWVsZW1lbnRHcm91cCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgLyoqIGdldCBkaWV0cyB3aXRoIHF1ZXJ5IGJ5IHBhcmFtZXRlciBkYXRlICAqL1xuICBnZXRBUElsaXN0RGlldHNCeURhdGUocGFyYW1zPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2RpZXRzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJbGlzdERpZXRzQnlEYXRlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUxpc3RSZWNpcGUocGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2RpZXRzL3JlY2VpcHRzYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgIC5zZXQoJ3RhZ3MnLCBwYXJhbXMudGFncylcbiAgICAuc2V0KCdpbnRlcmFjdGlvbnMnLCBwYXJhbXMuaW50ZXJhY3Rpb25zKVxuICAgIC5zZXQoJ3JlYWRpbmdUaW1lJywgcGFyYW1zLnJlYWRpbmdUaW1lKVxuICAgIC5zZXQoJ2Zyb21fZGF0ZScsIHBhcmFtcy5mcm9tX2RhdGUpXG4gICAgLnNldCgndG9fZGF0ZScsIHBhcmFtcy50b19kYXRlKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRldGFpbFJlY2lwZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKmdldEFQSWRpZXRzQnlEYXRlKGRhdGU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9kaWV0YXJ5SW50YWtlc2BcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChkYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdkYXRlJywgZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRpZXRzQnlEYXRlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfSovXG5cbiAgZ2V0QVBJZGlldHNCeURhdGUocGFyYW1zOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZGlldGFyeUludGFrZXNgXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdkYXRlJywgcGFyYW1zLmRhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5ncm91cGVkX2J5X3RpbWVzKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdncm91cGVkX2J5X3RpbWVzJywgcGFyYW1zLmdyb3VwZWRfYnlfdGltZXMpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaWV0c0J5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElGb3Jtc0J5RGF0ZShwYXJhbXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgcmVoYWJpbGlmeS9zaGFyZWRjYXJlcGxhbi9mb3Jtc2A7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdkYXRlJywgcGFyYW1zLmRhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5ncm91cGVkX2J5X3RpbWVzKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdncm91cGVkX2J5X3RpbWVzJywgcGFyYW1zLmdyb3VwZWRfYnlfdGltZXMpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaWV0c0J5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiBcblxuICBnZXRBUElkZXRhaWxEaWV0cyhpZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBkaWV0LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsRGlldHMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJZGV0YWlsUmVjaXBlKGlkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYGRpZXQvcmVjZWlwdC8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRldGFpbFJlY2lwZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElsaXN0VGVzdGltb25pYWxzKHBhcmFtcyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci90ZXN0aW1vbmlhbHNgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgLnNldCgndGFncycsIHBhcmFtcy50YWdzKVxuICAgIC5zZXQoJ2ludGVyYWN0aW9ucycsIHBhcmFtcy5pbnRlcmFjdGlvbnMpXG4gICAgLnNldCgncmVhZGluZ1RpbWUnLCBwYXJhbXMucmVhZGluZ1RpbWUpO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsUmVjaXBlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWRldGFpbFRlc3RpbW9uaWFsKGlkLCBwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvdGVzdGltb255LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgIC5zZXQoJ3RhZ3MnLCBwYXJhbXMudGFncylcbiAgICAuc2V0KCdpbnRlcmFjdGlvbnMnLCBwYXJhbXMuaW50ZXJhY3Rpb25zKVxuICAgIC5zZXQoJ3JlYWRpbmdUaW1lJywgcGFyYW1zLnJlYWRpbmdUaW1lKTtcbiAgICBcbiAgICBcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCxodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRldGFpbFJlY2lwZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgXG5cbiAgLyoqIGdldCBhZHZpY2VzICAqKi9cbiAgZ2V0QVBJbGlzdEFkdmljZXMocGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FkdmljZXMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgLnNldCgndGFncycsIHBhcmFtcy50YWdzKVxuICAgIC5zZXQoJ2ludGVyYWN0aW9ucycsIHBhcmFtcy5pbnRlcmFjdGlvbnMpXG4gICAgLnNldCgncmVhZGluZ1RpbWUnLCBwYXJhbXMucmVhZGluZ1RpbWUpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJbGlzdEFkdmljZXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiBcbiAgICAvKiogZ2V0IG5ld3MgICoqL1xuICAgIGdldEFQSWxpc3ROZXdzKHBhcmFtcyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICBsZXQgcGF0aCA9ICd1c2VyL25ld3MnO1xuICAgICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgLnNldCgndGFncycsIHBhcmFtcy50YWdzKVxuICAgICAgLnNldCgnaW50ZXJhY3Rpb25zJywgcGFyYW1zLmludGVyYWN0aW9ucylcbiAgICAgIC5zZXQoJ3JlYWRpbmdUaW1lJywgcGFyYW1zLnJlYWRpbmdUaW1lKTtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWxpc3ROZXdzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRBUElkZXRhaWxOZXcoaWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICBsZXQgcGF0aCA9IGB1c2VyL25ldy8ke2lkfWA7XG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsTmV3KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IFxuXG4gIGdldEFQSWRldGFpbEFkdmljZXMoaWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgYWR2aWNlLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGV0YWlsQWR2aWNlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElTZWFyY2hOZXdzKHF1ZXJ5OiBhbnkscGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICduZXdzJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICAuc2V0KCd0YWdzJywgcGFyYW1zLnRhZ3MpXG4gICAgLnNldCgnaW50ZXJhY3Rpb25zJywgcGFyYW1zLmludGVyYWN0aW9ucylcbiAgICAuc2V0KCdyZWFkaW5nVGltZScsIHBhcmFtcy5yZWFkaW5nVGltZSk7XG4gICAgaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSVNlYXJjaE5ld3MoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJU2VhcmNoQWR2aWNlcyhxdWVyeTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdhZHZpY2VzJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJU2VhcmNoQWR2aWNlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgXG4gIGdldEFQSWRydWdzTGlzdChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBkcnVnSW50YWtlL2xpc3RgO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHF1ZXJ5KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBxdWVyeSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWRydWdzTGlzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBcbiAgZ2V0QVBJZHJ1Z3NMaXN0SW50ZXJhY3Rpb24ocXVlcnk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgaHR0cHM6Ly9uNmliYWF6ZXZuc2l4ZmNzNHBybDd6N3dyYTBvb25tYS5sYW1iZGEtdXJsLmV1LWNlbnRyYWwtMS5vbi5hd3MvYDtcbiAgIC8vIGNvbnN0IGVuZHBvaW50ID0gYGh0dHBzOi8vbjZpYmFhemV2bnNpeGZjczRwcmw3ejd3cmEwb29ubWEubGFtYmRhLXVybC5ldS1jZW50cmFsLTEub24uYXdzLz9kcnVnPURCMDEzNjNgO1xuICAgLy9sZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdkcnVnJywgcXVlcnkpO1xuICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAuc2V0KCdkcnVnJywgcXVlcnkpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSWRydWdJbnRha2VCeURhdGUocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZHJ1Z0ludGFrZS9kYXRlJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZHJ1Z0ludGFrZUJ5RGF0ZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuLy8gc2VuZCBtZWRpY2F0aW9uIGxpc3RcbiAgZ2V0QVBJbWVkaWNhdGlvbkxpc3QocXVlcnk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgc2VuZG1lZGljYXRpb24vbGlzdGA7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocXVlcnkpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3NlYXJjaCcsIHF1ZXJ5KSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSW1lZGljYXRpb25MaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWRpcmVjdGlvbnNMaXN0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9hZGRyZXNzZXNgO1xuICAgIC8vIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICAvLyBodHRwUGFyYW1zID0gKHF1ZXJ5KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBxdWVyeSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElkaXJlY3Rpb25MaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBnZXRBUEltZWRpY2F0aW9uc0xpc3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBzZW5kbWVkaWNhdGlvbi9saXN0YDtcbiAgICAvLyBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgLy8gaHR0cFBhcmFtcyA9IChxdWVyeSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnc2VhcmNoJywgcXVlcnkpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZGlyZWN0aW9uTGlzdCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJc2VuZERpcmVjdGlvbihwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9hZGRyZXNzJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElzZW5kRGlyZWN0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHV0QVBJc2VuZERpcmVjdGlvbihpZDogYW55LCBwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9hZGRyZXNzLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwdXRBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlQVBJc2VuZERpcmVjdGlvbihpZDogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2FkZHJlc3MvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBkZWxldGVBUEltZWRpY2F0aW9uUGxhbigke3BhdGh9KSByZXM6ICR7cmVzfWAsIEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSW1lZGljYXRpb25TZW5kUGV0aXRpb24ocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3NlbmRtZWRpY2F0aW9uJztcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElzZW5kRGlyZWN0aW9uKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWRydWdJbnRha2UocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZHJ1Z0ludGFrZSc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWNoYW5nZVN0YXRlZHJ1Z0ludGFrZShpZDogT2JqZWN0LCBzdGF0ZTogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2RydWdJbnRha2UvJHtpZH0vc2V0LyR7c3RhdGV9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSW1lZGljYXRpb25QbGFuKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL21lZGljYXRpb25QbGFuYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWRydWdJbnRha2UoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdXRBUEltZWRpY2F0aW9uUGxhbihpZDogYW55LCBwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9tZWRpY2F0aW9uUGxhbi8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcHV0QVBJZHJ1Z0ludGFrZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSW1lZGljYXRpb25QbGFuKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW4vJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBkZWxldGVBUEltZWRpY2F0aW9uUGxhbigke3BhdGh9KSByZXM6ICR7cmVzfWAsIEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJbWVkaWNhdGlvblBsYW4oaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW4vJHtpZH1gXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSW1lZGljYXRpb25QbGFuKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSW1lZGljYXRpb25QbGFucyhwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL21lZGljYXRpb25QbGFuc2BcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/Lm9uRGF0ZSA9PT0gMCB8fCBwYXJhbXM/Lm9uRGF0ZSA9PT0gMSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnb25EYXRlJywgcGFyYW1zPy5vbkRhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5mcm9tX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2Zyb21fZGF0ZScsIHBhcmFtcz8uZnJvbV9kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8udG9fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHBhcmFtcz8udG9fZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEltZWRpY2F0aW9uUGxhbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbi8vdG9kb3MgbG9zIG1lZGljYW1lbnRvcyBhc2lnbmFkb3MgYSBlc2EgcGVyc29uYVxuICBnZXRBUEltZWRpY2F0aW9uQWxscygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvbWVkaWNhdGlvblBsYW5zYCAgXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUEltZWRpY2F0aW9uUGxhbigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuLy8gYWN0aXZhdGVQZW5kaW5nTWVkaWNhdGlvblBsYW5zXG4gIGdldEFQSVBlbmRpbmdNZWRpY2F0aW9uUGxhbnMocGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9wZW5kaW5nL21lZGljYXRpb25QbGFuc2BcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/Lm9ubHlDb3VudCA9PT0gMSB8fCBwYXJhbXM/Lm9ubHlDb3VudCA9PT0gMCkgPyBodHRwUGFyYW1zLmFwcGVuZCgnb25seUNvdW50JywgcGFyYW1zPy5vbmx5Q291bnQpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5vbmx5Q291bnQgPT09IHVuZGVmaW5lZCkgPyBodHRwUGFyYW1zLmFwcGVuZCgnb25seUNvdW50JywgJzAnKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSVBlbmRpbmdNZWRpY2F0aW9uUGxhbnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJRnJlcXVlbmNpZXNNZWRpY2F0aW9uUGxhbnNIUEMocGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgaHBjL21lZGljYXRpb25QbGFuL2ZyZXF1ZW5jaWVzYFxuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUZyZXF1ZW5jaWVzTWVkaWNhdGlvblBsYW5zSFBDKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSURydWdVbml0cyhpZCwgc2VhcmNoPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgZHJ1Zy8ke2lkfS91bml0c2BcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IHNlYXJjaCA/IGh0dHBQYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBzZWFyY2gpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJRHJ1Z1VuaXRzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSURpYWdub3N0aWMocGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2RpYWdub3N0aWNzJy8vJ3YyL2RpYWdub3N0aWMvdXNlcic7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5vbkRhdGUgPT09IDAgfHwgcGFyYW1zPy5vbkRhdGUgPT09IDEpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ29uRGF0ZScsIHBhcmFtcz8ub25EYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZnJvbV9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBwYXJhbXM/LmZyb21fZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LnRvX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3RvX2RhdGUnLCBwYXJhbXM/LnRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElnYW1lcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElDZW50ZXJBbGxlcmdpZXMoc2VhcmNoPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2FsbGVyZ2llcyc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAoc2VhcmNoKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBzZWFyY2gpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElnYW1lcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElBbGxlcmdpZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FsbGVyZ2llcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElBbGxlcmdpZXMocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWxsZXJneS9jcmVhdGVgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJZHJ1Z0ludGFrZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1dEFQSUFsbGVyZ3koaWQ6IGFueSwgcGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvYWxsZXJneS8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcHV0QVBJQWxsZXJneSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSUFsbGVyZ3koaWQ6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9hbGxlcmd5LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGRlbGV0ZUFQSUFsbGVyZ3koJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSWdhbWVzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9nYW1lcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICAvKiogZ2V0IGdhbWVzIHdpdGggcXVlcnkgYnkgcGFyYW1ldGVyIGRhdGUgICovXG4gIGdldEFQSWdhbWVzQnlEYXRlKGZyb21fZGF0ZTogYW55LCB0b19kYXRlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZ2FtZVBsYXlzL3NjaGVkdWxlZCc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAoZnJvbV9kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdmcm9tX2RhdGUnLCBmcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAodG9fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElnYW1lcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgZ2V0QVBJZ2FtZUlkKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2dhbWUvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElnYW1lSWQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJYWdlbmRhKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9hZ2VuZGEnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElhZ2VuZGEoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLy9yZW1pbmRlcnNcbiAgLy91c2VyL3JlbWluZGVyIFxuXG4gIGdldEFQSWFsbEFnZW5kYShwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+e1xuICAgIGxldCBwYXRoID0gJ3VzZXIvYWdlbmRhL3YyJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IHBhcmFtcz8uZnJvbV9kYXRlPyBodHRwUGFyYW1zLmFwcGVuZCgnZnJvbV9kYXRlJywgcGFyYW1zPy5mcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSBwYXJhbXM/LnRvX2RhdGU/IGh0dHBQYXJhbXMuYXBwZW5kKCd0b19kYXRlJywgcGFyYW1zPy50b19kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gcGFyYW1zPy5maWx0ZXJfYnlfZGF0ZT8gaHR0cFBhcmFtcy5hcHBlbmQoJ2ZpbHRlcl9ieV9kYXRlJywgcGFyYW1zPy5maWx0ZXJfYnlfZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LndpdGhfbWVkaWNhbF9wcm9jZWR1cmVzICE9IHVuZGVmaW5lZCk/IGh0dHBQYXJhbXMuYXBwZW5kKCd3aXRoX21lZGljYWxfcHJvY2VkdXJlcycsIHBhcmFtcz8ud2l0aF9tZWRpY2FsX3Byb2NlZHVyZXMpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5vcmRlciAhPSB1bmRlZmluZWQpPyBodHRwUGFyYW1zLmFwcGVuZCgnb3JkZXInLCBwYXJhbXM/Lm9yZGVyKSA6IGh0dHBQYXJhbXNcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJYXBwb2ludG1lbnRBZ2VuZGFWMigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElhZ2VuZGFJRChpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9hZ2VuZGEvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElhZ2VuZGFJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJYWRkQWdlbmRhKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2FnZW5kYS8nXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElhZGRBZ2VuZGEoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZGVsZXRlQVBJYWRkQWdlbmRhKGlkOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXJhbXMgPSB7IGFnZW5kYTogaWQgfVxuICAgIGxldCBwYXRoID0gJ3VzZXIvYWdlbmRhL2RlbGV0ZSdcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJYWRkQWdlbmRhKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1dEFQSWFnZW5kYShpZDogYW55LCBwYXJhbXM6IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9hZ2VuZGEvJHtpZH1gO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHB1dEFQSWFnZW5kYSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElhbGxvd2VkQ29udGFjdHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL2FsbG93ZWRDb250YWN0c2A7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKCd3aXRoRGVwYXJ0bWVudHMnLCAnMScpIFxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWFsbG93ZWRDb250YWN0cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIGxldCBhbGxvd2VkID0gcmVzLmFsbG93ZWRcbiAgICAgICAgaWYocmVzLmFsbG93ZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgYWxsb3dlZCA9IFtdXG4gICAgICAgIHJldHVybiBhbGxvd2VkO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElzdGFmZklkKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBzdGFmZi8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSXN0YWZmSWQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqIGdldCBnYW1lcyB3aXRoIHF1ZXJ5IGJ5IHBhcmFtZXRlciBkYXRlICAqL1xuICBnZXRBUElVc2VyTWVzc2FnZXMoKTogT2JzZXJ2YWJsZTxTaGVsbENoYXRNb2RlbFtdPiB7XG5cbiAgICBsZXQgcGF0aCA9ICdtZXNzYWdlL3VzZXInO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElVc2VyTWVzc2FnZXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICBpZihyZXMubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiByZXNcbiAgICAgICAgcmV0dXJuIHJlcy5tZXNzYWdlcyBhcyBTaGVsbENoYXRNb2RlbFtdO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIC8vIGdldCB0aGUgY29tcGFueSBkZXRhaWxzLCBhIHN1YnNldCBvZiB0aGUgdXNlciBkYXRhXG4gIGdldFVzZXJTdWJzZXREYXRhKCk6IE9ic2VydmFibGU8U2hlbGxDaGF0TW9kZWw+IHtcbiAgICBsZXQgcGF0aCA9ICdtZXNzYWdlL3VzZXInO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG5cbiAgICBjb25zdCBkYXRhT2JzZXJ2YWJsZSA9IHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpO1xuXG4gICAgcmV0dXJuIGRhdGFPYnNlcnZhYmxlLnBpcGUoXG4gICAgICBtYXAoKGpzb25SZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGE6IFNoZWxsQ2hhdE1vZGVsID0ge1xuICAgICAgICAgIC4uLmpzb25SZXNwb25zZS5tZXNzYWdlc1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4vKiogUmVtaW5kZXJzICovXG4gIGdldEFQSXJlbWluZGVycygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcmVtaW5kZXInO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElyZW1pbmRlcnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJcmVtaW5kZXJJRChpZCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9yZW1pbmRlci8ke2lkfWA7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSXJlbWluZGVySUQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSWFkZFJlbWluZGVyKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL3JlbWluZGVyLydcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWFkZFJlbWluZGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFQSVJlbWluZGVyKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL3JlbWluZGVyLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZGVsZXRlQVBJUmVtaW5kZXIoJHtwYXRofSkgcmVzOiAke3Jlc31gLCBKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUFQSVJlbWluZGVyKGlkOiBhbnksIHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL3JlbWluZGVyLyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSB1cGRhdGVBUElSZW1pbmRlcigke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUFQSXVzZXIocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXJgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHVwZGF0ZUFQSVJlbWluZGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSUNvbnRlbnRTdGF0dXMocGFyYW1zOiBPYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2NvbnRlbnQvc3RhdHVzJ1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJQ29udGVudFN0YXR1cygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJdXNlclJlZ2lzdGVyKHBhcmFtczogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdocGMvdXNlci9zdG9yZSc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJc2VuZFJlZ2lzdGVyKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJVHlwZURvY3VtZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnY2VudGVyL2RvY3VtZW50VHlwZXMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElUeXBlRG9jdW1lbnQoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG4gIFxuICBnZXRBUEltZXNzYWdlKGlkLCBwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL21lc3NhZ2UvJysgaWRcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXM/IGh0dHBQYXJhbXMuYXBwZW5kKCdwYWdlJywgcGFyYW1zKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZWxlbWVudHNMaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUV2ZW50cyhwYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ2hwYy91c2VyL2VwaXNvZGVzJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/Lm9uRGF0ZSA9PT0gMCB8fCBwYXJhbXM/Lm9uRGF0ZSA9PT0gMSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnb25EYXRlJywgcGFyYW1zPy5vbkRhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5mcm9tX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2Zyb21fZGF0ZScsIHBhcmFtcz8uZnJvbV9kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8udG9fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgndG9fZGF0ZScsIHBhcmFtcz8udG9fZGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlczsgXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwb3N0QVBJbWVkaWNhbFByb2NlZHVyZXMocGFyYW1zPzogT2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL21lZGljYWxQcm9jZWR1cmVzYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgcGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gcG9zdEFQSWRydWdJbnRha2UoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUEltZWRpY2FsUHJvY2VkdXJlczIocGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBocGMvdXNlci9tZWRpY2FsUHJvY2VkdXJlc2A7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LnRvX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3RvX2RhdGUnLCBwYXJhbXM/LnRvX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5mcm9tX2RhdGUpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ2Zyb21fZGF0ZScsIHBhcmFtcz8uZnJvbV9kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8udXNlcikgPyBodHRwUGFyYW1zLmFwcGVuZCgndXNlcicsIHBhcmFtcz8udXNlcikgOiBodHRwUGFyYW1zXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIHBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdEFQSU5leHRNZWRpY2FsUHJvY2VkdXJlKHBhcmFtcz86IE9iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9tZWRpY2FsUHJvY2VkdXJlL25leHRgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGVuZHBvaW50LCBwYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBwb3N0QVBJZHJ1Z0ludGFrZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSW1lZGljYWxQcm9jZWR1cmVzKHBhcmFtczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGBocGMvdXNlci9tZWRpY2FsUHJvY2VkdXJlYDtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LmJ5RXBpc29kZSA9PT0gMCB8fCBwYXJhbXM/LmJ5RXBpc29kZSA9PT0gMSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnYnlFcGlzb2RlJywgcGFyYW1zPy5ieUVwaXNvZGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5tZWRpY2FsX3Byb2NlZHVyZV9pZCAmJiBwYXJhbXM/LmJ5RXBpc29kZSA9PT0gMCkgPyBodHRwUGFyYW1zLmFwcGVuZCgnbWVkaWNhbF9wcm9jZWR1cmVfaWQnLCBwYXJhbXM/Lm1lZGljYWxfcHJvY2VkdXJlX2lkKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uZXBpc29kZV9pZCAmJiBwYXJhbXM/LmJ5RXBpc29kZSA9PT0gMSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnZXBpc29kZV9pZCcsIHBhcmFtcz8uZXBpc29kZV9pZCkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIHBvc3RBUElkcnVnSW50YWtlKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcblxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJcHJlZXhpc3RpbmdDb25kaXRpb25zKHBhcmFtcz8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcHJlZXhpc3RpbmdDb25kaXRpb25zJ1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8ub25EYXRlID09PSAwIHx8IHBhcmFtcz8ub25EYXRlID09PSAxKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdvbkRhdGUnLCBwYXJhbXM/Lm9uRGF0ZSkgOiBodHRwUGFyYW1zXG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LmZyb21fZGF0ZSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnZnJvbV9kYXRlJywgcGFyYW1zPy5mcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy50b19kYXRlKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCd0b19kYXRlJywgcGFyYW1zPy50b19kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICAvL2h0dHBQYXJhbXMgPSAocGFyYW1zPy5wcmVleGlzdGluZ0NvbmRpdGlvblR5cGVzKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdwcmVleGlzdGluZ0NvbmRpdGlvblR5cGVzW10nLCBwYXJhbXM/LnByZWV4aXN0aW5nQ29uZGl0aW9uVHlwZXMpIDogaHR0cFBhcmFtc1xuICAgIGlmIChwYXJhbXM/LnByZWV4aXN0aW5nQ29uZGl0aW9uVHlwZXMgJiYgcGFyYW1zPy5wcmVleGlzdGluZ0NvbmRpdGlvblR5cGVzPy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtcy5wcmVleGlzdGluZ0NvbmRpdGlvblR5cGVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZCgncHJlZXhpc3RpbmdDb25kaXRpb25UeXBlc1tdJywgZWxlbWVudClcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJZWxlbWVudHNMaXN0KCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSXByZWV4aXN0aW5nQ29uZGl0aW9uc1R5cGUoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdjZW50ZXIvcHJlZXhpc3RpbmdDb25kaXRpb25UeXBlcydcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJcHJlZXhpc3RpbmdDb25kaXRpb25zVHlwZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElOb3RpZmljYXRpb25zQ291bnQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL25vdGlmaWNhdGlvbnMvY291bnQnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElOb3RpZmljYXRpb25zKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSU5vdGlmaWNhdGlvbnMocGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9ub3RpZmljYXRpb25zJztcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IChwYXJhbXM/LnJlYWQpID8gaHR0cFBhcmFtcy5hcHBlbmQoJ3JlYWQnLCBwYXJhbXM/LnJlYWQpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy53aXRoUGFnaW5hdGUgPT0gMSkgPyBodHRwUGFyYW1zLmFwcGVuZCgnd2l0aFBhZ2luYXRlJywgcGFyYW1zPy53aXRoUGFnaW5hdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5wYWdlID4gMCkgPyBodHRwUGFyYW1zLmFwcGVuZCgncGFnZScsIHBhcmFtcz8ucGFnZSkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSU5vdGlmaWNhdGlvbnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJVXNlckltYWdlKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAndXNlci9pbWFnZSc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSWdhbWVzKCR7cGF0aH0pIHJlczogYCwgcmVzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHBvc3RBUElOb3RpZmljYXRpb25SZWFkKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9IGB1c2VyL25vdGlmaWNhdGlvbi9yZWFkYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgaWQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXQoZW5kcHQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQoZW5kcHQpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcG9zdChlbmRwdCwgaXRlbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQoZW5kcHQpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChlbmRwb2ludCwgaXRlbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBzZXRQdXNoTm90aWZpY2F0aW9uKHB1c2hOb3RpZmljYXRpb246IGFueSl7XG4gICAgdGhpcy5wdXNoTm90aWZpY2F0aW9uID0gcHVzaE5vdGlmaWNhdGlvbjtcbiAgfVxuXG4gIGdldFB1c2hOb3RpZmljYXRpb24oKXtcbiAgIHJldHVybiB0aGlzLnB1c2hOb3RpZmljYXRpb247XG4gIH1cblxuICBnZXRBUElFeGVyY2lzZURldGFpbChpZCwgcGFyYW1zPyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9leGVyY2lzZS8ke2lkfWA7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSAocGFyYW1zPy5wcm9ncmFtYWJsZV9wbGF5KSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdwcm9ncmFtYWJsZV9wbGF5JywgcGFyYW1zPy5wcm9ncmFtYWJsZV9wbGF5KSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gKHBhcmFtcz8uY2hhbGxlbmdlX2lkKSA/IGh0dHBQYXJhbXMuYXBwZW5kKCdjaGFsbGVuZ2VfaWQnLCBwYXJhbXM/LmNoYWxsZW5nZV9pZCkgOiBodHRwUGFyYW1zXG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCwgaHR0cFBhcmFtcykucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElFeGVyY2lzZXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJRXhlcmNpc2VzQnlEYXRlKGZyb21fZGF0ZT8sdG9fZGF0ZT8pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvZXhlcmNpc2VzL3NjaGVkdWxlZCc7XG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zPyBodHRwUGFyYW1zLmFwcGVuZCgnZnJvbV9kYXRlJywgZnJvbV9kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcz8gaHR0cFBhcmFtcy5hcHBlbmQoJ3RvX2RhdGUnLCB0b19kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUV4ZXJjaXNlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElFeGVyY2lzZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2V4ZXJjaXNlcyc7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElFeGVyY2lzZXMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJQ2hhbGxlbmdlKGNoYWxsZW5nZUlkLCBwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NoYWxsZW5nZS8nK2NoYWxsZW5nZUlkXG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSUNoYWxsZW5nZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRBUElDaGFsbGVuZ2VzKCBwYXJhbXM/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NoYWxsZW5nZXMnXG4gICAgbGV0IGh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpO1xuXG4gICAgaWYgKHBhcmFtcz8ub25seUFjY2VwdGVkKSBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoJ29ubHlBY2NlcHRlZCcsIHBhcmFtcy5vbmx5QWNjZXB0ZWQpO1xuICAgIFxuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQsIGh0dHBQYXJhbXMpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQ2hhbGxlbmdlcygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgZ2V0QVBJQ2hhbGxlbmdlczIoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICd1c2VyL2NoYWxsZW5nZXMvZ29hbHMnXG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCApLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQ2hhbGxlbmdlczIoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJQXBwTGF0ZXN0VmVyc2lvbih2ZXJzaW9uLCBwbGF0Zm9ybSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSAnYXBwL3ZlcnNpb25zL211c3QtdXBkYXRlP3ZlcnNpb249Jyt2ZXJzaW9uKycmcGxhdGZvcm09JytwbGF0Zm9ybTtcbiAgICAvLy8vY29uc29sZS5sb2cocGF0aCk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmFwaS5nZXRFbmRwb2ludChwYXRoKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChlbmRwb2ludCkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBnZXRBUElwYXRpZW50cygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gJ3VzZXIvcGF0aWVudHMnO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElyZW1pbmRlcnMoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJX1NDUF9nb2FscygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHNoYXJlY2FyZXBsYW4vZ29hbHNgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy8vL2NvbnNvbGUubG9nKGBbRG9vbGVTZXJ2aWNlXSBnZXRBUElhZ2VuZGFJRCgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBcbiAgZ2V0QVBJX3ByZXNjcmliZWRBcHBzX0J5RGF0ZShmcm9tX2RhdGU/LHRvX2RhdGU/KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGF0aCA9ICdyZWhhYmlsaWZ5L3ByZXNjcmliZWQtYXBwcy9hY3Rpdml0aWVzL3BlbmRpbmcnO1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcz8gaHR0cFBhcmFtcy5hcHBlbmQoJ2Zyb20nLCBmcm9tX2RhdGUpIDogaHR0cFBhcmFtc1xuICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zPyBodHRwUGFyYW1zLmFwcGVuZCgndG8nLCB0b19kYXRlKSA6IGh0dHBQYXJhbXNcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50LCBodHRwUGFyYW1zKS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSV9wcmVzY3JpYmVkQXBwc19CeURhdGUoJHtwYXRofSkgcmVzOiBgLCByZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0QVBJYWxsb3dlZERlcGFydG1lbnRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgdXNlci9kZXBhcnRtZW50c2A7XG4gIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgIG1hcCgocmVzOiBhbnkpID0+IHtcbiAgXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pXG4gICk7XG4gIH1cbiAgZ2V0QVBJZGV0YWlsRGVwYXJ0bWVudHMoaWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHBhdGggPSBgZGVwYXJ0bWVudC9zaG93LyR7aWR9YDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICBcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldEFQSUFuc3dlcnMoaWQpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZm9ybS8ke2lkfS9hbnN3ZXJzL2RldGFpbD9odG1sPXRydWVgO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5hcGkuZ2V0RW5kcG9pbnQocGF0aCk7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoZW5kcG9pbnQpLnBpcGUoXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vLy9jb25zb2xlLmxvZyhgW0Rvb2xlU2VydmljZV0gZ2V0QVBJQW5zd2Vycygke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuXG4gIGdldEFQSURheVBocmFzZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXRoID0gYHVzZXIvZGF5UGhyYXNlYDtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuYXBpLmdldEVuZHBvaW50KHBhdGgpO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGVuZHBvaW50KS5waXBlKFxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAvLy8vY29uc29sZS5sb2coYFtEb29sZVNlcnZpY2VdIGdldEFQSURheVBocmFzZSgke3BhdGh9KSByZXM6IGAsIHJlcyk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==