UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

72 lines 16.2 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { ApplicationService } from '@c8y/client'; import { AlertService, ContextRouteService } from '@c8y/ngx-components'; import { packageProperties } from '@c8y/ngx-components/ecosystem/shared'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@c8y/client"; import * as i3 from "@c8y/ngx-components"; import * as i4 from "@angular/common"; import * as i5 from "@c8y/ngx-components/ecosystem/shared"; import * as i6 from "./contents-plugins/contents-plugins.component"; import * as i7 from "./contents-apps/contents-apps.component"; export class PackageContentsComponent { constructor(activatedRoute, applicationService, alertService, contextRouteService) { this.activatedRoute = activatedRoute; this.applicationService = applicationService; this.alertService = alertService; this.contextRouteService = contextRouteService; this.showOverview = new EventEmitter(); this.package = {}; this.isLoading = false; this.packageVersionProperties = packageProperties; } showPluginOverview(plugin) { this.showOverview.emit(plugin); } async ngOnChanges(changes) { if (changes.selectedVersion?.currentValue) { this.loadManifest(this.selectedVersion); this.previousVersion = this.getPreviousVersion(); } } async loadManifest(version) { this.package = this.contextRouteService.getContextData(this.activatedRoute)?.contextData; this.isLoading = true; this.selectedVersionManifest = await this.getManifest(version); this.isLoading = false; } async getManifest(version) { try { return await this.applicationService.getAppManifest(this.package, version); } catch (error) { this.alertService.addServerFailure(error); } return undefined; } getPreviousVersion() { if (this.package.applicationVersions.length === 1) { return null; } const selectedVersionIndex = this.package.applicationVersions.findIndex(version => version.version === this.selectedVersion); if (selectedVersionIndex === 0) { return null; } return this.package.applicationVersions[selectedVersionIndex - 1].version; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageContentsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.ApplicationService }, { token: i3.AlertService }, { token: i3.ContextRouteService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PackageContentsComponent, selector: "c8y-package-contents", inputs: { selectedVersion: "selectedVersion", selectedPlugin: "selectedPlugin" }, outputs: { showOverview: "showOverview" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!selectedVersionManifest && !isLoading\">\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'big-parcel'\"\n [title]=\"'No package selected' | translate\"\n [subtitle]=\"'Select a package from the list to display the package contents.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n</ng-container>\n\n<ng-container *ngIf=\"selectedVersionManifest && !isLoading\">\n <!-- DETAILS -->\n <div class=\"card-block\">\n <c8y-properties-list\n [data]=\"selectedVersionManifest\"\n [emptyLabel]=\"'--'\"\n [properties]=\"packageVersionProperties\"\n ></c8y-properties-list>\n\n <!-- APPS -->\n <c8y-contents-apps\n class=\"p-t-16 d-block\"\n [selectedVersionManifest]=\"selectedVersionManifest\"\n ></c8y-contents-apps>\n\n <!-- PLUGINS -->\n <c8y-contents-plugins\n class=\"p-t-16 d-block\"\n [selectedVersionManifest]=\"selectedVersionManifest\"\n [selectedPlugin]=\"selectedPlugin\"\n (showOverview)=\"showPluginOverview($event)\"\n ></c8y-contents-plugins>\n\n <!-- CHANGELOG -->\n <p class=\"legend form-block\">\n {{ 'Change log' | translate }}\n </p>\n\n <c8y-contents-changelog\n [package]=\"package\"\n [selectedVersion]=\"selectedVersion\"\n [previousVersion]=\"previousVersion\"\n ></c8y-contents-changelog>\n </div>\n</ng-container>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.PropertiesListComponent, selector: "c8y-properties-list", inputs: ["properties", "title", "icon", "data", "groups", "noParse", "emptyLabel"] }, { kind: "component", type: i5.PackageChangelogComponent, selector: "c8y-contents-changelog", inputs: ["package", "selectedVersion", "previousVersion"] }, { kind: "component", type: i6.PackageVersionsPluginsComponent, selector: "c8y-contents-plugins", inputs: ["selectedVersionManifest", "selectedPlugin"], outputs: ["showOverview"] }, { kind: "component", type: i7.PackageVersionsAppsComponent, selector: "c8y-contents-apps", inputs: ["selectedVersionManifest"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackageContentsComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-package-contents', template: "<ng-container *ngIf=\"!selectedVersionManifest && !isLoading\">\n <div class=\"p-16\">\n <c8y-ui-empty-state\n [icon]=\"'big-parcel'\"\n [title]=\"'No package selected' | translate\"\n [subtitle]=\"'Select a package from the list to display the package contents.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n</ng-container>\n\n<ng-container *ngIf=\"selectedVersionManifest && !isLoading\">\n <!-- DETAILS -->\n <div class=\"card-block\">\n <c8y-properties-list\n [data]=\"selectedVersionManifest\"\n [emptyLabel]=\"'--'\"\n [properties]=\"packageVersionProperties\"\n ></c8y-properties-list>\n\n <!-- APPS -->\n <c8y-contents-apps\n class=\"p-t-16 d-block\"\n [selectedVersionManifest]=\"selectedVersionManifest\"\n ></c8y-contents-apps>\n\n <!-- PLUGINS -->\n <c8y-contents-plugins\n class=\"p-t-16 d-block\"\n [selectedVersionManifest]=\"selectedVersionManifest\"\n [selectedPlugin]=\"selectedPlugin\"\n (showOverview)=\"showPluginOverview($event)\"\n ></c8y-contents-plugins>\n\n <!-- CHANGELOG -->\n <p class=\"legend form-block\">\n {{ 'Change log' | translate }}\n </p>\n\n <c8y-contents-changelog\n [package]=\"package\"\n [selectedVersion]=\"selectedVersion\"\n [previousVersion]=\"previousVersion\"\n ></c8y-contents-changelog>\n </div>\n</ng-container>\n" }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.ApplicationService }, { type: i3.AlertService }, { type: i3.ContextRouteService }], propDecorators: { selectedVersion: [{ type: Input }], selectedPlugin: [{ type: Input }], showOverview: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMtY29udGVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3BhY2thZ2VzL3BhY2thZ2UtdmVyc2lvbnMvcGFja2FnZS1jb250ZW50cy9wYWNrYWdlcy1jb250ZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vcGFja2FnZXMvcGFja2FnZS12ZXJzaW9ucy9wYWNrYWdlLWNvbnRlbnRzL3BhY2thZ2VzLWNvbnRlbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQzFFLE9BQU8sRUFDTCxZQUFZLEVBRVosbUJBQW1CLEVBRXBCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7OztBQU16RSxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1UsY0FBOEIsRUFDOUIsa0JBQXNDLEVBQ3RDLFlBQTBCLEVBQzFCLG1CQUF3QztRQUh4QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBYnhDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFHL0QsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDM0IsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUdULDZCQUF3QixHQUF5QixpQkFBaUIsQ0FBQztJQU96RSxDQUFDO0lBRUosa0JBQWtCLENBQUMsTUFBeUI7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdEMsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWU7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLENBQUM7UUFDekYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFlO1FBQ3ZDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0UsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FDckUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQ3BELENBQUM7UUFDRixJQUFJLG9CQUFvQixLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDNUUsQ0FBQzsrR0F6RFUsd0JBQXdCO21HQUF4Qix3QkFBd0IsOE1DZnJDLDQrQ0FrREE7OzRGRG5DYSx3QkFBd0I7a0JBSnBDLFNBQVM7K0JBQ0Usc0JBQXNCO2lMQUl2QixlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblNlcnZpY2UsIElBcHBsaWNhdGlvbiwgSU1hbmlmZXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBcHBsaWNhdGlvblBsdWdpbixcbiAgQ29udGV4dFJvdXRlU2VydmljZSxcbiAgUHJvcGVydGllc0xpc3RJdGVtXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcGFja2FnZVByb3BlcnRpZXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Vjb3N5c3RlbS9zaGFyZWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcGFja2FnZS1jb250ZW50cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWNrYWdlcy1jb250ZW50cy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUGFja2FnZUNvbnRlbnRzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc2VsZWN0ZWRWZXJzaW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkUGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbjtcbiAgQE91dHB1dCgpIHNob3dPdmVydmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8QXBwbGljYXRpb25QbHVnaW4+KCk7XG5cbiAgc2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3Q6IElNYW5pZmVzdDtcbiAgcGFja2FnZTogSUFwcGxpY2F0aW9uID0ge307XG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuICBwcmV2aW91c1ZlcnNpb246IHN0cmluZyB8IG51bGw7XG5cbiAgcmVhZG9ubHkgcGFja2FnZVZlcnNpb25Qcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzTGlzdEl0ZW1bXSA9IHBhY2thZ2VQcm9wZXJ0aWVzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25TZXJ2aWNlOiBBcHBsaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRleHRSb3V0ZVNlcnZpY2U6IENvbnRleHRSb3V0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIHNob3dQbHVnaW5PdmVydmlldyhwbHVnaW46IEFwcGxpY2F0aW9uUGx1Z2luKSB7XG4gICAgdGhpcy5zaG93T3ZlcnZpZXcuZW1pdChwbHVnaW4pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnNlbGVjdGVkVmVyc2lvbj8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLnNlbGVjdGVkVmVyc2lvbik7XG4gICAgICB0aGlzLnByZXZpb3VzVmVyc2lvbiA9IHRoaXMuZ2V0UHJldmlvdXNWZXJzaW9uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZE1hbmlmZXN0KHZlcnNpb246IHN0cmluZykge1xuICAgIHRoaXMucGFja2FnZSA9IHRoaXMuY29udGV4dFJvdXRlU2VydmljZS5nZXRDb250ZXh0RGF0YSh0aGlzLmFjdGl2YXRlZFJvdXRlKT8uY29udGV4dERhdGE7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3QgPSBhd2FpdCB0aGlzLmdldE1hbmlmZXN0KHZlcnNpb24pO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE1hbmlmZXN0KHZlcnNpb246IHN0cmluZyk6IFByb21pc2U8SU1hbmlmZXN0PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uU2VydmljZS5nZXRBcHBNYW5pZmVzdCh0aGlzLnBhY2thZ2UsIHZlcnNpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNWZXJzaW9uKCkge1xuICAgIGlmICh0aGlzLnBhY2thZ2UuYXBwbGljYXRpb25WZXJzaW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZFZlcnNpb25JbmRleCA9IHRoaXMucGFja2FnZS5hcHBsaWNhdGlvblZlcnNpb25zLmZpbmRJbmRleChcbiAgICAgIHZlcnNpb24gPT4gdmVyc2lvbi52ZXJzaW9uID09PSB0aGlzLnNlbGVjdGVkVmVyc2lvblxuICAgICk7XG4gICAgaWYgKHNlbGVjdGVkVmVyc2lvbkluZGV4ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZS5hcHBsaWNhdGlvblZlcnNpb25zW3NlbGVjdGVkVmVyc2lvbkluZGV4IC0gMV0udmVyc2lvbjtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZFZlcnNpb25NYW5pZmVzdCAmJiAhaXNMb2FkaW5nXCI+XG4gIDxkaXYgY2xhc3M9XCJwLTE2XCI+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwiJ2JpZy1wYXJjZWwnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gcGFja2FnZSBzZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgW3N1YnRpdGxlXT1cIidTZWxlY3QgYSBwYWNrYWdlIGZyb20gdGhlIGxpc3QgdG8gZGlzcGxheSB0aGUgcGFja2FnZSBjb250ZW50cy4nIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtob3Jpem9udGFsXT1cInRydWVcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICA8Yzh5LWxvYWRpbmc+PC9jOHktbG9hZGluZz5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3QgJiYgIWlzTG9hZGluZ1wiPlxuICA8IS0tIERFVEFJTFMgLS0+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrXCI+XG4gICAgPGM4eS1wcm9wZXJ0aWVzLWxpc3RcbiAgICAgIFtkYXRhXT1cInNlbGVjdGVkVmVyc2lvbk1hbmlmZXN0XCJcbiAgICAgIFtlbXB0eUxhYmVsXT1cIictLSdcIlxuICAgICAgW3Byb3BlcnRpZXNdPVwicGFja2FnZVZlcnNpb25Qcm9wZXJ0aWVzXCJcbiAgICA+PC9jOHktcHJvcGVydGllcy1saXN0PlxuXG4gICAgPCEtLSBBUFBTIC0tPlxuICAgIDxjOHktY29udGVudHMtYXBwc1xuICAgICAgY2xhc3M9XCJwLXQtMTYgZC1ibG9ja1wiXG4gICAgICBbc2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3RdPVwic2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3RcIlxuICAgID48L2M4eS1jb250ZW50cy1hcHBzPlxuXG4gICAgPCEtLSBQTFVHSU5TIC0tPlxuICAgIDxjOHktY29udGVudHMtcGx1Z2luc1xuICAgICAgY2xhc3M9XCJwLXQtMTYgZC1ibG9ja1wiXG4gICAgICBbc2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3RdPVwic2VsZWN0ZWRWZXJzaW9uTWFuaWZlc3RcIlxuICAgICAgW3NlbGVjdGVkUGx1Z2luXT1cInNlbGVjdGVkUGx1Z2luXCJcbiAgICAgIChzaG93T3ZlcnZpZXcpPVwic2hvd1BsdWdpbk92ZXJ2aWV3KCRldmVudClcIlxuICAgID48L2M4eS1jb250ZW50cy1wbHVnaW5zPlxuXG4gICAgPCEtLSBDSEFOR0VMT0cgLS0+XG4gICAgPHAgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiPlxuICAgICAge3sgJ0NoYW5nZSBsb2cnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9wPlxuXG4gICAgPGM4eS1jb250ZW50cy1jaGFuZ2Vsb2dcbiAgICAgIFtwYWNrYWdlXT1cInBhY2thZ2VcIlxuICAgICAgW3NlbGVjdGVkVmVyc2lvbl09XCJzZWxlY3RlZFZlcnNpb25cIlxuICAgICAgW3ByZXZpb3VzVmVyc2lvbl09XCJwcmV2aW91c1ZlcnNpb25cIlxuICAgID48L2M4eS1jb250ZW50cy1jaGFuZ2Vsb2c+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=