UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

137 lines 26 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { ApplicationService } from '@c8y/client'; import { C8yStepper, GainsightService } from '@c8y/ngx-components'; import { BsModalRef } from 'ngx-bootstrap/modal'; import { BehaviorSubject } from 'rxjs'; import { distinctUntilKeyChanged, map, tap } from 'rxjs/operators'; import { APP_STATE } from '../../ecosystem.constants'; import { EcosystemService } from '../../ecosystem.service'; import { ApplicationPropertiesFormComponent } from '../../../shared/application-properties-form.component'; import { PRODUCT_EXPERIENCE_ECOSYSTEM } from '../../ecosystem.model'; import * as i0 from "@angular/core"; import * as i1 from "ngx-bootstrap/modal"; import * as i2 from "../../ecosystem.service"; import * as i3 from "@c8y/client"; import * as i4 from "@c8y/ngx-components"; import * as i5 from "@angular/common"; import * as i6 from "@angular/forms"; import * as i7 from "../../application-properties-form.component"; export class DuplicateApplicationPropertiesComponent { constructor(bsModalRef, ecosystemService, applicationService, gainsightService) { this.bsModalRef = bsModalRef; this.ecosystemService = ecosystemService; this.applicationService = applicationService; this.gainsightService = gainsightService; this.CURRENT_LOCATION = location.href; this.isFirstStep = false; this.duplicatedApp = new EventEmitter(); this.disableForm = false; this.inProgress = false; } ngOnInit() { this.isSubscribedApp$ = this.selectedApp.pipe(distinctUntilKeyChanged('id'), map(app => (app ? this.ecosystemService.getAppState(app) === APP_STATE.SUBSCRIBED : true)), tap(isSubscribed => { this.disableForm = isSubscribed; this.getAppConfig(); })); this.getAppConfig(); } async duplicateApp() { const formGroupValue = this.applicationPropertiesForm.formGroup.getRawValue(); this.inProgress = true; let { data: clonedApp } = await this.applicationService.clone(this.selectedApp.value); // TODO: remove once MTM-48474 has been merged clonedApp = this.ecosystemService.setAvailabilityToPrivateIfNotSetAlready(clonedApp); Object.assign(clonedApp, formGroupValue); if (formGroupValue.icon) { const icon = { class: formGroupValue.icon }; clonedApp.config = { ...clonedApp.config, icon }; if (clonedApp.manifest) { clonedApp.manifest.icon = icon; } } delete clonedApp.type; await this.updateApp(clonedApp); this.inProgress = false; this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.EVENTS.DUPLICATE_APPLICATION, { component: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.COMPONENTS.DUPLICATE_APPLICATION_PROPERTIES, result: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.RESULTS.DUPLICATED, url: this.CURRENT_LOCATION }); } cancel() { this.bsModalRef.hide(); this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.EVENTS.DUPLICATE_APPLICATION, { component: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.COMPONENTS.DUPLICATE_APPLICATION_PROPERTIES, action: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.ACTIONS.CANCEL, url: this.CURRENT_LOCATION }); } back() { this.stepper.previous(); } getAppConfig() { if (this.disableForm) { const { name, key, contextPath } = this.selectedApp.value; this.newAppConfig = { name, key, contextPath }; } else { this.newAppConfig = this.ecosystemService.getUniqueAppConfig(this.selectedApp.value, this.existingApps); } } async updateApp(clonedAppConfig) { try { const { data: app } = await this.ecosystemService.updateApp(clonedAppConfig, true); const manifest = await this.getAppManifest(app); if (manifest) { await this.updateManifest(app, manifest); } this.duplicatedApp.emit(app); this.stepper.next(); } catch (err) { this.inProgress = false; } } async updateManifest(app, manifest) { const keysToUpdate = ['name', 'key', 'contextPath']; const someKeyDiffers = keysToUpdate.some(key => app[key] !== manifest[key]); if (someKeyDiffers) { keysToUpdate.forEach(key => { manifest[key] = app[key]; }); await this.applicationService.storeAppManifest(app, manifest); } } async getAppManifest(app) { if (!app?.contextPath) { return; } try { const manifest = await this.applicationService.getAppManifest(app); return manifest; } catch (ex) { return; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DuplicateApplicationPropertiesComponent, deps: [{ token: i1.BsModalRef }, { token: i2.EcosystemService }, { token: i3.ApplicationService }, { token: i4.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DuplicateApplicationPropertiesComponent, selector: "c8y-duplicate-application-properties", inputs: { stepper: "stepper", existingApps: "existingApps", selectedApp: "selectedApp", isFirstStep: "isFirstStep" }, outputs: { duplicatedApp: "duplicatedApp" }, viewQueries: [{ propertyName: "applicationPropertiesForm", first: true, predicate: ApplicationPropertiesFormComponent, descendants: true }], ngImport: i0, template: "<p\n class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0 fit-w\"\n *ngIf=\"!inProgress\"\n>\n {{ 'Provide application details' | translate }}\n</p>\n\n<ng-container *ngIf=\"!inProgress\">\n <label class=\"c8y-switch\" *ngIf=\"isSubscribedApp$ | async\">\n <input type=\"checkbox\" [(ngModel)]=\"disableForm\" (change)=\"getAppConfig()\" />\n <span></span> {{ 'Overrule subscribed application' | translate }}\n </label>\n\n <c8y-application-properties-form\n [application]=\"newAppConfig\"\n class=\"d-block fit-w\"\n [disabled]=\"disableForm\"\n ></c8y-application-properties-form>\n</ng-container>\n<c8y-loading\n *ngIf=\"inProgress\"\n [message]=\"'Duplicating\u2026' | translate\"\n layout=\"application\"\n class=\"text-center d-block\"\n></c8y-loading>\n\n<c8y-wizard-footer>\n <button\n *ngIf=\"!isFirstStep\"\n (click)=\"back()\"\n [disabled]=\"inProgress\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Back' | translate }}\"\n >\n {{ 'Back' | translate }}\n </button>\n <button (click)=\"cancel()\" class=\"btn btn-default\" title=\"{{ 'Cancel' | translate }}\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n (click)=\"duplicateApp()\"\n [disabled]=\"inProgress\"\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Duplicate' | translate }}\"\n >\n {{ 'Duplicate' | translate }}\n </button>\n</c8y-wizard-footer>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "component", type: i7.ApplicationPropertiesFormComponent, selector: "c8y-application-properties-form", inputs: ["application", "disabled"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DuplicateApplicationPropertiesComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-duplicate-application-properties', template: "<p\n class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0 fit-w\"\n *ngIf=\"!inProgress\"\n>\n {{ 'Provide application details' | translate }}\n</p>\n\n<ng-container *ngIf=\"!inProgress\">\n <label class=\"c8y-switch\" *ngIf=\"isSubscribedApp$ | async\">\n <input type=\"checkbox\" [(ngModel)]=\"disableForm\" (change)=\"getAppConfig()\" />\n <span></span> {{ 'Overrule subscribed application' | translate }}\n </label>\n\n <c8y-application-properties-form\n [application]=\"newAppConfig\"\n class=\"d-block fit-w\"\n [disabled]=\"disableForm\"\n ></c8y-application-properties-form>\n</ng-container>\n<c8y-loading\n *ngIf=\"inProgress\"\n [message]=\"'Duplicating\u2026' | translate\"\n layout=\"application\"\n class=\"text-center d-block\"\n></c8y-loading>\n\n<c8y-wizard-footer>\n <button\n *ngIf=\"!isFirstStep\"\n (click)=\"back()\"\n [disabled]=\"inProgress\"\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Back' | translate }}\"\n >\n {{ 'Back' | translate }}\n </button>\n <button (click)=\"cancel()\" class=\"btn btn-default\" title=\"{{ 'Cancel' | translate }}\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n (click)=\"duplicateApp()\"\n [disabled]=\"inProgress\"\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Duplicate' | translate }}\"\n >\n {{ 'Duplicate' | translate }}\n </button>\n</c8y-wizard-footer>\n" }] }], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.EcosystemService }, { type: i3.ApplicationService }, { type: i4.GainsightService }], propDecorators: { stepper: [{ type: Input }], existingApps: [{ type: Input }], selectedApp: [{ type: Input }], isFirstStep: [{ type: Input }], duplicatedApp: [{ type: Output }], applicationPropertiesForm: [{ type: ViewChild, args: [ApplicationPropertiesFormComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWFwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3NoYXJlZC9kdXBsaWNhdGUtYXBwbGljYXRpb24vZHVwbGljYXRlLWFwcGxpY2F0aW9uLXByb3BlcnRpZXMvZHVwbGljYXRlLWFwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3NoYXJlZC9kdXBsaWNhdGUtYXBwbGljYXRpb24vZHVwbGljYXRlLWFwcGxpY2F0aW9uLXByb3BlcnRpZXMvZHVwbGljYXRlLWFwcGxpY2F0aW9uLXByb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDM0csT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUJBQXVCLENB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Q0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuRSxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQzsrR0FsSVUsdUNBQXVDO21HQUF2Qyx1Q0FBdUMsMFNBUXZDLGtDQUFrQyxnREN2Qi9DLCs2Q0FrREE7OzRGRG5DYSx1Q0FBdUM7a0JBSm5ELFNBQVM7K0JBQ0Usc0NBQXNDOzhLQU12QyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTTtnQkFFUCx5QkFBeUI7c0JBRHhCLFNBQVM7dUJBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TZXJ2aWNlLCBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDOHlTdGVwcGVyLCBHYWluc2lnaHRTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uLy4uL2Vjb3N5c3RlbS5jb25zdGFudHMnO1xuaW1wb3J0IHsgRWNvc3lzdGVtU2VydmljZSB9IGZyb20gJy4uLy4uL2Vjb3N5c3RlbS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uUHJvcGVydGllc0Zvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYXBwbGljYXRpb24tcHJvcGVydGllcy1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNIH0gZnJvbSAnLi4vLi4vZWNvc3lzdGVtLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWR1cGxpY2F0ZS1hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R1cGxpY2F0ZS1hcHBsaWNhdGlvbi1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEdXBsaWNhdGVBcHBsaWNhdGlvblByb3BlcnRpZXNDb21wb25lbnQge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcblxuICBASW5wdXQoKSBzdGVwcGVyOiBDOHlTdGVwcGVyO1xuICBASW5wdXQoKSBleGlzdGluZ0FwcHM6IElBcHBsaWNhdGlvbltdO1xuICBASW5wdXQoKSBzZWxlY3RlZEFwcDogQmVoYXZpb3JTdWJqZWN0PElBcHBsaWNhdGlvbj47XG4gIEBJbnB1dCgpIGlzRmlyc3RTdGVwID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBkdXBsaWNhdGVkQXBwID0gbmV3IEV2ZW50RW1pdHRlcjxJQXBwbGljYXRpb24+KCk7XG4gIEBWaWV3Q2hpbGQoQXBwbGljYXRpb25Qcm9wZXJ0aWVzRm9ybUNvbXBvbmVudClcbiAgYXBwbGljYXRpb25Qcm9wZXJ0aWVzRm9ybTogQXBwbGljYXRpb25Qcm9wZXJ0aWVzRm9ybUNvbXBvbmVudDtcbiAgbmV3QXBwQ29uZmlnOiBJQXBwbGljYXRpb247XG4gIGRpc2FibGVGb3JtID0gZmFsc2U7XG4gIGlzU3Vic2NyaWJlZEFwcCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgaW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnNNb2RhbFJlZjogQnNNb2RhbFJlZixcbiAgICBwcml2YXRlIGVjb3N5c3RlbVNlcnZpY2U6IEVjb3N5c3RlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBsaWNhdGlvblNlcnZpY2U6IEFwcGxpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNTdWJzY3JpYmVkQXBwJCA9IHRoaXMuc2VsZWN0ZWRBcHAucGlwZShcbiAgICAgIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCdpZCcpLFxuICAgICAgbWFwKGFwcCA9PiAoYXBwID8gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldEFwcFN0YXRlKGFwcCkgPT09IEFQUF9TVEFURS5TVUJTQ1JJQkVEIDogdHJ1ZSkpLFxuICAgICAgdGFwKGlzU3Vic2NyaWJlZCA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUZvcm0gPSBpc1N1YnNjcmliZWQ7XG4gICAgICAgIHRoaXMuZ2V0QXBwQ29uZmlnKCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5nZXRBcHBDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGR1cGxpY2F0ZUFwcCgpIHtcbiAgICBjb25zdCBmb3JtR3JvdXBWYWx1ZSA9IHRoaXMuYXBwbGljYXRpb25Qcm9wZXJ0aWVzRm9ybS5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGxldCB7IGRhdGE6IGNsb25lZEFwcCB9ID0gYXdhaXQgdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuY2xvbmUodGhpcy5zZWxlY3RlZEFwcC52YWx1ZSk7XG4gICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgTVRNLTQ4NDc0IGhhcyBiZWVuIG1lcmdlZFxuICAgIGNsb25lZEFwcCA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5zZXRBdmFpbGFiaWxpdHlUb1ByaXZhdGVJZk5vdFNldEFscmVhZHkoY2xvbmVkQXBwKTtcbiAgICBPYmplY3QuYXNzaWduKGNsb25lZEFwcCwgZm9ybUdyb3VwVmFsdWUpO1xuICAgIGlmIChmb3JtR3JvdXBWYWx1ZS5pY29uKSB7XG4gICAgICBjb25zdCBpY29uID0geyBjbGFzczogZm9ybUdyb3VwVmFsdWUuaWNvbiB9O1xuICAgICAgY2xvbmVkQXBwLmNvbmZpZyA9IHsgLi4uY2xvbmVkQXBwLmNvbmZpZywgaWNvbiB9O1xuICAgICAgaWYgKGNsb25lZEFwcC5tYW5pZmVzdCkge1xuICAgICAgICBjbG9uZWRBcHAubWFuaWZlc3QuaWNvbiA9IGljb247XG4gICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZSBjbG9uZWRBcHAudHlwZTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFwcChjbG9uZWRBcHApO1xuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChcbiAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLkVWRU5UUy5EVVBMSUNBVEVfQVBQTElDQVRJT04sXG4gICAgICB7XG4gICAgICAgIGNvbXBvbmVudDpcbiAgICAgICAgICBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5DT01QT05FTlRTLkRVUExJQ0FURV9BUFBMSUNBVElPTl9QUk9QRVJUSUVTLFxuICAgICAgICByZXN1bHQ6IFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLlJFU1VMVFMuRFVQTElDQVRFRCxcbiAgICAgICAgdXJsOiB0aGlzLkNVUlJFTlRfTE9DQVRJT05cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG5cbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KFxuICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuRVZFTlRTLkRVUExJQ0FURV9BUFBMSUNBVElPTixcbiAgICAgIHtcbiAgICAgICAgY29tcG9uZW50OlxuICAgICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLkNPTVBPTkVOVFMuRFVQTElDQVRFX0FQUExJQ0FUSU9OX1BST1BFUlRJRVMsXG4gICAgICAgIGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuQUNUSU9OUy5DQU5DRUwsXG4gICAgICAgIHVybDogdGhpcy5DVVJSRU5UX0xPQ0FUSU9OXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGJhY2soKSB7XG4gICAgdGhpcy5zdGVwcGVyLnByZXZpb3VzKCk7XG4gIH1cblxuICBnZXRBcHBDb25maWcoKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZUZvcm0pIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwga2V5LCBjb250ZXh0UGF0aCB9ID0gdGhpcy5zZWxlY3RlZEFwcC52YWx1ZTtcbiAgICAgIHRoaXMubmV3QXBwQ29uZmlnID0geyBuYW1lLCBrZXksIGNvbnRleHRQYXRoIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV3QXBwQ29uZmlnID0gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldFVuaXF1ZUFwcENvbmZpZyhcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFwcC52YWx1ZSxcbiAgICAgICAgdGhpcy5leGlzdGluZ0FwcHNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBcHAoY2xvbmVkQXBwQ29uZmlnOiBQYXJ0aWFsPElBcHBsaWNhdGlvbj4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBkYXRhOiBhcHAgfSA9IGF3YWl0IHRoaXMuZWNvc3lzdGVtU2VydmljZS51cGRhdGVBcHAoY2xvbmVkQXBwQ29uZmlnLCB0cnVlKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgdGhpcy5nZXRBcHBNYW5pZmVzdChhcHApO1xuICAgICAgaWYgKG1hbmlmZXN0KSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlTWFuaWZlc3QoYXBwLCBtYW5pZmVzdCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHVwbGljYXRlZEFwcC5lbWl0KGFwcCk7XG4gICAgICB0aGlzLnN0ZXBwZXIubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVNYW5pZmVzdChhcHA6IElBcHBsaWNhdGlvbiwgbWFuaWZlc3Q6IGFueSkge1xuICAgIGNvbnN0IGtleXNUb1VwZGF0ZTogQXJyYXk8a2V5b2YgSUFwcGxpY2F0aW9uPiA9IFsnbmFtZScsICdrZXknLCAnY29udGV4dFBhdGgnXTtcbiAgICBjb25zdCBzb21lS2V5RGlmZmVycyA9IGtleXNUb1VwZGF0ZS5zb21lKGtleSA9PiBhcHBba2V5XSAhPT0gbWFuaWZlc3Rba2V5XSk7XG4gICAgaWYgKHNvbWVLZXlEaWZmZXJzKSB7XG4gICAgICBrZXlzVG9VcGRhdGUuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBtYW5pZmVzdFtrZXldID0gYXBwW2tleV07XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLnN0b3JlQXBwTWFuaWZlc3QoYXBwLCBtYW5pZmVzdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBcHBNYW5pZmVzdChhcHA6IElBcHBsaWNhdGlvbikge1xuICAgIGlmICghYXBwPy5jb250ZXh0UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5nZXRBcHBNYW5pZmVzdChhcHApO1xuICAgICAgcmV0dXJuIG1hbmlmZXN0O1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iLCI8cFxuICBjbGFzcz1cInAtMTYgdGV4dC1jZW50ZXIgdGV4dC1tZWRpdW0gc2VwYXJhdG9yLWJvdHRvbSBzdGlja3ktdG9wIGJnLWxldmVsLTAgZml0LXdcIlxuICAqbmdJZj1cIiFpblByb2dyZXNzXCJcbj5cbiAge3sgJ1Byb3ZpZGUgYXBwbGljYXRpb24gZGV0YWlscycgfCB0cmFuc2xhdGUgfX1cbjwvcD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpblByb2dyZXNzXCI+XG4gIDxsYWJlbCBjbGFzcz1cImM4eS1zd2l0Y2hcIiAqbmdJZj1cImlzU3Vic2NyaWJlZEFwcCQgfCBhc3luY1wiPlxuICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImRpc2FibGVGb3JtXCIgKGNoYW5nZSk9XCJnZXRBcHBDb25maWcoKVwiIC8+XG4gICAgPHNwYW4+PC9zcGFuPiB7eyAnT3ZlcnJ1bGUgc3Vic2NyaWJlZCBhcHBsaWNhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgPC9sYWJlbD5cblxuICA8Yzh5LWFwcGxpY2F0aW9uLXByb3BlcnRpZXMtZm9ybVxuICAgIFthcHBsaWNhdGlvbl09XCJuZXdBcHBDb25maWdcIlxuICAgIGNsYXNzPVwiZC1ibG9jayBmaXQtd1wiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVGb3JtXCJcbiAgPjwvYzh5LWFwcGxpY2F0aW9uLXByb3BlcnRpZXMtZm9ybT5cbjwvbmctY29udGFpbmVyPlxuPGM4eS1sb2FkaW5nXG4gICpuZ0lmPVwiaW5Qcm9ncmVzc1wiXG4gIFttZXNzYWdlXT1cIidEdXBsaWNhdGluZ+KApicgfCB0cmFuc2xhdGVcIlxuICBsYXlvdXQ9XCJhcHBsaWNhdGlvblwiXG4gIGNsYXNzPVwidGV4dC1jZW50ZXIgZC1ibG9ja1wiXG4+PC9jOHktbG9hZGluZz5cblxuPGM4eS13aXphcmQtZm9vdGVyPlxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhaXNGaXJzdFN0ZXBcIlxuICAgIChjbGljayk9XCJiYWNrKClcIlxuICAgIFtkaXNhYmxlZF09XCJpblByb2dyZXNzXCJcbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgdGl0bGU9XCJ7eyAnQmFjaycgfCB0cmFuc2xhdGUgfX1cIlxuICA+XG4gICAge3sgJ0JhY2snIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uIChjbGljayk9XCJjYW5jZWwoKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgKGNsaWNrKT1cImR1cGxpY2F0ZUFwcCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiaW5Qcm9ncmVzc1wiXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwie3sgJ0R1cGxpY2F0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICA+XG4gICAge3sgJ0R1cGxpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS13aXphcmQtZm9vdGVyPlxuIl19