@c8y/ngx-components 1018.0.147 → 1018.0.151

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 (30) 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/application-properties/update-application-modal/update-application-modal.component.d.ts +0 -2
  4. package/ecosystem/packages/deploy-application/deploy-application.component.d.ts +7 -6
  5. package/ecosystem/shared/ecosystem.constants.d.ts +3 -1
  6. package/ecosystem/shared/ecosystem.model.d.ts +3 -1
  7. package/ecosystem/shared/ecosystem.service.d.ts +11 -5
  8. package/esm2020/core/common/date.pipe.mjs +12 -7
  9. package/esm2020/core/common/stringify-object.pipe.mjs +11 -8
  10. package/esm2020/ecosystem/application-properties/application-properties.component.mjs +6 -4
  11. package/esm2020/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +11 -22
  12. package/esm2020/ecosystem/applications/install-from-package/install-from-package.component.mjs +2 -2
  13. package/esm2020/ecosystem/packages/deploy-application/deploy-application.component.mjs +28 -85
  14. package/esm2020/ecosystem/shared/ecosystem.constants.mjs +5 -3
  15. package/esm2020/ecosystem/shared/ecosystem.model.mjs +3 -1
  16. package/esm2020/ecosystem/shared/ecosystem.service.mjs +121 -24
  17. package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs +139 -27
  18. package/fesm2015/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  19. package/fesm2015/c8y-ngx-components-ecosystem.mjs +110 -179
  20. package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
  21. package/fesm2015/c8y-ngx-components.mjs +20 -13
  22. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  23. package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs +126 -25
  24. package/fesm2020/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  25. package/fesm2020/c8y-ngx-components-ecosystem.mjs +110 -176
  26. package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
  27. package/fesm2020/c8y-ngx-components.mjs +20 -13
  28. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  29. package/locales/locales.pot +15 -3
  30. package/package.json +1 -1
@@ -182,6 +182,8 @@ export class ApplicationPropertiesComponent {
182
182
  await this.bsModalService.show(UpdateApplicationModalComponent, {
183
183
  ariaDescribedby: 'modal-body',
184
184
  ariaLabelledBy: 'modal-title',
185
+ class: 'modal-sm',
186
+ ignoreBackdropClick: true,
185
187
  initialState: {
186
188
  sourcePackage: this.sourcePackage,
187
189
  application: this.application
@@ -218,7 +220,7 @@ export class ApplicationPropertiesComponent {
218
220
  label: gettext('Source package'),
219
221
  value: this.sourcePackage.name,
220
222
  type: 'link',
221
- action: () => this.router.navigateByUrl(ViewContext.Application.replace(':id', this.sourcePackage.id.toString()))
223
+ action: () => this.router.navigateByUrl(ViewContext.Extension.replace(':id', this.sourcePackage.id.toString()))
222
224
  });
223
225
  }
224
226
  }
@@ -285,9 +287,9 @@ export class ApplicationPropertiesComponent {
285
287
  }
286
288
  }
287
289
  ApplicationPropertiesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ApplicationPropertiesComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.EcosystemService }, { token: i1.Router }, { token: i3.FormBuilder }, { token: i4.ApplicationService }, { token: i5.AlertService }, { token: i4.InventoryService }, { token: i5.Permissions }, { token: i5.ModalService }, { token: i6.TranslateService }, { token: i7.BsModalService }, { token: i5.GainsightService }], target: i0.ɵɵFactoryTarget.Component });
288
- ApplicationPropertiesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ApplicationPropertiesComponent, selector: "c8y-application-properties", ngImport: i0, template: "<c8y-title>{{ application | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n *ngIf=\"isFeature\"\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-breadcrumb *ngIf=\"isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"row\">\n <div [ngClass]=\"{ 'col-md-8': !isActivityLogSupported, 'col-md-12': isActivityLogSupported }\">\n <div\n *ngIf=\"application\"\n [ngClass]=\"{ 'd-grid grid__col--7-5--md': isActivityLogSupported }\"\n class=\"card content-fullpage\"\n >\n <form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n [formGroup]=\"formGroup\"\n class=\"d-flex d-col content-fullpage\"\n novalidate\n >\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"card-block separator-bottom large-padding flex-no-shrink\">\n <div class=\"d-flex-md a-i-start text-center text-left-md\">\n <c8y-app-icon\n *ngIf=\"!isPackage && !isFeature && !isMicroservice && !isExternal\"\n [app]=\"application\"\n [contextPath]=\"application.contextPath\"\n [name]=\"application.name\"\n class=\"icon-48\"\n ></c8y-app-icon>\n <i *ngIf=\"isPackage\" c8yIcon=\"big-parcel\" class=\"icon-48\"></i>\n <i *ngIf=\"isFeature\" c8yIcon=\"tab\" class=\"icon-48\"></i>\n <i *ngIf=\"isMicroservice\" c8yIcon=\"microchip\" class=\"icon-48\"></i>\n <i *ngIf=\"isExternal\" c8yIcon=\"globe1\" class=\"icon-48\"></i>\n\n <div class=\"p-t-md-16 p-l-md-16 p-r-md-32 flex-grow\">\n <p class=\"h4 text-medium m-b-8\">{{ application | humanizeAppName | async }}</p>\n <p *ngIf=\"!isOwner\">\n <em class=\"text-muted\">\n {{\n formGroup?.controls?.description?.value ||\n ('No description available.' | translate)\n }}\n </em>\n </p>\n <div *ngIf=\"isOwner\" class=\"form-group m-b-0\">\n <label\n [ngClass]=\"{ updated: formGroup?.controls?.description?.dirty }\"\n class=\"editable\"\n >\n <textarea\n c8y-textarea-autoresize\n class=\"form-control no-resize\"\n formControlName=\"description\"\n name=\"description\"\n placeholder=\"{{ 'No description available.' | translate }}\"\n ></textarea>\n </label>\n </div>\n </div>\n <div class=\"text-right-md m-t-4\">\n <span [ngClass]=\"appState?.class\" class=\"label\">\n {{ appState?.label | translate }}\n </span>\n <div class=\"fit-w m-t-2\" *ngIf=\"isPackage || isMicroservice\">\n <label class=\"text-label-small\" translate>Version:</label>\n <small class=\"p-l-4 text-bold\">{{ application.manifest?.version }}</small>\n </div>\n <div class=\"fit-w m-t-2\">\n <label class=\"text-label-small\" translate>Creation time:</label>\n <small class=\"p-l-4 text-bold\">\n {{ (binaryMo?.creationTime | c8yDate) || '---' }}\n </small>\n </div>\n <div class=\"m-t-8\">\n <button\n type=\"button\"\n *ngIf=\"isUpdateAvailable\"\n (click)=\"updateToLatestVersion()\"\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'There\\'s a newer version available, click to update' | translate}}\"\n [attr.aria-label]=\"'There\\'s a newer version available, click to update' | translate\"\n [delay]=\"300\"\n placement=\"top\"\n >\n <i [c8yIcon]=\"'installing-updates'\"></i>\n {{ 'Update available' | translate }}\n </button>\n <button\n (click)=\"openApp(application)\"\n [disabled]=\"disableOpenInBrowser\"\n *ngIf=\"canOpenInBrowser\"\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Open' | translate }}\"\n type=\"button\"\n >\n <i [c8yIcon]=\"'external-link'\"></i>\n {{ 'Open' | translate }}\n </button>\n <div *ngIf=\"canOpenInBrowser && disableOpenInBrowser\">\n <small class=\"text-muted\" translate>\n The application is overwritten by a custom application sharing the same path\n </small>\n </div>\n <span *ngIf=\"isCustomMicroservice\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Subscribe' | translate }}\"\n (click)=\"subscribe()\"\n *ngIf=\"!isSubscribed\"\n >\n <i [c8yIcon]=\"'check-circle-o'\"></i>\n {{ 'Subscribe' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Unsubscribe' | translate }}\"\n (click)=\"unsubscribe()\"\n *ngIf=\"isSubscribed\"\n >\n <i [c8yIcon]=\"'minus-circle'\"></i>\n {{ 'Unsubscribe' | translate }}\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div *ngIf=\"isPackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"application.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Package details' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div *ngIf=\"sourcePackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"sourcePackage.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Source package information' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label for=\"appId\">ID</label>\n <input\n [readonly]=\"true\"\n autocomplete=\"off\"\n class=\"form-control\"\n formControlName=\"id\"\n name=\"id\"\n id=\"appId\"\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Name' | translate }}</label>\n <input\n [readonly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label>{{ 'Application key' | translate }}</label>\n <input\n [readonly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"key\"\n formControlName=\"key\"\n placeholder=\"{{ 'e.g. my-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Type' | translate }}</label>\n <div>\n <div *ngIf=\"application.id\">\n <p class=\"form-control-static\">\n <i [c8yIcon]=\"iconMap[application.type]\"></i>\n <span>\n {{ application.type | translate }}\n </span>\n </p>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div [ngSwitch]=\"application.type\">\n <div *ngSwitchCase=\"'HOSTED'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n </div>\n\n <div *ngSwitchCase=\"'MICROSERVICE'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/service/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-microservice`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n <div class=\"row\">\n <div *ngIf=\"application.manifest.version\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Version' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.version }}\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Isolation' | translate }}</label>\n <p class=\"form-control-static\">\n <span *ngIf=\"singleTenant\">\n <i [c8yIcon]=\"'c8y-enterprise'\" class=\"c8y-icon-duocolor h4\"></i>\n {{ 'Single tenant' | translate }}\n </span>\n <span *ngIf=\"!singleTenant\">\n <i [c8yIcon]=\"'c8y-sub-tenants'\" class=\"c8y-icon-duocolor icon-32\"></i>\n {{ 'Multi tenant' | translate }}\n </span>\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Billing mode' | translate }}</label>\n <p class=\"form-control-static\">\n <span\n *ngIf=\"subscription\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Subscription' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Subscriber | translate'\"\n >\n {{ 'Resources' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && !singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Resources' | translate }}\n </span>\n </p>\n </div>\n </div>\n\n <div *ngIf=\"application.manifest.provider\" class=\"legend form-block m-t-40\">\n {{ 'Provider' | translate }}\n </div>\n <div class=\"list-inline\" *ngIf=\"application.manifest.provider\">\n <div *ngIf=\"application.manifest.provider.name\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Name' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.name }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.domain\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Domain' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.domain }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.support\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Support' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.support }}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'REPOSITORY'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n formControlName=\"contextPath\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n />\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label>{{ 'Server URL' | translate }}</label>\n <input\n class=\"form-control\"\n name=\"resourcesUrl\"\n formControlName=\"resourcesUrl\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n\n <div class=\"form-group\">\n <label>{{ 'Username' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"username\"\n name=\"username\"\n type=\"text\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>{{ 'Password' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"password\"\n name=\"password\"\n type=\"text\"\n />\n </div>\n </div>\n\n <div *ngSwitchCase=\"'EXTERNAL'\">\n <c8y-form-group>\n <label>{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n [readOnly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://www.example.com/\"\n required\n type=\"url\"\n />\n <c8y-messages>\n <c8y-message\n [name]=\"'pattern'\"\n [text]=\"'Valid URL required.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"isCustomMicroservice\">\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <c8y-upload-archive\n [(application)]=\"application\"\n (refresh)=\"onNewArchive()\"\n ></c8y-upload-archive>\n </div>\n </ng-container>\n <div\n *ngIf=\"application && !!isOwner && hasAdminPermissions\"\n class=\"card-footer separator\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n type=\"button\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"delete()\"\n *ngIf=\"canDelete\"\n >\n {{ 'Delete' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!application.type || formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n\n <div *ngIf=\"isActivityLogSupported\" class=\"content-fullpage d-flex d-col bg-level-1\">\n <div class=\"card-header separator\">\n <div class=\"card-title\" translate>Activity log</div>\n <div class=\"m-l-auto\">\n <button\n class=\"btn btn-link btn-sm\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"load()\"\n >\n <i [ngClass]=\"{ 'icon-spin': isLoading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"isLoading\" class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n <c8y-activity-log\n *ngIf=\"!isLoading\"\n [hasAdminPermissions]=\"hasAdminPermissions\"\n [application]=\"application\"\n class=\"d-contents\"\n ></c8y-activity-log>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i5.AppIconComponent, selector: "c8y-app-icon", inputs: ["contextPath", "name", "app"] }, { kind: "component", type: i5.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i5.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "component", type: i5.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i5.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i5.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PropertiesListComponent, selector: "c8y-properties-list", inputs: ["properties", "title", "icon", "data", "groups", "noParse", "emptyLabel"] }, { kind: "directive", type: i9.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i2.UploadArchiveComponent, selector: "c8y-upload-archive", inputs: ["application", "uploadNewVersion", "preUploadCallback"], outputs: ["applicationChange", "refresh"] }, { kind: "component", type: i10.ActivityLogComponent, selector: "c8y-activity-log", inputs: ["application", "hasAdminPermissions"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i5.DatePipe, name: "c8yDate" }] });
290
+ ApplicationPropertiesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ApplicationPropertiesComponent, selector: "c8y-application-properties", ngImport: i0, template: "<c8y-title>{{ application | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n *ngIf=\"isFeature\"\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-breadcrumb *ngIf=\"isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"row\">\n <div [ngClass]=\"{ 'col-md-8': !isActivityLogSupported, 'col-md-12': isActivityLogSupported }\">\n <div\n *ngIf=\"application\"\n [ngClass]=\"{ 'd-grid grid__col--7-5--md': isActivityLogSupported }\"\n class=\"card content-fullpage\"\n >\n <form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n [formGroup]=\"formGroup\"\n class=\"d-flex d-col content-fullpage\"\n novalidate\n >\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"card-block separator-bottom large-padding flex-no-shrink\">\n <div class=\"d-flex-md a-i-start text-center text-left-md\">\n <c8y-app-icon\n *ngIf=\"!isPackage && !isFeature && !isMicroservice && !isExternal\"\n [app]=\"application\"\n [contextPath]=\"application.contextPath\"\n [name]=\"application.name\"\n class=\"icon-48\"\n ></c8y-app-icon>\n <i *ngIf=\"isPackage\" c8yIcon=\"big-parcel\" class=\"icon-48\"></i>\n <i *ngIf=\"isFeature\" c8yIcon=\"tab\" class=\"icon-48\"></i>\n <i *ngIf=\"isMicroservice\" c8yIcon=\"microchip\" class=\"icon-48\"></i>\n <i *ngIf=\"isExternal\" c8yIcon=\"globe1\" class=\"icon-48\"></i>\n\n <div class=\"p-t-md-16 p-l-md-16 p-r-md-32 flex-grow\">\n <p class=\"h4 text-medium m-b-8\">{{ application | humanizeAppName | async }}</p>\n <p *ngIf=\"!isOwner\">\n <em class=\"text-muted\">\n {{\n formGroup?.controls?.description?.value ||\n ('No description available.' | translate)\n }}\n </em>\n </p>\n <div *ngIf=\"isOwner\" class=\"form-group m-b-0\">\n <label\n [ngClass]=\"{ updated: formGroup?.controls?.description?.dirty }\"\n class=\"editable\"\n >\n <textarea\n c8y-textarea-autoresize\n class=\"form-control no-resize\"\n formControlName=\"description\"\n name=\"description\"\n placeholder=\"{{ 'No description available.' | translate }}\"\n ></textarea>\n </label>\n </div>\n </div>\n <div class=\"text-right-md m-t-4\">\n <span [ngClass]=\"appState?.class\" class=\"label\">\n {{ appState?.label | translate }}\n </span>\n <div\n class=\"fit-w m-t-2\"\n *ngIf=\"isPackage || isMicroservice || isUnpacked\"\n >\n <label\n class=\"text-label-small\"\n translate\n >\n Version:\n </label>\n <small class=\"p-l-4 text-bold\">{{ application.manifest?.version }}</small>\n </div>\n <div\n class=\"fit-w m-t-2\"\n *ngIf=\"!isUnpacked\"\n >\n <label\n class=\"text-label-small\"\n translate\n >\n Creation time:\n </label>\n <small class=\"p-l-4 text-bold\">\n {{ (binaryMo?.creationTime | c8yDate) || '---' }}\n </small>\n </div>\n <div class=\"m-t-8\">\n <button\n type=\"button\"\n *ngIf=\"isUpdateAvailable\"\n (click)=\"updateToLatestVersion()\"\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'There\\'s a newer version available, click to update' | translate}}\"\n [attr.aria-label]=\"'There\\'s a newer version available, click to update' | translate\"\n [delay]=\"300\"\n placement=\"top\"\n >\n <i [c8yIcon]=\"'installing-updates'\"></i>\n {{ 'Update available' | translate }}\n </button>\n <button\n (click)=\"openApp(application)\"\n [disabled]=\"disableOpenInBrowser\"\n *ngIf=\"canOpenInBrowser\"\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Open' | translate }}\"\n type=\"button\"\n >\n <i [c8yIcon]=\"'external-link'\"></i>\n {{ 'Open' | translate }}\n </button>\n <div *ngIf=\"canOpenInBrowser && disableOpenInBrowser\">\n <small class=\"text-muted\" translate>\n The application is overwritten by a custom application sharing the same path\n </small>\n </div>\n <span *ngIf=\"isCustomMicroservice\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Subscribe' | translate }}\"\n (click)=\"subscribe()\"\n *ngIf=\"!isSubscribed\"\n >\n <i [c8yIcon]=\"'check-circle-o'\"></i>\n {{ 'Subscribe' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Unsubscribe' | translate }}\"\n (click)=\"unsubscribe()\"\n *ngIf=\"isSubscribed\"\n >\n <i [c8yIcon]=\"'minus-circle'\"></i>\n {{ 'Unsubscribe' | translate }}\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div *ngIf=\"isPackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"application.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Package details' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div *ngIf=\"sourcePackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"sourcePackage.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Source package information' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label for=\"appId\">ID</label>\n <input\n [readonly]=\"true\"\n autocomplete=\"off\"\n class=\"form-control\"\n formControlName=\"id\"\n name=\"id\"\n id=\"appId\"\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Name' | translate }}</label>\n <input\n [readonly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label>{{ 'Application key' | translate }}</label>\n <input\n [readonly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"key\"\n formControlName=\"key\"\n placeholder=\"{{ 'e.g. my-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Type' | translate }}</label>\n <div>\n <div *ngIf=\"application.id\">\n <p class=\"form-control-static\">\n <i [c8yIcon]=\"iconMap[application.type]\"></i>\n <span>\n {{ application.type | translate }}\n </span>\n </p>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div [ngSwitch]=\"application.type\">\n <div *ngSwitchCase=\"'HOSTED'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n </div>\n\n <div *ngSwitchCase=\"'MICROSERVICE'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/service/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-microservice`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n <div class=\"row\">\n <div *ngIf=\"application.manifest.version\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Version' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.version }}\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Isolation' | translate }}</label>\n <p class=\"form-control-static\">\n <span *ngIf=\"singleTenant\">\n <i [c8yIcon]=\"'c8y-enterprise'\" class=\"c8y-icon-duocolor h4\"></i>\n {{ 'Single tenant' | translate }}\n </span>\n <span *ngIf=\"!singleTenant\">\n <i [c8yIcon]=\"'c8y-sub-tenants'\" class=\"c8y-icon-duocolor icon-32\"></i>\n {{ 'Multi tenant' | translate }}\n </span>\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Billing mode' | translate }}</label>\n <p class=\"form-control-static\">\n <span\n *ngIf=\"subscription\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Subscription' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Subscriber | translate'\"\n >\n {{ 'Resources' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && !singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Resources' | translate }}\n </span>\n </p>\n </div>\n </div>\n\n <div *ngIf=\"application.manifest.provider\" class=\"legend form-block m-t-40\">\n {{ 'Provider' | translate }}\n </div>\n <div class=\"list-inline\" *ngIf=\"application.manifest.provider\">\n <div *ngIf=\"application.manifest.provider.name\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Name' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.name }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.domain\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Domain' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.domain }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.support\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Support' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.support }}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'REPOSITORY'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n formControlName=\"contextPath\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n />\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label>{{ 'Server URL' | translate }}</label>\n <input\n class=\"form-control\"\n name=\"resourcesUrl\"\n formControlName=\"resourcesUrl\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n\n <div class=\"form-group\">\n <label>{{ 'Username' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"username\"\n name=\"username\"\n type=\"text\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>{{ 'Password' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"password\"\n name=\"password\"\n type=\"text\"\n />\n </div>\n </div>\n\n <div *ngSwitchCase=\"'EXTERNAL'\">\n <c8y-form-group>\n <label>{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n [readOnly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://www.example.com/\"\n required\n type=\"url\"\n />\n <c8y-messages>\n <c8y-message\n [name]=\"'pattern'\"\n [text]=\"'Valid URL required.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"isCustomMicroservice\">\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <c8y-upload-archive\n [(application)]=\"application\"\n (refresh)=\"onNewArchive()\"\n ></c8y-upload-archive>\n </div>\n </ng-container>\n <div\n *ngIf=\"application && !!isOwner && hasAdminPermissions\"\n class=\"card-footer separator\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n type=\"button\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"delete()\"\n *ngIf=\"canDelete\"\n >\n {{ 'Delete' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!application.type || formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n\n <div *ngIf=\"isActivityLogSupported\" class=\"content-fullpage d-flex d-col bg-level-1\">\n <div class=\"card-header separator\">\n <div class=\"card-title\" translate>Activity log</div>\n <div class=\"m-l-auto\">\n <button\n class=\"btn btn-link btn-sm\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"load()\"\n >\n <i [ngClass]=\"{ 'icon-spin': isLoading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"isLoading\" class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n <c8y-activity-log\n *ngIf=\"!isLoading\"\n [hasAdminPermissions]=\"hasAdminPermissions\"\n [application]=\"application\"\n class=\"d-contents\"\n ></c8y-activity-log>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i5.AppIconComponent, selector: "c8y-app-icon", inputs: ["contextPath", "name", "app"] }, { kind: "component", type: i5.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i5.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "component", type: i5.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "component", type: i5.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i5.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i5.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i5.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.PropertiesListComponent, selector: "c8y-properties-list", inputs: ["properties", "title", "icon", "data", "groups", "noParse", "emptyLabel"] }, { kind: "directive", type: i9.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i2.UploadArchiveComponent, selector: "c8y-upload-archive", inputs: ["application", "uploadNewVersion", "preUploadCallback"], outputs: ["applicationChange", "refresh"] }, { kind: "component", type: i10.ActivityLogComponent, selector: "c8y-activity-log", inputs: ["application", "hasAdminPermissions"] }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.HumanizeAppNamePipe, name: "humanizeAppName" }, { kind: "pipe", type: i5.DatePipe, name: "c8yDate" }] });
289
291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ApplicationPropertiesComponent, decorators: [{
290
292
  type: Component,
291
- args: [{ selector: 'c8y-application-properties', template: "<c8y-title>{{ application | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n *ngIf=\"isFeature\"\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-breadcrumb *ngIf=\"isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"row\">\n <div [ngClass]=\"{ 'col-md-8': !isActivityLogSupported, 'col-md-12': isActivityLogSupported }\">\n <div\n *ngIf=\"application\"\n [ngClass]=\"{ 'd-grid grid__col--7-5--md': isActivityLogSupported }\"\n class=\"card content-fullpage\"\n >\n <form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n [formGroup]=\"formGroup\"\n class=\"d-flex d-col content-fullpage\"\n novalidate\n >\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"card-block separator-bottom large-padding flex-no-shrink\">\n <div class=\"d-flex-md a-i-start text-center text-left-md\">\n <c8y-app-icon\n *ngIf=\"!isPackage && !isFeature && !isMicroservice && !isExternal\"\n [app]=\"application\"\n [contextPath]=\"application.contextPath\"\n [name]=\"application.name\"\n class=\"icon-48\"\n ></c8y-app-icon>\n <i *ngIf=\"isPackage\" c8yIcon=\"big-parcel\" class=\"icon-48\"></i>\n <i *ngIf=\"isFeature\" c8yIcon=\"tab\" class=\"icon-48\"></i>\n <i *ngIf=\"isMicroservice\" c8yIcon=\"microchip\" class=\"icon-48\"></i>\n <i *ngIf=\"isExternal\" c8yIcon=\"globe1\" class=\"icon-48\"></i>\n\n <div class=\"p-t-md-16 p-l-md-16 p-r-md-32 flex-grow\">\n <p class=\"h4 text-medium m-b-8\">{{ application | humanizeAppName | async }}</p>\n <p *ngIf=\"!isOwner\">\n <em class=\"text-muted\">\n {{\n formGroup?.controls?.description?.value ||\n ('No description available.' | translate)\n }}\n </em>\n </p>\n <div *ngIf=\"isOwner\" class=\"form-group m-b-0\">\n <label\n [ngClass]=\"{ updated: formGroup?.controls?.description?.dirty }\"\n class=\"editable\"\n >\n <textarea\n c8y-textarea-autoresize\n class=\"form-control no-resize\"\n formControlName=\"description\"\n name=\"description\"\n placeholder=\"{{ 'No description available.' | translate }}\"\n ></textarea>\n </label>\n </div>\n </div>\n <div class=\"text-right-md m-t-4\">\n <span [ngClass]=\"appState?.class\" class=\"label\">\n {{ appState?.label | translate }}\n </span>\n <div class=\"fit-w m-t-2\" *ngIf=\"isPackage || isMicroservice\">\n <label class=\"text-label-small\" translate>Version:</label>\n <small class=\"p-l-4 text-bold\">{{ application.manifest?.version }}</small>\n </div>\n <div class=\"fit-w m-t-2\">\n <label class=\"text-label-small\" translate>Creation time:</label>\n <small class=\"p-l-4 text-bold\">\n {{ (binaryMo?.creationTime | c8yDate) || '---' }}\n </small>\n </div>\n <div class=\"m-t-8\">\n <button\n type=\"button\"\n *ngIf=\"isUpdateAvailable\"\n (click)=\"updateToLatestVersion()\"\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'There\\'s a newer version available, click to update' | translate}}\"\n [attr.aria-label]=\"'There\\'s a newer version available, click to update' | translate\"\n [delay]=\"300\"\n placement=\"top\"\n >\n <i [c8yIcon]=\"'installing-updates'\"></i>\n {{ 'Update available' | translate }}\n </button>\n <button\n (click)=\"openApp(application)\"\n [disabled]=\"disableOpenInBrowser\"\n *ngIf=\"canOpenInBrowser\"\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Open' | translate }}\"\n type=\"button\"\n >\n <i [c8yIcon]=\"'external-link'\"></i>\n {{ 'Open' | translate }}\n </button>\n <div *ngIf=\"canOpenInBrowser && disableOpenInBrowser\">\n <small class=\"text-muted\" translate>\n The application is overwritten by a custom application sharing the same path\n </small>\n </div>\n <span *ngIf=\"isCustomMicroservice\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Subscribe' | translate }}\"\n (click)=\"subscribe()\"\n *ngIf=\"!isSubscribed\"\n >\n <i [c8yIcon]=\"'check-circle-o'\"></i>\n {{ 'Subscribe' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Unsubscribe' | translate }}\"\n (click)=\"unsubscribe()\"\n *ngIf=\"isSubscribed\"\n >\n <i [c8yIcon]=\"'minus-circle'\"></i>\n {{ 'Unsubscribe' | translate }}\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div *ngIf=\"isPackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"application.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Package details' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div *ngIf=\"sourcePackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"sourcePackage.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Source package information' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label for=\"appId\">ID</label>\n <input\n [readonly]=\"true\"\n autocomplete=\"off\"\n class=\"form-control\"\n formControlName=\"id\"\n name=\"id\"\n id=\"appId\"\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Name' | translate }}</label>\n <input\n [readonly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label>{{ 'Application key' | translate }}</label>\n <input\n [readonly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"key\"\n formControlName=\"key\"\n placeholder=\"{{ 'e.g. my-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Type' | translate }}</label>\n <div>\n <div *ngIf=\"application.id\">\n <p class=\"form-control-static\">\n <i [c8yIcon]=\"iconMap[application.type]\"></i>\n <span>\n {{ application.type | translate }}\n </span>\n </p>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div [ngSwitch]=\"application.type\">\n <div *ngSwitchCase=\"'HOSTED'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n </div>\n\n <div *ngSwitchCase=\"'MICROSERVICE'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/service/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-microservice`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n <div class=\"row\">\n <div *ngIf=\"application.manifest.version\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Version' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.version }}\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Isolation' | translate }}</label>\n <p class=\"form-control-static\">\n <span *ngIf=\"singleTenant\">\n <i [c8yIcon]=\"'c8y-enterprise'\" class=\"c8y-icon-duocolor h4\"></i>\n {{ 'Single tenant' | translate }}\n </span>\n <span *ngIf=\"!singleTenant\">\n <i [c8yIcon]=\"'c8y-sub-tenants'\" class=\"c8y-icon-duocolor icon-32\"></i>\n {{ 'Multi tenant' | translate }}\n </span>\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Billing mode' | translate }}</label>\n <p class=\"form-control-static\">\n <span\n *ngIf=\"subscription\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Subscription' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Subscriber | translate'\"\n >\n {{ 'Resources' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && !singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Resources' | translate }}\n </span>\n </p>\n </div>\n </div>\n\n <div *ngIf=\"application.manifest.provider\" class=\"legend form-block m-t-40\">\n {{ 'Provider' | translate }}\n </div>\n <div class=\"list-inline\" *ngIf=\"application.manifest.provider\">\n <div *ngIf=\"application.manifest.provider.name\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Name' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.name }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.domain\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Domain' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.domain }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.support\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Support' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.support }}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'REPOSITORY'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n formControlName=\"contextPath\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n />\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label>{{ 'Server URL' | translate }}</label>\n <input\n class=\"form-control\"\n name=\"resourcesUrl\"\n formControlName=\"resourcesUrl\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n\n <div class=\"form-group\">\n <label>{{ 'Username' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"username\"\n name=\"username\"\n type=\"text\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>{{ 'Password' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"password\"\n name=\"password\"\n type=\"text\"\n />\n </div>\n </div>\n\n <div *ngSwitchCase=\"'EXTERNAL'\">\n <c8y-form-group>\n <label>{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n [readOnly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://www.example.com/\"\n required\n type=\"url\"\n />\n <c8y-messages>\n <c8y-message\n [name]=\"'pattern'\"\n [text]=\"'Valid URL required.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"isCustomMicroservice\">\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <c8y-upload-archive\n [(application)]=\"application\"\n (refresh)=\"onNewArchive()\"\n ></c8y-upload-archive>\n </div>\n </ng-container>\n <div\n *ngIf=\"application && !!isOwner && hasAdminPermissions\"\n class=\"card-footer separator\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n type=\"button\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"delete()\"\n *ngIf=\"canDelete\"\n >\n {{ 'Delete' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!application.type || formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n\n <div *ngIf=\"isActivityLogSupported\" class=\"content-fullpage d-flex d-col bg-level-1\">\n <div class=\"card-header separator\">\n <div class=\"card-title\" translate>Activity log</div>\n <div class=\"m-l-auto\">\n <button\n class=\"btn btn-link btn-sm\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"load()\"\n >\n <i [ngClass]=\"{ 'icon-spin': isLoading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"isLoading\" class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n <c8y-activity-log\n *ngIf=\"!isLoading\"\n [hasAdminPermissions]=\"hasAdminPermissions\"\n [application]=\"application\"\n class=\"d-contents\"\n ></c8y-activity-log>\n </div>\n </div>\n </div>\n</div>\n" }]
293
+ args: [{ selector: 'c8y-application-properties', template: "<c8y-title>{{ application | humanizeAppName | async }}</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-modules'\"\n [label]=\"'Applications' | translate\"\n [path]=\"'ecosystem/application/applications'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n *ngIf=\"isFeature\"\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-breadcrumb *ngIf=\"isMicroservice\">\n <c8y-breadcrumb-item [icon]=\"'c8y-atom'\" [label]=\"'Ecosystem' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"breadcrumbConfig?.icon\"\n [label]=\"breadcrumbConfig?.label\"\n [path]=\"breadcrumbConfig?.path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"application | humanizeAppName | async\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'Properties' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"row\">\n <div [ngClass]=\"{ 'col-md-8': !isActivityLogSupported, 'col-md-12': isActivityLogSupported }\">\n <div\n *ngIf=\"application\"\n [ngClass]=\"{ 'd-grid grid__col--7-5--md': isActivityLogSupported }\"\n class=\"card content-fullpage\"\n >\n <form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n [formGroup]=\"formGroup\"\n class=\"d-flex d-col content-fullpage\"\n novalidate\n >\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"card-block separator-bottom large-padding flex-no-shrink\">\n <div class=\"d-flex-md a-i-start text-center text-left-md\">\n <c8y-app-icon\n *ngIf=\"!isPackage && !isFeature && !isMicroservice && !isExternal\"\n [app]=\"application\"\n [contextPath]=\"application.contextPath\"\n [name]=\"application.name\"\n class=\"icon-48\"\n ></c8y-app-icon>\n <i *ngIf=\"isPackage\" c8yIcon=\"big-parcel\" class=\"icon-48\"></i>\n <i *ngIf=\"isFeature\" c8yIcon=\"tab\" class=\"icon-48\"></i>\n <i *ngIf=\"isMicroservice\" c8yIcon=\"microchip\" class=\"icon-48\"></i>\n <i *ngIf=\"isExternal\" c8yIcon=\"globe1\" class=\"icon-48\"></i>\n\n <div class=\"p-t-md-16 p-l-md-16 p-r-md-32 flex-grow\">\n <p class=\"h4 text-medium m-b-8\">{{ application | humanizeAppName | async }}</p>\n <p *ngIf=\"!isOwner\">\n <em class=\"text-muted\">\n {{\n formGroup?.controls?.description?.value ||\n ('No description available.' | translate)\n }}\n </em>\n </p>\n <div *ngIf=\"isOwner\" class=\"form-group m-b-0\">\n <label\n [ngClass]=\"{ updated: formGroup?.controls?.description?.dirty }\"\n class=\"editable\"\n >\n <textarea\n c8y-textarea-autoresize\n class=\"form-control no-resize\"\n formControlName=\"description\"\n name=\"description\"\n placeholder=\"{{ 'No description available.' | translate }}\"\n ></textarea>\n </label>\n </div>\n </div>\n <div class=\"text-right-md m-t-4\">\n <span [ngClass]=\"appState?.class\" class=\"label\">\n {{ appState?.label | translate }}\n </span>\n <div\n class=\"fit-w m-t-2\"\n *ngIf=\"isPackage || isMicroservice || isUnpacked\"\n >\n <label\n class=\"text-label-small\"\n translate\n >\n Version:\n </label>\n <small class=\"p-l-4 text-bold\">{{ application.manifest?.version }}</small>\n </div>\n <div\n class=\"fit-w m-t-2\"\n *ngIf=\"!isUnpacked\"\n >\n <label\n class=\"text-label-small\"\n translate\n >\n Creation time:\n </label>\n <small class=\"p-l-4 text-bold\">\n {{ (binaryMo?.creationTime | c8yDate) || '---' }}\n </small>\n </div>\n <div class=\"m-t-8\">\n <button\n type=\"button\"\n *ngIf=\"isUpdateAvailable\"\n (click)=\"updateToLatestVersion()\"\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'There\\'s a newer version available, click to update' | translate}}\"\n [attr.aria-label]=\"'There\\'s a newer version available, click to update' | translate\"\n [delay]=\"300\"\n placement=\"top\"\n >\n <i [c8yIcon]=\"'installing-updates'\"></i>\n {{ 'Update available' | translate }}\n </button>\n <button\n (click)=\"openApp(application)\"\n [disabled]=\"disableOpenInBrowser\"\n *ngIf=\"canOpenInBrowser\"\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Open' | translate }}\"\n type=\"button\"\n >\n <i [c8yIcon]=\"'external-link'\"></i>\n {{ 'Open' | translate }}\n </button>\n <div *ngIf=\"canOpenInBrowser && disableOpenInBrowser\">\n <small class=\"text-muted\" translate>\n The application is overwritten by a custom application sharing the same path\n </small>\n </div>\n <span *ngIf=\"isCustomMicroservice\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Subscribe' | translate }}\"\n (click)=\"subscribe()\"\n *ngIf=\"!isSubscribed\"\n >\n <i [c8yIcon]=\"'check-circle-o'\"></i>\n {{ 'Subscribe' | translate }}\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Unsubscribe' | translate }}\"\n (click)=\"unsubscribe()\"\n *ngIf=\"isSubscribed\"\n >\n <i [c8yIcon]=\"'minus-circle'\"></i>\n {{ 'Unsubscribe' | translate }}\n </button>\n </span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div *ngIf=\"isPackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"application.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Package details' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div *ngIf=\"sourcePackage\" class=\"row p-16\">\n <c8y-properties-list\n [data]=\"sourcePackage.manifest\"\n [properties]=\"packageProperties\"\n [title]=\"'Source package information' | translate\"\n [emptyLabel]=\"'---'\"\n icon=\"info\"\n ></c8y-properties-list>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label for=\"appId\">ID</label>\n <input\n [readonly]=\"true\"\n autocomplete=\"off\"\n class=\"form-control\"\n formControlName=\"id\"\n name=\"id\"\n id=\"appId\"\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Name' | translate }}</label>\n <input\n [readonly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"name\"\n name=\"name\"\n placeholder=\"{{ 'e.g. My application' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label>{{ 'Application key' | translate }}</label>\n <input\n [readonly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"key\"\n formControlName=\"key\"\n placeholder=\"{{ 'e.g. my-application-key' | translate }}\"\n required\n type=\"text\"\n />\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-7\">\n <c8y-form-group>\n <label>{{ 'Type' | translate }}</label>\n <div>\n <div *ngIf=\"application.id\">\n <p class=\"form-control-static\">\n <i [c8yIcon]=\"iconMap[application.type]\"></i>\n <span>\n {{ application.type | translate }}\n </span>\n </p>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n\n <div [ngSwitch]=\"application.type\">\n <div *ngSwitchCase=\"'HOSTED'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n </div>\n\n <div *ngSwitchCase=\"'MICROSERVICE'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/service/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-microservice`used in URL`' | translate }}\"\n required\n type=\"text\"\n formControlName=\"contextPath\"\n />\n </div>\n </c8y-form-group>\n <div class=\"row\">\n <div *ngIf=\"application.manifest.version\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Version' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.version }}\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Isolation' | translate }}</label>\n <p class=\"form-control-static\">\n <span *ngIf=\"singleTenant\">\n <i [c8yIcon]=\"'c8y-enterprise'\" class=\"c8y-icon-duocolor h4\"></i>\n {{ 'Single tenant' | translate }}\n </span>\n <span *ngIf=\"!singleTenant\">\n <i [c8yIcon]=\"'c8y-sub-tenants'\" class=\"c8y-icon-duocolor icon-32\"></i>\n {{ 'Multi tenant' | translate }}\n </span>\n </p>\n </div>\n <div *ngIf=\"application.manifest.isolation\" class=\"col-sm-4 m-b-16 flex-auto\">\n <label>{{ 'Billing mode' | translate }}</label>\n <p class=\"form-control-static\">\n <span\n *ngIf=\"subscription\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Subscription' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Subscriber | translate'\"\n >\n {{ 'Resources' | translate }}\n </span>\n <span\n *ngIf=\"!subscription && !singleTenant\"\n [tooltip]=\"'Resources usage assigned to: Owner' | translate\"\n >\n {{ 'Resources' | translate }}\n </span>\n </p>\n </div>\n </div>\n\n <div *ngIf=\"application.manifest.provider\" class=\"legend form-block m-t-40\">\n {{ 'Provider' | translate }}\n </div>\n <div class=\"list-inline\" *ngIf=\"application.manifest.provider\">\n <div *ngIf=\"application.manifest.provider.name\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Name' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.name }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.domain\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Domain' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.domain }}\n </p>\n </div>\n </div>\n <div *ngIf=\"application.manifest.provider.support\">\n <div class=\"col-sm-4 m-b-16\">\n <label>{{ 'Support' | translate }}</label>\n <p class=\"form-control-static\">\n {{ application.manifest.provider.support }}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n <div *ngSwitchCase=\"'REPOSITORY'\">\n <c8y-form-group>\n <label>{{ 'Path' | translate }}</label>\n <div class=\"input-group\">\n <span class=\"input-group-addon\">/apps/</span>\n <input\n [readOnly]=\"application.id || !isOwner\"\n class=\"form-control\"\n formControlName=\"contextPath\"\n name=\"contextPath\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"text\"\n />\n </div>\n </c8y-form-group>\n\n <c8y-form-group>\n <label>{{ 'Server URL' | translate }}</label>\n <input\n class=\"form-control\"\n name=\"resourcesUrl\"\n formControlName=\"resourcesUrl\"\n placeholder=\"{{ 'e.g. my-application`used in URL`' | translate }}\"\n required\n type=\"url\"\n />\n </c8y-form-group>\n\n <div class=\"form-group\">\n <label>{{ 'Username' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"username\"\n name=\"username\"\n type=\"text\"\n />\n </div>\n\n <div class=\"form-group\">\n <label>{{ 'Password' | translate }}</label>\n <input\n class=\"form-control\"\n formControlName=\"password\"\n name=\"password\"\n type=\"text\"\n />\n </div>\n </div>\n\n <div *ngSwitchCase=\"'EXTERNAL'\">\n <c8y-form-group>\n <label>{{ 'External URL' | translate }}</label>\n <input\n [pattern]=\"'^(?!javascript:).+'\"\n [readOnly]=\"!isOwner\"\n class=\"form-control\"\n formControlName=\"externalUrl\"\n name=\"externalUrl\"\n placeholder=\"{{ 'e.g.' | translate }} http://www.example.com/\"\n required\n type=\"url\"\n />\n <c8y-messages>\n <c8y-message\n [name]=\"'pattern'\"\n [text]=\"'Valid URL required.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"isCustomMicroservice\">\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <c8y-upload-archive\n [(application)]=\"application\"\n (refresh)=\"onNewArchive()\"\n ></c8y-upload-archive>\n </div>\n </ng-container>\n <div\n *ngIf=\"application && !!isOwner && hasAdminPermissions\"\n class=\"card-footer separator\"\n >\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-danger\"\n type=\"button\"\n title=\"{{ 'Delete' | translate }}\"\n (click)=\"delete()\"\n *ngIf=\"canDelete\"\n >\n {{ 'Delete' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!application.type || formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </form>\n\n <div *ngIf=\"isActivityLogSupported\" class=\"content-fullpage d-flex d-col bg-level-1\">\n <div class=\"card-header separator\">\n <div class=\"card-title\" translate>Activity log</div>\n <div class=\"m-l-auto\">\n <button\n class=\"btn btn-link btn-sm\"\n type=\"button\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"load()\"\n >\n <i [ngClass]=\"{ 'icon-spin': isLoading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"isLoading\" class=\"p-16 text-center\">\n <c8y-loading></c8y-loading>\n </div>\n <c8y-activity-log\n *ngIf=\"!isLoading\"\n [hasAdminPermissions]=\"hasAdminPermissions\"\n [application]=\"application\"\n class=\"d-contents\"\n ></c8y-activity-log>\n </div>\n </div>\n </div>\n</div>\n" }]
292
294
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.EcosystemService }, { type: i1.Router }, { type: i3.FormBuilder }, { type: i4.ApplicationService }, { type: i5.AlertService }, { type: i4.InventoryService }, { type: i5.Permissions }, { type: i5.ModalService }, { type: i6.TranslateService }, { type: i7.BsModalService }, { type: i5.GainsightService }]; } });
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tcHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9lY29zeXN0ZW0vYXBwbGljYXRpb24tcHJvcGVydGllcy9hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzL2FwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsV0FBVyxFQUdYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1YsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFdBQVcsRUFFWCxXQUFXLEVBQ1gsT0FBTyxFQUNSLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2xCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDOzs7Ozs7Ozs7Ozs7QUFFaEgsTUFBTSx1QkFBdUIsR0FBRyx1Q0FBdUMsQ0FB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QUNsRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUNqRSxjQUFjLEVBQ2Qsc0JBQXNCLENBQ3ZCLENBQUM7U0FDSDtRQUFDLE1BQU07WUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsK0NBQStDLENBQUMsQ0FBQyxDQUFDO1NBQ3JGO0lBQ0gsQ0FBQzs7MkhBalZVLDhCQUE4QjsrR0FBOUIsOEJBQThCLGtFQ3ZDM0MsNm1xQkEyZUE7MkZEcGNhLDhCQUE4QjtrQkFKMUMsU0FBUzsrQkFDRSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25TZXJ2aWNlLFxuICBBcHBsaWNhdGlvblR5cGUsXG4gIEJpbGxpbmdNb2RlLFxuICBJQXBwbGljYXRpb24sXG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJbnZlbnRvcnlTZXJ2aWNlLFxuICBJc29sYXRpb25cbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBHYWluc2lnaHRTZXJ2aWNlLFxuICBNb2RhbFNlcnZpY2UsXG4gIFBlcm1pc3Npb25zLFxuICBQcm9wZXJ0aWVzTGlzdEl0ZW0sXG4gIFZpZXdDb250ZXh0LFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25TdGF0ZSxcbiAgRWNvc3lzdGVtU2VydmljZSxcbiAgUFJPRFVDVF9FWFBFUklFTkNFLFxuICBwYWNrYWdlUHJvcGVydGllc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Vjb3N5c3RlbS9zaGFyZWQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi9zdWJzY3JpcHRpb24tbW9kYWwvc3Vic2NyaXB0aW9uLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBVcGRhdGVBcHBsaWNhdGlvbk1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi91cGRhdGUtYXBwbGljYXRpb24tbW9kYWwvdXBkYXRlLWFwcGxpY2F0aW9uLW1vZGFsLmNvbXBvbmVudCc7XG5cbmNvbnN0IE1JQ1JPU0VSVklDRVNfQkFTRV9QQVRIID0gJy9lY29zeXN0ZW0vbWljcm9zZXJ2aWNlL21pY3Jvc2VydmljZXMnO1xuY29uc3QgQVBQTElDQVRJT05TX0JBU0VfUEFUSCA9ICcvZWNvc3lzdGVtL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uUHJvcGVydGllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIENVUlJFTlRfTE9DQVRJT04gPSBsb2NhdGlvbi5ocmVmO1xuICBmb3JtR3JvdXA6IEZvcm1Hcm91cDtcbiAgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbjtcbiAgYmluYXJ5TW86IElNYW5hZ2VkT2JqZWN0O1xuICBzaW5nbGVUZW5hbnQgPSBmYWxzZTtcbiAgc3Vic2NyaXB0aW9uID0gZmFsc2U7XG4gIGNhbk9wZW5JbkJyb3dzZXI6IGJvb2xlYW47XG4gIGRpc2FibGVPcGVuSW5Ccm93c2VyOiBib29sZWFuO1xuICBjYW5EZWxldGU6IGJvb2xlYW47XG4gIGlzT3duZXI6IGJvb2xlYW47XG4gIGlzU3Vic2NyaWJlZDogYm9vbGVhbjtcbiAgaXNQYWNrYWdlOiBib29sZWFuO1xuICBpc01pY3Jvc2VydmljZTogYm9vbGVhbjtcbiAgaXNGZWF0dXJlOiBib29sZWFuO1xuICBpc0V4dGVybmFsOiBib29sZWFuO1xuICBpc1VucGFja2VkOiBib29sZWFuO1xuICBpY29uTWFwID0ge1xuICAgIEhPU1RFRDogJ2Nsb3VkJyxcbiAgICBFWFRFUk5BTDogJ2V4dGVybmFsLWxpbmstc3F1YXJlJyxcbiAgICBNSUNST1NFUlZJQ0U6ICdtaWNyb2NoaXAnXG4gIH07XG4gIGFwcFN0YXRlOiBBcHBsaWNhdGlvblN0YXRlO1xuICBzb3VyY2VQYWNrYWdlOiBJQXBwbGljYXRpb247XG4gIGlzTG9hZGluZyA9IHRydWU7XG4gIGlzQWN0aXZpdHlMb2dTdXBwb3J0ZWQ6IGJvb2xlYW47XG4gIGlzQ3VzdG9tTWljcm9zZXJ2aWNlOiBib29sZWFuO1xuICBoYXNBZG1pblBlcm1pc3Npb25zID0gZmFsc2U7XG5cbiAgYnJlYWRjcnVtYkNvbmZpZzogeyBpY29uOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9O1xuICBwYWNrYWdlUHJvcGVydGllczogUHJvcGVydGllc0xpc3RJdGVtW10gPSBbLi4ucGFja2FnZVByb3BlcnRpZXNdO1xuICBpc1VwZGF0ZUF2YWlsYWJsZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYmx1ZXByaW50QXBwbGljYXRpb25WZXJzaW9uOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBlY29zeXN0ZW1TZXJ2aWNlOiBFY29zeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvblNlcnZpY2U6IEFwcGxpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5U2VydmljZTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9ucyxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5oYXNBZG1pblBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucy5oYXNSb2xlKCdST0xFX0FQUExJQ0FUSU9OX01BTkFHRU1FTlRfQURNSU4nKTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgdGhpcy5pc1VucGFja2VkID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzVW5wYWNrZWQodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc1BhY2thZ2UgPSB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNQYWNrYWdlKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuaXNGZWF0dXJlID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzRmVhdHVyZSh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLmlzRXh0ZXJuYWwgPSB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNFeHRlcm5hbCh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLmlzTWljcm9zZXJ2aWNlID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzTWljcm9zZXJ2aWNlKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuYXBwU3RhdGUgPSB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0QXBwU3RhdGUodGhpcy5hcHBsaWNhdGlvbik7XG5cbiAgICBpZiAodGhpcy5pc1VucGFja2VkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc29sdmVTb3VyY2VQYWNrYWdlRGV0YWlscygpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QnJlYWRjcnVtYkNvbmZpZygpO1xuXG4gICAgaWYgKHRoaXMuaXNDdXN0b21NaWNyb3NlcnZpY2UpIHtcbiAgICAgIHRoaXMubG9hZEJpbmFyeU1vKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZCgpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIGF3YWl0IHRoaXMubG9hZEFwcGxpY2F0aW9uKCk7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uQXBwbGljYXRpb24oYXBwOiBJQXBwbGljYXRpb24pIHtcbiAgICBpZiAoYXBwLm1hbmlmZXN0KSB7XG4gICAgICB0aGlzLnNpbmdsZVRlbmFudCA9IGFwcC5tYW5pZmVzdC5pc29sYXRpb24gPT09IElzb2xhdGlvbi5QRVJfVEVOQU5UO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBhcHAubWFuaWZlc3QuYmlsbGluZ01vZGUgPT09IEJpbGxpbmdNb2RlLlNVQlNDUklQVElPTjtcbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuYXBwbGljYXRpb24udHlwZSA9PT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChNSUNST1NFUlZJQ0VTX0JBU0VfUEFUSCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoQVBQTElDQVRJT05TX0JBU0VfUEFUSCk7XG4gICAgfVxuICB9XG5cbiAgb3BlbkFwcChhcHApIHtcbiAgICB0aGlzLmVjb3N5c3RlbVNlcnZpY2Uub3BlbkFwcChhcHApO1xuICB9XG5cbiAgZ2V0UGFja2FnZShlbnRpdHlPcklkOiBzdHJpbmcgfCBudW1iZXIgfCBJQXBwbGljYXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZGV0YWlsKGVudGl0eU9ySWQpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZGVsZXRlQXBwKHRoaXMuYXBwbGljYXRpb24pO1xuICAgICAgaWYgKHRoaXMuYXBwbGljYXRpb24udHlwZSA9PT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRSkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKE1JQ1JPU0VSVklDRVNfQkFTRV9QQVRIKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoQVBQTElDQVRJT05TX0JBU0VfUEFUSCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmIChleCkge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBzdWJzY3JpYmUoKSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0geyBhcHBsaWNhdGlvbjogdGhpcy5hcHBsaWNhdGlvbiwgaXNTdWJzY3JpYmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IHRoaXMuY29uZmlybVN1YnNjcmlwdGlvbkNoYW5nZShpbml0aWFsU3RhdGUpO1xuICAgIHRoaXMubG9hZEFwcGxpY2F0aW9uKCk7XG4gIH1cblxuICBhc3luYyB1bnN1YnNjcmliZSgpIHtcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7IGFwcGxpY2F0aW9uOiB0aGlzLmFwcGxpY2F0aW9uLCBpc1N1YnNjcmliZWQ6IHRydWUgfTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpcm1TdWJzY3JpcHRpb25DaGFuZ2UoaW5pdGlhbFN0YXRlKTtcbiAgICB0aGlzLmxvYWRBcHBsaWNhdGlvbigpO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFwcGxpY2F0aW9uKCkge1xuICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyZW50LmRhdGEuY29udGV4dERhdGE7XG4gICAgdGhpcy5hcHBsaWNhdGlvbiA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRBcHBsaWNhdGlvbihpZCk7XG4gICAgaWYgKHRoaXMuYXBwbGljYXRpb24udHlwZSA9PT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCduYW1lJykuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRBcHBsaWNhdGlvbiA9IHtcbiAgICAgIC4uLnRoaXMuYXBwbGljYXRpb24sXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5nZXREZXNjcmlwdGlvbih0aGlzLmFwcGxpY2F0aW9uKVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHVwZGF0ZWRBcHBsaWNhdGlvbik7XG4gICAgdGhpcy5jYW5PcGVuSW5Ccm93c2VyID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmNhbk9wZW5BcHBJbkJyb3dzZXIodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5kaXNhYmxlT3BlbkluQnJvd3NlciA9XG4gICAgICB0aGlzLmNhbk9wZW5JbkJyb3dzZXIgJiZcbiAgICAgIChhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNPdmVyd3JpdHRlbkJ5Q3VzdG9tQXBwKHRoaXMuYXBwbGljYXRpb24pKTtcbiAgICB0aGlzLmNhbkRlbGV0ZSA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5jYW5EZWxldGVBcHAodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc093bmVyID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzT3duZXIodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc0FjdGl2aXR5TG9nU3VwcG9ydGVkID0gdGhpcy5pc0FjdGl2aXR5TG9nU3VwcG9ydGVkQnlBcHAodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc0N1c3RvbU1pY3Jvc2VydmljZSA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc0N1c3RvbU1pY3Jvc2VydmljZSh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLmlzU3Vic2NyaWJlZCA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS5jaGVja0lmU3Vic2NyaWJlZCh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLm9uQXBwbGljYXRpb24odGhpcy5hcHBsaWNhdGlvbik7XG4gIH1cblxuICBhc3luYyBzYXZlKGFwcDogSUFwcGxpY2F0aW9uKSB7XG4gICAgYXBwLmlkID0gdGhpcy5hcHBsaWNhdGlvbi5pZDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLnVwZGF0ZUFwcChhcHApO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdBcHBsaWNhdGlvbiBzYXZlZC4nKSk7XG4gICAgICB0aGlzLmZvcm1Hcm91cC5yZXNldCgpO1xuICAgICAgdGhpcy5sb2FkQXBwbGljYXRpb24oKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIG9uTmV3QXJjaGl2ZSgpIHtcbiAgICB0aGlzLmxvYWRCaW5hcnlNbygpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlVG9MYXRlc3RWZXJzaW9uKCkge1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQoXG4gICAgICBQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkVWRU5UUy5BUFBMSUNBVElPTl9QUk9QRVJUSUVTLFxuICAgICAge1xuICAgICAgICBjb21wb25lbnQ6IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQ09NUE9ORU5UUy5BUFBMSUNBVElPTl9QUk9QRVJUSUVTLFxuICAgICAgICBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRS5BUFBMSUNBVElPTlMuQUNUSU9OUy5VUERBVEVfQVZBSUxBQkxFLFxuICAgICAgICB1cmw6IHRoaXMuQ1VSUkVOVF9MT0NBVElPTlxuICAgICAgfVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHJhbnNsYXRlZEJvZHkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgIGBZb3UncmUgdXNpbmcgdGhlIHZlcnNpb24ge3sgY3VycmVudFZlcnNpb24gfX0gb2YgdGhlIHt7IHBhY2thZ2VOYW1lIH19IHBhY2thZ2UsIHRoZSBsYXRlc3QgdmVyc2lvbiBhdmFpbGFibGUgaXMge3sgbGF0ZXN0VmVyc2lvbiB9fSwgZG8geW91IHdhbnQgdG8gdXBkYXRlPyBZb3UgY2FuIGFsd2F5cyByZXZlcnQgdG8gYSBwcmV2aW91cyB2ZXJzaW9uIGluIHRoZSBBY3Rpdml0eSBsb2cgcGFuZWwuYFxuICAgICAgICApLFxuICAgICAgICB7XG4gICAgICAgICAgY3VycmVudFZlcnNpb246IHRoaXMuYXBwbGljYXRpb24ubWFuaWZlc3Q/LnZlcnNpb24sXG4gICAgICAgICAgbGF0ZXN0VmVyc2lvbjogdGhpcy5ibHVlcHJpbnRBcHBsaWNhdGlvblZlcnNpb24sXG4gICAgICAgICAgcGFja2FnZU5hbWU6IHRoaXMuc291cmNlUGFja2FnZS5uYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5jb25maXJtKGdldHRleHQoJ1VwZGF0ZSBhcHBsaWNhdGlvbicpLCB0cmFuc2xhdGVkQm9keSwgJ3dhcm5pbmcnLCB7XG4gICAgICAgIG9rOiBnZXR0ZXh0KCdVcGRhdGUnKSxcbiAgICAgICAgY2FuY2VsOiBnZXR0ZXh0KCdDYW5jZWwnKVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBtb2RhbCBjYW5jZWxlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3c8VXBkYXRlQXBwbGljYXRpb25Nb2RhbENvbXBvbmVudD4oXG4gICAgICAgIFVwZGF0ZUFwcGxpY2F0aW9uTW9kYWxDb21wb25lbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgICAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgICAgIHNvdXJjZVBhY2thZ2U6IHRoaXMuc291cmNlUGFja2FnZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uOiB0aGlzLmFwcGxpY2F0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLmNvbnRlbnQucmVzdWx0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbW9kYWwgY2FuY2VsZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0FwcGxpY2F0aW9uIHVwZGF0ZWQuJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXNjcmlwdGlvbihhcHBsaWNhdGlvbjogSUFwcGxpY2F0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFwcGxpY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhcHBsaWNhdGlvbi5kZXNjcmlwdGlvbiB8fCBhcHBsaWNhdGlvbi5tYW5pZmVzdD8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1TdWJzY3JpcHRpb25DaGFuZ2UoaW5pdGlhbFN0YXRlOiB7XG4gICAgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbjtcbiAgICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCAoXG4gICAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coU3Vic2NyaXB0aW9uTW9kYWxDb21wb25lbnQsIHtcbiAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgICB9KS5jb250ZW50IGFzIFN1YnNjcmlwdGlvbk1vZGFsQ29tcG9uZW50XG4gICAgKS5yZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVTb3VyY2VQYWNrYWdlRGV0YWlscygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zb3VyY2VQYWNrYWdlID0gKGF3YWl0IHRoaXMuZ2V0UGFja2FnZSh0aGlzLmFwcGxpY2F0aW9uLm1hbmlmZXN0Py5zb3VyY2UpKS5kYXRhO1xuICAgICAgaWYgKHRoaXMuc291cmNlUGFja2FnZSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VQcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdTb3VyY2UgcGFja2FnZScpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnNvdXJjZVBhY2thZ2UubmFtZSxcbiAgICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcbiAgICAgICAgICAgICAgVmlld0NvbnRleHQuQXBwbGljYXRpb24ucmVwbGFjZSgnOmlkJywgdGhpcy5zb3VyY2VQYWNrYWdlLmlkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICApXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uud2FybmluZyhnZXR0ZXh0KCdVbmFibGUgdG8gcmVzb2x2ZSBzb3VyY2UgcGFja2FnZS4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5leHRyYWN0VmVyc2lvbkluZm9ybWF0aW9uKHRoaXMuYXBwbGljYXRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgaWQ6IFt7IHZhbHVlOiAnJyB9XSxcbiAgICAgIG5hbWU6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMjApXSxcbiAgICAgIGtleTogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEyMCldLFxuICAgICAgY29udGV4dFBhdGg6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMjApXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJycsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMCldLFxuICAgICAgcmVzb3VyY2VzVXJsOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB1c2VybmFtZTogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgcGFzc3dvcmQ6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGV4dGVybmFsVXJsOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICB9KTtcbiAgICBpZiAoIXRoaXMuaGFzQWRtaW5QZXJtaXNzaW9ucykge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuZGlzYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNBY3Rpdml0eUxvZ1N1cHBvcnRlZEJ5QXBwKGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc093bmVyKGFwcCkgJiZcbiAgICAgIGFwcC50eXBlICE9PSBBcHBsaWNhdGlvblR5cGUuTUlDUk9TRVJWSUNFICYmXG4gICAgICBhcHAudHlwZSAhPT0gQXBwbGljYXRpb25UeXBlLkVYVEVSTkFMXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QnJlYWRjcnVtYkNvbmZpZygpIHtcbiAgICB0aGlzLmJyZWFkY3J1bWJDb25maWcgPSB7XG4gICAgICBpY29uOiB0aGlzLmlzTWljcm9zZXJ2aWNlID8gJ21pY3JvY2hpcCcgOiB0aGlzLmlzRmVhdHVyZSA/ICd0YWInIDogJ2M4eS1tb2R1bGVzJyxcbiAgICAgIGxhYmVsOiB0aGlzLmlzTWljcm9zZXJ2aWNlXG4gICAgICAgID8gZ2V0dGV4dCgnTWljcm9zZXJ2aWNlcycpXG4gICAgICAgIDogdGhpcy5pc0ZlYXR1cmVcbiAgICAgICAgPyBnZXR0ZXh0KCdGZWF0dXJlcycpXG4gICAgICAgIDogZ2V0dGV4dCgnQXBwbGljYXRpb25zJyksXG4gICAgICBwYXRoOiB0aGlzLmlzTWljcm9zZXJ2aWNlXG4gICAgICAgID8gJy9lY29zeXN0ZW0vbWljcm9zZXJ2aWNlL21pY3Jvc2VydmljZXMnXG4gICAgICAgIDogdGhpcy5pc0ZlYXR1cmVcbiAgICAgICAgPyAnZWNvc3lzdGVtL2FwcGxpY2F0aW9uL2ZlYXR1cmVzJ1xuICAgICAgICA6ICdlY29zeXN0ZW0vYXBwbGljYXRpb24vYXBwbGljYXRpb25zJ1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRCaW5hcnlNbygpIHtcbiAgICB0aGlzLmJpbmFyeU1vID0gKGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5kZXRhaWwodGhpcy5hcHBsaWNhdGlvbi5hY3RpdmVWZXJzaW9uSWQpKS5kYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHRyYWN0VmVyc2lvbkluZm9ybWF0aW9uKGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb24pIHtcbiAgICBpZiAoIWFwcGxpY2F0aW9uLm1hbmlmZXN0LmlzUGFja2FnZSAmJiAhYXBwbGljYXRpb24ubWFuaWZlc3Quc291cmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmx1ZXByaW50QXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLm1hbmlmZXN0Py5zb3VyY2U7XG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBhcHBsaWNhdGlvbi5tYW5pZmVzdD8udmVyc2lvbjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGE6IGJsdWVwcmludEFwcGxpY2F0aW9uVmVyc2lvbnMgfSA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmxpc3RWZXJzaW9ucyhcbiAgICAgICAgYmx1ZXByaW50QXBwbGljYXRpb25JZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJsdWVwcmludExhdGVzdFZlcnNpb24gPSB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0QXBwbGljYXRpb25WZXJzaW9uT2JqZWN0QnlUYWcoXG4gICAgICAgIGJsdWVwcmludEFwcGxpY2F0aW9uVmVyc2lvbnMsXG4gICAgICAgICdsYXRlc3QnXG4gICAgICApO1xuICAgICAgdGhpcy5ibHVlcHJpbnRBcHBsaWNhdGlvblZlcnNpb24gPSBibHVlcHJpbnRMYXRlc3RWZXJzaW9uLnZlcnNpb247XG4gICAgICB0aGlzLmlzVXBkYXRlQXZhaWxhYmxlID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLnNob3VsZFVwZ3JhZGVQYWNrYWdlKFxuICAgICAgICBjdXJyZW50VmVyc2lvbixcbiAgICAgICAgYmx1ZXByaW50TGF0ZXN0VmVyc2lvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLndhcm5pbmcoZ2V0dGV4dCgnVW5hYmxlIHRvIHJlc29sdmUgdmVyc2lvbnMgb2Ygc291cmNlIHBhY2thZ2UuJykpO1xuICAgIH1cbiAgfVxufVxuIiwiPGM4eS10aXRsZT57eyBhcHBsaWNhdGlvbiB8IGh1bWFuaXplQXBwTmFtZSB8IGFzeW5jIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYiAqbmdJZj1cIiFpc01pY3Jvc2VydmljZVwiPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbaWNvbl09XCInYzh5LWF0b20nXCIgW2xhYmVsXT1cIidFY29zeXN0ZW0nIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidjOHktbW9kdWxlcydcIlxuICAgIFtsYWJlbF09XCInQXBwbGljYXRpb25zJyB8IHRyYW5zbGF0ZVwiXG4gICAgW3BhdGhdPVwiJ2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbnMnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICAqbmdJZj1cImlzRmVhdHVyZVwiXG4gICAgW2ljb25dPVwiYnJlYWRjcnVtYkNvbmZpZz8uaWNvblwiXG4gICAgW2xhYmVsXT1cImJyZWFkY3J1bWJDb25maWc/LmxhYmVsXCJcbiAgICBbcGF0aF09XCJicmVhZGNydW1iQ29uZmlnPy5wYXRoXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cImFwcGxpY2F0aW9uIHwgaHVtYW5pemVBcHBOYW1lIHwgYXN5bmNcIj48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtsYWJlbF09XCInUHJvcGVydGllcycgfCB0cmFuc2xhdGVcIj48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG48L2M4eS1icmVhZGNydW1iPlxuXG48Yzh5LWJyZWFkY3J1bWIgKm5nSWY9XCJpc01pY3Jvc2VydmljZVwiPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbaWNvbl09XCInYzh5LWF0b20nXCIgW2xhYmVsXT1cIidFY29zeXN0ZW0nIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cImJyZWFkY3J1bWJDb25maWc/Lmljb25cIlxuICAgIFtsYWJlbF09XCJicmVhZGNydW1iQ29uZmlnPy5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYkNvbmZpZz8ucGF0aFwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtsYWJlbF09XCJhcHBsaWNhdGlvbiB8IGh1bWFuaXplQXBwTmFtZSB8IGFzeW5jXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbbGFiZWxdPVwiJ1Byb3BlcnRpZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IFtuZ0NsYXNzXT1cInsgJ2NvbC1tZC04JzogIWlzQWN0aXZpdHlMb2dTdXBwb3J0ZWQsICdjb2wtbWQtMTInOiBpc0FjdGl2aXR5TG9nU3VwcG9ydGVkIH1cIj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImFwcGxpY2F0aW9uXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ2QtZ3JpZCBncmlkX19jb2wtLTctNS0tbWQnOiBpc0FjdGl2aXR5TG9nU3VwcG9ydGVkIH1cIlxuICAgICAgY2xhc3M9XCJjYXJkIGNvbnRlbnQtZnVsbHBhZ2VcIlxuICAgID5cbiAgICAgIDxmb3JtXG4gICAgICAgIChuZ1N1Ym1pdCk9XCJmb3JtR3JvdXAudmFsaWQgJiYgc2F2ZShmb3JtR3JvdXAudmFsdWUpXCJcbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICAgICAgICBjbGFzcz1cImQtZmxleCBkLWNvbCBjb250ZW50LWZ1bGxwYWdlXCJcbiAgICAgICAgbm92YWxpZGF0ZVxuICAgICAgPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZ1wiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHNlcGFyYXRvci1ib3R0b20gbGFyZ2UtcGFkZGluZyBmbGV4LW5vLXNocmlua1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleC1tZCBhLWktc3RhcnQgdGV4dC1jZW50ZXIgdGV4dC1sZWZ0LW1kXCI+XG4gICAgICAgICAgICAgIDxjOHktYXBwLWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc1BhY2thZ2UgJiYgIWlzRmVhdHVyZSAmJiAhaXNNaWNyb3NlcnZpY2UgJiYgIWlzRXh0ZXJuYWxcIlxuICAgICAgICAgICAgICAgIFthcHBdPVwiYXBwbGljYXRpb25cIlxuICAgICAgICAgICAgICAgIFtjb250ZXh0UGF0aF09XCJhcHBsaWNhdGlvbi5jb250ZXh0UGF0aFwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwiYXBwbGljYXRpb24ubmFtZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLTQ4XCJcbiAgICAgICAgICAgICAgPjwvYzh5LWFwcC1pY29uPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImlzUGFja2FnZVwiIGM4eUljb249XCJiaWctcGFyY2VsXCIgY2xhc3M9XCJpY29uLTQ4XCI+PC9pPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImlzRmVhdHVyZVwiIGM4eUljb249XCJ0YWJcIiBjbGFzcz1cImljb24tNDhcIj48L2k+XG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwiaXNNaWNyb3NlcnZpY2VcIiBjOHlJY29uPVwibWljcm9jaGlwXCIgY2xhc3M9XCJpY29uLTQ4XCI+PC9pPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImlzRXh0ZXJuYWxcIiBjOHlJY29uPVwiZ2xvYmUxXCIgY2xhc3M9XCJpY29uLTQ4XCI+PC9pPlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLXQtbWQtMTYgcC1sLW1kLTE2IHAtci1tZC0zMiBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImg0IHRleHQtbWVkaXVtIG0tYi04XCI+e3sgYXBwbGljYXRpb24gfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9fTwvcD5cbiAgICAgICAgICAgICAgICA8cCAqbmdJZj1cIiFpc093bmVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwPy5jb250cm9scz8uZGVzY3JpcHRpb24/LnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzT3duZXJcIiBjbGFzcz1cImZvcm0tZ3JvdXAgbS1iLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHVwZGF0ZWQ6IGZvcm1Hcm91cD8uY29udHJvbHM/LmRlc2NyaXB0aW9uPy5kaXJ0eSB9XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGM4eS10ZXh0YXJlYS1hdXRvcmVzaXplXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbm8tcmVzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0LW1kIG0tdC00XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiYXBwU3RhdGU/LmNsYXNzXCIgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAge3sgYXBwU3RhdGU/LmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaXQtdyBtLXQtMlwiICpuZ0lmPVwiaXNQYWNrYWdlIHx8IGlzTWljcm9zZXJ2aWNlXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCIgdHJhbnNsYXRlPlZlcnNpb246PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInAtbC00IHRleHQtYm9sZFwiPnt7IGFwcGxpY2F0aW9uLm1hbmlmZXN0Py52ZXJzaW9uIH19PC9zbWFsbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZml0LXcgbS10LTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIiB0cmFuc2xhdGU+Q3JlYXRpb24gdGltZTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicC1sLTQgdGV4dC1ib2xkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IChiaW5hcnlNbz8uY3JlYXRpb25UaW1lIHwgYzh5RGF0ZSkgfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tdC04XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzVXBkYXRlQXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRvTGF0ZXN0VmVyc2lvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdUaGVyZVxcJ3MgYSBuZXdlciB2ZXJzaW9uIGF2YWlsYWJsZSwgY2xpY2sgdG8gdXBkYXRlJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVGhlcmVcXCdzIGEgbmV3ZXIgdmVyc2lvbiBhdmFpbGFibGUsIGNsaWNrIHRvIHVwZGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiJ2luc3RhbGxpbmctdXBkYXRlcydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdVcGRhdGUgYXZhaWxhYmxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQXBwKGFwcGxpY2F0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlT3BlbkluQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FuT3BlbkluQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ09wZW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidleHRlcm5hbC1saW5rJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAge3sgJ09wZW4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW5PcGVuSW5Ccm93c2VyICYmIGRpc2FibGVPcGVuSW5Ccm93c2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGlzIG92ZXJ3cml0dGVuIGJ5IGEgY3VzdG9tIGFwcGxpY2F0aW9uIHNoYXJpbmcgdGhlIHNhbWUgcGF0aFxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzQ3VzdG9tTWljcm9zZXJ2aWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1N1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWJzY3JpYmUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNTdWJzY3JpYmVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidjaGVjay1jaXJjbGUtbydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1N1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Vuc3Vic2NyaWJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuc3Vic2NyaWJlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNTdWJzY3JpYmVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidtaW51cy1jaXJjbGUnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdVbnN1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1sZXZlbC0wIGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZ1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQYWNrYWdlXCIgY2xhc3M9XCJyb3cgcC0xNlwiPlxuICAgICAgICAgICAgICAgIDxjOHktcHJvcGVydGllcy1saXN0XG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJhcHBsaWNhdGlvbi5tYW5pZmVzdFwiXG4gICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJwYWNrYWdlUHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1BhY2thZ2UgZGV0YWlscycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2VtcHR5TGFiZWxdPVwiJy0tLSdcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cImluZm9cIlxuICAgICAgICAgICAgICAgID48L2M4eS1wcm9wZXJ0aWVzLWxpc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic291cmNlUGFja2FnZVwiIGNsYXNzPVwicm93IHAtMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LXByb3BlcnRpZXMtbGlzdFxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwic291cmNlUGFja2FnZS5tYW5pZmVzdFwiXG4gICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJwYWNrYWdlUHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NvdXJjZSBwYWNrYWdlIGluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1wdHlMYWJlbF09XCInLS0tJ1wiXG4gICAgICAgICAgICAgICAgICBpY29uPVwiaW5mb1wiXG4gICAgICAgICAgICAgICAgPjwvYzh5LXByb3BlcnRpZXMtbGlzdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFwcElkXCI+SUQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdOYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIE15IGFwcGxpY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQXBwbGljYXRpb24ga2V5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhcHBsaWNhdGlvbi5pZCB8fCAhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBteS1hcHBsaWNhdGlvbi1rZXknIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdUeXBlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiaWNvbk1hcFthcHBsaWNhdGlvbi50eXBlXVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYXBwbGljYXRpb24udHlwZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiYXBwbGljYXRpb24udHlwZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidIT1NURUQnXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnUGF0aCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+L2FwcHMvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImFwcGxpY2F0aW9uLmlkIHx8ICFpc093bmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjb250ZXh0UGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIG15LWFwcGxpY2F0aW9uYHVzZWQgaW4gVVJMYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRleHRQYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTUlDUk9TRVJWSUNFJ1wiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1BhdGgnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPi9zZXJ2aWNlLzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJhcHBsaWNhdGlvbi5pZCB8fCAhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29udGV4dFBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBteS1taWNyb3NlcnZpY2VgdXNlZCBpbiBVUkxgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29udGV4dFBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLm1hbmlmZXN0LnZlcnNpb25cIiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNiBmbGV4LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFwcGxpY2F0aW9uLm1hbmlmZXN0LnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QuaXNvbGF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNCBtLWItMTYgZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdJc29sYXRpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2luZ2xlVGVuYW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidjOHktZW50ZXJwcmlzZSdcIiBjbGFzcz1cImM4eS1pY29uLWR1b2NvbG9yIGg0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2luZ2xlIHRlbmFudCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNpbmdsZVRlbmFudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBbYzh5SWNvbl09XCInYzh5LXN1Yi10ZW5hbnRzJ1wiIGNsYXNzPVwiYzh5LWljb24tZHVvY29sb3IgaWNvbi0zMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ011bHRpIHRlbmFudCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QuaXNvbGF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNCBtLWItMTYgZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdCaWxsaW5nIG1vZGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3Vic2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1Jlc291cmNlcyB1c2FnZSBhc3NpZ25lZCB0bzogT3duZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ1N1YnNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXN1YnNjcmlwdGlvbiAmJiBzaW5nbGVUZW5hbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVzb3VyY2VzIHVzYWdlIGFzc2lnbmVkIHRvOiBTdWJzY3JpYmVyIHwgdHJhbnNsYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZXNvdXJjZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzdWJzY3JpcHRpb24gJiYgIXNpbmdsZVRlbmFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZXNvdXJjZXMgdXNhZ2UgYXNzaWduZWQgdG86IE93bmVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZXNvdXJjZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXJcIiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIG0tdC00MFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnUHJvdmlkZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWlubGluZVwiICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLm1hbmlmZXN0LnByb3ZpZGVyLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbS1iLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ05hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9ybS1jb250cm9sLXN0YXRpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXIuZG9tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdEb21haW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9ybS1jb250cm9sLXN0YXRpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5kb21haW4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5zdXBwb3J0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdTdXBwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXIuc3VwcG9ydCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ1JFUE9TSVRPUlknXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnUGF0aCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+L2FwcHMvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImFwcGxpY2F0aW9uLmlkIHx8ICFpc093bmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRleHRQYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjb250ZXh0UGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIG15LWFwcGxpY2F0aW9uYHVzZWQgaW4gVVJMYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdTZXJ2ZXIgVVJMJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmVzb3VyY2VzVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXNvdXJjZXNVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gbXktYXBwbGljYXRpb25gdXNlZCBpbiBVUkxgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnVXNlcm5hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1Bhc3N3b3JkJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidFWFRFUk5BTCdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdFeHRlcm5hbCBVUkwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwiJ14oPyFqYXZhc2NyaXB0OikuKydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCIhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV4dGVybmFsVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZXh0ZXJuYWxVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vXCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ1cmxcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3BhdHRlcm4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidWYWxpZCBVUkwgcmVxdWlyZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDdXN0b21NaWNyb3NlcnZpY2VcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nXCIgY2xhc3M9XCJkLWNvbnRlbnRzXCI+XG4gICAgICAgICAgICAgIDxjOHktdXBsb2FkLWFyY2hpdmVcbiAgICAgICAgICAgICAgICBbKGFwcGxpY2F0aW9uKV09XCJhcHBsaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgKHJlZnJlc2gpPVwib25OZXdBcmNoaXZlKClcIlxuICAgICAgICAgICAgICA+PC9jOHktdXBsb2FkLWFyY2hpdmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImFwcGxpY2F0aW9uICYmICEhaXNPd25lciAmJiBoYXNBZG1pblBlcm1pc3Npb25zXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuRGVsZXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tZm9ybVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYXBwbGljYXRpb24udHlwZSB8fCBmb3JtR3JvdXAuaW52YWxpZCB8fCBmb3JtR3JvdXAucHJpc3RpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cblxuICAgICAgPGRpdiAqbmdJZj1cImlzQWN0aXZpdHlMb2dTdXBwb3J0ZWRcIiBjbGFzcz1cImNvbnRlbnQtZnVsbHBhZ2UgZC1mbGV4IGQtY29sIGJnLWxldmVsLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCIgdHJhbnNsYXRlPkFjdGl2aXR5IGxvZzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc21cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJsb2FkKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcgfVwiIGM4eUljb249XCJyZWZyZXNoXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGM4eS1sb2FkaW5nPjwvYzh5LWxvYWRpbmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Yzh5LWFjdGl2aXR5LWxvZ1xuICAgICAgICAgICpuZ0lmPVwiIWlzTG9hZGluZ1wiXG4gICAgICAgICAgW2hhc0FkbWluUGVybWlzc2lvbnNdPVwiaGFzQWRtaW5QZXJtaXNzaW9uc1wiXG4gICAgICAgICAgW2FwcGxpY2F0aW9uXT1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICA+PC9jOHktYWN0aXZpdHktbG9nPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbGljYXRpb24tcHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9lY29zeXN0ZW0vYXBwbGljYXRpb24tcHJvcGVydGllcy9hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzL2FwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFhLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsV0FBVyxFQUdYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1YsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFdBQVcsRUFFWCxXQUFXLEVBQ1gsT0FBTyxFQUNSLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2xCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQy9GLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDOzs7Ozs7Ozs7Ozs7QUFFaEgsTUFBTSx1QkFBdUIsR0FBRyx1Q0FBdUMsQ0FB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LElBQUksQ0FBQywyQkFBMkIsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7WUFDbEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FDakUsY0FBYyxFQUNkLHNCQUFzQixDQUN2QixDQUFDO1NBQ0g7UUFBQyxNQUFNO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FBQztTQUNyRjtJQUNILENBQUM7OzJIQW5WVSw4QkFBOEI7K0dBQTlCLDhCQUE4QixrRUN2QzNDLGk5cUJBMmZBOzJGRHBkYSw4QkFBOEI7a0JBSjFDLFNBQVM7K0JBQ0UsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uU2VydmljZSxcbiAgQXBwbGljYXRpb25UeXBlLFxuICBCaWxsaW5nTW9kZSxcbiAgSUFwcGxpY2F0aW9uLFxuICBJTWFuYWdlZE9iamVjdCxcbiAgSW52ZW50b3J5U2VydmljZSxcbiAgSXNvbGF0aW9uXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgR2FpbnNpZ2h0U2VydmljZSxcbiAgTW9kYWxTZXJ2aWNlLFxuICBQZXJtaXNzaW9ucyxcbiAgUHJvcGVydGllc0xpc3RJdGVtLFxuICBWaWV3Q29udGV4dCxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFwcGxpY2F0aW9uU3RhdGUsXG4gIEVjb3N5c3RlbVNlcnZpY2UsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRSxcbiAgcGFja2FnZVByb3BlcnRpZXNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9lY29zeXN0ZW0vc2hhcmVkJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4vc3Vic2NyaXB0aW9uLW1vZGFsL3N1YnNjcmlwdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXBkYXRlQXBwbGljYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJy4vdXBkYXRlLWFwcGxpY2F0aW9uLW1vZGFsL3VwZGF0ZS1hcHBsaWNhdGlvbi1tb2RhbC5jb21wb25lbnQnO1xuXG5jb25zdCBNSUNST1NFUlZJQ0VTX0JBU0VfUEFUSCA9ICcvZWNvc3lzdGVtL21pY3Jvc2VydmljZS9taWNyb3NlcnZpY2VzJztcbmNvbnN0IEFQUExJQ0FUSU9OU19CQVNFX1BBVEggPSAnL2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi9hcHBsaWNhdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXBwbGljYXRpb24tcHJvcGVydGllcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvblByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG4gIGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb247XG4gIGJpbmFyeU1vOiBJTWFuYWdlZE9iamVjdDtcbiAgc2luZ2xlVGVuYW50ID0gZmFsc2U7XG4gIHN1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICBjYW5PcGVuSW5Ccm93c2VyOiBib29sZWFuO1xuICBkaXNhYmxlT3BlbkluQnJvd3NlcjogYm9vbGVhbjtcbiAgY2FuRGVsZXRlOiBib29sZWFuO1xuICBpc093bmVyOiBib29sZWFuO1xuICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XG4gIGlzUGFja2FnZTogYm9vbGVhbjtcbiAgaXNNaWNyb3NlcnZpY2U6IGJvb2xlYW47XG4gIGlzRmVhdHVyZTogYm9vbGVhbjtcbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcbiAgaXNVbnBhY2tlZDogYm9vbGVhbjtcbiAgaWNvbk1hcCA9IHtcbiAgICBIT1NURUQ6ICdjbG91ZCcsXG4gICAgRVhURVJOQUw6ICdleHRlcm5hbC1saW5rLXNxdWFyZScsXG4gICAgTUlDUk9TRVJWSUNFOiAnbWljcm9jaGlwJ1xuICB9O1xuICBhcHBTdGF0ZTogQXBwbGljYXRpb25TdGF0ZTtcbiAgc291cmNlUGFja2FnZTogSUFwcGxpY2F0aW9uO1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICBpc0FjdGl2aXR5TG9nU3VwcG9ydGVkOiBib29sZWFuO1xuICBpc0N1c3RvbU1pY3Jvc2VydmljZTogYm9vbGVhbjtcbiAgaGFzQWRtaW5QZXJtaXNzaW9ucyA9IGZhbHNlO1xuXG4gIGJyZWFkY3J1bWJDb25maWc6IHsgaWNvbjogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfTtcbiAgcGFja2FnZVByb3BlcnRpZXM6IFByb3BlcnRpZXNMaXN0SXRlbVtdID0gWy4uLnBhY2thZ2VQcm9wZXJ0aWVzXTtcbiAgaXNVcGRhdGVBdmFpbGFibGUgPSBmYWxzZTtcblxuICBwcml2YXRlIGJsdWVwcmludEFwcGxpY2F0aW9uVmVyc2lvbjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZWNvc3lzdGVtU2VydmljZTogRWNvc3lzdGVtU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25TZXJ2aWNlOiBBcHBsaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogUGVybWlzc2lvbnMsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaGFzQWRtaW5QZXJtaXNzaW9ucyA9IHRoaXMucGVybWlzc2lvbnMuaGFzUm9sZSgnUk9MRV9BUFBMSUNBVElPTl9NQU5BR0VNRU5UX0FETUlOJyk7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKCkge1xuICAgIGF3YWl0IHRoaXMubG9hZCgpO1xuICAgIHRoaXMuaXNVbnBhY2tlZCA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc1VucGFja2VkKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuaXNQYWNrYWdlID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzUGFja2FnZSh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLmlzRmVhdHVyZSA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc0ZlYXR1cmUodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc0V4dGVybmFsID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzRXh0ZXJuYWwodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc01pY3Jvc2VydmljZSA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc01pY3Jvc2VydmljZSh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICB0aGlzLmFwcFN0YXRlID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldEFwcFN0YXRlKHRoaXMuYXBwbGljYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuaXNVbnBhY2tlZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlU291cmNlUGFja2FnZURldGFpbHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEJyZWFkY3J1bWJDb25maWcoKTtcblxuICAgIGlmICh0aGlzLmlzQ3VzdG9tTWljcm9zZXJ2aWNlKSB7XG4gICAgICB0aGlzLmxvYWRCaW5hcnlNbygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvYWQoKSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRBcHBsaWNhdGlvbigpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBvbkFwcGxpY2F0aW9uKGFwcDogSUFwcGxpY2F0aW9uKSB7XG4gICAgaWYgKGFwcC5tYW5pZmVzdCkge1xuICAgICAgdGhpcy5zaW5nbGVUZW5hbnQgPSBhcHAubWFuaWZlc3QuaXNvbGF0aW9uID09PSBJc29sYXRpb24uUEVSX1RFTkFOVDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gYXBwLm1hbmlmZXN0LmJpbGxpbmdNb2RlID09PSBCaWxsaW5nTW9kZS5TVUJTQ1JJUFRJT047XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLmFwcGxpY2F0aW9uLnR5cGUgPT09IEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0UpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoTUlDUk9TRVJWSUNFU19CQVNFX1BBVEgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKEFQUExJQ0FUSU9OU19CQVNFX1BBVEgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5BcHAoYXBwKSB7XG4gICAgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLm9wZW5BcHAoYXBwKTtcbiAgfVxuXG4gIGdldFBhY2thZ2UoZW50aXR5T3JJZDogc3RyaW5nIHwgbnVtYmVyIHwgSUFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLmRldGFpbChlbnRpdHlPcklkKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmRlbGV0ZUFwcCh0aGlzLmFwcGxpY2F0aW9uKTtcbiAgICAgIGlmICh0aGlzLmFwcGxpY2F0aW9uLnR5cGUgPT09IEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0UpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChNSUNST1NFUlZJQ0VTX0JBU0VfUEFUSCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKEFQUExJQ0FUSU9OU19CQVNFX1BBVEgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3Vic2NyaWJlKCkge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHsgYXBwbGljYXRpb246IHRoaXMuYXBwbGljYXRpb24sIGlzU3Vic2NyaWJlZDogZmFsc2UgfTtcbiAgICBhd2FpdCB0aGlzLmNvbmZpcm1TdWJzY3JpcHRpb25DaGFuZ2UoaW5pdGlhbFN0YXRlKTtcbiAgICB0aGlzLmxvYWRBcHBsaWNhdGlvbigpO1xuICB9XG5cbiAgYXN5bmMgdW5zdWJzY3JpYmUoKSB7XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0geyBhcHBsaWNhdGlvbjogdGhpcy5hcHBsaWNhdGlvbiwgaXNTdWJzY3JpYmVkOiB0cnVlIH07XG4gICAgYXdhaXQgdGhpcy5jb25maXJtU3Vic2NyaXB0aW9uQ2hhbmdlKGluaXRpYWxTdGF0ZSk7XG4gICAgdGhpcy5sb2FkQXBwbGljYXRpb24oKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRBcHBsaWNhdGlvbigpIHtcbiAgICBjb25zdCB7IGlkIH0gPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhO1xuICAgIHRoaXMuYXBwbGljYXRpb24gPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0QXBwbGljYXRpb24oaWQpO1xuICAgIGlmICh0aGlzLmFwcGxpY2F0aW9uLnR5cGUgPT09IEFwcGxpY2F0aW9uVHlwZS5NSUNST1NFUlZJQ0UpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnbmFtZScpLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkQXBwbGljYXRpb24gPSB7XG4gICAgICAuLi50aGlzLmFwcGxpY2F0aW9uLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24odGhpcy5hcHBsaWNhdGlvbilcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh1cGRhdGVkQXBwbGljYXRpb24pO1xuICAgIHRoaXMuY2FuT3BlbkluQnJvd3NlciA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5jYW5PcGVuQXBwSW5Ccm93c2VyKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuZGlzYWJsZU9wZW5JbkJyb3dzZXIgPVxuICAgICAgdGhpcy5jYW5PcGVuSW5Ccm93c2VyICYmXG4gICAgICAoYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzT3ZlcndyaXR0ZW5CeUN1c3RvbUFwcCh0aGlzLmFwcGxpY2F0aW9uKSk7XG4gICAgdGhpcy5jYW5EZWxldGUgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuY2FuRGVsZXRlQXBwKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuaXNPd25lciA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5pc093bmVyKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuaXNBY3Rpdml0eUxvZ1N1cHBvcnRlZCA9IHRoaXMuaXNBY3Rpdml0eUxvZ1N1cHBvcnRlZEJ5QXBwKHRoaXMuYXBwbGljYXRpb24pO1xuICAgIHRoaXMuaXNDdXN0b21NaWNyb3NlcnZpY2UgPSB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNDdXN0b21NaWNyb3NlcnZpY2UodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5pc1N1YnNjcmliZWQgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuY2hlY2tJZlN1YnNjcmliZWQodGhpcy5hcHBsaWNhdGlvbik7XG4gICAgdGhpcy5vbkFwcGxpY2F0aW9uKHRoaXMuYXBwbGljYXRpb24pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShhcHA6IElBcHBsaWNhdGlvbikge1xuICAgIGFwcC5pZCA9IHRoaXMuYXBwbGljYXRpb24uaWQ7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS51cGRhdGVBcHAoYXBwKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQXBwbGljYXRpb24gc2F2ZWQuJykpO1xuICAgICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoKTtcbiAgICAgIHRoaXMubG9hZEFwcGxpY2F0aW9uKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICBvbk5ld0FyY2hpdmUoKSB7XG4gICAgdGhpcy5sb2FkQmluYXJ5TW8oKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVRvTGF0ZXN0VmVyc2lvbigpIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFxuICAgICAgUFJPRFVDVF9FWFBFUklFTkNFLkFQUExJQ0FUSU9OUy5FVkVOVFMuQVBQTElDQVRJT05fUFJPUEVSVElFUyxcbiAgICAgIHtcbiAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkNPTVBPTkVOVFMuQVBQTElDQVRJT05fUFJPUEVSVElFUyxcbiAgICAgICAgYWN0aW9uOiBQUk9EVUNUX0VYUEVSSUVOQ0UuQVBQTElDQVRJT05TLkFDVElPTlMuVVBEQVRFX0FWQUlMQUJMRSxcbiAgICAgICAgdXJsOiB0aGlzLkNVUlJFTlRfTE9DQVRJT05cbiAgICAgIH1cbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zbGF0ZWRCb2R5ID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICBgWW91J3JlIHVzaW5nIHRoZSB2ZXJzaW9uIHt7IGN1cnJlbnRWZXJzaW9uIH19IG9mIHRoZSB7eyBwYWNrYWdlTmFtZSB9fSBwYWNrYWdlLCB0aGUgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlIGlzIHt7IGxhdGVzdFZlcnNpb24gfX0sIGRvIHlvdSB3YW50IHRvIHVwZGF0ZT8gWW91IGNhbiBhbHdheXMgcmV2ZXJ0IHRvIGEgcHJldmlvdXMgdmVyc2lvbiBpbiB0aGUgQWN0aXZpdHkgbG9nIHBhbmVsLmBcbiAgICAgICAgKSxcbiAgICAgICAge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uOiB0aGlzLmFwcGxpY2F0aW9uLm1hbmlmZXN0Py52ZXJzaW9uLFxuICAgICAgICAgIGxhdGVzdFZlcnNpb246IHRoaXMuYmx1ZXByaW50QXBwbGljYXRpb25WZXJzaW9uLFxuICAgICAgICAgIHBhY2thZ2VOYW1lOiB0aGlzLnNvdXJjZVBhY2thZ2UubmFtZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybShnZXR0ZXh0KCdVcGRhdGUgYXBwbGljYXRpb24nKSwgdHJhbnNsYXRlZEJvZHksICd3YXJuaW5nJywge1xuICAgICAgICBvazogZ2V0dGV4dCgnVXBkYXRlJyksXG4gICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbW9kYWwgY2FuY2VsZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5ic01vZGFsU2VydmljZS5zaG93PFVwZGF0ZUFwcGxpY2F0aW9uTW9kYWxDb21wb25lbnQ+KFxuICAgICAgICBVcGRhdGVBcHBsaWNhdGlvbk1vZGFsQ29tcG9uZW50LFxuICAgICAgICB7XG4gICAgICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnbW9kYWwtYm9keScsXG4gICAgICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgICAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgICAgIHNvdXJjZVBhY2thZ2U6IHRoaXMuc291cmNlUGFja2FnZSxcbiAgICAgICAgICAgIGFwcGxpY2F0aW9uOiB0aGlzLmFwcGxpY2F0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLmNvbnRlbnQucmVzdWx0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbW9kYWwgY2FuY2VsZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0FwcGxpY2F0aW9uIHVwZGF0ZWQuJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXNjcmlwdGlvbihhcHBsaWNhdGlvbjogSUFwcGxpY2F0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFwcGxpY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhcHBsaWNhdGlvbi5kZXNjcmlwdGlvbiB8fCBhcHBsaWNhdGlvbi5tYW5pZmVzdD8uZGVzY3JpcHRpb247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbmZpcm1TdWJzY3JpcHRpb25DaGFuZ2UoaW5pdGlhbFN0YXRlOiB7XG4gICAgYXBwbGljYXRpb246IElBcHBsaWNhdGlvbjtcbiAgICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCAoXG4gICAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coU3Vic2NyaXB0aW9uTW9kYWxDb21wb25lbnQsIHtcbiAgICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgICB9KS5jb250ZW50IGFzIFN1YnNjcmlwdGlvbk1vZGFsQ29tcG9uZW50XG4gICAgKS5yZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc29sdmVTb3VyY2VQYWNrYWdlRGV0YWlscygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zb3VyY2VQYWNrYWdlID0gKGF3YWl0IHRoaXMuZ2V0UGFja2FnZSh0aGlzLmFwcGxpY2F0aW9uLm1hbmlmZXN0Py5zb3VyY2UpKS5kYXRhO1xuICAgICAgaWYgKHRoaXMuc291cmNlUGFja2FnZSkge1xuICAgICAgICB0aGlzLnBhY2thZ2VQcm9wZXJ0aWVzLnB1c2goe1xuICAgICAgICAgIGxhYmVsOiBnZXR0ZXh0KCdTb3VyY2UgcGFja2FnZScpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnNvdXJjZVBhY2thZ2UubmFtZSxcbiAgICAgICAgICB0eXBlOiAnbGluaycsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChcbiAgICAgICAgICAgICAgVmlld0NvbnRleHQuRXh0ZW5zaW9uLnJlcGxhY2UoJzppZCcsIHRoaXMuc291cmNlUGFja2FnZS5pZC50b1N0cmluZygpKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLndhcm5pbmcoZ2V0dGV4dCgnVW5hYmxlIHRvIHJlc29sdmUgc291cmNlIHBhY2thZ2UuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZXh0cmFjdFZlcnNpb25JbmZvcm1hdGlvbih0aGlzLmFwcGxpY2F0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGlkOiBbeyB2YWx1ZTogJycgfV0sXG4gICAgICBuYW1lOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTIwKV0sXG4gICAgICBrZXk6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMjApXSxcbiAgICAgIGNvbnRleHRQYXRoOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTIwKV0sXG4gICAgICBkZXNjcmlwdGlvbjogWycnLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyMDApXSxcbiAgICAgIHJlc291cmNlc1VybDogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdXNlcm5hbWU6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHBhc3N3b3JkOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBleHRlcm5hbFVybDogW1ZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfSk7XG4gICAgaWYgKCF0aGlzLmhhc0FkbWluUGVybWlzc2lvbnMpIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzQWN0aXZpdHlMb2dTdXBwb3J0ZWRCeUFwcChhcHA6IElBcHBsaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuaXNPd25lcihhcHApICYmXG4gICAgICBhcHAudHlwZSAhPT0gQXBwbGljYXRpb25UeXBlLk1JQ1JPU0VSVklDRSAmJlxuICAgICAgYXBwLnR5cGUgIT09IEFwcGxpY2F0aW9uVHlwZS5FWFRFUk5BTFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEJyZWFkY3J1bWJDb25maWcoKSB7XG4gICAgdGhpcy5icmVhZGNydW1iQ29uZmlnID0ge1xuICAgICAgaWNvbjogdGhpcy5pc01pY3Jvc2VydmljZSA/ICdtaWNyb2NoaXAnIDogdGhpcy5pc0ZlYXR1cmUgPyAndGFiJyA6ICdjOHktbW9kdWxlcycsXG4gICAgICBsYWJlbDogdGhpcy5pc01pY3Jvc2VydmljZVxuICAgICAgICA/IGdldHRleHQoJ01pY3Jvc2VydmljZXMnKVxuICAgICAgICA6IHRoaXMuaXNGZWF0dXJlXG4gICAgICAgID8gZ2V0dGV4dCgnRmVhdHVyZXMnKVxuICAgICAgICA6IGdldHRleHQoJ0FwcGxpY2F0aW9ucycpLFxuICAgICAgcGF0aDogdGhpcy5pc01pY3Jvc2VydmljZVxuICAgICAgICA/ICcvZWNvc3lzdGVtL21pY3Jvc2VydmljZS9taWNyb3NlcnZpY2VzJ1xuICAgICAgICA6IHRoaXMuaXNGZWF0dXJlXG4gICAgICAgID8gJ2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi9mZWF0dXJlcydcbiAgICAgICAgOiAnZWNvc3lzdGVtL2FwcGxpY2F0aW9uL2FwcGxpY2F0aW9ucydcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQmluYXJ5TW8oKSB7XG4gICAgdGhpcy5iaW5hcnlNbyA9IChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKHRoaXMuYXBwbGljYXRpb24uYWN0aXZlVmVyc2lvbklkKSkuZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFZlcnNpb25JbmZvcm1hdGlvbihhcHBsaWNhdGlvbjogSUFwcGxpY2F0aW9uKSB7XG4gICAgaWYgKCFhcHBsaWNhdGlvbi5tYW5pZmVzdC5pc1BhY2thZ2UgJiYgIWFwcGxpY2F0aW9uLm1hbmlmZXN0LnNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJsdWVwcmludEFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbi5tYW5pZmVzdD8uc291cmNlO1xuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXBwbGljYXRpb24ubWFuaWZlc3Q/LnZlcnNpb247XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhOiBibHVlcHJpbnRBcHBsaWNhdGlvblZlcnNpb25zIH0gPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5saXN0VmVyc2lvbnMoXG4gICAgICAgIGJsdWVwcmludEFwcGxpY2F0aW9uSWRcbiAgICAgICk7XG4gICAgICBjb25zdCBibHVlcHJpbnRMYXRlc3RWZXJzaW9uID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldEFwcGxpY2F0aW9uVmVyc2lvbk9iamVjdEJ5VGFnKFxuICAgICAgICBibHVlcHJpbnRBcHBsaWNhdGlvblZlcnNpb25zLFxuICAgICAgICAnbGF0ZXN0J1xuICAgICAgKTtcbiAgICAgIHRoaXMuYmx1ZXByaW50QXBwbGljYXRpb25WZXJzaW9uID0gYmx1ZXByaW50TGF0ZXN0VmVyc2lvbi52ZXJzaW9uO1xuICAgICAgdGhpcy5pc1VwZGF0ZUF2YWlsYWJsZSA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5zaG91bGRVcGdyYWRlUGFja2FnZShcbiAgICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICAgIGJsdWVwcmludExhdGVzdFZlcnNpb25cbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS53YXJuaW5nKGdldHRleHQoJ1VuYWJsZSB0byByZXNvbHZlIHZlcnNpb25zIG9mIHNvdXJjZSBwYWNrYWdlLicpKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgYXBwbGljYXRpb24gfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luYyB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWIgKm5nSWY9XCIhaXNNaWNyb3NlcnZpY2VcIj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2ljb25dPVwiJ2M4eS1hdG9tJ1wiIFtsYWJlbF09XCInRWNvc3lzdGVtJyB8IHRyYW5zbGF0ZVwiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInYzh5LW1vZHVsZXMnXCJcbiAgICBbbGFiZWxdPVwiJ0FwcGxpY2F0aW9ucycgfCB0cmFuc2xhdGVcIlxuICAgIFtwYXRoXT1cIidlY29zeXN0ZW0vYXBwbGljYXRpb24vYXBwbGljYXRpb25zJ1wiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgKm5nSWY9XCJpc0ZlYXR1cmVcIlxuICAgIFtpY29uXT1cImJyZWFkY3J1bWJDb25maWc/Lmljb25cIlxuICAgIFtsYWJlbF09XCJicmVhZGNydW1iQ29uZmlnPy5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYkNvbmZpZz8ucGF0aFwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtIFtsYWJlbF09XCJhcHBsaWNhdGlvbiB8IGh1bWFuaXplQXBwTmFtZSB8IGFzeW5jXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbbGFiZWxdPVwiJ1Byb3BlcnRpZXMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwiaXNNaWNyb3NlcnZpY2VcIj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2ljb25dPVwiJ2M4eS1hdG9tJ1wiIFtsYWJlbF09XCInRWNvc3lzdGVtJyB8IHRyYW5zbGF0ZVwiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCJicmVhZGNydW1iQ29uZmlnPy5pY29uXCJcbiAgICBbbGFiZWxdPVwiYnJlYWRjcnVtYkNvbmZpZz8ubGFiZWxcIlxuICAgIFtwYXRoXT1cImJyZWFkY3J1bWJDb25maWc/LnBhdGhcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbSBbbGFiZWxdPVwiYXBwbGljYXRpb24gfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luY1wiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIidQcm9wZXJ0aWVzJyB8IHRyYW5zbGF0ZVwiPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPGRpdiBbbmdDbGFzc109XCJ7ICdjb2wtbWQtOCc6ICFpc0FjdGl2aXR5TG9nU3VwcG9ydGVkLCAnY29sLW1kLTEyJzogaXNBY3Rpdml0eUxvZ1N1cHBvcnRlZCB9XCI+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJhcHBsaWNhdGlvblwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdkLWdyaWQgZ3JpZF9fY29sLS03LTUtLW1kJzogaXNBY3Rpdml0eUxvZ1N1cHBvcnRlZCB9XCJcbiAgICAgIGNsYXNzPVwiY2FyZCBjb250ZW50LWZ1bGxwYWdlXCJcbiAgICA+XG4gICAgICA8Zm9ybVxuICAgICAgICAobmdTdWJtaXQpPVwiZm9ybUdyb3VwLnZhbGlkICYmIHNhdmUoZm9ybUdyb3VwLnZhbHVlKVwiXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZC1jb2wgY29udGVudC1mdWxscGFnZVwiXG4gICAgICAgIG5vdmFsaWRhdGVcbiAgICAgID5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmdcIiBjbGFzcz1cImQtY29udGVudHNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ibG9jayBzZXBhcmF0b3ItYm90dG9tIGxhcmdlLXBhZGRpbmcgZmxleC1uby1zaHJpbmtcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgtbWQgYS1pLXN0YXJ0IHRleHQtY2VudGVyIHRleHQtbGVmdC1tZFwiPlxuICAgICAgICAgICAgICA8Yzh5LWFwcC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQYWNrYWdlICYmICFpc0ZlYXR1cmUgJiYgIWlzTWljcm9zZXJ2aWNlICYmICFpc0V4dGVybmFsXCJcbiAgICAgICAgICAgICAgICBbYXBwXT1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgICAgICAgICBbY29udGV4dFBhdGhdPVwiYXBwbGljYXRpb24uY29udGV4dFBhdGhcIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cImFwcGxpY2F0aW9uLm5hbWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi00OFwiXG4gICAgICAgICAgICAgID48L2M4eS1hcHAtaWNvbj5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpc1BhY2thZ2VcIiBjOHlJY29uPVwiYmlnLXBhcmNlbFwiIGNsYXNzPVwiaWNvbi00OFwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpc0ZlYXR1cmVcIiBjOHlJY29uPVwidGFiXCIgY2xhc3M9XCJpY29uLTQ4XCI+PC9pPlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImlzTWljcm9zZXJ2aWNlXCIgYzh5SWNvbj1cIm1pY3JvY2hpcFwiIGNsYXNzPVwiaWNvbi00OFwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJpc0V4dGVybmFsXCIgYzh5SWNvbj1cImdsb2JlMVwiIGNsYXNzPVwiaWNvbi00OFwiPjwvaT5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC10LW1kLTE2IHAtbC1tZC0xNiBwLXItbWQtMzIgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoNCB0ZXh0LW1lZGl1bSBtLWItOFwiPnt7IGFwcGxpY2F0aW9uIHwgaHVtYW5pemVBcHBOYW1lIHwgYXN5bmMgfX08L3A+XG4gICAgICAgICAgICAgICAgPHAgKm5nSWY9XCIhaXNPd25lclwiPlxuICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwidGV4dC1tdXRlZFwiPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cD8uY29udHJvbHM/LmRlc2NyaXB0aW9uPy52YWx1ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKCdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUuJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc093bmVyXCIgY2xhc3M9XCJmb3JtLWdyb3VwIG0tYi0wXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyB1cGRhdGVkOiBmb3JtR3JvdXA/LmNvbnRyb2xzPy5kZXNjcmlwdGlvbj8uZGlydHkgfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICBjOHktdGV4dGFyZWEtYXV0b3Jlc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodC1tZCBtLXQtNFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImFwcFN0YXRlPy5jbGFzc1wiIGNsYXNzPVwibGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGFwcFN0YXRlPy5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZpdC13IG0tdC0yXCJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNQYWNrYWdlIHx8IGlzTWljcm9zZXJ2aWNlIHx8IGlzVW5wYWNrZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtbGFiZWwtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJwLWwtNCB0ZXh0LWJvbGRcIj57eyBhcHBsaWNhdGlvbi5tYW5pZmVzdD8udmVyc2lvbiB9fTwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmaXQtdyBtLXQtMlwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc1VucGFja2VkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsXCJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIENyZWF0aW9uIHRpbWU6XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicC1sLTQgdGV4dC1ib2xkXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IChiaW5hcnlNbz8uY3JlYXRpb25UaW1lIHwgYzh5RGF0ZSkgfHwgJy0tLScgfX1cbiAgICAgICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tdC04XCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzVXBkYXRlQXZhaWxhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRvTGF0ZXN0VmVyc2lvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdUaGVyZVxcJ3MgYSBuZXdlciB2ZXJzaW9uIGF2YWlsYWJsZSwgY2xpY2sgdG8gdXBkYXRlJyB8IHRyYW5zbGF0ZX19XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVGhlcmVcXCdzIGEgbmV3ZXIgdmVyc2lvbiBhdmFpbGFibGUsIGNsaWNrIHRvIHVwZGF0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiJ2luc3RhbGxpbmctdXBkYXRlcydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdVcGRhdGUgYXZhaWxhYmxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQXBwKGFwcGxpY2F0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlT3BlbkluQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FuT3BlbkluQnJvd3NlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ09wZW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidleHRlcm5hbC1saW5rJ1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAge3sgJ09wZW4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjYW5PcGVuSW5Ccm93c2VyICYmIGRpc2FibGVPcGVuSW5Ccm93c2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIGlzIG92ZXJ3cml0dGVuIGJ5IGEgY3VzdG9tIGFwcGxpY2F0aW9uIHNoYXJpbmcgdGhlIHNhbWUgcGF0aFxuICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzQ3VzdG9tTWljcm9zZXJ2aWNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1N1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWJzY3JpYmUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNTdWJzY3JpYmVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidjaGVjay1jaXJjbGUtbydcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1N1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Vuc3Vic2NyaWJlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVuc3Vic2NyaWJlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNTdWJzY3JpYmVkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidtaW51cy1jaXJjbGUnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdVbnN1YnNjcmliZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1sZXZlbC0wIGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZ1wiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNQYWNrYWdlXCIgY2xhc3M9XCJyb3cgcC0xNlwiPlxuICAgICAgICAgICAgICAgIDxjOHktcHJvcGVydGllcy1saXN0XG4gICAgICAgICAgICAgICAgICBbZGF0YV09XCJhcHBsaWNhdGlvbi5tYW5pZmVzdFwiXG4gICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJwYWNrYWdlUHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1BhY2thZ2UgZGV0YWlscycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW2VtcHR5TGFiZWxdPVwiJy0tLSdcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cImluZm9cIlxuICAgICAgICAgICAgICAgID48L2M4eS1wcm9wZXJ0aWVzLWxpc3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic291cmNlUGFja2FnZVwiIGNsYXNzPVwicm93IHAtMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LXByb3BlcnRpZXMtbGlzdFxuICAgICAgICAgICAgICAgICAgW2RhdGFdPVwic291cmNlUGFja2FnZS5tYW5pZmVzdFwiXG4gICAgICAgICAgICAgICAgICBbcHJvcGVydGllc109XCJwYWNrYWdlUHJvcGVydGllc1wiXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1NvdXJjZSBwYWNrYWdlIGluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbZW1wdHlMYWJlbF09XCInLS0tJ1wiXG4gICAgICAgICAgICAgICAgICBpY29uPVwiaW5mb1wiXG4gICAgICAgICAgICAgICAgPjwvYzh5LXByb3BlcnRpZXMtbGlzdD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImFwcElkXCI+SUQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJhcHBJZFwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdOYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCIhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIE15IGFwcGxpY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS01XCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnQXBwbGljYXRpb24ga2V5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJhcHBsaWNhdGlvbi5pZCB8fCAhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBteS1hcHBsaWNhdGlvbi1rZXknIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdUeXBlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiaWNvbk1hcFthcHBsaWNhdGlvbi50eXBlXVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYXBwbGljYXRpb24udHlwZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwiYXBwbGljYXRpb24udHlwZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidIT1NURUQnXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnUGF0aCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+L2FwcHMvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImFwcGxpY2F0aW9uLmlkIHx8ICFpc093bmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjb250ZXh0UGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIG15LWFwcGxpY2F0aW9uYHVzZWQgaW4gVVJMYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRleHRQYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCInTUlDUk9TRVJWSUNFJ1wiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1BhdGgnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPi9zZXJ2aWNlLzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJhcHBsaWNhdGlvbi5pZCB8fCAhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiY29udGV4dFBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnZS5nLiBteS1taWNyb3NlcnZpY2VgdXNlZCBpbiBVUkxgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29udGV4dFBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLm1hbmlmZXN0LnZlcnNpb25cIiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNiBmbGV4LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFwcGxpY2F0aW9uLm1hbmlmZXN0LnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QuaXNvbGF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNCBtLWItMTYgZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdJc29sYXRpb24nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2luZ2xlVGVuYW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIFtjOHlJY29uXT1cIidjOHktZW50ZXJwcmlzZSdcIiBjbGFzcz1cImM4eS1pY29uLWR1b2NvbG9yIGg0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnU2luZ2xlIHRlbmFudCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNpbmdsZVRlbmFudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBbYzh5SWNvbl09XCInYzh5LXN1Yi10ZW5hbnRzJ1wiIGNsYXNzPVwiYzh5LWljb24tZHVvY29sb3IgaWNvbi0zMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ011bHRpIHRlbmFudCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QuaXNvbGF0aW9uXCIgY2xhc3M9XCJjb2wtc20tNCBtLWItMTYgZmxleC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdCaWxsaW5nIG1vZGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3Vic2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1Jlc291cmNlcyB1c2FnZSBhc3NpZ25lZCB0bzogT3duZXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ1N1YnNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXN1YnNjcmlwdGlvbiAmJiBzaW5nbGVUZW5hbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInUmVzb3VyY2VzIHVzYWdlIGFzc2lnbmVkIHRvOiBTdWJzY3JpYmVyIHwgdHJhbnNsYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZXNvdXJjZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzdWJzY3JpcHRpb24gJiYgIXNpbmdsZVRlbmFudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidSZXNvdXJjZXMgdXNhZ2UgYXNzaWduZWQgdG86IE93bmVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZXNvdXJjZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXJcIiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIG0tdC00MFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnUHJvdmlkZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWlubGluZVwiICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFwcGxpY2F0aW9uLm1hbmlmZXN0LnByb3ZpZGVyLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbS1iLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ05hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9ybS1jb250cm9sLXN0YXRpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXIuZG9tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdEb21haW4nIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9ybS1jb250cm9sLXN0YXRpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5kb21haW4gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhcHBsaWNhdGlvbi5tYW5pZmVzdC5wcm92aWRlci5zdXBwb3J0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG0tYi0xNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdTdXBwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImZvcm0tY29udHJvbC1zdGF0aWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYXBwbGljYXRpb24ubWFuaWZlc3QucHJvdmlkZXIuc3VwcG9ydCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiJ1JFUE9TSVRPUlknXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnUGF0aCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+L2FwcHMvPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImFwcGxpY2F0aW9uLmlkIHx8ICFpc093bmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbnRleHRQYXRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjb250ZXh0UGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdlLmcuIG15LWFwcGxpY2F0aW9uYHVzZWQgaW4gVVJMYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdTZXJ2ZXIgVVJMJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicmVzb3VyY2VzVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXNvdXJjZXNVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4gbXktYXBwbGljYXRpb25gdXNlZCBpbiBVUkxgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbD57eyAnVXNlcm5hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInVzZXJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidXNlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgJ1Bhc3N3b3JkJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIidFWFRFUk5BTCdcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdFeHRlcm5hbCBVUkwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwiJ14oPyFqYXZhc2NyaXB0OikuKydcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCIhaXNPd25lclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV4dGVybmFsVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZXh0ZXJuYWxVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2UuZy4nIHwgdHJhbnNsYXRlIH19IGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vXCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ1cmxcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ3BhdHRlcm4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidWYWxpZCBVUkwgcmVxdWlyZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDdXN0b21NaWNyb3NlcnZpY2VcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nXCIgY2xhc3M9XCJkLWNvbnRlbnRzXCI+XG4gICAgICAgICAgICAgIDxjOHktdXBsb2FkLWFyY2hpdmVcbiAgICAgICAgICAgICAgICBbKGFwcGxpY2F0aW9uKV09XCJhcHBsaWNhdGlvblwiXG4gICAgICAgICAgICAgICAgKHJlZnJlc2gpPVwib25OZXdBcmNoaXZlKClcIlxuICAgICAgICAgICAgICA+PC9jOHktdXBsb2FkLWFyY2hpdmU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImFwcGxpY2F0aW9uICYmICEhaXNPd25lciAmJiBoYXNBZG1pblBlcm1pc3Npb25zXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY2FyZC1mb290ZXIgc2VwYXJhdG9yXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuRGVsZXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tZm9ybVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYXBwbGljYXRpb24udHlwZSB8fCBmb3JtR3JvdXAuaW52YWxpZCB8fCBmb3JtR3JvdXAucHJpc3RpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cblxuICAgICAgPGRpdiAqbmdJZj1cImlzQWN0aXZpdHlMb2dTdXBwb3J0ZWRcIiBjbGFzcz1cImNvbnRlbnQtZnVsbHBhZ2UgZC1mbGV4IGQtY29sIGJnLWxldmVsLTFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHNlcGFyYXRvclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlXCIgdHJhbnNsYXRlPkFjdGl2aXR5IGxvZzwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc21cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJsb2FkKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiBpc0xvYWRpbmcgfVwiIGM4eUljb249XCJyZWZyZXNoXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJwLTE2IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgPGM4eS1sb2FkaW5nPjwvYzh5LWxvYWRpbmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8Yzh5LWFjdGl2aXR5LWxvZ1xuICAgICAgICAgICpuZ0lmPVwiIWlzTG9hZGluZ1wiXG4gICAgICAgICAgW2hhc0FkbWluUGVybWlzc2lvbnNdPVwiaGFzQWRtaW5QZXJtaXNzaW9uc1wiXG4gICAgICAgICAgW2FwcGxpY2F0aW9uXT1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICA+PC9jOHktYWN0aXZpdHktbG9nPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=