@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
69 lines • 26 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { gettext, Permissions, WizardModalService } from '@c8y/ngx-components';
import { APP_STATE, defaultPackageContents, defaultPackageTypes, EcosystemService, EcosystemWizards, ListFiltersComponent } from '@c8y/ngx-components/ecosystem/shared';
import { BehaviorSubject, Subject } from 'rxjs';
import { shareReplay, switchMap, takeUntil, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/ecosystem/shared";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
export class PackagesListComponent {
constructor(ecosystemService, wizardModalService, permissions) {
this.ecosystemService = ecosystemService;
this.wizardModalService = wizardModalService;
this.permissions = permissions;
this.reloading = false;
this.reload$ = new BehaviorSubject(null);
this.hasAdminPermissions = false;
this.emptyStateSubtitle = gettext('Add your first package by clicking below.');
this.packageTypes = defaultPackageTypes;
this.packageAvailabilities = [
APP_STATE.SUBSCRIBED.label,
APP_STATE.CUSTOM.label
];
this.packageContents = defaultPackageContents;
this.destroy$ = new Subject();
this.packages$ = this.reload$.pipe(takeUntil(this.destroy$), tap(() => (this.reloading = true)), switchMap(() => this.ecosystemService.getPackageApplications()), tap(packages => {
packages.forEach(pckg => {
pckg.filterProps = this.ecosystemService.getAppFilterProps(pckg);
});
}), tap(() => (this.reloading = false)), shareReplay(1));
}
ngOnInit() {
this.hasAdminPermissions = this.permissions.hasRole(Permissions.ROLE_APPLICATION_MANAGEMENT_ADMIN);
this.loadPackages();
}
loadPackages() {
this.reload$.next();
}
addPackage() {
const initialState = {
id: EcosystemWizards.PACKAGE_UPLOAD
};
const modalOptions = { initialState };
const modalRef = this.wizardModalService.show(modalOptions);
modalRef.content.onClose.subscribe(() => {
this.loadPackages();
});
}
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.complete();
}
setFilterPipe(pipe) {
this.filteredPackages$ = this.packages$.pipe(src => pipe(src));
}
resetFilters() {
this.filtersComponent?.resetAllFilters();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackagesListComponent, deps: [{ token: i1.EcosystemService }, { token: i2.WizardModalService }, { token: i2.Permissions }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PackagesListComponent, selector: "c8y-packages-list", viewQueries: [{ propertyName: "filtersComponent", first: true, predicate: ListFiltersComponent, descendants: true }], ngImport: i0, template: "<c8y-title>{{ 'Extensions' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'big-parcel'\"\n [path]=\"'ecosystem/extension/extensions'\"\n [label]=\"'Extensions' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"hasAdminPermissions\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add extension package' | translate }}\"\n type=\"button\"\n data-cy=\"packages-list--add-extension-package\"\n (click)=\"addPackage()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add extension package' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadPackages()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"p-r-8 p-l-8\"\n>\n <c8y-list-filters\n *ngIf=\"packages$ | async\"\n [packageTypes]=\"packageTypes\"\n [packageAvailabilities]=\"packageAvailabilities\"\n [packageContents]=\"packageContents\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n >\n <c8y-archived-filter></c8y-archived-filter>\n </c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n>\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(packages$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/ecosystem/#extensions\"></c8y-help>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n>\n <div\n class=\"page-sticky-header hidden-xs d-flex m-b-8\"\n *ngIf=\"(filteredPackages$ | async)?.length > 0\"\n >\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Package' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80 m-r-40\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n <div class=\"card-block card-column-20\"></div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-sm-4 col-md-3\"\n *ngFor=\"let app of filteredPackages$ | async\"\n >\n <c8y-application-card\n class=\"d-contents\"\n (onAppDeleted)=\"loadPackages()\"\n (onAppCloned)=\"loadPackages()\"\n [app]=\"app\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n [icon]=\"'big-parcel'\"\n [title]=\"'No extensions to display.' | translate\"\n [subtitle]=\"hasAdminPermissions ? (emptyStateSubtitle | translate) : ''\"\n *ngIf=\"(packages$ | async)?.length === 0\"\n>\n <div *ngIf=\"hasAdminPermissions\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add extension package' | translate }}\"\n type=\"button\"\n (click)=\"addPackage()\"\n >\n {{ 'Add extension package' | translate }}\n </button>\n </div>\n</c8y-ui-empty-state>\n\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching extensions.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n *ngIf=\"(packages$ | async)?.length > 0 && (filteredPackages$ | async)?.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filters' | translate }}\"\n type=\"button\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: i1.ApplicationCardComponent, selector: "c8y-application-card", inputs: ["app", "canEdit"], outputs: ["onAppDeleted", "onAppCloned"] }, { kind: "component", type: i1.ListFiltersComponent, selector: "c8y-list-filters", inputs: ["packageTypes", "packageAvailabilities", "packageContents"], outputs: ["filterPipeChange"] }, { kind: "component", type: i1.ArchivedFilterComponent, selector: "c8y-archived-filter" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PackagesListComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-packages-list', template: "<c8y-title>{{ 'Extensions' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-atom'\"\n [label]=\"'Ecosystem' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'big-parcel'\"\n [path]=\"'ecosystem/extension/extensions'\"\n [label]=\"'Extensions' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"hasAdminPermissions\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add extension package' | translate }}\"\n type=\"button\"\n data-cy=\"packages-list--add-extension-package\"\n (click)=\"addPackage()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add extension package' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadPackages()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"p-r-8 p-l-8\"\n>\n <c8y-list-filters\n *ngIf=\"packages$ | async\"\n [packageTypes]=\"packageTypes\"\n [packageAvailabilities]=\"packageAvailabilities\"\n [packageContents]=\"packageContents\"\n (filterPipeChange)=\"setFilterPipe($event)\"\n >\n <c8y-archived-filter></c8y-archived-filter>\n </c8y-list-filters>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n>\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(packages$ | async)?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/docs/standard-tenant/ecosystem/#extensions\"></c8y-help>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n>\n <div\n class=\"page-sticky-header hidden-xs d-flex m-b-8\"\n *ngIf=\"(filteredPackages$ | async)?.length > 0\"\n >\n <div class=\"card-block card-column-40\">\n <div class=\"card-appicon p-l-32 p-r-16 m-r-0 m-l-4\"></div>\n {{ 'Package' | translate }}\n </div>\n <div class=\"card-block p-0 card-column-80 m-r-40\">\n <div class=\"card-block card-column-80\">{{ 'Description' | translate }}</div>\n <div class=\"card-block card-column-20\">{{ 'Type' | translate }}</div>\n <div class=\"card-block card-column-20\"></div>\n </div>\n </div>\n <div\n class=\"col-xs-12 col-sm-4 col-md-3\"\n *ngFor=\"let app of filteredPackages$ | async\"\n >\n <c8y-application-card\n class=\"d-contents\"\n (onAppDeleted)=\"loadPackages()\"\n (onAppCloned)=\"loadPackages()\"\n [app]=\"app\"\n ></c8y-application-card>\n </div>\n</div>\n\n<c8y-ui-empty-state\n [icon]=\"'big-parcel'\"\n [title]=\"'No extensions to display.' | translate\"\n [subtitle]=\"hasAdminPermissions ? (emptyStateSubtitle | translate) : ''\"\n *ngIf=\"(packages$ | async)?.length === 0\"\n>\n <div *ngIf=\"hasAdminPermissions\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add extension package' | translate }}\"\n type=\"button\"\n (click)=\"addPackage()\"\n >\n {{ 'Add extension package' | translate }}\n </button>\n </div>\n</c8y-ui-empty-state>\n\n<c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching extensions.' | translate\"\n [subtitle]=\"'Refine your search terms and/or the filters' | translate\"\n *ngIf=\"(packages$ | async)?.length > 0 && (filteredPackages$ | async)?.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Reset filters' | translate }}\"\n type=\"button\"\n (click)=\"resetFilters()\"\n >\n {{ 'Reset filters' | translate }}\n </button>\n</c8y-ui-empty-state>\n" }]
}], ctorParameters: () => [{ type: i1.EcosystemService }, { type: i2.WizardModalService }, { type: i2.Permissions }], propDecorators: { filtersComponent: [{
type: ViewChild,
args: [ListFiltersComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vcGFja2FnZXMvcGFja2FnZS1saXN0L3BhY2thZ2VzLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZWNvc3lzdGVtL3BhY2thZ2VzL3BhY2thZ2UtbGlzdC9wYWNrYWdlcy1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUNMLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFHaEIsb0JBQW9CLEVBRXJCLE1BQU0sc0NBQXNDLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQU14RSxNQUFNLE9BQU8scUJBQXFCO0lBa0JoQyxZQUNVLGdCQUFrQyxFQUNsQyxrQkFBc0MsRUFDdEMsV0FBd0I7UUFGeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBcEJsQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFlBQU8sR0FBMEIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFLM0Qsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLHVCQUFrQixHQUFHLE9BQU8sQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzFFLGlCQUFZLEdBQUcsbUJBQW1CLENBQUM7UUFDbkMsMEJBQXFCLEdBQTZDO1lBQ2hFLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSztZQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUs7U0FDdkIsQ0FBQztRQUNGLG9CQUFlLEdBQUcsc0JBQXNCLENBQUM7UUFFakMsYUFBUSxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBTzFELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFDbEMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLEVBQy9ELEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNiLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUNuQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2YsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUNqRCxXQUFXLENBQUMsaUNBQWlDLENBQzlDLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxZQUFZLEdBQTRCO1lBQzVDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjO1NBQ3BDLENBQUM7UUFDRixNQUFNLFlBQVksR0FBaUIsRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUVwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVELFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBZ0I7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDM0MsQ0FBQzsrR0F2RVUscUJBQXFCO21HQUFyQixxQkFBcUIsMkdBZXJCLG9CQUFvQixnRENyQ2pDLDAwSEF3SUE7OzRGRGxIYSxxQkFBcUI7a0JBSmpDLFNBQVM7K0JBQ0UsbUJBQW1CO2dKQWtCSSxnQkFBZ0I7c0JBQWhELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZ2V0dGV4dCwgUGVybWlzc2lvbnMsIFdpemFyZE1vZGFsU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQVBQX1NUQVRFLFxuICBkZWZhdWx0UGFja2FnZUNvbnRlbnRzLFxuICBkZWZhdWx0UGFja2FnZVR5cGVzLFxuICBFY29zeXN0ZW1TZXJ2aWNlLFxuICBFY29zeXN0ZW1XaXphcmRzLFxuICBGaWx0ZXJhYmxlQXBwT3JQbHVnaW4sXG4gIEZpbHRlclBpcGUsXG4gIExpc3RGaWx0ZXJzQ29tcG9uZW50LFxuICBQYWNrYWdlRmlsdGVyc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2Vjb3N5c3RlbS9zaGFyZWQnO1xuaW1wb3J0IHsgTW9kYWxPcHRpb25zIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktcGFja2FnZXMtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWNrYWdlcy1saXN0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBQYWNrYWdlc0xpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWxvYWRpbmcgPSBmYWxzZTtcbiAgcmVsb2FkJDogQmVoYXZpb3JTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcblxuICBwYWNrYWdlcyQ6IE9ic2VydmFibGU8SUFwcGxpY2F0aW9uW10+O1xuICBmaWx0ZXJlZFBhY2thZ2VzJDogT2JzZXJ2YWJsZTxGaWx0ZXJhYmxlQXBwT3JQbHVnaW5bXT47XG4gIGxpc3RDbGFzczogc3RyaW5nO1xuICBoYXNBZG1pblBlcm1pc3Npb25zID0gZmFsc2U7XG4gIGVtcHR5U3RhdGVTdWJ0aXRsZSA9IGdldHRleHQoJ0FkZCB5b3VyIGZpcnN0IHBhY2thZ2UgYnkgY2xpY2tpbmcgYmVsb3cuJyk7XG4gIHBhY2thZ2VUeXBlcyA9IGRlZmF1bHRQYWNrYWdlVHlwZXM7XG4gIHBhY2thZ2VBdmFpbGFiaWxpdGllczogKGtleW9mIFBhY2thZ2VGaWx0ZXJzWydhdmFpbGFiaWxpdHknXSlbXSA9IFtcbiAgICBBUFBfU1RBVEUuU1VCU0NSSUJFRC5sYWJlbCxcbiAgICBBUFBfU1RBVEUuQ1VTVE9NLmxhYmVsXG4gIF07XG4gIHBhY2thZ2VDb250ZW50cyA9IGRlZmF1bHRQYWNrYWdlQ29udGVudHM7XG4gIEBWaWV3Q2hpbGQoTGlzdEZpbHRlcnNDb21wb25lbnQpIGZpbHRlcnNDb21wb25lbnQ6IExpc3RGaWx0ZXJzQ29tcG9uZW50O1xuICBwcml2YXRlIGRlc3Ryb3kkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVjb3N5c3RlbVNlcnZpY2U6IEVjb3N5c3RlbVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3aXphcmRNb2RhbFNlcnZpY2U6IFdpemFyZE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uc1xuICApIHtcbiAgICB0aGlzLnBhY2thZ2VzJCA9IHRoaXMucmVsb2FkJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgdGFwKCgpID0+ICh0aGlzLnJlbG9hZGluZyA9IHRydWUpKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0UGFja2FnZUFwcGxpY2F0aW9ucygpKSxcbiAgICAgIHRhcChwYWNrYWdlcyA9PiB7XG4gICAgICAgIHBhY2thZ2VzLmZvckVhY2gocGNrZyA9PiB7XG4gICAgICAgICAgcGNrZy5maWx0ZXJQcm9wcyA9IHRoaXMuZWNvc3lzdGVtU2VydmljZS5nZXRBcHBGaWx0ZXJQcm9wcyhwY2tnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiAodGhpcy5yZWxvYWRpbmcgPSBmYWxzZSkpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5oYXNBZG1pblBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9ucy5oYXNSb2xlKFxuICAgICAgUGVybWlzc2lvbnMuUk9MRV9BUFBMSUNBVElPTl9NQU5BR0VNRU5UX0FETUlOXG4gICAgKTtcbiAgICB0aGlzLmxvYWRQYWNrYWdlcygpO1xuICB9XG5cbiAgbG9hZFBhY2thZ2VzKCkge1xuICAgIHRoaXMucmVsb2FkJC5uZXh0KCk7XG4gIH1cblxuICBhZGRQYWNrYWdlKCkge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBpZDogRWNvc3lzdGVtV2l6YXJkcy5QQUNLQUdFX1VQTE9BRFxuICAgIH07XG4gICAgY29uc3QgbW9kYWxPcHRpb25zOiBNb2RhbE9wdGlvbnMgPSB7IGluaXRpYWxTdGF0ZSB9O1xuXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLndpemFyZE1vZGFsU2VydmljZS5zaG93KG1vZGFsT3B0aW9ucyk7XG4gICAgbW9kYWxSZWYuY29udGVudC5vbkNsb3NlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvYWRQYWNrYWdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHNldEZpbHRlclBpcGUocGlwZTogRmlsdGVyUGlwZSkge1xuICAgIHRoaXMuZmlsdGVyZWRQYWNrYWdlcyQgPSB0aGlzLnBhY2thZ2VzJC5waXBlKHNyYyA9PiBwaXBlKHNyYykpO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuZmlsdGVyc0NvbXBvbmVudD8ucmVzZXRBbGxGaWx0ZXJzKCk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgJ0V4dGVuc2lvbnMnIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInYzh5LWF0b20nXCJcbiAgICBbbGFiZWxdPVwiJ0Vjb3N5c3RlbScgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtpY29uXT1cIidiaWctcGFyY2VsJ1wiXG4gICAgW3BhdGhdPVwiJ2Vjb3N5c3RlbS9leHRlbnNpb24vZXh0ZW5zaW9ucydcIlxuICAgIFtsYWJlbF09XCInRXh0ZW5zaW9ucycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCIncmlnaHQnXCJcbiAgKm5nSWY9XCJoYXNBZG1pblBlcm1pc3Npb25zXCJcbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICB0aXRsZT1cInt7ICdBZGQgZXh0ZW5zaW9uIHBhY2thZ2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBkYXRhLWN5PVwicGFja2FnZXMtbGlzdC0tYWRkLWV4dGVuc2lvbi1wYWNrYWdlXCJcbiAgICAoY2xpY2spPVwiYWRkUGFja2FnZSgpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICB7eyAnQWRkIGV4dGVuc2lvbiBwYWNrYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImxvYWRQYWNrYWdlcygpXCJcbiAgPlxuICAgIDxpXG4gICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmcgfVwiXG4gICAgPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICBpdGVtQ2xhc3M9XCJwLXItOCBwLWwtOFwiXG4+XG4gIDxjOHktbGlzdC1maWx0ZXJzXG4gICAgKm5nSWY9XCJwYWNrYWdlcyQgfCBhc3luY1wiXG4gICAgW3BhY2thZ2VUeXBlc109XCJwYWNrYWdlVHlwZXNcIlxuICAgIFtwYWNrYWdlQXZhaWxhYmlsaXRpZXNdPVwicGFja2FnZUF2YWlsYWJpbGl0aWVzXCJcbiAgICBbcGFja2FnZUNvbnRlbnRzXT1cInBhY2thZ2VDb250ZW50c1wiXG4gICAgKGZpbHRlclBpcGVDaGFuZ2UpPVwic2V0RmlsdGVyUGlwZSgkZXZlbnQpXCJcbiAgPlxuICAgIDxjOHktYXJjaGl2ZWQtZmlsdGVyPjwvYzh5LWFyY2hpdmVkLWZpbHRlcj5cbiAgPC9jOHktbGlzdC1maWx0ZXJzPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gIGl0ZW1DbGFzcz1cIm5hdmJhci1mb3JtIGhpZGRlbi14c1wiXG4+XG4gIDxjOHktbGlzdC1kaXNwbGF5LXN3aXRjaFxuICAgIChvbkxpc3RDbGFzc0NoYW5nZSk9XCJsaXN0Q2xhc3MgPSAkZXZlbnRcIlxuICAgIFtsaXN0TGVuZ3RoXT1cIihwYWNrYWdlcyQgfCBhc3luYyk/Lmxlbmd0aFwiXG4gID48L2M4eS1saXN0LWRpc3BsYXktc3dpdGNoPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWhlbHAgc3JjPVwiL2RvY3Mvc3RhbmRhcmQtdGVuYW50L2Vjb3N5c3RlbS8jZXh0ZW5zaW9uc1wiPjwvYzh5LWhlbHA+XG5cbjxkaXZcbiAgY2xhc3M9XCJjYXJkLWdyb3VwXCJcbiAgW25nQ2xhc3NdPVwibGlzdENsYXNzXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicGFnZS1zdGlja3ktaGVhZGVyIGhpZGRlbi14cyBkLWZsZXggbS1iLThcIlxuICAgICpuZ0lmPVwiKGZpbHRlcmVkUGFja2FnZXMkIHwgYXN5bmMpPy5sZW5ndGggPiAwXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTQwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1hcHBpY29uIHAtbC0zMiBwLXItMTYgbS1yLTAgbS1sLTRcIj48L2Rpdj5cbiAgICAgIHt7ICdQYWNrYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIHAtMCBjYXJkLWNvbHVtbi04MCBtLXItNDBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTgwXCI+e3sgJ0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgY2FyZC1jb2x1bW4tMjBcIj57eyAnVHlwZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrIGNhcmQtY29sdW1uLTIwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTQgY29sLW1kLTNcIlxuICAgICpuZ0Zvcj1cImxldCBhcHAgb2YgZmlsdGVyZWRQYWNrYWdlcyQgfCBhc3luY1wiXG4gID5cbiAgICA8Yzh5LWFwcGxpY2F0aW9uLWNhcmRcbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgICAob25BcHBEZWxldGVkKT1cImxvYWRQYWNrYWdlcygpXCJcbiAgICAgIChvbkFwcENsb25lZCk9XCJsb2FkUGFja2FnZXMoKVwiXG4gICAgICBbYXBwXT1cImFwcFwiXG4gICAgPjwvYzh5LWFwcGxpY2F0aW9uLWNhcmQ+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxjOHktdWktZW1wdHktc3RhdGVcbiAgW2ljb25dPVwiJ2JpZy1wYXJjZWwnXCJcbiAgW3RpdGxlXT1cIidObyBleHRlbnNpb25zIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gIFtzdWJ0aXRsZV09XCJoYXNBZG1pblBlcm1pc3Npb25zID8gKGVtcHR5U3RhdGVTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICpuZ0lmPVwiKHBhY2thZ2VzJCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwXCJcbj5cbiAgPGRpdiAqbmdJZj1cImhhc0FkbWluUGVybWlzc2lvbnNcIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICB0aXRsZT1cInt7ICdBZGQgZXh0ZW5zaW9uIHBhY2thZ2UnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImFkZFBhY2thZ2UoKVwiXG4gICAgPlxuICAgICAge3sgJ0FkZCBleHRlbnNpb24gcGFja2FnZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuPGM4eS11aS1lbXB0eS1zdGF0ZVxuICBbaWNvbl09XCInc2VhcmNoJ1wiXG4gIFt0aXRsZV09XCInTm8gbWF0Y2hpbmcgZXh0ZW5zaW9ucy4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidSZWZpbmUgeW91ciBzZWFyY2ggdGVybXMgYW5kL29yIHRoZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZVwiXG4gICpuZ0lmPVwiKHBhY2thZ2VzJCB8IGFzeW5jKT8ubGVuZ3RoID4gMCAmJiAoZmlsdGVyZWRQYWNrYWdlcyQgfCBhc3luYyk/Lmxlbmd0aCA9PT0gMFwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gICAgdGl0bGU9XCJ7eyAnUmVzZXQgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiXG4gID5cbiAgICB7eyAnUmVzZXQgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cbiJdfQ==