UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

111 lines 27.6 kB
import { Component } from '@angular/core'; import { AlertService, GainsightService, PluginsService, gettext } from '@c8y/ngx-components'; import { uniq } from 'lodash-es'; import { BsModalRef } from 'ngx-bootstrap/modal'; import { EcosystemService, PRODUCT_EXPERIENCE_ECOSYSTEM } from '@c8y/ngx-components/ecosystem/shared'; import * as i0 from "@angular/core"; import * as i1 from "ngx-bootstrap/modal"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@c8y/ngx-components/ecosystem/shared"; import * as i4 from "@angular/common"; import * as i5 from "@angular/forms"; export class UpdatePluginOfAppComponent { constructor(bsModalRef, pluginsService, alert, ecosystemService, gainsightService) { this.bsModalRef = bsModalRef; this.pluginsService = pluginsService; this.alert = alert; this.ecosystemService = ecosystemService; this.gainsightService = gainsightService; this.CURRENT_LOCATION = location.href; this.result = new Promise((resolve, reject) => { this._install = resolve; this._cancel = reject; }); this.updateAll = true; } async update() { const remotes = this.pluginsService.getMFRemotes(this.app); const oldRemotePath = `${this.plugin.contextPath}@${this.plugin.version}`; const newRemotePath = `${this.plugin.contextPath}@${this.applicationVersion.version}`; let oldRemoteModules = [...(remotes[oldRemotePath] || [])]; if (!oldRemoteModules.length) { this.alert.warning(gettext('Could not change the version of plugin.')); this.cancel(); return; } const isArchived = await this.ecosystemService.verifyArchived([this.plugin]); if (!isArchived) { this.alert.warning(gettext('Plugin update aborted by user.')); this.cancel(); return; } const result = await this.ecosystemService.verifyLicenses([this.plugin]); if (!result) { this.alert.warning(gettext('Plugin update aborted by user.')); this.cancel(); return; } let remoteModulesOfNewVersion = [...(remotes[newRemotePath] || [])]; let olderVersions = {}; if (this.updateAll) { olderVersions = Object.keys(remotes) .filter(key => key.startsWith(`${this.plugin.contextPath}@`)) .reduceRight((prev, curr) => { prev[curr] = undefined; return prev; }, {}); oldRemoteModules = Object.keys(olderVersions) .map(version => remotes[version]) .reduceRight((prev, curr) => { prev.push(...curr); return prev; }, []); remoteModulesOfNewVersion.push(...oldRemoteModules); } else { remoteModulesOfNewVersion.push(this.plugin.module); olderVersions[oldRemotePath] = oldRemoteModules.filter(module => module !== this.plugin.module); if (!olderVersions[oldRemotePath].length) { olderVersions[oldRemotePath] = undefined; } } remoteModulesOfNewVersion = uniq(remoteModulesOfNewVersion); const newRemotes = { ...remotes, ...olderVersions, [newRemotePath]: remoteModulesOfNewVersion }; try { await this.pluginsService.updateRemotesInAppConfig(this.app, newRemotes); this.alert.success(gettext(`Switched the version of plugin.`)); this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.EVENTS.INSTALLED_PLUGINS, { component: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.COMPONENTS.UPDATE_PLUGIN_OF_APP, action: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.ACTIONS.CHANGE_PLUGIN_VERSION, result: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.RESULTS.PLUGIN_VERSION_CHANGED, url: this.CURRENT_LOCATION }); } catch (e) { this.alert.addServerFailure(e); this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.EVENTS.INSTALLED_PLUGINS, { component: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.COMPONENTS.UPDATE_PLUGIN_OF_APP, action: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.ACTIONS.CHANGE_PLUGIN_VERSION, result: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.RESULTS.SERVER_FAILURE, url: this.CURRENT_LOCATION }); } this.bsModalRef.hide(); this._install(); } cancel() { this.bsModalRef.hide(); this._cancel(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UpdatePluginOfAppComponent, deps: [{ token: i1.BsModalRef }, { token: i2.PluginsService }, { token: i2.AlertService }, { token: i3.EcosystemService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UpdatePluginOfAppComponent, selector: "c8y-update-plugin-of-app", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'installing-updates'\"></i>\n <h4\n id=\"modal-title\"\n *ngIf=\"!downgrade\"\n translate\n >\n Update plugin\n </h4>\n <h4\n id=\"modal-title\"\n *ngIf=\"downgrade\"\n translate\n >\n Downgrade plugin\n </h4>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"card-block p-r-24 p-l-24 sticky-top bg-component separator-bottom\">\n <c8y-package-version-select\n [packageContextPath]=\"plugin?.contextPath\"\n [(ngModel)]=\"applicationVersion\"\n ></c8y-package-version-select>\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"plugin?.version && plugin.version === applicationVersion?.version\"\n >\n <span\n translate\n ngNonBindable\n [translateParams]=\"applicationVersion\"\n >\n Select another version, as {{ version }} is currently used.\n </span>\n </div>\n <div class=\"form-group\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"updateAll\"\n />\n <span></span>\n <span\n translate\n ngNonBindable\n [translateParams]=\"plugin\"\n >\n Set version for all plugins using the same context path \"{{ contextPath }}\".\n </span>\n </label>\n </div>\n <p class=\"legend form-block\">\n {{ 'Change log' | translate }}\n </p>\n </div>\n <div class=\"card-block p-l-24 p-r-24\">\n\n <div\n class=\"markdown-content markdown-content--to-h3\"\n >\n <c8y-contents-changelog\n [package]=\"plugin.originApp\"\n [selectedVersion]=\"applicationVersion?.version\"\n [previousVersion]=\"plugin?.version\"\n ></c8y-contents-changelog>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Set version' | translate }}\"\n [disabled]=\"!applicationVersion || plugin?.version === applicationVersion?.version\"\n (click)=\"update()\"\n >\n {{ 'Set version' | translate }}\n </button>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.PackageVersionSelectComponent, selector: "c8y-package-version-select", inputs: ["label", "packageContextPath", "packageId"] }, { kind: "component", type: i3.PackageChangelogComponent, selector: "c8y-contents-changelog", inputs: ["package", "selectedVersion", "previousVersion"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UpdatePluginOfAppComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-update-plugin-of-app', template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'installing-updates'\"></i>\n <h4\n id=\"modal-title\"\n *ngIf=\"!downgrade\"\n translate\n >\n Update plugin\n </h4>\n <h4\n id=\"modal-title\"\n *ngIf=\"downgrade\"\n translate\n >\n Downgrade plugin\n </h4>\n </div>\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"card-block p-r-24 p-l-24 sticky-top bg-component separator-bottom\">\n <c8y-package-version-select\n [packageContextPath]=\"plugin?.contextPath\"\n [(ngModel)]=\"applicationVersion\"\n ></c8y-package-version-select>\n <div\n class=\"alert alert-info\"\n role=\"alert\"\n *ngIf=\"plugin?.version && plugin.version === applicationVersion?.version\"\n >\n <span\n translate\n ngNonBindable\n [translateParams]=\"applicationVersion\"\n >\n Select another version, as {{ version }} is currently used.\n </span>\n </div>\n <div class=\"form-group\">\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"updateAll\"\n />\n <span></span>\n <span\n translate\n ngNonBindable\n [translateParams]=\"plugin\"\n >\n Set version for all plugins using the same context path \"{{ contextPath }}\".\n </span>\n </label>\n </div>\n <p class=\"legend form-block\">\n {{ 'Change log' | translate }}\n </p>\n </div>\n <div class=\"card-block p-l-24 p-r-24\">\n\n <div\n class=\"markdown-content markdown-content--to-h3\"\n >\n <c8y-contents-changelog\n [package]=\"plugin.originApp\"\n [selectedVersion]=\"applicationVersion?.version\"\n [previousVersion]=\"plugin?.version\"\n ></c8y-contents-changelog>\n </div>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Set version' | translate }}\"\n [disabled]=\"!applicationVersion || plugin?.version === applicationVersion?.version\"\n (click)=\"update()\"\n >\n {{ 'Set version' | translate }}\n </button>\n </div>\n</div>" }] }], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.PluginsService }, { type: i2.AlertService }, { type: i3.EcosystemService }, { type: i2.GainsightService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXBsdWdpbi1vZi1hcHAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvdXBkYXRlLXBsdWdpbi1vZi1hcHAvdXBkYXRlLXBsdWdpbi1vZi1hcHAuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL2FwcGxpY2F0aW9uLXBsdWdpbnMvdXBkYXRlLXBsdWdpbi1vZi1hcHAvdXBkYXRlLXBsdWdpbi1vZi1hcHAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsWUFBWSxFQUVaLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsT0FBTyxFQUNSLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQiw0QkFBNEIsRUFDN0IsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7OztBQU05QyxNQUFNLE9BQU8sMEJBQTBCO0lBZ0JyQyxZQUNVLFVBQXNCLEVBQ3RCLGNBQThCLEVBQzlCLEtBQW1CLEVBQ25CLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFKbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFwQjVDLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFLakMsV0FBTSxHQUFrQixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxN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QyxxQkFBcUI7Z0JBQy9FLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFzQjtnQkFDaEYsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7YUFDM0IsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ2hDLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQ2xFO2dCQUNFLFNBQVMsRUFBRSw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG9CQUFvQjtnQkFDcEYsTUFBTSxFQUFFLDRCQUE0QixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMscUJBQXFCO2dCQUMvRSxNQUFNLEVBQUUsNEJBQTRCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUN4RSxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjthQUMzQixDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDOytHQW5IVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixnRUNwQnZDLHlnRkEyRk07OzRGRHZFTywwQkFBMEI7a0JBSnRDLFNBQVM7K0JBQ0UsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMsIElBcHBsaWNhdGlvbiwgSUFwcGxpY2F0aW9uVmVyc2lvbiB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwbGljYXRpb25QbHVnaW4sXG4gIEdhaW5zaWdodFNlcnZpY2UsXG4gIFBsdWdpbnNTZXJ2aWNlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBFY29zeXN0ZW1TZXJ2aWNlLFxuICBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZWNvc3lzdGVtL3NoYXJlZCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS11cGRhdGUtcGx1Z2luLW9mLWFwcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGRhdGUtcGx1Z2luLW9mLWFwcC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXBkYXRlUGx1Z2luT2ZBcHBDb21wb25lbnQge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcblxuICBhcHA6IElBcHBsaWNhdGlvbjtcbiAgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbjtcbiAgZG93bmdyYWRlOiBib29sZWFuO1xuICByZXN1bHQ6IFByb21pc2U8dm9pZD4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5faW5zdGFsbCA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcbiAgYXBwbGljYXRpb25WZXJzaW9uOiBJQXBwbGljYXRpb25WZXJzaW9uO1xuICB1cGRhdGVBbGwgPSB0cnVlO1xuXG4gIHByaXZhdGUgX2luc3RhbGw6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgX2NhbmNlbDogKHJlYXNvbj86IGFueSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSBwbHVnaW5zU2VydmljZTogUGx1Z2luc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWNvc3lzdGVtU2VydmljZTogRWNvc3lzdGVtU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIHVwZGF0ZSgpIHtcbiAgICBjb25zdCByZW1vdGVzID0gdGhpcy5wbHVnaW5zU2VydmljZS5nZXRNRlJlbW90ZXModGhpcy5hcHApO1xuICAgIGNvbnN0IG9sZFJlbW90ZVBhdGggPSBgJHt0aGlzLnBsdWdpbi5jb250ZXh0UGF0aH1AJHt0aGlzLnBsdWdpbi52ZXJzaW9ufWA7XG4gICAgY29uc3QgbmV3UmVtb3RlUGF0aCA9IGAke3RoaXMucGx1Z2luLmNvbnRleHRQYXRofUAke3RoaXMuYXBwbGljYXRpb25WZXJzaW9uLnZlcnNpb259YDtcbiAgICBsZXQgb2xkUmVtb3RlTW9kdWxlcyA9IFsuLi4ocmVtb3Rlc1tvbGRSZW1vdGVQYXRoXSB8fCBbXSldO1xuICAgIGlmICghb2xkUmVtb3RlTW9kdWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWxlcnQud2FybmluZyhnZXR0ZXh0KCdDb3VsZCBub3QgY2hhbmdlIHRoZSB2ZXJzaW9uIG9mIHBsdWdpbi4nKSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQXJjaGl2ZWQgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UudmVyaWZ5QXJjaGl2ZWQoW3RoaXMucGx1Z2luXSk7XG4gICAgaWYgKCFpc0FyY2hpdmVkKSB7XG4gICAgICB0aGlzLmFsZXJ0Lndhcm5pbmcoZ2V0dGV4dCgnUGx1Z2luIHVwZGF0ZSBhYm9ydGVkIGJ5IHVzZXIuJykpO1xuICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UudmVyaWZ5TGljZW5zZXMoW3RoaXMucGx1Z2luXSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRoaXMuYWxlcnQud2FybmluZyhnZXR0ZXh0KCdQbHVnaW4gdXBkYXRlIGFib3J0ZWQgYnkgdXNlci4nKSk7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZW1vdGVNb2R1bGVzT2ZOZXdWZXJzaW9uID0gWy4uLihyZW1vdGVzW25ld1JlbW90ZVBhdGhdIHx8IFtdKV07XG4gICAgbGV0IG9sZGVyVmVyc2lvbnM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHt9O1xuICAgIGlmICh0aGlzLnVwZGF0ZUFsbCkge1xuICAgICAgb2xkZXJWZXJzaW9ucyA9IE9iamVjdC5rZXlzKHJlbW90ZXMpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKGAke3RoaXMucGx1Z2luLmNvbnRleHRQYXRofUBgKSlcbiAgICAgICAgLnJlZHVjZVJpZ2h0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgcHJldltjdXJyXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICBvbGRSZW1vdGVNb2R1bGVzID0gT2JqZWN0LmtleXMob2xkZXJWZXJzaW9ucylcbiAgICAgICAgLm1hcCh2ZXJzaW9uID0+IHJlbW90ZXNbdmVyc2lvbl0pXG4gICAgICAgIC5yZWR1Y2VSaWdodCgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgIHByZXYucHVzaCguLi5jdXJyKTtcbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwgW10pO1xuICAgICAgcmVtb3RlTW9kdWxlc09mTmV3VmVyc2lvbi5wdXNoKC4uLm9sZFJlbW90ZU1vZHVsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdGVNb2R1bGVzT2ZOZXdWZXJzaW9uLnB1c2godGhpcy5wbHVnaW4ubW9kdWxlKTtcbiAgICAgIG9sZGVyVmVyc2lvbnNbb2xkUmVtb3RlUGF0aF0gPSBvbGRSZW1vdGVNb2R1bGVzLmZpbHRlcihcbiAgICAgICAgbW9kdWxlID0+IG1vZHVsZSAhPT0gdGhpcy5wbHVnaW4ubW9kdWxlXG4gICAgICApO1xuICAgICAgaWYgKCFvbGRlclZlcnNpb25zW29sZFJlbW90ZVBhdGhdLmxlbmd0aCkge1xuICAgICAgICBvbGRlclZlcnNpb25zW29sZFJlbW90ZVBhdGhdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlbW90ZU1vZHVsZXNPZk5ld1ZlcnNpb24gPSB1bmlxKHJlbW90ZU1vZHVsZXNPZk5ld1ZlcnNpb24pO1xuICAgIGNvbnN0IG5ld1JlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IHtcbiAgICAgIC4uLnJlbW90ZXMsXG4gICAgICAuLi5vbGRlclZlcnNpb25zLFxuICAgICAgW25ld1JlbW90ZVBhdGhdOiByZW1vdGVNb2R1bGVzT2ZOZXdWZXJzaW9uXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnBsdWdpbnNTZXJ2aWNlLnVwZGF0ZVJlbW90ZXNJbkFwcENvbmZpZyh0aGlzLmFwcCwgbmV3UmVtb3Rlcyk7XG4gICAgICB0aGlzLmFsZXJ0LnN1Y2Nlc3MoZ2V0dGV4dChgU3dpdGNoZWQgdGhlIHZlcnNpb24gb2YgcGx1Z2luLmApKTtcbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQoXG4gICAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLkVWRU5UUy5JTlNUQUxMRURfUExVR0lOUyxcbiAgICAgICAge1xuICAgICAgICAgIGNvbXBvbmVudDogUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuQ09NUE9ORU5UUy5VUERBVEVfUExVR0lOX09GX0FQUCxcbiAgICAgICAgICBhY3Rpb246IFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLkFDVElPTlMuQ0hBTkdFX1BMVUdJTl9WRVJTSU9OLFxuICAgICAgICAgIHJlc3VsdDogUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuUkVTVUxUUy5QTFVHSU5fVkVSU0lPTl9DSEFOR0VELFxuICAgICAgICAgIHVybDogdGhpcy5DVVJSRU5UX0xPQ0FUSU9OXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChcbiAgICAgICAgUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuRVZFTlRTLklOU1RBTExFRF9QTFVHSU5TLFxuICAgICAgICB7XG4gICAgICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5DT01QT05FTlRTLlVQREFURV9QTFVHSU5fT0ZfQVBQLFxuICAgICAgICAgIGFjdGlvbjogUFJPRFVDVF9FWFBFUklFTkNFX0VDT1NZU1RFTS5BUFBMSUNBVElPTlMuQUNUSU9OUy5DSEFOR0VfUExVR0lOX1ZFUlNJT04sXG4gICAgICAgICAgcmVzdWx0OiBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5SRVNVTFRTLlNFUlZFUl9GQUlMVVJFLFxuICAgICAgICAgIHVybDogdGhpcy5DVVJSRU5UX0xPQ0FUSU9OXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICB0aGlzLl9pbnN0YWxsKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICB0aGlzLl9jYW5jZWwoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInZpZXdwb3J0LW1vZGFsXCI+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZGlhbG9nLWhlYWRlclwiPlxuICAgIDxpIFtjOHlJY29uXT1cIidpbnN0YWxsaW5nLXVwZGF0ZXMnXCI+PC9pPlxuICAgIDxoNFxuICAgICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgICAqbmdJZj1cIiFkb3duZ3JhZGVcIlxuICAgICAgdHJhbnNsYXRlXG4gICAgPlxuICAgICAgVXBkYXRlIHBsdWdpblxuICAgIDwvaDQ+XG4gICAgPGg0XG4gICAgICBpZD1cIm1vZGFsLXRpdGxlXCJcbiAgICAgICpuZ0lmPVwiZG93bmdyYWRlXCJcbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIERvd25ncmFkZSBwbHVnaW5cbiAgICA8L2g0PlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiaW5uZXItc2Nyb2xsXCJcbiAgICBpZD1cIm1vZGFsLWJvZHlcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgcC1yLTI0IHAtbC0yNCBzdGlja3ktdG9wIGJnLWNvbXBvbmVudCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICA8Yzh5LXBhY2thZ2UtdmVyc2lvbi1zZWxlY3RcbiAgICAgICAgW3BhY2thZ2VDb250ZXh0UGF0aF09XCJwbHVnaW4/LmNvbnRleHRQYXRoXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBsaWNhdGlvblZlcnNpb25cIlxuICAgICAgPjwvYzh5LXBhY2thZ2UtdmVyc2lvbi1zZWxlY3Q+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiXG4gICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgICpuZ0lmPVwicGx1Z2luPy52ZXJzaW9uICYmIHBsdWdpbi52ZXJzaW9uID09PSBhcHBsaWNhdGlvblZlcnNpb24/LnZlcnNpb25cIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImFwcGxpY2F0aW9uVmVyc2lvblwiXG4gICAgICAgID5cbiAgICAgICAgICBTZWxlY3QgYW5vdGhlciB2ZXJzaW9uLCBhcyB7eyB2ZXJzaW9uIH19IGlzIGN1cnJlbnRseSB1c2VkLlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwidXBkYXRlQWxsXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInBsdWdpblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2V0IHZlcnNpb24gZm9yIGFsbCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIGNvbnRleHQgcGF0aCBcInt7IGNvbnRleHRQYXRoIH19XCIuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8cCBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+XG4gICAgICAgIHt7ICdDaGFuZ2UgbG9nJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHAtbC0yNCBwLXItMjRcIj5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1hcmtkb3duLWNvbnRlbnQgbWFya2Rvd24tY29udGVudC0tdG8taDNcIlxuICAgICAgPlxuICAgICAgICA8Yzh5LWNvbnRlbnRzLWNoYW5nZWxvZ1xuICAgICAgICAgIFtwYWNrYWdlXT1cInBsdWdpbi5vcmlnaW5BcHBcIlxuICAgICAgICAgIFtzZWxlY3RlZFZlcnNpb25dPVwiYXBwbGljYXRpb25WZXJzaW9uPy52ZXJzaW9uXCJcbiAgICAgICAgICBbcHJldmlvdXNWZXJzaW9uXT1cInBsdWdpbj8udmVyc2lvblwiXG4gICAgICAgID48L2M4eS1jb250ZW50cy1jaGFuZ2Vsb2c+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICA+XG4gICAgICB7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgIHRpdGxlPVwie3sgJ1NldCB2ZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWFwcGxpY2F0aW9uVmVyc2lvbiB8fCBwbHVnaW4/LnZlcnNpb24gPT09IGFwcGxpY2F0aW9uVmVyc2lvbj8udmVyc2lvblwiXG4gICAgICAoY2xpY2spPVwidXBkYXRlKClcIlxuICAgID5cbiAgICAgIHt7ICdTZXQgdmVyc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=