@c8y/ngx-components 1017.0.336 → 1017.0.343

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 (28) hide show
  1. package/core/common/date.pipe.d.ts +2 -2
  2. package/core/common/stringify-object.pipe.d.ts +2 -1
  3. package/ecosystem/packages/deploy-application/deploy-application.component.d.ts +6 -5
  4. package/ecosystem/shared/ecosystem.constants.d.ts +2 -0
  5. package/ecosystem/shared/ecosystem.model.d.ts +3 -1
  6. package/ecosystem/shared/ecosystem.service.d.ts +11 -5
  7. package/esm2020/core/common/date.pipe.mjs +12 -7
  8. package/esm2020/core/common/stringify-object.pipe.mjs +11 -8
  9. package/esm2020/ecosystem/application-properties/application-properties.component.mjs +3 -3
  10. package/esm2020/ecosystem/applications/install-from-package/install-from-package.component.mjs +2 -2
  11. package/esm2020/ecosystem/packages/deploy-application/deploy-application.component.mjs +26 -81
  12. package/esm2020/ecosystem/shared/ecosystem.constants.mjs +5 -3
  13. package/esm2020/ecosystem/shared/ecosystem.model.mjs +3 -1
  14. package/esm2020/ecosystem/shared/ecosystem.service.mjs +121 -24
  15. package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs +139 -27
  16. package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  17. package/fesm2015/c8y-ngx-components-ecosystem.mjs +23 -77
  18. package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
  19. package/fesm2015/c8y-ngx-components.mjs +20 -13
  20. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  21. package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs +126 -25
  22. package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  23. package/fesm2020/c8y-ngx-components-ecosystem.mjs +23 -78
  24. package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
  25. package/fesm2020/c8y-ngx-components.mjs +20 -13
  26. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  27. package/locales/locales.pot +15 -3
  28. package/package.json +2 -2
@@ -3,7 +3,7 @@ import { ApplicationAvailability, ApplicationService, ApplicationType, Inventory
3
3
  import { AlertService, AppStateService, gettext, HumanizeAppNamePipe, ModalService, Status, ZipService } from '@c8y/ngx-components';
4
4
  import { TranslateService } from '@ngx-translate/core';
5
5
  import { saveAs } from 'file-saver';
6
- import { cloneDeep, get, groupBy, kebabCase, pick, uniqBy } from 'lodash-es';
6
+ import { cloneDeep, get, groupBy, kebabCase, pick, uniqBy, omit, isUndefined } from 'lodash-es';
7
7
  import { BehaviorSubject, defer } from 'rxjs';
8
8
  import { debounceTime, take, map, shareReplay } from 'rxjs/operators';
9
9
  import { gt, coerce } from 'semver';
@@ -108,6 +108,14 @@ export class EcosystemService {
108
108
  return webApps.sort((a, b) => a.name.localeCompare(b.name));
109
109
  }
110
110
  async getPackageApplications(customFilter = {}) {
111
+ const filterCallback = app => this.isPackage(app);
112
+ return this.getApplicationsFiltered(customFilter, filterCallback);
113
+ }
114
+ async getHostedAndPackageApplications(customFilter = {}) {
115
+ const filterCallback = app => this.isPackage(app) || this.isApplication(app);
116
+ return this.getApplicationsFiltered(customFilter, filterCallback);
117
+ }
118
+ async getApplicationsFiltered(customFilter = {}, filterCallback = (app) => !!app) {
111
119
  const filter = Object.assign({}, customFilter);
112
120
  const sharedFilter = Object.assign({
113
121
  availability: ApplicationAvailability.SHARED,
@@ -118,7 +126,7 @@ export class EcosystemService {
118
126
  this.getApplications(filter),
119
127
  this.applicationService.list(sharedFilter)
120
128
  ]);
121
- const webApps = [...apps, ...shared].filter(app => this.isPackage(app));
129
+ const webApps = [...apps, ...shared].filter(filterCallback);
122
130
  // an app could be subscribed to a tenant, but also have it's availability set to SHARED, in that case it would occur twice.
123
131
  const uniqWebApps = uniqBy(webApps, (app) => app.id);
124
132
  return uniqWebApps.sort((a, b) => a.name.localeCompare(b.name));
@@ -201,18 +209,6 @@ export class EcosystemService {
201
209
  };
202
210
  return config;
203
211
  }
204
- async updateAppManifest(application, sourcePackage) {
205
- const { id } = application;
206
- const cleanedApp = this.removeAppProperties(application);
207
- if (!cleanedApp.manifest) {
208
- cleanedApp.manifest = {};
209
- }
210
- cleanedApp.manifest.isPackage = false;
211
- cleanedApp.manifest.source = sourcePackage.id;
212
- return await this.applicationService
213
- .binary(id)
214
- .updateFiles([{ path: CUMULOCITY_JSON, contents: JSON.stringify(cleanedApp) }]);
215
- }
216
212
  async listArchives(appId) {
217
213
  const filter = {
218
214
  pageSize: 100
@@ -420,6 +416,78 @@ export class EcosystemService {
420
416
  this.alertError(ex);
421
417
  }
422
418
  }
419
+ async deployApp(selectedPackage, formGroupValue, model) {
420
+ // Create new app config
421
+ const config = this.createConfig(selectedPackage, formGroupValue);
422
+ const requestedVersion = model.selected.version;
423
+ let cleanManifest;
424
+ try {
425
+ const manifest = await this.applicationService.getAppManifest(selectedPackage, requestedVersion);
426
+ cleanManifest = omit(manifest, ['name', 'contextPath', 'key']);
427
+ }
428
+ catch (ex) {
429
+ throw new EcosystemError(ERROR_TYPE.VERSION_NOT_FOUND);
430
+ }
431
+ config.isSetup = true;
432
+ config.manifest = cleanManifest;
433
+ config.availability = ApplicationAvailability.PRIVATE;
434
+ config.manifest.isPackage = false;
435
+ config.manifest.source = selectedPackage.id;
436
+ config.manifest.package = 'blueprint';
437
+ // because of a issue with SHARED availability we always should check again
438
+ // if the app not exist already
439
+ const allExistingApps = await this.getHostedAndPackageApplications();
440
+ const doesAppKeyOrContextPathExist = this.checkIfAppNameKeyPathExists(allExistingApps, config);
441
+ if (doesAppKeyOrContextPathExist) {
442
+ throw new EcosystemError(ERROR_TYPE.ALREADY_EXIST);
443
+ }
444
+ // Create new app
445
+ const newApp = (await this.applicationService.create(config)).data;
446
+ try {
447
+ // Binary upload can fail if SHARED package
448
+ // in this case, catch error and fall back to
449
+ // clone API.
450
+ await this.uploadBinaryFromOtherPackage(selectedPackage, newApp, model.selected.binaryId, requestedVersion);
451
+ }
452
+ catch (error) {
453
+ if (error?.res?.status === 404) {
454
+ await this.fallbackToClone(newApp, selectedPackage, requestedVersion);
455
+ }
456
+ }
457
+ return newApp;
458
+ }
459
+ async fallbackToClone(application, selectedPackage, requestedVersion) {
460
+ let wasSuccess = true;
461
+ let clonedPkg;
462
+ try {
463
+ clonedPkg = (await this.applicationService.clone(selectedPackage, requestedVersion)).data;
464
+ await this.uploadBinaryFromOtherPackage(selectedPackage, application, clonedPkg.activeVersionId, requestedVersion, clonedPkg);
465
+ }
466
+ catch (error) {
467
+ this.alertError(error);
468
+ wasSuccess = false;
469
+ }
470
+ finally {
471
+ await this.deleteApp(clonedPkg, true);
472
+ }
473
+ return wasSuccess;
474
+ }
475
+ async uploadBinaryFromOtherPackage(selectedPackage, applicationToUploadBinaryTo, binaryId, requestedVersion, useBinariesFrom) {
476
+ const { data: binaryDetails } = await this.inventoryService.detail(binaryId);
477
+ // Get binary from specific package version
478
+ const binary = await this.getBinary(useBinariesFrom || selectedPackage, {
479
+ id: binaryId
480
+ });
481
+ // Create zip
482
+ const fileBinary = new Blob([binary], { type: binaryDetails.contentType });
483
+ const file = new File([fileBinary], binaryDetails.name, {
484
+ type: binaryDetails.contentType
485
+ });
486
+ // Upload binary to new app
487
+ await this.uploadArchiveToApp(file, applicationToUploadBinaryTo);
488
+ // update the app manifest
489
+ await this.updateAppManifest(applicationToUploadBinaryTo, selectedPackage, requestedVersion);
490
+ }
423
491
  getAppState(app) {
424
492
  if (!this.isOwner(app)) {
425
493
  return APP_STATE.SUBSCRIBED;
@@ -501,6 +569,43 @@ export class EcosystemService {
501
569
  throw new EcosystemError(ERROR_TYPE.KEY_OR_CONTEXT_PATH_MISMATCH);
502
570
  }
503
571
  }
572
+ filterContainString(name, filterTerm) {
573
+ const term = filterTerm.toLowerCase().trim();
574
+ return name && name.toLowerCase().indexOf(term) > -1;
575
+ }
576
+ async updateAppManifest(application, selectedPackage, requestedVersion) {
577
+ const { id } = application;
578
+ const cleanedApp = this.removeAppProperties(application);
579
+ let manifest = selectedPackage.manifest || {};
580
+ if (requestedVersion) {
581
+ try {
582
+ const versionedAppManifest = await this.applicationService.getAppManifest(selectedPackage, requestedVersion);
583
+ manifest = versionedAppManifest;
584
+ }
585
+ catch (ex) {
586
+ throw new EcosystemError(ERROR_TYPE.VERSION_NOT_FOUND);
587
+ }
588
+ }
589
+ cleanedApp.manifest = manifest;
590
+ cleanedApp.manifest.isPackage = false;
591
+ cleanedApp.manifest.source = selectedPackage.id;
592
+ return await this.applicationService
593
+ .binary(id)
594
+ .updateFiles([{ path: CUMULOCITY_JSON, contents: JSON.stringify(cleanedApp) }]);
595
+ }
596
+ checkIfAppNameKeyPathExists(existingApps, app, retryNo) {
597
+ if (isUndefined(retryNo)) {
598
+ return existingApps.find(existingApp => existingApp.name === app.name ||
599
+ existingApp.key === app.key ||
600
+ existingApp.contextPath === app.contextPath);
601
+ }
602
+ return existingApps.find(existingApp => existingApp.name === app.name ||
603
+ existingApp.key === app.key ||
604
+ existingApp.contextPath === app.contextPath ||
605
+ existingApp.name === [app.name, retryNo].join('-') ||
606
+ existingApp.key === [app.key, retryNo].join('-') ||
607
+ existingApp.contextPath === [app.contextPath, retryNo].join('-'));
608
+ }
504
609
  getAppKey(appModel, name) {
505
610
  let key = appModel?.key;
506
611
  if (!key) {
@@ -537,17 +642,9 @@ export class EcosystemService {
537
642
  }
538
643
  return baseName;
539
644
  }
540
- checkIfAppNameKeyPathExists(existingApps, app, retryNo) {
541
- return existingApps.find(existingApp => existingApp.name === app.name ||
542
- existingApp.key === app.key ||
543
- existingApp.contextPath === app.contextPath ||
544
- existingApp.name === [app.name, retryNo].join('-') ||
545
- existingApp.key === [app.key, retryNo].join('-') ||
546
- existingApp.contextPath === [app.contextPath, retryNo].join('-'));
547
- }
548
645
  removeAppProperties(app) {
549
646
  const tempApp = cloneDeep(app);
550
- const propertiesToRemove = ['id', 'owner', 'activeVersionId', 'self'];
647
+ const propertiesToRemove = ['id', 'owner', 'activeVersionId', 'self', 'type'];
551
648
  propertiesToRemove.forEach(prop => delete tempApp[prop]);
552
649
  return tempApp;
553
650
  }
@@ -581,4 +678,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
581
678
  providedIn: 'root'
582
679
  }]
583
680
  }], ctorParameters: function () { return [{ type: i1.ModalService }, { type: i1.AlertService }, { type: i1.HumanizeAppNamePipe }, { type: i2.TranslateService }, { type: i3.ApplicationService }, { type: i1.AppStateService }, { type: i1.ZipService }, { type: i3.TenantService }, { type: i3.InventoryService }]; } });
584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvc3lzdGVtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9lY29zeXN0ZW0vc2hhcmVkL2Vjb3N5c3RlbS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFXZixnQkFBZ0IsRUFJaEIsYUFBYSxFQUNkLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZUFBZSxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUFvQixVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7QUFFakUsTUFBTSxl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QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTthQUMvRTtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBWTtRQUN4QyxNQUFNLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsT0FBTztRQUN4QyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsNEJBQTRCLElBQUksT0FBTyxLQUFLLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFDaEcsQ0FBQzs7NkdBdnJCVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25BdmFpbGFiaWxpdHksXG4gIEFwcGxpY2F0aW9uU2VydmljZSxcbiAgQXBwbGljYXRpb25UeXBlLFxuICBJQXBwbGljYXRpb24sXG4gIElBcHBsaWNhdGlvbkJpbmFyeSxcbiAgSUFwcGxpY2F0aW9uVmVyc2lvbixcbiAgSUFwcGxpY2F0aW9uVmVyc2lvbkRlbGV0ZVBhcmFtcyxcbiAgSUN1cnJlbnRUZW5hbnQsXG4gIElkUmVmZXJlbmNlLFxuICBJRmV0Y2hSZXNwb25zZSxcbiAgSUlkZW50aWZpZWQsXG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJTWFuaWZlc3QsXG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElSZXN1bHQsXG4gIElSZXN1bHRMaXN0LFxuICBJVXBsb2FkUGFyYW1zT3ZlcnJpZGUsXG4gIFRlbmFudFNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBcHBTdGF0ZVNlcnZpY2UsXG4gIGdldHRleHQsXG4gIEh1bWFuaXplQXBwTmFtZVBpcGUsXG4gIE1vZGFsU2VydmljZSxcbiAgU3RhdHVzLFxuICBaaXBTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGdldCwgZ3JvdXBCeSwga2ViYWJDYXNlLCBwaWNrLCB1bmlxQnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBkZWZlciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ3QsIGNvZXJjZSB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBFY29zeXN0ZW1FcnJvciB9IGZyb20gJy4vZWNvc3lzdGVtLWVycm9yJztcbmltcG9ydCB7IEFQUF9TVEFURSwgRVJST1JfTUVTU0FHRVMgfSBmcm9tICcuL2Vjb3N5c3RlbS5jb25zdGFudHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TdGF0ZSwgRVJST1JfVFlQRSB9IGZyb20gJy4vZWNvc3lzdGVtLm1vZGVsJztcblxuY29uc3QgQ1VNVUxPQ0lUWV9KU09OID0gJ2N1bXVsb2NpdHkuanNvbic7XG5jb25zdCBNSUNST1NFUlZJQ0VfTkFNRV9NQVhfTEVOR1RIID0gMjM7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEVjb3N5c3RlbVNlcnZpY2Uge1xuICBhcHBEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQXBwbGljYXRpb24+KCk7XG4gIHByb2dyZXNzOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgcHJpdmF0ZSBhcHBzR3JvdXBlZEJ5Q29udGV4dFBhdGgkOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIElBcHBsaWNhdGlvbltdPj47XG4gIHByaXZhdGUgeGhyOiBYTUxIdHRwUmVxdWVzdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGh1bWFuaXplQXBwTmFtZTogSHVtYW5pemVBcHBOYW1lUGlwZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvblNlcnZpY2U6IEFwcGxpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFwcFN0YXRlU2VydmljZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgemlwU2VydmljZTogWmlwU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFNlcnZpY2U6IFRlbmFudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnlTZXJ2aWNlOiBJbnZlbnRvcnlTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuYXBwc0dyb3VwZWRCeUNvbnRleHRQYXRoJCA9IGRlZmVyKCgpID0+IHRoaXMuZ2V0V2ViQXBwbGljYXRpb25zKCkpLnBpcGUoXG4gICAgICBtYXAod2ViQXBwcyA9PiBncm91cEJ5KHdlYkFwcHMsICdjb250ZXh0UGF0aCcpKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0VW5pcXVlQXBwQ29uZmlnKHNyY0FwcDogSUFwcGxpY2F0aW9uLCBleGlzdGluZ0FwcHM6IElBcHBsaWNhdGlvbltdKTogSUFwcGxpY2F0aW9uIHtcbiAgICBsZXQgYXBwOiBJQXBwbGljYXRpb24gPSB7XG4gICAgICBuYW1lOiBzcmNBcHAubmFtZSxcbiAgICAgIGtleTogc3JjQXBwLmtleSxcbiAgICAgIGNvbnRleHRQYXRoOiBzcmNBcHAuY29udGV4dFBhdGhcbiAgICB9O1xuICAgIGZvciAobGV0IHJldHJ5Tm8gPSAwOyByZXRyeU5vIDwgOTsgKSB7XG4gICAgICBpZiAodGhpcy5jaGVja0lmQXBwTmFtZUtleVBhdGhFeGlzdHMoZXhpc3RpbmdBcHBzLCBhcHAsIHJldHJ5Tm8pKSB7XG4gICAgICAgIHJldHJ5Tm8rKztcbiAgICAgICAgYXBwID0ge1xuICAgICAgICAgIG5hbWU6IFtzcmNBcHAubmFtZSwgcmV0cnlOb10uam9pbignLScpLFxuICAgICAgICAgIGtleTogW3NyY0FwcC5rZXksIHJldHJ5Tm9dLmpvaW4oJy0nKSxcbiAgICAgICAgICBjb250ZXh0UGF0aDogW3NyY0FwcC5jb250ZXh0UGF0aCwgcmV0cnlOb10uam9pbignLScpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb21wYXJlcyBjdXJyZW50bHkgZGVwbG95ZWQgYXBwbGljYXRpb24gdmVyc2lvbiB3aXRoIGFwcGxpY2F0aW9uIHZlcnNpb24gdGFnZ2VkIGFzIFwibGF0ZXN0XCJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRBcHBsaWNhdGlvblZlcnNpb24gRGVwbG95ZWQgYXBwbGljYXRpb24gdmVyc2lvblxuICAgKiBAcGFyYW0ge29iamVjdH0gbGF0ZXN0QXBwIExhdGVzdCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG9iamVjdFxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGxhdGVzdCB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50LCBvdGhlcndpc2UgZmFsc2VcbiAgICovXG4gIHNob3VsZFVwZ3JhZGVQYWNrYWdlKGN1cnJlbnRBcHBsaWNhdGlvblZlcnNpb246IHN0cmluZywgbGF0ZXN0QXBwOiBJQXBwbGljYXRpb25WZXJzaW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGF0ZXN0QXBwbGljYXRpb25WZXJzaW9uID0gbGF0ZXN0QXBwPy52ZXJzaW9uO1xuXG4gICAgaWYgKCFsYXRlc3RBcHBsaWNhdGlvblZlcnNpb24gfHwgIWN1cnJlbnRBcHBsaWNhdGlvblZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3QoY29lcmNlKGxhdGVzdEFwcGxpY2F0aW9uVmVyc2lvbiksIGNvZXJjZShjdXJyZW50QXBwbGljYXRpb25WZXJzaW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEdldHMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VhcmNoZWQgdGFnXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IGFwcGxpY2F0aW9uVmVyc2lvbnMgQXJyYXkgd2l0aCBhbGwgYXZhaWxhYmxlIHZlcnNpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIFNlYXJjaGVkIHRhZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHNlYXJjaGVkIHRhZ1xuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25WZXJzaW9uT2JqZWN0QnlUYWcoXG4gICAgYXBwbGljYXRpb25WZXJzaW9uczogSUFwcGxpY2F0aW9uVmVyc2lvbltdLFxuICAgIHRhZ05hbWU6IHN0cmluZ1xuICApOiBJQXBwbGljYXRpb25WZXJzaW9uIHtcbiAgICByZXR1cm4gYXBwbGljYXRpb25WZXJzaW9ucz8uZmluZChlbGVtZW50ID0+IGVsZW1lbnQudGFncy5pbmNsdWRlcyh0YWdOYW1lKSk7XG4gIH1cblxuICBhc3luYyBnZXRBcHBsaWNhdGlvbihhcHBJZDogSWRSZWZlcmVuY2UpOiBQcm9taXNlPElBcHBsaWNhdGlvbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZGV0YWlsKGFwcElkKSkuZGF0YTtcbiAgfVxuXG4gIGdldEFwcGxpY2F0aW9ucyhjdXN0b21GaWx0ZXI6IGFueSA9IHt9KTogUHJvbWlzZTxJUmVzdWx0TGlzdDxJQXBwbGljYXRpb24+PiB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBwYWdlU2l6ZTogMjAwMCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgICBPYmplY3QuYXNzaWduKGZpbHRlciwgY3VzdG9tRmlsdGVyKTtcbiAgICBjb25zdCBjdXJyZW50VGVuYW50ID0gdGhpcy5hcHBTdGF0ZVNlcnZpY2UuY3VycmVudFRlbmFudC52YWx1ZTtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UubGlzdEJ5VGVuYW50KGN1cnJlbnRUZW5hbnQubmFtZSwgZmlsdGVyKTtcbiAgfVxuXG4gIGFzeW5jIGdldE1pY3Jvc2VydmljZXMoKTogUHJvbWlzZTxJQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGFwcHMgPSAoYXdhaXQgdGhpcy5nZXRBcHBsaWNhdGlvbnMoKSkuZGF0YTtcbiAgICBjb25zdCBtaWNyb3NlcnZpY2VzID0gYXBwcy5maWx0ZXIoYXBwID0+IHRoaXMuaXNNaWNyb3NlcnZpY2UoYXBwKSk7XG4gICAgcmV0dXJuIG1pY3Jvc2VydmljZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cblxuICBhc3luYyBnZXRXZWJBcHBsaWNhdGlvbnMoY3VzdG9tRmlsdGVyOiBhbnkgPSB7fSk6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+IHtcbiAgICBjb25zdCBhcHBzID0gKGF3YWl0IHRoaXMuZ2V0QXBwbGljYXRpb25zKGN1c3RvbUZpbHRlcikpLmRhdGE7XG4gICAgY29uc3Qgd2ViQXBwcyA9IGFwcHMuZmlsdGVyKGFwcCA9PiB0aGlzLmlzQXBwbGljYXRpb24oYXBwKSk7XG4gICAgcmV0dXJuIHdlYkFwcHMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cblxuICBhc3luYyBnZXRGZWF0dXJlQXBwbGljYXRpb25zKGN1c3RvbUZpbHRlcjogYW55ID0ge30pOiBQcm9taXNlPElBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgYXBwcyA9IChhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9ucyhjdXN0b21GaWx0ZXIpKS5kYXRhO1xuICAgIGNvbnN0IHdlYkFwcHMgPSBhcHBzLmZpbHRlcihhcHAgPT4gdGhpcy5pc0ZlYXR1cmUoYXBwKSk7XG4gICAgcmV0dXJuIHdlYkFwcHMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gIH1cblxuICBhc3luYyBnZXRQYWNrYWdlQXBwbGljYXRpb25zKGN1c3RvbUZpbHRlcjogYW55ID0ge30pOiBQcm9taXNlPElBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgZmlsdGVyID0gT2JqZWN0LmFzc2lnbih7fSwgY3VzdG9tRmlsdGVyKTtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXIgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBhdmFpbGFiaWxpdHk6IEFwcGxpY2F0aW9uQXZhaWxhYmlsaXR5LlNIQVJFRCxcbiAgICAgICAgdHlwZTogJ0hPU1RFRCcsXG4gICAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgICB9LFxuICAgICAgY3VzdG9tRmlsdGVyXG4gICAgKTtcbiAgICBjb25zdCBbeyBkYXRhOiBhcHBzIH0sIHsgZGF0YTogc2hhcmVkIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRBcHBsaWNhdGlvbnMoZmlsdGVyKSxcbiAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmxpc3Qoc2hhcmVkRmlsdGVyKVxuICAgIF0pO1xuICAgIGNvbnN0IHdlYkFwcHMgPSBbLi4uYXBwcywgLi4uc2hhcmVkXS5maWx0ZXIoYXBwID0+IHRoaXMuaXNQYWNrYWdlKGFwcCkpO1xuICAgIC8vIGFuIGFwcCBjb3VsZCBiZSBzdWJzY3JpYmVkIHRvIGEgdGVuYW50LCBidXQgYWxzbyBoYXZlIGl0J3MgYXZhaWxhYmlsaXR5IHNldCB0byBTSEFSRUQsIGluIHRoYXQgY2FzZSBpdCB3b3VsZCBvY2N1ciB0d2ljZS5cbiAgICBjb25zdCB1bmlxV2ViQXBwcyA9IHVuaXFCeSh3ZWJBcHBzLCAoYXBwOiBJQXBwbGljYXRpb24pID0+IGFwcC5pZCk7XG4gICAgcmV0dXJuIHVuaXFXZWJBcHBzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9XG5cbiAgYXN5bmMgaXNNaWNyb3NlcnZpY2VIb3N0aW5nQWxsb3dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRhdGE6IGFwcHMgfSA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmxpc3RCeU5hbWUoJ2ZlYXR1cmUtbWljcm9zZXJ2aWNlLWhvc3RpbmcnKTtcbiAgICByZXR1cm4gISFhcHBzLmZpbHRlcihhcHAgPT4gYXBwLm93bmVyPy50ZW5hbnQ/LmlkID09PSAnbWFuYWdlbWVudCcpLmxlbmd0aDtcbiAgfVxuXG4gIGNhbk9wZW5BcHBJbkJyb3dzZXIoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBpc05vdEFGZWF0dXJlID0gIXRoaXMuaXNGZWF0dXJlKGFwcCk7XG4gICAgY29uc3QgaGFzUHJvcGVyVHlwZSA9IFtcbiAgICAgIEFwcGxpY2F0aW9uVHlwZS5IT1NURUQsXG4gICAgICBBcHBsaWNhdGlvblR5cGUuRVhURVJOQUwsXG4gICAgICBBcHBsaWNhdGlvblR5cGUuUkVQT1NJVE9SWVxuICAgIF0uaW5jbHVkZXMoYXBwLnR5cGUpO1xuICAgIGNvbnN0IGlzTm90QVBhY2thZ2UgPSAhdGhpcy5pc1BhY2thZ2UoYXBwKTtcbiAgICByZXR1cm4gaXNOb3RBRmVhdHVyZSAmJiBoYXNQcm9wZXJUeXBlICYmIGlzTm90QVBhY2thZ2U7XG4gIH1cblxuICBvcGVuQXBwKGFwcCkge1xuICAgIHdpbmRvdy5vcGVuKHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmdldEhyZWYoYXBwKSwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7XG4gIH1cblxuICBhc3luYyBjYW5EZWxldGVBcHAoYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc093bmVyKGFwcCkgJiYgKCF0aGlzLmlzQ3VycmVudEFwcChhcHApIHx8IChhd2FpdCB0aGlzLmhhc1N1YnNjcmliZWRBcHBQYXJlbnQoYXBwKSkpXG4gICAgKTtcbiAgfVxuXG4gIGlzT3duZXIoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VGVuYW50OiBJQ3VycmVudFRlbmFudCA9IHRoaXMuYXBwU3RhdGVTZXJ2aWNlLmN1cnJlbnRUZW5hbnQudmFsdWU7XG4gICAgY29uc3QgYXBwT3duZXIgPSBnZXQoYXBwLCAnb3duZXIudGVuYW50LmlkJyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUZW5hbnQubmFtZSA9PT0gYXBwT3duZXI7XG4gIH1cblxuICBpc0ZlYXR1cmUoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhcHAubmFtZS5tYXRjaCgvZmVhdHVyZS0vKTtcbiAgfVxuXG4gIGlzTWljcm9zZXJ2aWNlKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFwcC50eXBlID09PSAnTUlDUk9TRVJWSUNFJztcbiAgfVxuXG4gIGlzRXh0ZXJuYWwoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBwLnR5cGUgPT09ICdFWFRFUk5BTCc7XG4gIH1cblxuICBpc1BhY2thZ2UoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBwLm1hbmlmZXN0Py5pc1BhY2thZ2UgPT09IHRydWU7XG4gIH1cblxuICBpc1BsdWdpbihhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcHAubWFuaWZlc3Q/LnBhY2thZ2UgPT09ICdwbHVnaW4nO1xuICB9XG5cbiAgY2FuY2VsQXBwQ3JlYXRpb24oYXBwOiBJQXBwbGljYXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy54aHIpIHtcbiAgICAgIHRoaXMueGhyLmFib3J0KCk7XG4gICAgfVxuICAgIGlmIChhcHApIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmRlbGV0ZShhcHApO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVwbG9hZFByb2dyZXNzKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3MudmFsdWU7XG4gICAgICB0aGlzLnByb2dyZXNzLm5leHQoY3VycmVudFByb2dyZXNzICsgKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKSAqICg5NSAtIGN1cnJlbnRQcm9ncmVzcykpO1xuICAgIH1cbiAgfVxuXG4gIHNldEFwcEFjdGl2ZVZlcnNpb24oYXBwOiBJQXBwbGljYXRpb24sIGFjdGl2ZVZlcnNpb25JZDogc3RyaW5nKTogUHJvbWlzZTxJQXBwbGljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UudXBkYXRlKHsgaWQ6IGFwcC5pZCwgYWN0aXZlVmVyc2lvbklkIH0pO1xuICB9XG5cbiAgc2V0UGFja2FnZVZlcnNpb25UYWcoYXBwOiBJQXBwbGljYXRpb24sIHZlcnNpb246IHN0cmluZywgdGFnczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2Uuc2V0UGFja2FnZVZlcnNpb25UYWcoYXBwLCB2ZXJzaW9uLCB0YWdzKTtcbiAgfVxuXG4gIGRlbGV0ZVBhY2thZ2VWZXJzaW9uKGFwcDogSUFwcGxpY2F0aW9uLCBwYXJhbXM6IElBcHBsaWNhdGlvblZlcnNpb25EZWxldGVQYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZGVsZXRlVmVyc2lvblBhY2thZ2UoYXBwLCBwYXJhbXMpO1xuICB9XG5cbiAgZ2V0SHVtYW5pemVkQXBwTmFtZShhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaHVtYW5pemVBcHBOYW1lLnRyYW5zZm9ybShhcHAubmFtZSkucGlwZShkZWJvdW5jZVRpbWUoMjUwKSwgdGFrZSgxKSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBjcmVhdGVDb25maWcoYXBwOiBJQXBwbGljYXRpb24sIGZvcm1Hcm91cFZhbHVlOiBGb3JtR3JvdXApOiBQYXJ0aWFsPElBcHBsaWNhdGlvbj4ge1xuICAgIGNvbnN0IHsgaWQsIHR5cGUsIGF2YWlsYWJpbGl0eSB9ID0gYXBwO1xuICAgIGxldCBjb25maWcgPSBwaWNrKGZvcm1Hcm91cFZhbHVlLCBbJ25hbWUnLCAna2V5JywgJ2NvbnRleHRQYXRoJ10pO1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGlzU2V0dXA6IHRydWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGUsXG4gICAgICBhdmFpbGFiaWxpdHlcbiAgICB9O1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHBNYW5pZmVzdChcbiAgICBhcHBsaWNhdGlvbjogSUFwcGxpY2F0aW9uLFxuICAgIHNvdXJjZVBhY2thZ2U6IElBcHBsaWNhdGlvblxuICApOiBQcm9taXNlPHsgcmVzOiBJRmV0Y2hSZXNwb25zZTsgZGF0YTogYW55IH0+IHtcbiAgICBjb25zdCB7IGlkIH0gPSBhcHBsaWNhdGlvbjtcbiAgICBjb25zdCBjbGVhbmVkQXBwID0gdGhpcy5yZW1vdmVBcHBQcm9wZXJ0aWVzKGFwcGxpY2F0aW9uKTtcbiAgICBpZiAoIWNsZWFuZWRBcHAubWFuaWZlc3QpIHtcbiAgICAgIGNsZWFuZWRBcHAubWFuaWZlc3QgPSB7fTtcbiAgICB9XG4gICAgY2xlYW5lZEFwcC5tYW5pZmVzdC5pc1BhY2thZ2UgPSBmYWxzZTtcbiAgICBjbGVhbmVkQXBwLm1hbmlmZXN0LnNvdXJjZSA9IHNvdXJjZVBhY2thZ2UuaWQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2VcbiAgICAgIC5iaW5hcnkoaWQpXG4gICAgICAudXBkYXRlRmlsZXMoW3sgcGF0aDogQ1VNVUxPQ0lUWV9KU09OLCBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoY2xlYW5lZEFwcCkgYXMgYW55IH1dKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBcmNoaXZlcyhhcHBJZDogc3RyaW5nIHwgbnVtYmVyIHwgSUFwcGxpY2F0aW9uKTogUHJvbWlzZTxJQXBwbGljYXRpb25CaW5hcnlbXT4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgIHBhZ2VTaXplOiAxMDBcbiAgICB9O1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuYmluYXJ5KGFwcElkKS5saXN0KGZpbHRlcikpLmRhdGE7XG4gIH1cblxuICBhc3luYyBkZWxldGVBcmNoaXZlKGFyY2hpdmU6IElBcHBsaWNhdGlvbkJpbmFyeSwgYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBodW1hbml6ZWRBcmNoaXZlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0SHVtYW5pemVkQXBwTmFtZShhcmNoaXZlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbC5jb25maXJtKFxuICAgICAgICBnZXR0ZXh0KCdEZWxldGUgYXJjaGl2ZScpLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFyY2hpdmUgXCJ7eyBodW1hbml6ZWRBcmNoaXZlTmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2BcbiAgICAgICAgICApLFxuICAgICAgICAgIHsgaHVtYW5pemVkQXJjaGl2ZU5hbWUgfVxuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICB7IG9rOiBnZXR0ZXh0KCdEZWxldGUnKSwgY2FuY2VsOiBnZXR0ZXh0KCdDYW5jZWwnKSB9XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuYmluYXJ5KGFwcCkuZGVsZXRlKGFyY2hpdmUuaWQpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdBcmNoaXZlIGRlbGV0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKGdldChleCwgJ2RhdGEubWVzc2FnZScpLCBleC5kYXRhKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuY2VsbGVkJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0QXJjaGl2ZU1hbmFnZWRPYmplY3QoYmluYXJ5SWQ6IHN0cmluZyk6IFByb21pc2U8SU1hbmFnZWRPYmplY3Q+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5kZXRhaWwoYmluYXJ5SWQpKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgZG93bmxvYWRBcmNoaXZlKFxuICAgIGFwcDogSUFwcGxpY2F0aW9uLFxuICAgIGFyY2hpdmU6IFBpY2s8SUFwcGxpY2F0aW9uQmluYXJ5LCAnbmFtZScgfCAnaWQnPlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmluYXJ5ID0gYXdhaXQgdGhpcy5nZXRCaW5hcnkoYXBwLCBhcmNoaXZlKTtcbiAgICAgIGNvbnN0IGZpbGVCaW5hcnkgPSBuZXcgQmxvYihbYmluYXJ5XSwgeyB0eXBlOiAnYXBwbGljYXRpb24veC16aXAtY29tcHJlc3NlZCcgfSk7XG4gICAgICBzYXZlQXMoZmlsZUJpbmFyeSwgYXJjaGl2ZS5uYW1lKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBlbXB0eVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFwcChcbiAgICBhcHA6IElBcHBsaWNhdGlvbixcbiAgICBkZWxldGVPbkZhaWx1cmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPElSZXN1bHQ8SUFwcGxpY2F0aW9uPj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UudXBkYXRlKGFwcCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRFcnJvcihleCk7XG4gICAgICBpZiAoZGVsZXRlT25GYWlsdXJlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmRlbGV0ZShhcHAuaWQpO1xuICAgICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5BUFBMSUNBVElPTl9DUkVBVElPTl9GQUlMRUQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFwcChhcHA6IElBcHBsaWNhdGlvbiwgc2lsZW50ID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBodW1hbml6ZWRBcHBOYW1lID0gYXdhaXQgdGhpcy5nZXRIdW1hbml6ZWRBcHBOYW1lKGFwcCk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIGFwcGxpY2F0aW9uJyksXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgIGdldHRleHQoXG4gICAgICAgICAgICBgWW91IGFyZSBhYm91dCB0byBkZWxldGUgYXBwbGljYXRpb24gXCJ7eyBodW1hbml6ZWRBcHBOYW1lIH19XCIuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/YFxuICAgICAgICAgICksXG4gICAgICAgICAgeyBodW1hbml6ZWRBcHBOYW1lIH1cbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLkRBTkdFUixcbiAgICAgICAgeyBvazogZ2V0dGV4dCgnRGVsZXRlJyksIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJykgfVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZGVsZXRlKGFwcC5pZCk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQXBwbGljYXRpb24gZGVsZXRlZC4nKSk7XG4gICAgfVxuICAgIHRoaXMuYXBwRGVsZXRlZC5lbWl0KGFwcCk7XG4gIH1cblxuICBhc3luYyBjaGVja0lmU3Vic2NyaWJlZChhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuY3VycmVudCgpO1xuICAgIGNvbnN0IHN1YnNjcmliZWRBcHBzID0gY3VycmVudFRlbmFudC5kYXRhLmFwcGxpY2F0aW9ucy5yZWZlcmVuY2VzO1xuICAgIHJldHVybiBzdWJzY3JpYmVkQXBwcy5zb21lKGFwcGxpY2F0aW9uID0+IGFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uLmlkID09PSBhcHAuaWQpO1xuICB9XG5cbiAgYXN5bmMgc3Vic2NyaWJlQXBwKGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50VGVuYW50LnZhbHVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2Uuc3Vic2NyaWJlQXBwbGljYXRpb24oY3VycmVudFRlbmFudCwgYXBwKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnU3VjY2Vzc2Z1bGx5IHN1YnNjcmliZWQgdG8gYXBwbGljYXRpb24uJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0RXJyb3IoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVuc3Vic2NyaWJlQXBwKGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFRlbmFudDogSUN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50VGVuYW50LnZhbHVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UudW5zdWJzY3JpYmVBcHBsaWNhdGlvbihjdXJyZW50VGVuYW50LCBhcHApO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdTdWNjZXNzZnVsbHkgdW5zdWJzY3JpYmVkIGZyb20gYXBwbGljYXRpb24uJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0RXJyb3IoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGlzVmFsaWRBcHBUeXBlKGFyY2hpdmU6IEZpbGUsIGFwcFR5cGU6IEFwcGxpY2F0aW9uVHlwZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50VHlwZSA9IGF3YWl0IHRoaXMuZ2V0QXBwVHlwZShhcmNoaXZlKTtcbiAgICAgIGlmIChjdXJyZW50VHlwZSAhPT0gYXBwVHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5UWVBFX1ZBTElEQVRJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5uZXh0KHRoaXMucHJvZ3Jlc3MudmFsdWUgKyAxMCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5UWVBFX1ZBTElEQVRJT04pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZEFyY2hpdmVUb0FwcChcbiAgICBhcmNoaXZlOiBGaWxlLFxuICAgIGFwcDogSUFwcGxpY2F0aW9uLFxuICAgIGlzTmV3VmVyc2lvbjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8SUFwcGxpY2F0aW9uPiB7XG4gICAgbGV0IHVwbG9hZE92ZXJyaWRlczogSVVwbG9hZFBhcmFtc092ZXJyaWRlO1xuICAgIGlmIChpc05ld1ZlcnNpb24pIHtcbiAgICAgIHVwbG9hZE92ZXJyaWRlcyA9IGF3YWl0IHRoaXMuZ2V0VXBsb2FkT3ZlcnJpZGVzKGFyY2hpdmUsIGFwcCk7XG4gICAgfVxuICAgIGNvbnN0IGJpbmFyeVNlcnZpY2UgPSB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5iaW5hcnkoYXBwKTtcbiAgICB0aGlzLnhociA9IGJpbmFyeVNlcnZpY2UudXBsb2FkV2l0aFByb2dyZXNzWGhyKFxuICAgICAgYXJjaGl2ZSxcbiAgICAgIHRoaXMudXBkYXRlVXBsb2FkUHJvZ3Jlc3MuYmluZCh0aGlzKSxcbiAgICAgICcnLFxuICAgICAgdXBsb2FkT3ZlcnJpZGVzXG4gICAgKTtcblxuICAgIGNvbnN0IGJpbmFyeU1vID0gYXdhaXQgYmluYXJ5U2VydmljZS5nZXRYTUxIdHRwUmVzcG9uc2UodGhpcy54aHIpO1xuXG4gICAgLy8gVE9ETyBjb21tZW50ZWQgaXQgZHVlIHRvOiBodHRwczovL2N1bXVsb2NpdHkuYXRsYXNzaWFuLm5ldC9icm93c2UvTVRNLTQ4NTUzXG4gICAgLy8gQWRkIGl0IGJhY2sgd2hlbiBCRSBmaXhlcyBpc3N1ZXMgd2l0aCBhY3RpdmVWZXJzaW9uLlxuICAgIC8vIGlmIChpc05ld1ZlcnNpb24pIHtcbiAgICAvLyAgIHJldHVybiBhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9uKGFwcCk7XG4gICAgLy8gfVxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZXRBcHBBY3RpdmVWZXJzaW9uKGFwcCwgKGJpbmFyeU1vLmJpbmFyeUlkIHx8IGJpbmFyeU1vLmlkKSBhcyBzdHJpbmcpKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVBcmNoaXZlVG9BcHBDb21wYXRpYmlsaXR5KGFyY2hpdmU6IEZpbGUsIGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXBwVHlwZSA9IGF3YWl0IHRoaXMuZ2V0QXBwVHlwZShhcmNoaXZlKTtcbiAgICBpZiAoYXBwVHlwZSAhPT0gYXBwLnR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFY29zeXN0ZW1FcnJvcihFUlJPUl9UWVBFLklOVkFMSURfQVBQTElDQVRJT04pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2dyZXNzLm5leHQodGhpcy5wcm9ncmVzcy52YWx1ZSArIDEwKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNNaWNyb3NlcnZpY2UoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMuZ2V0Q3VtdWxvY2l0eUpzb24oYXJjaGl2ZSk7XG4gICAgLy8gQSB1c2VyIGNhbiB1cGxvYWQgYW4gYXBwIHdpdGhvdXQgYSBDdW11bG9jaXR5IEpTT04gZmlsZSAoZS5nLiBhIHJlYWN0IGFwcCkuXG4gICAgLy8gVGhpcyBpcyBhbGxvd2VkIGFuZCBzaG91bGQgbm90IHRyaWdnZXIgYSB2YWxpZGF0aW9uIGVycm9yLlxuICAgIGlmICghbWFuaWZlc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVBhY2thZ2VLZXlBbmRDb250ZXh0UGF0aChtYW5pZmVzdCwgYXBwKTtcbiAgfVxuXG4gIGFzeW5jIGdldEN1bXVsb2NpdHlKc29uKGFyY2hpdmU6IEZpbGUpOiBQcm9taXNlPElNYW5pZmVzdCB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYzh5TWFuaWZlc3QgPSBhd2FpdCB0aGlzLmdldEN1bXVsb2NpdHlKc29uJChhcmNoaXZlKS50b1Byb21pc2UoKTtcbiAgICAgIHJldHVybiBjOHlNYW5pZmVzdDtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlQXBwRm9yQXJjaGl2ZShhcmNoaXZlLCBpc1BhY2thZ2VUeXBlQXJjaGl2ZSA9IGZhbHNlKTogUHJvbWlzZTxJQXBwbGljYXRpb24+IHtcbiAgICBsZXQgaXNQYWNrYWdlID0gZmFsc2U7XG4gICAgY29uc3QgYXBwVHlwZSA9IGF3YWl0IHRoaXMuZ2V0QXBwVHlwZShhcmNoaXZlKTtcbiAgICBsZXQgYXBwTW9kZWw6IGFueSA9IHt9O1xuICAgIGNvbnN0IHN1cHBvcnRlZEFwcFR5cGVzID0gW0FwcGxpY2F0aW9uVHlwZS5IT1NURUQsIEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0VdO1xuXG4gICAgaWYgKHN1cHBvcnRlZEFwcFR5cGVzLmluY2x1ZGVzKGFwcFR5cGUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcHBNb2RlbCA9IGF3YWl0IHRoaXMuZ2V0Q3VtdWxvY2l0eUpzb24kKGFyY2hpdmUpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpc1BhY2thZ2UgPSBhcHBNb2RlbC5pc1BhY2thZ2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcsIHdlIGFsbG93IGhhdmluZyBIT1NURUQgYXBwbGljYXRpb25zIHdpdGhvdXQgdGhlIG1hbmlmZXN0IGZpbGVcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0QmFzZU5hbWVGcm9tQXJjaGl2ZU9yQXBwTW9kZWwoYXJjaGl2ZSwgYXBwVHlwZSwgYXBwTW9kZWwpO1xuICAgIGNvbnN0IGNsZWFyZWROYW1lID0gdGhpcy5yZW1vdmVGb3JiaWRkZW5DaGFyYWN0ZXJzKG5hbWUpO1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0QXBwS2V5KGFwcE1vZGVsLCBjbGVhcmVkTmFtZSk7XG4gICAgY29uc3QgY29udGV4dFBhdGggPSB0aGlzLmdldENvbnRleHRQYXRoKGFwcE1vZGVsLCBuYW1lKTtcblxuICAgIGNvbnN0IGFwcFRvU2F2ZSA9IHtcbiAgICAgIHJlc291cmNlc1VybDogJy8nLFxuICAgICAgdHlwZTogYXBwVHlwZSxcbiAgICAgIG5hbWUsXG4gICAgICBrZXksXG4gICAgICBjb250ZXh0UGF0aFxuICAgIH07XG5cbiAgICBpZiAoaXNQYWNrYWdlVHlwZUFyY2hpdmUgJiYgIWlzUGFja2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuSU5WQUxJRF9QQUNLQUdFKTtcbiAgICB9IGVsc2UgaWYgKCFpc1BhY2thZ2VUeXBlQXJjaGl2ZSAmJiBpc1BhY2thZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFY29zeXN0ZW1FcnJvcihFUlJPUl9UWVBFLklOVkFMSURfQVBQTElDQVRJT04pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc05hbWVMZW5ndGhFeGNlZWRlZChuYW1lLCBhcHBUeXBlKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgIGVycm9yLm5hbWUgPSBFUlJPUl9UWVBFLk1JQ1JPU0VSVklDRV9OQU1FX1RPT19MT05HO1xuICAgICAgZXJyb3IubWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KEVSUk9SX01FU1NBR0VTW2Vycm9yLm5hbWVdLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1heENoYXJzOiBNSUNST1NFUlZJQ0VfTkFNRV9NQVhfTEVOR1RIXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgLi4uYXBwVG9TYXZlLFxuICAgICAgICBtYW5pZmVzdDoge1xuICAgICAgICAgIGlzUGFja2FnZSxcbiAgICAgICAgICAuLi4oYXBwTW9kZWw/LnBhY2thZ2UgJiYgeyBwYWNrYWdlOiBhcHBNb2RlbC5wYWNrYWdlIH0pXG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBJTWFuaWZlc3RcbiAgICAgIH0pXG4gICAgKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgcmVhY3RpdmF0ZUFyY2hpdmUoYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UucmVhY3RpdmF0ZUFyY2hpdmUoYXBwLmlkKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQXBwbGljYXRpb24gcmVhY3RpdmF0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0RXJyb3IoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZU9sZGVzdEFyY2hpdmUoYXBwOiBJQXBwbGljYXRpb24sIGFyY2hpdmVzOiBJQXBwbGljYXRpb25CaW5hcnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm1vZGFsLmNvbmZpcm0oXG4gICAgICAgIGdldHRleHQoJ0RlbGV0ZSBvbGRlc3QgYXJjaGl2ZSBhbmQgY29udGludWUnKSxcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnVXAgdG8gNiBhcmNoaXZlcyBjYW4gYmUgc2F2ZWQgaW4gdGhlIHBsYXRmb3JtLiBJZiB5b3UgdXBsb2FkIGEgbmV3IGFyY2hpdmUsIHRoZSBvbGRlc3QgYXJjaGl2ZSB0aGF0IGlzIG5vdCBhY3RpdmUgd2lsbCBiZSBkZWxldGVkLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkPydcbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLklORk8sXG4gICAgICAgIHsgb2s6IGdldHRleHQoJ0RlbGV0ZSBhbmQgY29udGludWUnKSB9XG4gICAgICApO1xuICAgICAgY29uc3QgYXJjaGl2ZVRvRGVsZXRlID0gYXJjaGl2ZXNbYXJjaGl2ZXMubGVuZ3RoIC0gMl07XG4gICAgICBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5iaW5hcnkoYXBwKS5kZWxldGUoYXJjaGl2ZVRvRGVsZXRlLmlkKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQXJjaGl2ZSBkZWxldGVkLicpKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydEVycm9yKGV4KTtcbiAgICB9XG4gIH1cblxuICBnZXRBcHBTdGF0ZShhcHA6IElBcHBsaWNhdGlvbik6IEFwcGxpY2F0aW9uU3RhdGUge1xuICAgIGlmICghdGhpcy5pc093bmVyKGFwcCkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuU1VCU0NSSUJFRDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNVbnBhY2tlZChhcHApKSB7XG4gICAgICByZXR1cm4gQVBQX1NUQVRFLlVOUEFDS0VEO1xuICAgIH0gZWxzZSBpZiAoYXBwLnR5cGUgPT09IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTCkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5FWFRFUk5BTDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQYWNrYWdlQmx1ZXByaW50KGFwcCkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuUEFDS0FHRV9CTFVFUFJJTlQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGx1Z2luc1BhY2thZ2UoYXBwKSkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5QQUNLQUdFX1BMVUdJTjtcbiAgICB9XG4gICAgcmV0dXJuIEFQUF9TVEFURS5DVVNUT007XG4gIH1cblxuICBpc1BhY2thZ2VCbHVlcHJpbnQoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhY2thZ2UoYXBwKSAmJiBhcHAubWFuaWZlc3QucGFja2FnZSA9PT0gJ2JsdWVwcmludCc7XG4gIH1cblxuICBpc1BsdWdpbnNQYWNrYWdlKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNQYWNrYWdlKGFwcCkgJiYgYXBwLm1hbmlmZXN0LnBhY2thZ2UgPT09ICdwbHVnaW4nO1xuICB9XG5cbiAgaXNVbnBhY2tlZChhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWFwcC5tYW5pZmVzdD8uc291cmNlO1xuICB9XG5cbiAgaGFzRXhwb3J0cyhhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWFwcC5tYW5pZmVzdD8uZXhwb3J0cz8ubGVuZ3RoO1xuICB9XG5cbiAgaXNBcHBsaWNhdGlvbihhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBhcHAudHlwZSAhPT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRSAmJiAhdGhpcy5pc0ZlYXR1cmUoYXBwKSAmJiAhdGhpcy5pc1BhY2thZ2UoYXBwKVxuICAgICk7XG4gIH1cblxuICBpc0N1c3RvbU1pY3Jvc2VydmljZShhcHA6IElBcHBsaWNhdGlvbikge1xuICAgIHJldHVybiB0aGlzLmlzT3duZXIoYXBwKSAmJiBhcHAudHlwZSA9PT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRTtcbiAgfVxuXG4gIGFzeW5jIGdldEJpbmFyeShcbiAgICBhcHA6IElBcHBsaWNhdGlvbixcbiAgICBhcmNoaXZlOiBJQXBwbGljYXRpb25CaW5hcnkgfCBJSWRlbnRpZmllZFxuICApOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgbGV0IGJpbmFyeTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuYmluYXJ5KGFwcCkuZG93bmxvYWRBcmNoaXZlKGFyY2hpdmUuaWQpO1xuICAgICAgYmluYXJ5ID0gYXdhaXQgcmVzLmFycmF5QnVmZmVyKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGdldHRleHQoJ0NvdWxkIG5vdCBnZXQgdGhlIGJpbmFyeS4nKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihtc2cpO1xuICAgIH1cbiAgICByZXR1cm4gYmluYXJ5O1xuICB9XG5cbiAgYXN5bmMgaXNPdmVyd3JpdHRlbkJ5Q3VzdG9tQXBwKGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT3duZXIoYXBwKSAmJiAoYXdhaXQgdGhpcy5oYXNTdWJzY3JpYmVkQXBwUGFyZW50KGFwcCkpO1xuICB9XG5cbiAgYXN5bmMgaGFzU3Vic2NyaWJlZEFwcFBhcmVudChhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGFwcHNHcm91cGVkQnlDb250ZXh0UGF0aCA9IGF3YWl0IHRoaXMuYXBwc0dyb3VwZWRCeUNvbnRleHRQYXRoJC5waXBlKHRha2UoMSkpLnRvUHJvbWlzZSgpO1xuICAgIHJldHVybiBhcHAuY29udGV4dFBhdGggJiYgYXBwc0dyb3VwZWRCeUNvbnRleHRQYXRoW2FwcC5jb250ZXh0UGF0aF0/Lmxlbmd0aCA9PT0gMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc2V0QXZhaWxhYmlsaXR5VG9Qcml2YXRlSWZOb3RTZXRBbHJlYWR5KGFwcDogSUFwcGxpY2F0aW9uKTogSUFwcGxpY2F0aW9uIHtcbiAgICBhcHAuYXZhaWxhYmlsaXR5ID0gQXBwbGljYXRpb25BdmFpbGFiaWxpdHkuUFJJVkFURTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGFuIGVycm9yIGRpYWxvZy5cbiAgICogQHBhcmFtIGVycm9yIEVpdGhlciBhIHNlcnZlciBlcnJvciBvciBhbiBpbnRlcm5hbCBbW0Vjb3N5c3RlbUVycm9yXV0uXG4gICAqL1xuICBhbGVydEVycm9yKGVycm9yOiBFcnJvciB8IEVjb3N5c3RlbUVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRWNvc3lzdGVtRXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihlcnJvci5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQYWNrYWdlS2V5QW5kQ29udGV4dFBhdGgobWFuaWZlc3Q6IElNYW5pZmVzdCwgYXBwOiBJQXBwbGljYXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0UGF0aCA9IGdldChtYW5pZmVzdCwgJ2NvbnRleHRQYXRoJyk7XG4gICAgY29uc3QgYXBwS2V5ID0gZ2V0KG1hbmlmZXN0LCAna2V5Jyk7XG4gICAgaWYgKGNvbnRleHRQYXRoICE9PSBhcHAuY29udGV4dFBhdGggfHwgYXBwS2V5ICE9PSBhcHAua2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5LRVlfT1JfQ09OVEVYVF9QQVRIX01JU01BVENIKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFwcEtleShhcHBNb2RlbDogSUFwcGxpY2F0aW9uLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBrZXkgPSBhcHBNb2RlbD8ua2V5O1xuICAgIGlmICgha2V5KSB7XG4gICAgICBrZXkgPSBgJHtrZWJhYkNhc2UobmFtZSl9LWtleWA7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHRQYXRoKGFwcE1vZGVsOiBJQXBwbGljYXRpb24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGFwcE1vZGVsPy5jb250ZXh0UGF0aCB8fCBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUZvcmJpZGRlbkNoYXJhY3RlcnMoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvW15hLXpBLVowLTktX10vZywgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0N1cnJlbnRBcHAoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50QXBwID0gdGhpcy5hcHBTdGF0ZVNlcnZpY2Uuc3RhdGUuYXBwO1xuICAgIHJldHVybiBjdXJyZW50QXBwLmNvbnRleHRQYXRoID09PSBhcHAuY29udGV4dFBhdGg7XG4gIH1cblxuICBwcml2YXRlIGdldEN1bXVsb2NpdHlKc29uJChhcmNoaXZlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy56aXBTZXJ2aWNlLmdldEpzb25EYXRhKGFyY2hpdmUsIHtcbiAgICAgIGZpbGVuYW1lOiBDVU1VTE9DSVRZX0pTT05cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QXBwVHlwZShhcmNoaXZlOiBGaWxlKTogUHJvbWlzZTxBcHBsaWNhdGlvblR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDdW11bG9jaXR5SnNvbiQoYXJjaGl2ZSlcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIGRhdGEgPT5cbiAgICAgICAgICBnZXQoZGF0YSwgJ3R5cGUnKSB8fFxuICAgICAgICAgIChnZXQoZGF0YSwgJ2FwaVZlcnNpb24nKSA/IEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0UgOiBBcHBsaWNhdGlvblR5cGUuSE9TVEVEKVxuICAgICAgKVxuICAgICAgLmNhdGNoKCgpID0+IEFwcGxpY2F0aW9uVHlwZS5IT1NURUQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCYXNlTmFtZUZyb21BcmNoaXZlT3JBcHBNb2RlbChcbiAgICBhcmNoaXZlOiBhbnksXG4gICAgYXBwVHlwZTogQXBwbGljYXRpb25UeXBlLFxuICAgIGFwcE1vZGVsPzogSUFwcGxpY2F0aW9uXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IGJhc2VOYW1lID0gYXBwTW9kZWw/Lm5hbWUgfHwgYXJjaGl2ZS5uYW1lLnJlcGxhY2UoL1xcLnppcCQvaSwgJycpO1xuICAgIGlmIChhcHBUeXBlID09PSAnTUlDUk9TRVJWSUNFJykge1xuICAgICAgYmFzZU5hbWUgPSB0aGlzLnJlbW92ZVZlcnNpb25Gcm9tTmFtZShiYXNlTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBiYXNlTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZkFwcE5hbWVLZXlQYXRoRXhpc3RzKFxuICAgIGV4aXN0aW5nQXBwczogSUFwcGxpY2F0aW9uW10sXG4gICAgYXBwOiBJQXBwbGljYXRpb24sXG4gICAgcmV0cnlObzogbnVtYmVyXG4gICk6IElBcHBsaWNhdGlvbiB7XG4gICAgcmV0dXJuIGV4aXN0aW5nQXBwcy5maW5kKFxuICAgICAgZXhpc3RpbmdBcHAgPT5cbiAgICAgICAgZXhpc3RpbmdBcHAubmFtZSA9PT0gYXBwLm5hbWUgfHxcbiAgICAgICAgZXhpc3RpbmdBcHAua2V5ID09PSBhcHAua2V5IHx8XG4gICAgICAgIGV4aXN0aW5nQXBwLmNvbnRleHRQYXRoID09PSBhcHAuY29udGV4dFBhdGggfHxcbiAgICAgICAgZXhpc3RpbmdBcHAubmFtZSA9PT0gW2FwcC5uYW1lLCByZXRyeU5vXS5qb2luKCctJykgfHxcbiAgICAgICAgZXhpc3RpbmdBcHAua2V5ID09PSBbYXBwLmtleSwgcmV0cnlOb10uam9pbignLScpIHx8XG4gICAgICAgIGV4aXN0aW5nQXBwLmNvbnRleHRQYXRoID09PSBbYXBwLmNvbnRleHRQYXRoLCByZXRyeU5vXS5qb2luKCctJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBcHBQcm9wZXJ0aWVzKGFwcDogSUFwcGxpY2F0aW9uKTogSUFwcGxpY2F0aW9uIHtcbiAgICBjb25zdCB0ZW1wQXBwID0gY2xvbmVEZWVwKGFwcCk7XG4gICAgY29uc3QgcHJvcGVydGllc1RvUmVtb3ZlID0gWydpZCcsICdvd25lcicsICdhY3RpdmVWZXJzaW9uSWQnLCAnc2VsZiddO1xuXG4gICAgcHJvcGVydGllc1RvUmVtb3ZlLmZvckVhY2gocHJvcCA9PiBkZWxldGUgdGVtcEFwcFtwcm9wXSk7XG4gICAgcmV0dXJuIHRlbXBBcHA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFVwbG9hZE92ZXJyaWRlcyhcbiAgICBhcmNoaXZlOiBGaWxlLFxuICAgIGFwcDogSUFwcGxpY2F0aW9uXG4gICk6IFByb21pc2U8SVVwbG9hZFBhcmFtc092ZXJyaWRlPiB7XG4gICAgY29uc3QgeyB2ZXJzaW9uIH0gPSBhd2FpdCB0aGlzLmdldEN1bXVsb2NpdHlKc29uJChhcmNoaXZlKS50b1Byb21pc2UoKTtcbiAgICBjb25zdCBpc0luaXRpYWxQYWNrYWdlID0gYXBwLmFwcGxpY2F0aW9uVmVyc2lvbnM/Lmxlbmd0aCA9PT0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgbGlzdFVybDogJ3ZlcnNpb25zJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vdm5kLmNvbS5uc24uY3VtdWxvY2l0eS5hcHBsaWNhdGlvblZlcnNpb24ranNvbjtjaGFyc2V0PVVURi04O3Zlcj0wLjknXG4gICAgICB9LFxuICAgICAgYm9keUZpbGVQcm9wZXJ0eTogJ2FwcGxpY2F0aW9uQmluYXJ5JyxcbiAgICAgIHJlcXVlc3RCb2R5OiB7XG4gICAgICAgIGFwcGxpY2F0aW9uVmVyc2lvbjogeyB2ZXJzaW9uLCAuLi4oaXNJbml0aWFsUGFja2FnZSAmJiB7IHRhZ3M6IFsnbGF0ZXN0J10gfSkgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVZlcnNpb25Gcm9tTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB2ZXJzaW9uUmVnRXhwID0gLy1cXGQrXFwuXFxkK1xcLlxcZCsoXFwuXFxkKyk/KC1cXGQrKT8oLiopJC87XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSh2ZXJzaW9uUmVnRXhwLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGlzTmFtZUxlbmd0aEV4Y2VlZGVkKG5hbWUsIGFwcFR5cGUpIHtcbiAgICByZXR1cm4gbmFtZS5sZW5ndGggPiBNSUNST1NFUlZJQ0VfTkFNRV9NQVhfTEVOR1RIICYmIGFwcFR5cGUgPT09IEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0U7XG4gIH1cbn1cbiJdfQ==
681
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvc3lzdGVtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9lY29zeXN0ZW0vc2hhcmVkL2Vjb3N5c3RlbS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFXZixnQkFBZ0IsRUFJaEIsYUFBYSxFQUNkLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxlQUFlLEVBQWMsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQW9CLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixD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QUM7UUFDL0QsT0FBTztZQUNMLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUUsa0ZBQWtGO2FBQzNGO1lBQ0QsZ0JBQWdCLEVBQUUsbUJBQW1CO1lBQ3JDLFdBQVcsRUFBRTtnQkFDWCxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7YUFDL0U7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQVk7UUFDeEMsTUFBTSxhQUFhLEdBQUcsb0NBQW9DLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sb0JBQW9CLENBQUMsSUFBSSxFQUFFLE9BQU87UUFDeEMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLDRCQUE0QixJQUFJLE9BQU8sS0FBSyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQ2hHLENBQUM7OzZHQWowQlUsZ0JBQWdCO2lIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzJGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uQXZhaWxhYmlsaXR5LFxuICBBcHBsaWNhdGlvblNlcnZpY2UsXG4gIEFwcGxpY2F0aW9uVHlwZSxcbiAgSUFwcGxpY2F0aW9uLFxuICBJQXBwbGljYXRpb25CaW5hcnksXG4gIElBcHBsaWNhdGlvblZlcnNpb24sXG4gIElBcHBsaWNhdGlvblZlcnNpb25EZWxldGVQYXJhbXMsXG4gIElDdXJyZW50VGVuYW50LFxuICBJZFJlZmVyZW5jZSxcbiAgSUZldGNoUmVzcG9uc2UsXG4gIElJZGVudGlmaWVkLFxuICBJTWFuYWdlZE9iamVjdCxcbiAgSU1hbmlmZXN0LFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJUmVzdWx0LFxuICBJUmVzdWx0TGlzdCxcbiAgSVVwbG9hZFBhcmFtc092ZXJyaWRlLFxuICBUZW5hbnRTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwU3RhdGVTZXJ2aWNlLFxuICBnZXR0ZXh0LFxuICBIdW1hbml6ZUFwcE5hbWVQaXBlLFxuICBNb2RhbFNlcnZpY2UsXG4gIFN0YXR1cyxcbiAgWmlwU2VydmljZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGdyb3VwQnksIGtlYmFiQ2FzZSwgcGljaywgdW5pcUJ5LCBvbWl0LCBpc1VuZGVmaW5lZCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRlZmVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2UsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBndCwgY29lcmNlIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEVjb3N5c3RlbUVycm9yIH0gZnJvbSAnLi9lY29zeXN0ZW0tZXJyb3InO1xuaW1wb3J0IHsgQVBQX1NUQVRFLCBFUlJPUl9NRVNTQUdFUyB9IGZyb20gJy4vZWNvc3lzdGVtLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblN0YXRlLCBFUlJPUl9UWVBFIH0gZnJvbSAnLi9lY29zeXN0ZW0ubW9kZWwnO1xuXG5jb25zdCBDVU1VTE9DSVRZX0pTT04gPSAnY3VtdWxvY2l0eS5qc29uJztcbmNvbnN0IE1JQ1JPU0VSVklDRV9OQU1FX01BWF9MRU5HVEggPSAyMztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRWNvc3lzdGVtU2VydmljZSB7XG4gIGFwcERlbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElBcHBsaWNhdGlvbj4oKTtcbiAgcHJvZ3Jlc3M6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KG51bGwpO1xuICBwcml2YXRlIGFwcHNHcm91cGVkQnlDb250ZXh0UGF0aCQ6IE9ic2VydmFibGU8UmVjb3JkPHN0cmluZywgSUFwcGxpY2F0aW9uW10+PjtcbiAgcHJpdmF0ZSB4aHI6IFhNTEh0dHBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHVtYW5pemVBcHBOYW1lOiBIdW1hbml6ZUFwcE5hbWVQaXBlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uU2VydmljZTogQXBwbGljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwU3RhdGVTZXJ2aWNlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB6aXBTZXJ2aWNlOiBaaXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5hcHBzR3JvdXBlZEJ5Q29udGV4dFBhdGgkID0gZGVmZXIoKCkgPT4gdGhpcy5nZXRXZWJBcHBsaWNhdGlvbnMoKSkucGlwZShcbiAgICAgIG1hcCh3ZWJBcHBzID0+IGdyb3VwQnkod2ViQXBwcywgJ2NvbnRleHRQYXRoJykpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgICk7XG4gIH1cblxuICBnZXRVbmlxdWVBcHBDb25maWcoc3JjQXBwOiBJQXBwbGljYXRpb24sIGV4aXN0aW5nQXBwczogSUFwcGxpY2F0aW9uW10pOiBJQXBwbGljYXRpb24ge1xuICAgIGxldCBhcHA6IElBcHBsaWNhdGlvbiA9IHtcbiAgICAgIG5hbWU6IHNyY0FwcC5uYW1lLFxuICAgICAga2V5OiBzcmNBcHAua2V5LFxuICAgICAgY29udGV4dFBhdGg6IHNyY0FwcC5jb250ZXh0UGF0aFxuICAgIH07XG4gICAgZm9yIChsZXQgcmV0cnlObyA9IDA7IHJldHJ5Tm8gPCA5OyApIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrSWZBcHBOYW1lS2V5UGF0aEV4aXN0cyhleGlzdGluZ0FwcHMsIGFwcCwgcmV0cnlObykpIHtcbiAgICAgICAgcmV0cnlObysrO1xuICAgICAgICBhcHAgPSB7XG4gICAgICAgICAgbmFtZTogW3NyY0FwcC5uYW1lLCByZXRyeU5vXS5qb2luKCctJyksXG4gICAgICAgICAga2V5OiBbc3JjQXBwLmtleSwgcmV0cnlOb10uam9pbignLScpLFxuICAgICAgICAgIGNvbnRleHRQYXRoOiBbc3JjQXBwLmNvbnRleHRQYXRoLCByZXRyeU5vXS5qb2luKCctJylcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbXBhcmVzIGN1cnJlbnRseSBkZXBsb3llZCBhcHBsaWNhdGlvbiB2ZXJzaW9uIHdpdGggYXBwbGljYXRpb24gdmVyc2lvbiB0YWdnZWQgYXMgXCJsYXRlc3RcIlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3VycmVudEFwcGxpY2F0aW9uVmVyc2lvbiBEZXBsb3llZCBhcHBsaWNhdGlvbiB2ZXJzaW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsYXRlc3RBcHAgTGF0ZXN0IGFwcGxpY2F0aW9uIHZlcnNpb24gb2JqZWN0XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgbGF0ZXN0IHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQsIG90aGVyd2lzZSBmYWxzZVxuICAgKi9cbiAgc2hvdWxkVXBncmFkZVBhY2thZ2UoY3VycmVudEFwcGxpY2F0aW9uVmVyc2lvbjogc3RyaW5nLCBsYXRlc3RBcHA6IElBcHBsaWNhdGlvblZlcnNpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBsYXRlc3RBcHBsaWNhdGlvblZlcnNpb24gPSBsYXRlc3RBcHA/LnZlcnNpb247XG5cbiAgICBpZiAoIWxhdGVzdEFwcGxpY2F0aW9uVmVyc2lvbiB8fCAhY3VycmVudEFwcGxpY2F0aW9uVmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBndChjb2VyY2UobGF0ZXN0QXBwbGljYXRpb25WZXJzaW9uKSwgY29lcmNlKGN1cnJlbnRBcHBsaWNhdGlvblZlcnNpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogR2V0cyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBzZWFyY2hlZCB0YWdcbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gYXBwbGljYXRpb25WZXJzaW9ucyBBcnJheSB3aXRoIGFsbCBhdmFpbGFibGUgdmVyc2lvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgU2VhcmNoZWQgdGFnXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2VhcmNoZWQgdGFnXG4gICAqL1xuICBnZXRBcHBsaWNhdGlvblZlcnNpb25PYmplY3RCeVRhZyhcbiAgICBhcHBsaWNhdGlvblZlcnNpb25zOiBJQXBwbGljYXRpb25WZXJzaW9uW10sXG4gICAgdGFnTmFtZTogc3RyaW5nXG4gICk6IElBcHBsaWNhdGlvblZlcnNpb24ge1xuICAgIHJldHVybiBhcHBsaWNhdGlvblZlcnNpb25zPy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC50YWdzLmluY2x1ZGVzKHRhZ05hbWUpKTtcbiAgfVxuXG4gIGFzeW5jIGdldEFwcGxpY2F0aW9uKGFwcElkOiBJZFJlZmVyZW5jZSk6IFByb21pc2U8SUFwcGxpY2F0aW9uPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5kZXRhaWwoYXBwSWQpKS5kYXRhO1xuICB9XG5cbiAgZ2V0QXBwbGljYXRpb25zKGN1c3RvbUZpbHRlcjogYW55ID0ge30pOiBQcm9taXNlPElSZXN1bHRMaXN0PElBcHBsaWNhdGlvbj4+IHtcbiAgICBjb25zdCBmaWx0ZXI6IG9iamVjdCA9IHtcbiAgICAgIHBhZ2VTaXplOiAyMDAwLFxuICAgICAgd2l0aFRvdGFsUGFnZXM6IHRydWVcbiAgICB9O1xuICAgIE9iamVjdC5hc3NpZ24oZmlsdGVyLCBjdXN0b21GaWx0ZXIpO1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlU2VydmljZS5jdXJyZW50VGVuYW50LnZhbHVlO1xuICAgIHJldHVybiB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5saXN0QnlUZW5hbnQoY3VycmVudFRlbmFudC5uYW1lLCBmaWx0ZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWljcm9zZXJ2aWNlcygpOiBQcm9taXNlPElBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgYXBwcyA9IChhd2FpdCB0aGlzLmdldEFwcGxpY2F0aW9ucygpKS5kYXRhO1xuICAgIGNvbnN0IG1pY3Jvc2VydmljZXMgPSBhcHBzLmZpbHRlcihhcHAgPT4gdGhpcy5pc01pY3Jvc2VydmljZShhcHApKTtcbiAgICByZXR1cm4gbWljcm9zZXJ2aWNlcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxuXG4gIGFzeW5jIGdldFdlYkFwcGxpY2F0aW9ucyhjdXN0b21GaWx0ZXI6IGFueSA9IHt9KTogUHJvbWlzZTxJQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGFwcHMgPSAoYXdhaXQgdGhpcy5nZXRBcHBsaWNhdGlvbnMoY3VzdG9tRmlsdGVyKSkuZGF0YTtcbiAgICBjb25zdCB3ZWJBcHBzID0gYXBwcy5maWx0ZXIoYXBwID0+IHRoaXMuaXNBcHBsaWNhdGlvbihhcHApKTtcbiAgICByZXR1cm4gd2ViQXBwcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVBcHBsaWNhdGlvbnMoY3VzdG9tRmlsdGVyOiBhbnkgPSB7fSk6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+IHtcbiAgICBjb25zdCBhcHBzID0gKGF3YWl0IHRoaXMuZ2V0QXBwbGljYXRpb25zKGN1c3RvbUZpbHRlcikpLmRhdGE7XG4gICAgY29uc3Qgd2ViQXBwcyA9IGFwcHMuZmlsdGVyKGFwcCA9PiB0aGlzLmlzRmVhdHVyZShhcHApKTtcbiAgICByZXR1cm4gd2ViQXBwcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxuXG4gIGFzeW5jIGdldFBhY2thZ2VBcHBsaWNhdGlvbnMoY3VzdG9tRmlsdGVyOiBhbnkgPSB7fSk6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+IHtcbiAgICBjb25zdCBmaWx0ZXJDYWxsYmFjayA9IGFwcCA9PiB0aGlzLmlzUGFja2FnZShhcHApO1xuICAgIHJldHVybiB0aGlzLmdldEFwcGxpY2F0aW9uc0ZpbHRlcmVkKGN1c3RvbUZpbHRlciwgZmlsdGVyQ2FsbGJhY2spO1xuICB9XG5cbiAgYXN5bmMgZ2V0SG9zdGVkQW5kUGFja2FnZUFwcGxpY2F0aW9ucyhjdXN0b21GaWx0ZXI6IGFueSA9IHt9KTogUHJvbWlzZTxJQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGZpbHRlckNhbGxiYWNrID0gYXBwID0+IHRoaXMuaXNQYWNrYWdlKGFwcCkgfHwgdGhpcy5pc0FwcGxpY2F0aW9uKGFwcCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXBwbGljYXRpb25zRmlsdGVyZWQoY3VzdG9tRmlsdGVyLCBmaWx0ZXJDYWxsYmFjayk7XG4gIH1cblxuICBhc3luYyBnZXRBcHBsaWNhdGlvbnNGaWx0ZXJlZChcbiAgICBjdXN0b21GaWx0ZXI6IGFueSA9IHt9LFxuICAgIGZpbHRlckNhbGxiYWNrID0gKGFwcDogSUFwcGxpY2F0aW9uKSA9PiAhIWFwcFxuICApOiBQcm9taXNlPElBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgZmlsdGVyID0gT2JqZWN0LmFzc2lnbih7fSwgY3VzdG9tRmlsdGVyKTtcbiAgICBjb25zdCBzaGFyZWRGaWx0ZXIgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBhdmFpbGFiaWxpdHk6IEFwcGxpY2F0aW9uQXZhaWxhYmlsaXR5LlNIQVJFRCxcbiAgICAgICAgdHlwZTogJ0hPU1RFRCcsXG4gICAgICAgIHBhZ2VTaXplOiAyMDAwXG4gICAgICB9LFxuICAgICAgY3VzdG9tRmlsdGVyXG4gICAgKTtcbiAgICBjb25zdCBbeyBkYXRhOiBhcHBzIH0sIHsgZGF0YTogc2hhcmVkIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRBcHBsaWNhdGlvbnMoZmlsdGVyKSxcbiAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmxpc3Qoc2hhcmVkRmlsdGVyKVxuICAgIF0pO1xuICAgIGNvbnN0IHdlYkFwcHMgPSBbLi4uYXBwcywgLi4uc2hhcmVkXS5maWx0ZXIoZmlsdGVyQ2FsbGJhY2spO1xuICAgIC8vIGFuIGFwcCBjb3VsZCBiZSBzdWJzY3JpYmVkIHRvIGEgdGVuYW50LCBidXQgYWxzbyBoYXZlIGl0J3MgYXZhaWxhYmlsaXR5IHNldCB0byBTSEFSRUQsIGluIHRoYXQgY2FzZSBpdCB3b3VsZCBvY2N1ciB0d2ljZS5cbiAgICBjb25zdCB1bmlxV2ViQXBwcyA9IHVuaXFCeSh3ZWJBcHBzLCAoYXBwOiBJQXBwbGljYXRpb24pID0+IGFwcC5pZCk7XG4gICAgcmV0dXJuIHVuaXFXZWJBcHBzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICB9XG5cbiAgYXN5bmMgaXNNaWNyb3NlcnZpY2VIb3N0aW5nQWxsb3dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGRhdGE6IGFwcHMgfSA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmxpc3RCeU5hbWUoJ2ZlYXR1cmUtbWljcm9zZXJ2aWNlLWhvc3RpbmcnKTtcbiAgICByZXR1cm4gISFhcHBzLmZpbHRlcihhcHAgPT4gYXBwLm93bmVyPy50ZW5hbnQ/LmlkID09PSAnbWFuYWdlbWVudCcpLmxlbmd0aDtcbiAgfVxuXG4gIGNhbk9wZW5BcHBJbkJyb3dzZXIoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBpc05vdEFGZWF0dXJlID0gIXRoaXMuaXNGZWF0dXJlKGFwcCk7XG4gICAgY29uc3QgaGFzUHJvcGVyVHlwZSA9IFtcbiAgICAgIEFwcGxpY2F0aW9uVHlwZS5IT1NURUQsXG4gICAgICBBcHBsaWNhdGlvblR5cGUuRVhURVJOQUwsXG4gICAgICBBcHBsaWNhdGlvblR5cGUuUkVQT1NJVE9SWVxuICAgIF0uaW5jbHVkZXMoYXBwLnR5cGUpO1xuICAgIGNvbnN0IGlzTm90QVBhY2thZ2UgPSAhdGhpcy5pc1BhY2thZ2UoYXBwKTtcbiAgICByZXR1cm4gaXNOb3RBRmVhdHVyZSAmJiBoYXNQcm9wZXJUeXBlICYmIGlzTm90QVBhY2thZ2U7XG4gIH1cblxuICBvcGVuQXBwKGFwcCkge1xuICAgIHdpbmRvdy5vcGVuKHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmdldEhyZWYoYXBwKSwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7XG4gIH1cblxuICBhc3luYyBjYW5EZWxldGVBcHAoYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc093bmVyKGFwcCkgJiYgKCF0aGlzLmlzQ3VycmVudEFwcChhcHApIHx8IChhd2FpdCB0aGlzLmhhc1N1YnNjcmliZWRBcHBQYXJlbnQoYXBwKSkpXG4gICAgKTtcbiAgfVxuXG4gIGlzT3duZXIoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VGVuYW50OiBJQ3VycmVudFRlbmFudCA9IHRoaXMuYXBwU3RhdGVTZXJ2aWNlLmN1cnJlbnRUZW5hbnQudmFsdWU7XG4gICAgY29uc3QgYXBwT3duZXIgPSBnZXQoYXBwLCAnb3duZXIudGVuYW50LmlkJyk7XG4gICAgcmV0dXJuIGN1cnJlbnRUZW5hbnQubmFtZSA9PT0gYXBwT3duZXI7XG4gIH1cblxuICBpc0ZlYXR1cmUoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhcHAubmFtZS5tYXRjaCgvZmVhdHVyZS0vKTtcbiAgfVxuXG4gIGlzTWljcm9zZXJ2aWNlKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFwcC50eXBlID09PSAnTUlDUk9TRVJWSUNFJztcbiAgfVxuXG4gIGlzRXh0ZXJuYWwoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBwLnR5cGUgPT09ICdFWFRFUk5BTCc7XG4gIH1cblxuICBpc1BhY2thZ2UoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXBwLm1hbmlmZXN0Py5pc1BhY2thZ2UgPT09IHRydWU7XG4gIH1cblxuICBpc1BsdWdpbihhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcHAubWFuaWZlc3Q/LnBhY2thZ2UgPT09ICdwbHVnaW4nO1xuICB9XG5cbiAgY2FuY2VsQXBwQ3JlYXRpb24oYXBwOiBJQXBwbGljYXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy54aHIpIHtcbiAgICAgIHRoaXMueGhyLmFib3J0KCk7XG4gICAgfVxuICAgIGlmIChhcHApIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmRlbGV0ZShhcHApO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVwbG9hZFByb2dyZXNzKGV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50Lmxlbmd0aENvbXB1dGFibGUpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQcm9ncmVzcyA9IHRoaXMucHJvZ3Jlc3MudmFsdWU7XG4gICAgICB0aGlzLnByb2dyZXNzLm5leHQoY3VycmVudFByb2dyZXNzICsgKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsKSAqICg5NSAtIGN1cnJlbnRQcm9ncmVzcykpO1xuICAgIH1cbiAgfVxuXG4gIHNldEFwcEFjdGl2ZVZlcnNpb24oYXBwOiBJQXBwbGljYXRpb24sIGFjdGl2ZVZlcnNpb25JZDogc3RyaW5nKTogUHJvbWlzZTxJQXBwbGljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UudXBkYXRlKHsgaWQ6IGFwcC5pZCwgYWN0aXZlVmVyc2lvbklkIH0pO1xuICB9XG5cbiAgc2V0UGFja2FnZVZlcnNpb25UYWcoYXBwOiBJQXBwbGljYXRpb24sIHZlcnNpb246IHN0cmluZywgdGFnczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2Uuc2V0UGFja2FnZVZlcnNpb25UYWcoYXBwLCB2ZXJzaW9uLCB0YWdzKTtcbiAgfVxuXG4gIGRlbGV0ZVBhY2thZ2VWZXJzaW9uKGFwcDogSUFwcGxpY2F0aW9uLCBwYXJhbXM6IElBcHBsaWNhdGlvblZlcnNpb25EZWxldGVQYXJhbXMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZGVsZXRlVmVyc2lvblBhY2thZ2UoYXBwLCBwYXJhbXMpO1xuICB9XG5cbiAgZ2V0SHVtYW5pemVkQXBwTmFtZShhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuaHVtYW5pemVBcHBOYW1lLnRyYW5zZm9ybShhcHAubmFtZSkucGlwZShkZWJvdW5jZVRpbWUoMjUwKSwgdGFrZSgxKSkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBjcmVhdGVDb25maWcoYXBwOiBJQXBwbGljYXRpb24sIGZvcm1Hcm91cFZhbHVlOiBGb3JtR3JvdXApOiBQYXJ0aWFsPElBcHBsaWNhdGlvbj4ge1xuICAgIGNvbnN0IHsgaWQsIHR5cGUsIGF2YWlsYWJpbGl0eSB9ID0gYXBwO1xuICAgIGxldCBjb25maWcgPSBwaWNrKGZvcm1Hcm91cFZhbHVlLCBbJ25hbWUnLCAna2V5JywgJ2NvbnRleHRQYXRoJ10pO1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGlzU2V0dXA6IHRydWUsXG4gICAgICBpZCxcbiAgICAgIHR5cGUsXG4gICAgICBhdmFpbGFiaWxpdHlcbiAgICB9O1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBhc3luYyBsaXN0QXJjaGl2ZXMoYXBwSWQ6IHN0cmluZyB8IG51bWJlciB8IElBcHBsaWNhdGlvbik6IFByb21pc2U8SUFwcGxpY2F0aW9uQmluYXJ5W10+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7XG4gICAgICBwYWdlU2l6ZTogMTAwXG4gICAgfTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmJpbmFyeShhcHBJZCkubGlzdChmaWx0ZXIpKS5kYXRhO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQXJjaGl2ZShhcmNoaXZlOiBJQXBwbGljYXRpb25CaW5hcnksIGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaHVtYW5pemVkQXJjaGl2ZU5hbWUgPSBhd2FpdCB0aGlzLmdldEh1bWFuaXplZEFwcE5hbWUoYXJjaGl2ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIGFyY2hpdmUnKSxcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAgIGBZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhcmNoaXZlIFwie3sgaHVtYW5pemVkQXJjaGl2ZU5hbWUgfX1cIi4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD9gXG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IGh1bWFuaXplZEFyY2hpdmVOYW1lIH1cbiAgICAgICAgKSxcbiAgICAgICAgU3RhdHVzLkRBTkdFUixcbiAgICAgICAgeyBvazogZ2V0dGV4dCgnRGVsZXRlJyksIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJykgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmJpbmFyeShhcHApLmRlbGV0ZShhcmNoaXZlLmlkKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQXJjaGl2ZSBkZWxldGVkLicpKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgaWYgKGV4KSB7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihnZXQoZXgsICdkYXRhLm1lc3NhZ2UnKSwgZXguZGF0YSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbmNlbGxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEFyY2hpdmVNYW5hZ2VkT2JqZWN0KGJpbmFyeUlkOiBzdHJpbmcpOiBQcm9taXNlPElNYW5hZ2VkT2JqZWN0PiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGJpbmFyeUlkKSkuZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkQXJjaGl2ZShcbiAgICBhcHA6IElBcHBsaWNhdGlvbixcbiAgICBhcmNoaXZlOiBQaWNrPElBcHBsaWNhdGlvbkJpbmFyeSwgJ25hbWUnIHwgJ2lkJz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJpbmFyeSA9IGF3YWl0IHRoaXMuZ2V0QmluYXJ5KGFwcCwgYXJjaGl2ZSk7XG4gICAgICBjb25zdCBmaWxlQmluYXJ5ID0gbmV3IEJsb2IoW2JpbmFyeV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQnIH0pO1xuICAgICAgc2F2ZUFzKGZpbGVCaW5hcnksIGFyY2hpdmUubmFtZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZW1wdHlcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVBcHAoXG4gICAgYXBwOiBJQXBwbGljYXRpb24sXG4gICAgZGVsZXRlT25GYWlsdXJlOiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxJUmVzdWx0PElBcHBsaWNhdGlvbj4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLnVwZGF0ZShhcHApO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0RXJyb3IoZXgpO1xuICAgICAgaWYgKGRlbGV0ZU9uRmFpbHVyZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5kZWxldGUoYXBwLmlkKTtcbiAgICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuQVBQTElDQVRJT05fQ1JFQVRJT05fRkFJTEVEKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVBcHAoYXBwOiBJQXBwbGljYXRpb24sIHNpbGVudCA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaHVtYW5pemVkQXBwTmFtZSA9IGF3YWl0IHRoaXMuZ2V0SHVtYW5pemVkQXBwTmFtZShhcHApO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLm1vZGFsLmNvbmZpcm0oXG4gICAgICAgIGdldHRleHQoJ0RlbGV0ZSBhcHBsaWNhdGlvbicpLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICAgYFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFwcGxpY2F0aW9uIFwie3sgaHVtYW5pemVkQXBwTmFtZSB9fVwiLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkP2BcbiAgICAgICAgICApLFxuICAgICAgICAgIHsgaHVtYW5pemVkQXBwTmFtZSB9XG4gICAgICAgICksXG4gICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgIHsgb2s6IGdldHRleHQoJ0RlbGV0ZScpLCBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmRlbGV0ZShhcHAuaWQpO1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0FwcGxpY2F0aW9uIGRlbGV0ZWQuJykpO1xuICAgIH1cbiAgICB0aGlzLmFwcERlbGV0ZWQuZW1pdChhcHApO1xuICB9XG5cbiAgYXN5bmMgY2hlY2tJZlN1YnNjcmliZWQoYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjdXJyZW50VGVuYW50ID0gYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLmN1cnJlbnQoKTtcbiAgICBjb25zdCBzdWJzY3JpYmVkQXBwcyA9IGN1cnJlbnRUZW5hbnQuZGF0YS5hcHBsaWNhdGlvbnMucmVmZXJlbmNlcztcbiAgICByZXR1cm4gc3Vic2NyaWJlZEFwcHMuc29tZShhcHBsaWNhdGlvbiA9PiBhcHBsaWNhdGlvbi5hcHBsaWNhdGlvbi5pZCA9PT0gYXBwLmlkKTtcbiAgfVxuXG4gIGFzeW5jIHN1YnNjcmliZUFwcChhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQ6IElDdXJyZW50VGVuYW50ID0gdGhpcy5hcHBTdGF0ZVNlcnZpY2UuY3VycmVudFRlbmFudC52YWx1ZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLnN1YnNjcmliZUFwcGxpY2F0aW9uKGN1cnJlbnRUZW5hbnQsIGFwcCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1N1Y2Nlc3NmdWxseSBzdWJzY3JpYmVkIHRvIGFwcGxpY2F0aW9uLicpKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydEVycm9yKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1bnN1YnNjcmliZUFwcChhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQ6IElDdXJyZW50VGVuYW50ID0gdGhpcy5hcHBTdGF0ZVNlcnZpY2UuY3VycmVudFRlbmFudC52YWx1ZTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLnVuc3Vic2NyaWJlQXBwbGljYXRpb24oY3VycmVudFRlbmFudCwgYXBwKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnU3VjY2Vzc2Z1bGx5IHVuc3Vic2NyaWJlZCBmcm9tIGFwcGxpY2F0aW9uLicpKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydEVycm9yKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1ZhbGlkQXBwVHlwZShhcmNoaXZlOiBGaWxlLCBhcHBUeXBlOiBBcHBsaWNhdGlvblR5cGUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFR5cGUgPSBhd2FpdCB0aGlzLmdldEFwcFR5cGUoYXJjaGl2ZSk7XG4gICAgICBpZiAoY3VycmVudFR5cGUgIT09IGFwcFR5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuVFlQRV9WQUxJREFUSU9OKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MubmV4dCh0aGlzLnByb2dyZXNzLnZhbHVlICsgMTApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuVFlQRV9WQUxJREFUSU9OKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGxvYWRBcmNoaXZlVG9BcHAoXG4gICAgYXJjaGl2ZTogRmlsZSxcbiAgICBhcHA6IElBcHBsaWNhdGlvbixcbiAgICBpc05ld1ZlcnNpb246IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPElBcHBsaWNhdGlvbj4ge1xuICAgIGxldCB1cGxvYWRPdmVycmlkZXM6IElVcGxvYWRQYXJhbXNPdmVycmlkZTtcbiAgICBpZiAoaXNOZXdWZXJzaW9uKSB7XG4gICAgICB1cGxvYWRPdmVycmlkZXMgPSBhd2FpdCB0aGlzLmdldFVwbG9hZE92ZXJyaWRlcyhhcmNoaXZlLCBhcHApO1xuICAgIH1cbiAgICBjb25zdCBiaW5hcnlTZXJ2aWNlID0gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuYmluYXJ5KGFwcCk7XG4gICAgdGhpcy54aHIgPSBiaW5hcnlTZXJ2aWNlLnVwbG9hZFdpdGhQcm9ncmVzc1hocihcbiAgICAgIGFyY2hpdmUsXG4gICAgICB0aGlzLnVwZGF0ZVVwbG9hZFByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgICAnJyxcbiAgICAgIHVwbG9hZE92ZXJyaWRlc1xuICAgICk7XG5cbiAgICBjb25zdCBiaW5hcnlNbyA9IGF3YWl0IGJpbmFyeVNlcnZpY2UuZ2V0WE1MSHR0cFJlc3BvbnNlKHRoaXMueGhyKTtcbiAgICAvLyBUT0RPIGNvbW1lbnRlZCBpdCBkdWUgdG86IGh0dHBzOi8vY3VtdWxvY2l0eS5hdGxhc3NpYW4ubmV0L2Jyb3dzZS9NVE0tNDg1NTNcbiAgICAvLyBBZGQgaXQgYmFjayB3aGVuIEJFIGZpeGVzIGlzc3VlcyB3aXRoIGFjdGl2ZVZlcnNpb24uXG4gICAgLy8gaWYgKGlzTmV3VmVyc2lvbikge1xuICAgIC8vICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QXBwbGljYXRpb24oYXBwKTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLnNldEFwcEFjdGl2ZVZlcnNpb24oYXBwLCAoYmluYXJ5TW8uYmluYXJ5SWQgfHwgYmluYXJ5TW8uaWQpIGFzIHN0cmluZykpLmRhdGE7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUFyY2hpdmVUb0FwcENvbXBhdGliaWxpdHkoYXJjaGl2ZTogRmlsZSwgYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcHBUeXBlID0gYXdhaXQgdGhpcy5nZXRBcHBUeXBlKGFyY2hpdmUpO1xuICAgIGlmIChhcHBUeXBlICE9PSBhcHAudHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuSU5WQUxJRF9BUFBMSUNBVElPTik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvZ3Jlc3MubmV4dCh0aGlzLnByb2dyZXNzLnZhbHVlICsgMTApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc01pY3Jvc2VydmljZShhcHApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRDdW11bG9jaXR5SnNvbihhcmNoaXZlKTtcbiAgICAvLyBBIHVzZXIgY2FuIHVwbG9hZCBhbiBhcHAgd2l0aG91dCBhIEN1bXVsb2NpdHkgSlNPTiBmaWxlIChlLmcuIGEgcmVhY3QgYXBwKS5cbiAgICAvLyBUaGlzIGlzIGFsbG93ZWQgYW5kIHNob3VsZCBub3QgdHJpZ2dlciBhIHZhbGlkYXRpb24gZXJyb3IuXG4gICAgaWYgKCFtYW5pZmVzdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlUGFja2FnZUtleUFuZENvbnRleHRQYXRoKG1hbmlmZXN0LCBhcHApO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q3VtdWxvY2l0eUpzb24oYXJjaGl2ZTogRmlsZSk6IFByb21pc2U8SU1hbmlmZXN0IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjOHlNYW5pZmVzdCA9IGF3YWl0IHRoaXMuZ2V0Q3VtdWxvY2l0eUpzb24kKGFyY2hpdmUpLnRvUHJvbWlzZSgpO1xuICAgICAgcmV0dXJuIGM4eU1hbmlmZXN0O1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVBcHBGb3JBcmNoaXZlKGFyY2hpdmUsIGlzUGFja2FnZVR5cGVBcmNoaXZlID0gZmFsc2UpOiBQcm9taXNlPElBcHBsaWNhdGlvbj4ge1xuICAgIGxldCBpc1BhY2thZ2UgPSBmYWxzZTtcbiAgICBjb25zdCBhcHBUeXBlID0gYXdhaXQgdGhpcy5nZXRBcHBUeXBlKGFyY2hpdmUpO1xuICAgIGxldCBhcHBNb2RlbDogYW55ID0ge307XG4gICAgY29uc3Qgc3VwcG9ydGVkQXBwVHlwZXMgPSBbQXBwbGljYXRpb25UeXBlLkhPU1RFRCwgQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRV07XG5cbiAgICBpZiAoc3VwcG9ydGVkQXBwVHlwZXMuaW5jbHVkZXMoYXBwVHlwZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcE1vZGVsID0gYXdhaXQgdGhpcy5nZXRDdW11bG9jaXR5SnNvbiQoYXJjaGl2ZSkudG9Qcm9taXNlKCk7XG4gICAgICAgIGlzUGFja2FnZSA9IGFwcE1vZGVsLmlzUGFja2FnZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZywgd2UgYWxsb3cgaGF2aW5nIEhPU1RFRCBhcHBsaWNhdGlvbnMgd2l0aG91dCB0aGUgbWFuaWZlc3QgZmlsZVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRCYXNlTmFtZUZyb21BcmNoaXZlT3JBcHBNb2RlbChhcmNoaXZlLCBhcHBUeXBlLCBhcHBNb2RlbCk7XG4gICAgY29uc3QgY2xlYXJlZE5hbWUgPSB0aGlzLnJlbW92ZUZvcmJpZGRlbkNoYXJhY3RlcnMobmFtZSk7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRBcHBLZXkoYXBwTW9kZWwsIGNsZWFyZWROYW1lKTtcbiAgICBjb25zdCBjb250ZXh0UGF0aCA9IHRoaXMuZ2V0Q29udGV4dFBhdGgoYXBwTW9kZWwsIG5hbWUpO1xuXG4gICAgY29uc3QgYXBwVG9TYXZlID0ge1xuICAgICAgcmVzb3VyY2VzVXJsOiAnLycsXG4gICAgICB0eXBlOiBhcHBUeXBlLFxuICAgICAgbmFtZSxcbiAgICAgIGtleSxcbiAgICAgIGNvbnRleHRQYXRoXG4gICAgfTtcblxuICAgIGlmIChpc1BhY2thZ2VUeXBlQXJjaGl2ZSAmJiAhaXNQYWNrYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5JTlZBTElEX1BBQ0tBR0UpO1xuICAgIH0gZWxzZSBpZiAoIWlzUGFja2FnZVR5cGVBcmNoaXZlICYmIGlzUGFja2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVjb3N5c3RlbUVycm9yKEVSUk9SX1RZUEUuSU5WQUxJRF9BUFBMSUNBVElPTik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTmFtZUxlbmd0aEV4Y2VlZGVkKG5hbWUsIGFwcFR5cGUpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcigpO1xuICAgICAgZXJyb3IubmFtZSA9IEVSUk9SX1RZUEUuTUlDUk9TRVJWSUNFX05BTUVfVE9PX0xPTkc7XG4gICAgICBlcnJvci5tZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoRVJST1JfTUVTU0FHRVNbZXJyb3IubmFtZV0sIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWF4Q2hhcnM6IE1JQ1JPU0VSVklDRV9OQU1FX01BWF9MRU5HVEhcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5jcmVhdGUoe1xuICAgICAgICAuLi5hcHBUb1NhdmUsXG4gICAgICAgIG1hbmlmZXN0OiB7XG4gICAgICAgICAgaXNQYWNrYWdlLFxuICAgICAgICAgIC4uLihhcHBNb2RlbD8ucGFja2FnZSAmJiB7IHBhY2thZ2U6IGFwcE1vZGVsLnBhY2thZ2UgfSlcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIElNYW5pZmVzdFxuICAgICAgfSlcbiAgICApLmRhdGE7XG4gIH1cblxuICBhc3luYyByZWFjdGl2YXRlQXJjaGl2ZShhcHA6IElBcHBsaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5yZWFjdGl2YXRlQXJjaGl2ZShhcHAuaWQpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdBcHBsaWNhdGlvbiByZWFjdGl2YXRlZC4nKSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRFcnJvcihleCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlT2xkZXN0QXJjaGl2ZShhcHA6IElBcHBsaWNhdGlvbiwgYXJjaGl2ZXM6IElBcHBsaWNhdGlvbkJpbmFyeVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnRGVsZXRlIG9sZGVzdCBhcmNoaXZlIGFuZCBjb250aW51ZScpLFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdVcCB0byA2IGFyY2hpdmVzIGNhbiBiZSBzYXZlZCBpbiB0aGUgcGxhdGZvcm0uIElmIHlvdSB1cGxvYWQgYSBuZXcgYXJjaGl2ZSwgdGhlIG9sZGVzdCBhcmNoaXZlIHRoYXQgaXMgbm90IGFjdGl2ZSB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuSU5GTyxcbiAgICAgICAgeyBvazogZ2V0dGV4dCgnRGVsZXRlIGFuZCBjb250aW51ZScpIH1cbiAgICAgICk7XG4gICAgICBjb25zdCBhcmNoaXZlVG9EZWxldGUgPSBhcmNoaXZlc1thcmNoaXZlcy5sZW5ndGggLSAyXTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmJpbmFyeShhcHApLmRlbGV0ZShhcmNoaXZlVG9EZWxldGUuaWQpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdBcmNoaXZlIGRlbGV0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0RXJyb3IoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlcGxveUFwcChzZWxlY3RlZFBhY2thZ2U6IElBcHBsaWNhdGlvbiwgZm9ybUdyb3VwVmFsdWUsIG1vZGVsKTogUHJvbWlzZTxJQXBwbGljYXRpb24+IHtcbiAgICAvLyBDcmVhdGUgbmV3IGFwcCBjb25maWdcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNyZWF0ZUNvbmZpZyhzZWxlY3RlZFBhY2thZ2UsIGZvcm1Hcm91cFZhbHVlKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRWZXJzaW9uID0gbW9kZWwuc2VsZWN0ZWQudmVyc2lvbjtcbiAgICBsZXQgY2xlYW5NYW5pZmVzdDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5nZXRBcHBNYW5pZmVzdChcbiAgICAgICAgc2VsZWN0ZWRQYWNrYWdlLFxuICAgICAgICByZXF1ZXN0ZWRWZXJzaW9uXG4gICAgICApO1xuICAgICAgY2xlYW5NYW5pZmVzdCA9IG9taXQobWFuaWZlc3QsIFsnbmFtZScsICdjb250ZXh0UGF0aCcsICdrZXknXSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRocm93IG5ldyBFY29zeXN0ZW1FcnJvcihFUlJPUl9UWVBFLlZFUlNJT05fTk9UX0ZPVU5EKTtcbiAgICB9XG5cbiAgICBjb25maWcuaXNTZXR1cCA9IHRydWU7XG4gICAgY29uZmlnLm1hbmlmZXN0ID0gY2xlYW5NYW5pZmVzdDtcbiAgICBjb25maWcuYXZhaWxhYmlsaXR5ID0gQXBwbGljYXRpb25BdmFpbGFiaWxpdHkuUFJJVkFURTtcbiAgICBjb25maWcubWFuaWZlc3QuaXNQYWNrYWdlID0gZmFsc2U7XG4gICAgY29uZmlnLm1hbmlmZXN0LnNvdXJjZSA9IHNlbGVjdGVkUGFja2FnZS5pZDtcbiAgICBjb25maWcubWFuaWZlc3QucGFja2FnZSA9ICdibHVlcHJpbnQnO1xuXG4gICAgLy8gYmVjYXVzZSBvZiBhIGlzc3VlIHdpdGggU0hBUkVEIGF2YWlsYWJpbGl0eSB3ZSBhbHdheXMgc2hvdWxkIGNoZWNrIGFnYWluXG4gICAgLy8gaWYgdGhlIGFwcCBub3QgZXhpc3QgYWxyZWFkeVxuICAgIGNvbnN0IGFsbEV4aXN0aW5nQXBwcyA9IGF3YWl0IHRoaXMuZ2V0SG9zdGVkQW5kUGFja2FnZUFwcGxpY2F0aW9ucygpO1xuICAgIGNvbnN0IGRvZXNBcHBLZXlPckNvbnRleHRQYXRoRXhpc3QgPSB0aGlzLmNoZWNrSWZBcHBOYW1lS2V5UGF0aEV4aXN0cyhhbGxFeGlzdGluZ0FwcHMsIGNvbmZpZyk7XG4gICAgaWYgKGRvZXNBcHBLZXlPckNvbnRleHRQYXRoRXhpc3QpIHtcbiAgICAgIHRocm93IG5ldyBFY29zeXN0ZW1FcnJvcihFUlJPUl9UWVBFLkFMUkVBRFlfRVhJU1QpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXcgYXBwXG4gICAgY29uc3QgbmV3QXBwID0gKGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmNyZWF0ZShjb25maWcpKS5kYXRhO1xuICAgIHRyeSB7XG4gICAgICAvLyBCaW5hcnkgdXBsb2FkIGNhbiBmYWlsIGlmIFNIQVJFRCBwYWNrYWdlXG4gICAgICAvLyBpbiB0aGlzIGNhc2UsIGNhdGNoIGVycm9yIGFuZCBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIGNsb25lIEFQSS5cbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkQmluYXJ5RnJvbU90aGVyUGFja2FnZShcbiAgICAgICAgc2VsZWN0ZWRQYWNrYWdlLFxuICAgICAgICBuZXdBcHAsXG4gICAgICAgIG1vZGVsLnNlbGVjdGVkLmJpbmFyeUlkLFxuICAgICAgICByZXF1ZXN0ZWRWZXJzaW9uXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3I/LnJlcz8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5mYWxsYmFja1RvQ2xvbmUobmV3QXBwLCBzZWxlY3RlZFBhY2thZ2UsIHJlcXVlc3RlZFZlcnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3QXBwO1xuICB9XG5cbiAgYXN5bmMgZmFsbGJhY2tUb0Nsb25lKFxuICAgIGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb24sXG4gICAgc2VsZWN0ZWRQYWNrYWdlOiBJQXBwbGljYXRpb24sXG4gICAgcmVxdWVzdGVkVmVyc2lvbj86IHN0cmluZ1xuICApIHtcbiAgICBsZXQgd2FzU3VjY2VzcyA9IHRydWU7XG4gICAgbGV0IGNsb25lZFBrZztcbiAgICB0cnkge1xuICAgICAgY2xvbmVkUGtnID0gKGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmNsb25lKHNlbGVjdGVkUGFja2FnZSwgcmVxdWVzdGVkVmVyc2lvbikpLmRhdGE7XG4gICAgICBhd2FpdCB0aGlzLnVwbG9hZEJpbmFyeUZyb21PdGhlclBhY2thZ2UoXG4gICAgICAgIHNlbGVjdGVkUGFja2FnZSxcbiAgICAgICAgYXBwbGljYXRpb24sXG4gICAgICAgIGNsb25lZFBrZy5hY3RpdmVWZXJzaW9uSWQsXG4gICAgICAgIHJlcXVlc3RlZFZlcnNpb24sXG4gICAgICAgIGNsb25lZFBrZ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydEVycm9yKGVycm9yKTtcbiAgICAgIHdhc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVBcHAoY2xvbmVkUGtnLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHdhc1N1Y2Nlc3M7XG4gIH1cblxuICBhc3luYyB1cGxvYWRCaW5hcnlGcm9tT3RoZXJQYWNrYWdlKFxuICAgIHNlbGVjdGVkUGFja2FnZTogSUFwcGxpY2F0aW9uLFxuICAgIGFwcGxpY2F0aW9uVG9VcGxvYWRCaW5hcnlUbzogSUFwcGxpY2F0aW9uLFxuICAgIGJpbmFyeUlkOiBzdHJpbmcsXG4gICAgcmVxdWVzdGVkVmVyc2lvbj86IHN0cmluZyxcbiAgICB1c2VCaW5hcmllc0Zyb20/OiBJQXBwbGljYXRpb25cbiAgKSB7XG4gICAgY29uc3QgeyBkYXRhOiBiaW5hcnlEZXRhaWxzIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKGJpbmFyeUlkKTtcblxuICAgIC8vIEdldCBiaW5hcnkgZnJvbSBzcGVjaWZpYyBwYWNrYWdlIHZlcnNpb25cbiAgICBjb25zdCBiaW5hcnkgPSBhd2FpdCB0aGlzLmdldEJpbmFyeSh1c2VCaW5hcmllc0Zyb20gfHwgc2VsZWN0ZWRQYWNrYWdlLCB7XG4gICAgICBpZDogYmluYXJ5SWRcbiAgICB9KTtcbiAgICAvLyBDcmVhdGUgemlwXG4gICAgY29uc3QgZmlsZUJpbmFyeSA9IG5ldyBCbG9iKFtiaW5hcnldLCB7IHR5cGU6IGJpbmFyeURldGFpbHMuY29udGVudFR5cGUgfSk7XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtmaWxlQmluYXJ5XSwgYmluYXJ5RGV0YWlscy5uYW1lLCB7XG4gICAgICB0eXBlOiBiaW5hcnlEZXRhaWxzLmNvbnRlbnRUeXBlXG4gICAgfSk7XG5cbiAgICAvLyBVcGxvYWQgYmluYXJ5IHRvIG5ldyBhcHBcbiAgICBhd2FpdCB0aGlzLnVwbG9hZEFyY2hpdmVUb0FwcChmaWxlLCBhcHBsaWNhdGlvblRvVXBsb2FkQmluYXJ5VG8pO1xuXG4gICAgLy8gdXBkYXRlIHRoZSBhcHAgbWFuaWZlc3RcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFwcE1hbmlmZXN0KGFwcGxpY2F0aW9uVG9VcGxvYWRCaW5hcnlUbywgc2VsZWN0ZWRQYWNrYWdlLCByZXF1ZXN0ZWRWZXJzaW9uKTtcbiAgfVxuXG4gIGdldEFwcFN0YXRlKGFwcDogSUFwcGxpY2F0aW9uKTogQXBwbGljYXRpb25TdGF0ZSB7XG4gICAgaWYgKCF0aGlzLmlzT3duZXIoYXBwKSkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5TVUJTQ1JJQkVEO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1VucGFja2VkKGFwcCkpIHtcbiAgICAgIHJldHVybiBBUFBfU1RBVEUuVU5QQUNLRUQ7XG4gICAgfSBlbHNlIGlmIChhcHAudHlwZSA9PT0gQXBwbGljYXRpb25UeXBlLkVYVEVSTkFMKSB7XG4gICAgICByZXR1cm4gQVBQX1NUQVRFLkVYVEVSTkFMO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhY2thZ2VCbHVlcHJpbnQoYXBwKSkge1xuICAgICAgcmV0dXJuIEFQUF9TVEFURS5QQUNLQUdFX0JMVUVQUklOVDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbHVnaW5zUGFja2FnZShhcHApKSB7XG4gICAgICByZXR1cm4gQVBQX1NUQVRFLlBBQ0tBR0VfUExVR0lOO1xuICAgIH1cbiAgICByZXR1cm4gQVBQX1NUQVRFLkNVU1RPTTtcbiAgfVxuXG4gIGlzUGFja2FnZUJsdWVwcmludChhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGFja2FnZShhcHApICYmIGFwcC5tYW5pZmVzdC5wYWNrYWdlID09PSAnYmx1ZXByaW50JztcbiAgfVxuXG4gIGlzUGx1Z2luc1BhY2thZ2UoYXBwOiBJQXBwbGljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhY2thZ2UoYXBwKSAmJiBhcHAubWFuaWZlc3QucGFja2FnZSA9PT0gJ3BsdWdpbic7XG4gIH1cblxuICBpc1VucGFja2VkKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYXBwLm1hbmlmZXN0Py5zb3VyY2U7XG4gIH1cblxuICBoYXNFeHBvcnRzKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhYXBwLm1hbmlmZXN0Py5leHBvcnRzPy5sZW5ndGg7XG4gIH1cblxuICBpc0FwcGxpY2F0aW9uKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGFwcC50eXBlICE9PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFICYmICF0aGlzLmlzRmVhdHVyZShhcHApICYmICF0aGlzLmlzUGFja2FnZShhcHApXG4gICAgKTtcbiAgfVxuXG4gIGlzQ3VzdG9tTWljcm9zZXJ2aWNlKGFwcDogSUFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNPd25lcihhcHApICYmIGFwcC50eXBlID09PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFO1xuICB9XG5cbiAgYXN5bmMgZ2V0QmluYXJ5KFxuICAgIGFwcDogSUFwcGxpY2F0aW9uLFxuICAgIGFyY2hpdmU6IElBcHBsaWNhdGlvbkJpbmFyeSB8IElJZGVudGlmaWVkXG4gICk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICBsZXQgYmluYXJ5O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5iaW5hcnkoYXBwKS5kb3dubG9hZEFyY2hpdmUoYXJjaGl2ZS5pZCk7XG4gICAgICBiaW5hcnkgPSBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc3QgbXNnID0gZ2V0dGV4dCgnQ291bGQgbm90IGdldCB0aGUgYmluYXJ5LicpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKG1zZyk7XG4gICAgfVxuICAgIHJldHVybiBiaW5hcnk7XG4gIH1cblxuICBhc3luYyBpc092ZXJ3cml0dGVuQnlDdXN0b21BcHAoYXBwOiBJQXBwbGljYXRpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gIXRoaXMuaXNPd25lcihhcHApICYmIChhd2FpdCB0aGlzLmhhc1N1YnNjcmliZWRBcHBQYXJlbnQoYXBwKSk7XG4gIH1cblxuICBhc3luYyBoYXNTdWJzY3JpYmVkQXBwUGFyZW50KGFwcDogSUFwcGxpY2F0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXBwc0dyb3VwZWRCeUNvbnRleHRQYXRoID0gYXdhaXQgdGhpcy5hcHBzR3JvdXBlZEJ5Q29udGV4dFBhdGgkLnBpcGUodGFrZSgxKSkudG9Qcm9taXNlKCk7XG4gICAgcmV0dXJuIGFwcC5jb250ZXh0UGF0aCAmJiBhcHBzR3JvdXBlZEJ5Q29udGV4dFBhdGhbYXBwLmNvbnRleHRQYXRoXT8ubGVuZ3RoID09PSAyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzZXRBdmFpbGFiaWxpdHlUb1ByaXZhdGVJZk5vdFNldEFscmVhZHkoYXBwOiBJQXBwbGljYXRpb24pOiBJQXBwbGljYXRpb24ge1xuICAgIGFwcC5hdmFpbGFiaWxpdHkgPSBBcHBsaWNhdGlvbkF2YWlsYWJpbGl0eS5QUklWQVRFO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYW4gZXJyb3IgZGlhbG9nLlxuICAgKiBAcGFyYW0gZXJyb3IgRWl0aGVyIGEgc2VydmVyIGVycm9yIG9yIGFuIGludGVybmFsIFtbRWNvc3lzdGVtRXJyb3JdXS5cbiAgICovXG4gIGFsZXJ0RXJyb3IoZXJyb3I6IEVycm9yIHwgRWNvc3lzdGVtRXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFY29zeXN0ZW1FcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKGVycm9yLm1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZVBhY2thZ2VLZXlBbmRDb250ZXh0UGF0aChtYW5pZmVzdDogSU1hbmlmZXN0LCBhcHA6IElBcHBsaWNhdGlvbikge1xuICAgIGNvbnN0IGNvbnRleHRQYXRoID0gZ2V0KG1hbmlmZXN0LCAnY29udGV4dFBhdGgnKTtcbiAgICBjb25zdCBhcHBLZXkgPSBnZXQobWFuaWZlc3QsICdrZXknKTtcbiAgICBpZiAoY29udGV4dFBhdGggIT09IGFwcC5jb250ZXh0UGF0aCB8fCBhcHBLZXkgIT09IGFwcC5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFY29zeXN0ZW1FcnJvcihFUlJPUl9UWVBFLktFWV9PUl9DT05URVhUX1BBVEhfTUlTTUFUQ0gpO1xuICAgIH1cbiAgfVxuXG4gIGZpbHRlckNvbnRhaW5TdHJpbmcobmFtZTogc3RyaW5nLCBmaWx0ZXJUZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0ZXJtID0gZmlsdGVyVGVybS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICByZXR1cm4gbmFtZSAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXBwTWFuaWZlc3QoXG4gICAgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbixcbiAgICBzZWxlY3RlZFBhY2thZ2U6IElBcHBsaWNhdGlvbixcbiAgICByZXF1ZXN0ZWRWZXJzaW9uPzogc3RyaW5nXG4gICk6IFByb21pc2U8eyByZXM6IElGZXRjaFJlc3BvbnNlOyBkYXRhOiBhbnkgfT4ge1xuICAgIGNvbnN0IHsgaWQgfSA9IGFwcGxpY2F0aW9uO1xuICAgIGNvbnN0IGNsZWFuZWRBcHAgPSB0aGlzLnJlbW92ZUFwcFByb3BlcnRpZXMoYXBwbGljYXRpb24pO1xuICAgIGxldCBtYW5pZmVzdDogUGFydGlhbDxJTWFuaWZlc3Q+ID0gc2VsZWN0ZWRQYWNrYWdlLm1hbmlmZXN0IHx8IHt9O1xuICAgIGlmIChyZXF1ZXN0ZWRWZXJzaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uZWRBcHBNYW5pZmVzdCA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmdldEFwcE1hbmlmZXN0KFxuICAgICAgICAgIHNlbGVjdGVkUGFja2FnZSxcbiAgICAgICAgICByZXF1ZXN0ZWRWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIG1hbmlmZXN0ID0gdmVyc2lvbmVkQXBwTWFuaWZlc3Q7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICB0aHJvdyBuZXcgRWNvc3lzdGVtRXJyb3IoRVJST1JfVFlQRS5WRVJTSU9OX05PVF9GT1VORCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW5lZEFwcC5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgIGNsZWFuZWRBcHAubWFuaWZlc3QuaXNQYWNrYWdlID0gZmFsc2U7XG4gICAgY2xlYW5lZEFwcC5tYW5pZmVzdC5zb3VyY2UgPSBzZWxlY3RlZFBhY2thZ2UuaWQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2VcbiAgICAgIC5iaW5hcnkoaWQpXG4gICAgICAudXBkYXRlRmlsZXMoW3sgcGF0aDogQ1VNVUxPQ0lUWV9KU09OLCBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoY2xlYW5lZEFwcCkgYXMgYW55IH1dKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZkFwcE5hbWVLZXlQYXRoRXhpc3RzKFxuICAgIGV4aXN0aW5nQXBwczogSUFwcGxpY2F0aW9uW10sXG4gICAgYXBwOiBJQXBwbGljYXRpb24sXG4gICAgcmV0cnlObz86IG51bWJlclxuICApOiBJQXBwbGljYXRpb24ge1xuICAgIGlmIChpc1VuZGVmaW5lZChyZXRyeU5vKSkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQXBwcy5maW5kKFxuICAgICAgICBleGlzdGluZ0FwcCA9PlxuICAgICAgICAgIGV4aXN0aW5nQXBwLm5hbWUgPT09IGFwcC5uYW1lIHx8XG4gICAgICAgICAgZXhpc3RpbmdBcHAua2V5ID09PSBhcHAua2V5IHx8XG4gICAgICAgICAgZXhpc3RpbmdBcHAuY29udGV4dFBhdGggPT09IGFwcC5jb250ZXh0UGF0aFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nQXBwcy5maW5kKFxuICAgICAgZXhpc3RpbmdBcHAgPT5cbiAgICAgICAgZXhpc3RpbmdBcHAubmFtZSA9PT0gYXBwLm5hbWUgfHxcbiAgICAgICAgZXhpc3RpbmdBcHAua2V5ID09PSBhcHAua2V5IHx8XG4gICAgICAgIGV4aXN0aW5nQXBwLmNvbnRleHRQYXRoID09PSBhcHAuY29udGV4dFBhdGggfHxcbiAgICAgICAgZXhpc3RpbmdBcHAubmFtZSA9PT0gW2FwcC5uYW1lLCByZXRyeU5vXS5qb2luKCctJykgfHxcbiAgICAgICAgZXhpc3RpbmdBcHAua2V5ID09PSBbYXBwLmtleSwgcmV0cnlOb10uam9pbignLScpIHx8XG4gICAgICAgIGV4aXN0aW5nQXBwLmNvbnRleHRQYXRoID09PSBbYXBwLmNvbnRleHRQYXRoLCByZXRyeU5vXS5qb2luKCctJylcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBcHBLZXkoYXBwTW9kZWw6IElBcHBsaWNhdGlvbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQga2V5ID0gYXBwTW9kZWw/LmtleTtcbiAgICBpZiAoIWtleSkge1xuICAgICAga2V5ID0gYCR7a2ViYWJDYXNlKG5hbWUpfS1rZXlgO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb250ZXh0UGF0aChhcHBNb2RlbDogSUFwcGxpY2F0aW9uLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhcHBNb2RlbD8uY29udGV4dFBhdGggfHwgbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGb3JiaWRkZW5DaGFyYWN0ZXJzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1teYS16QS1aMC05LV9dL2csICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDdXJyZW50QXBwKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VycmVudEFwcCA9IHRoaXMuYXBwU3RhdGVTZXJ2aWNlLnN0YXRlLmFwcDtcbiAgICByZXR1cm4gY3VycmVudEFwcC5jb250ZXh0UGF0aCA9PT0gYXBwLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdW11bG9jaXR5SnNvbiQoYXJjaGl2ZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuemlwU2VydmljZS5nZXRKc29uRGF0YShhcmNoaXZlLCB7XG4gICAgICBmaWxlbmFtZTogQ1VNVUxPQ0lUWV9KU09OXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFwcFR5cGUoYXJjaGl2ZTogRmlsZSk6IFByb21pc2U8QXBwbGljYXRpb25UeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q3VtdWxvY2l0eUpzb24kKGFyY2hpdmUpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKFxuICAgICAgICBkYXRhID0+XG4gICAgICAgICAgZ2V0KGRhdGEsICd0eXBlJykgfHxcbiAgICAgICAgICAoZ2V0KGRhdGEsICdhcGlWZXJzaW9uJykgPyBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFIDogQXBwbGljYXRpb25UeXBlLkhPU1RFRClcbiAgICAgIClcbiAgICAgIC5jYXRjaCgoKSA9PiBBcHBsaWNhdGlvblR5cGUuSE9TVEVEKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmFzZU5hbWVGcm9tQXJjaGl2ZU9yQXBwTW9kZWwoXG4gICAgYXJjaGl2ZTogYW55LFxuICAgIGFwcFR5cGU6IEFwcGxpY2F0aW9uVHlwZSxcbiAgICBhcHBNb2RlbD86IElBcHBsaWNhdGlvblxuICApOiBzdHJpbmcge1xuICAgIGxldCBiYXNlTmFtZSA9IGFwcE1vZGVsPy5uYW1lIHx8IGFyY2hpdmUubmFtZS5yZXBsYWNlKC9cXC56aXAkL2ksICcnKTtcbiAgICBpZiAoYXBwVHlwZSA9PT0gJ01JQ1JPU0VSVklDRScpIHtcbiAgICAgIGJhc2VOYW1lID0gdGhpcy5yZW1vdmVWZXJzaW9uRnJvbU5hbWUoYmFzZU5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZU5hbWU7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUFwcFByb3BlcnRpZXMoYXBwOiBJQXBwbGljYXRpb24pOiBJQXBwbGljYXRpb24ge1xuICAgIGNvbnN0IHRlbXBBcHAgPSBjbG9uZURlZXAoYXBwKTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzVG9SZW1vdmUgPSBbJ2lkJywgJ293bmVyJywgJ2FjdGl2ZVZlcnNpb25JZCcsICdzZWxmJywgJ3R5cGUnXTtcblxuICAgIHByb3BlcnRpZXNUb1JlbW92ZS5mb3JFYWNoKHByb3AgPT4gZGVsZXRlIHRlbXBBcHBbcHJvcF0pO1xuICAgIHJldHVybiB0ZW1wQXBwO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRVcGxvYWRPdmVycmlkZXMoXG4gICAgYXJjaGl2ZTogRmlsZSxcbiAgICBhcHA6IElBcHBsaWNhdGlvblxuICApOiBQcm9taXNlPElVcGxvYWRQYXJhbXNPdmVycmlkZT4ge1xuICAgIGNvbnN0IHsgdmVyc2lvbiB9ID0gYXdhaXQgdGhpcy5nZXRDdW11bG9jaXR5SnNvbiQoYXJjaGl2ZSkudG9Qcm9taXNlKCk7XG4gICAgY29uc3QgaXNJbml0aWFsUGFja2FnZSA9IGFwcC5hcHBsaWNhdGlvblZlcnNpb25zPy5sZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RVcmw6ICd2ZXJzaW9ucycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL3ZuZC5jb20ubnNuLmN1bXVsb2NpdHkuYXBwbGljYXRpb25WZXJzaW9uK2pzb247Y2hhcnNldD1VVEYtODt2ZXI9MC45J1xuICAgICAgfSxcbiAgICAgIGJvZHlGaWxlUHJvcGVydHk6ICdhcHBsaWNhdGlvbkJpbmFyeScsXG4gICAgICByZXF1ZXN0Qm9keToge1xuICAgICAgICBhcHBsaWNhdGlvblZlcnNpb246IHsgdmVyc2lvbiwgLi4uKGlzSW5pdGlhbFBhY2thZ2UgJiYgeyB0YWdzOiBbJ2xhdGVzdCddIH0pIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVWZXJzaW9uRnJvbU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdmVyc2lvblJlZ0V4cCA9IC8tXFxkK1xcLlxcZCtcXC5cXGQrKFxcLlxcZCspPygtXFxkKyk/KC4qKSQvO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UodmVyc2lvblJlZ0V4cCwgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc05hbWVMZW5ndGhFeGNlZWRlZChuYW1lLCBhcHBUeXBlKSB7XG4gICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gTUlDUk9TRVJWSUNFX05BTUVfTUFYX0xFTkdUSCAmJiBhcHBUeXBlID09PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFO1xuICB9XG59XG4iXX0=