UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

92 lines 17.6 kB
import { Component, ViewChild } from '@angular/core'; import { gettext, ModalService, Status } from '@c8y/ngx-components'; import { BaseStepperComponent } from '@c8y/ngx-components/operations/bulk-operation-stepper'; import { BulkOperationType } from '@c8y/ngx-components/operations/bulk-operations-service'; import { TranslateService } from '@ngx-translate/core'; import { uniq } from 'lodash-es'; import { SelectSoftwareStepComponent } from './select-software-step.component'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@ngx-translate/core"; import * as i3 from "@c8y/ngx-components/operations/bulk-operation-stepper"; import * as i4 from "./confirm-software-selection-step.component"; import * as i5 from "./select-software-step.component"; export class StepperBulkTypeSoftwareComponent extends BaseStepperComponent { constructor(modal, translate) { super(); this.modal = modal; this.translate = translate; this.type = BulkOperationType.SOFTWARE; this.descriptionTemplateSingle = gettext('Update software to: {{ name }} (version {{ version }})'); this.descriptionTemplateOneOther = gettext('Update software to: {{ name }} (version {{ version }}) and one other'); this.descriptionTemplateMultiple = gettext('Update software to: {{ name }} (version {{ version }}) and {{ count }} others'); this.selectedSoftware = []; } onSoftwareSelected(selectedItem) { this.selectedSoftware = this.selectedSoftware.filter(item => item.software.id !== selectedItem.software.id); this.selectedSoftware.push(selectedItem); } async confirmSoftwareSelection($event) { const deviceTypes = this.getUniqueDeviceTypes(); this.deviceTypes = deviceTypes; if (deviceTypes.length > 1) { try { await this.modal.confirm(gettext('Selected software for various device types'), gettext('Operation may fail due to unsupported software. Do you want to proceed?'), Status.WARNING, { ok: gettext('Confirm'), cancel: gettext('Cancel') }); $event.stepper.next(); } catch (ex) { this.selectedSoftware = []; this.selectSoftware.resetSelection(); } } else { $event.stepper.next(); } } retrieveOperationPrototype() { const softwareList = this.selectedSoftware.map(item => ({ name: item.software.name, version: item.version.c8y_Software.version, url: item.version.c8y_Software.url, action: item.action })); const interpolationParams = { name: softwareList[0].name, version: softwareList[0].version, count: softwareList.length - 1 }; let description; switch (softwareList.length) { case 1: description = this.translate.instant(this.descriptionTemplateSingle, interpolationParams); break; case 2: description = this.translate.instant(this.descriptionTemplateOneOther, interpolationParams); break; default: description = this.translate.instant(this.descriptionTemplateMultiple, interpolationParams); } return { name: gettext('Software update'), prototype: { description, c8y_SoftwareUpdate: softwareList } }; } getUniqueDeviceTypes() { return uniq(this.selectedSoftware .map(item => item.software.c8y_Filter && item.software.c8y_Filter.type) .filter(type => !!type)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepperBulkTypeSoftwareComponent, deps: [{ token: i1.ModalService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StepperBulkTypeSoftwareComponent, selector: "c8y-stepper-bulk-type-software", viewQueries: [{ propertyName: "selectSoftware", first: true, predicate: SelectSoftwareStepComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<c8y-bulk-operation-stepper [type]=\"type\">\n <ng-container\n *customStep=\"\n 'Select software' | translate;\n completed: !!selectedSoftware.length;\n buttonsDisabled: !selectedSoftware.length;\n onNext: confirmSoftwareSelection.bind(this)\n \"\n >\n <c8y-select-software-step\n (software)=\"onSoftwareSelected($event)\"\n class=\"d-contents\"\n ></c8y-select-software-step>\n </ng-container>\n <ng-container *customStep=\"'Confirm selected software' | translate\">\n <c8y-confirm-software-selection-step\n class=\"d-contents\"\n [selectedItems]=\"selectedSoftware\"\n ></c8y-confirm-software-selection-step>\n </ng-container>\n</c8y-bulk-operation-stepper>\n", dependencies: [{ kind: "component", type: i3.BulkOperationStepper, selector: "c8y-bulk-operation-stepper", inputs: ["type"], outputs: ["selectionChange"] }, { kind: "directive", type: i3.CustomStep, selector: "[customStep]", inputs: ["customStep", "customStepCompleted", "customStepButtonsDisabled", "customStepOnNext"] }, { kind: "component", type: i4.ConfirmSoftwareSelectionStepComponent, selector: "c8y-confirm-software-selection-step", inputs: ["selectedItems"] }, { kind: "component", type: i5.SelectSoftwareStepComponent, selector: "c8y-select-software-step", outputs: ["software"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepperBulkTypeSoftwareComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-stepper-bulk-type-software', template: "<c8y-bulk-operation-stepper [type]=\"type\">\n <ng-container\n *customStep=\"\n 'Select software' | translate;\n completed: !!selectedSoftware.length;\n buttonsDisabled: !selectedSoftware.length;\n onNext: confirmSoftwareSelection.bind(this)\n \"\n >\n <c8y-select-software-step\n (software)=\"onSoftwareSelected($event)\"\n class=\"d-contents\"\n ></c8y-select-software-step>\n </ng-container>\n <ng-container *customStep=\"'Confirm selected software' | translate\">\n <c8y-confirm-software-selection-step\n class=\"d-contents\"\n [selectedItems]=\"selectedSoftware\"\n ></c8y-confirm-software-selection-step>\n </ng-container>\n</c8y-bulk-operation-stepper>\n" }] }], ctorParameters: () => [{ type: i1.ModalService }, { type: i2.TranslateService }], propDecorators: { selectSoftware: [{ type: ViewChild, args: [SelectSoftwareStepComponent, { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci1idWxrLXR5cGUtc29mdHdhcmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vb3BlcmF0aW9ucy9zdGVwcGVyLWJ1bGstdHlwZS1zb2Z0d2FyZS9zdGVwcGVyLWJ1bGstdHlwZS1zb2Z0d2FyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL3N0ZXBwZXItYnVsay10eXBlLXNvZnR3YXJlL3N0ZXBwZXItYnVsay10eXBlLXNvZnR3YXJlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJELE9BQU8sRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzdGLE9BQU8sRUFDTCxpQkFBaUIsRUFFbEIsTUFBTSx3REFBd0QsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7O0FBTy9FLE1BQU0sT0FBTyxnQ0FBaUMsU0FBUSxvQkFBb0I7SUFnQnhFLFlBQW9CLEtBQW1CLEVBQVUsU0FBMkI7UUFDMUUsS0FBSyxFQUFFLENBQUM7UUFEVSxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFmbkUsU0FBSSxHQUFzQixpQkFBaUIsQ0FBQyxRQUFRLENBQUM7UUFDckQsOEJBQXlCLEdBQVcsT0FBTyxDQUNsRCx3REFBd0QsQ0FDekQsQ0FBQztRQUNPLGdDQUEyQixHQUFXLE9BQU8sQ0FDcEQsc0VBQXNFLENB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QU87WUFDTCxJQUFJLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQ2hDLFNBQVMsRUFBRTtnQkFDVCxXQUFXO2dCQUNYLGtCQUFrQixFQUFFLFlBQVk7YUFDUjtTQUMzQixDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FDVCxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQzthQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQzFCLENBQUM7SUFDSixDQUFDOytHQXhGVSxnQ0FBZ0M7bUdBQWhDLGdDQUFnQyxzSEFhaEMsMkJBQTJCLHVFQy9CeEMsc3RCQXFCQTs7NEZESGEsZ0NBQWdDO2tCQUo1QyxTQUFTOytCQUNFLGdDQUFnQztnSEFpQjFDLGNBQWM7c0JBRGIsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtTdGVwIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3N0ZXBwZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElPcGVyYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDOHlTdGVwcGVyLCBnZXR0ZXh0LCBNb2RhbFNlcnZpY2UsIFN0YXR1cyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQmFzZVN0ZXBwZXJDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL29wZXJhdGlvbnMvYnVsay1vcGVyYXRpb24tc3RlcHBlcic7XG5pbXBvcnQge1xuICBCdWxrT3BlcmF0aW9uVHlwZSxcbiAgT3BlcmF0aW9uRGV0YWlsc1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL29wZXJhdGlvbnMvYnVsay1vcGVyYXRpb25zLXNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgdW5pcSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTZWxlY3RTb2Z0d2FyZVN0ZXBDb21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1zb2Z0d2FyZS1zdGVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJU2VsZWN0ZWRTb2Z0d2FyZSwgSVNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uUHJvdG90eXBlIH0gZnJvbSAnLi9zZWxlY3Qtc29mdHdhcmUubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc3RlcHBlci1idWxrLXR5cGUtc29mdHdhcmUnLFxuICB0ZW1wbGF0ZVVybDogJ3N0ZXBwZXItYnVsay10eXBlLXNvZnR3YXJlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTdGVwcGVyQnVsa1R5cGVTb2Z0d2FyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VTdGVwcGVyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdHlwZTogQnVsa09wZXJhdGlvblR5cGUgPSBCdWxrT3BlcmF0aW9uVHlwZS5TT0ZUV0FSRTtcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb25UZW1wbGF0ZVNpbmdsZTogc3RyaW5nID0gZ2V0dGV4dChcbiAgICAnVXBkYXRlIHNvZnR3YXJlIHRvOiB7eyBuYW1lIH19ICh2ZXJzaW9uIHt7IHZlcnNpb24gfX0pJ1xuICApO1xuICByZWFkb25seSBkZXNjcmlwdGlvblRlbXBsYXRlT25lT3RoZXI6IHN0cmluZyA9IGdldHRleHQoXG4gICAgJ1VwZGF0ZSBzb2Z0d2FyZSB0bzoge3sgbmFtZSB9fSAodmVyc2lvbiB7eyB2ZXJzaW9uIH19KSBhbmQgb25lIG90aGVyJ1xuICApO1xuICByZWFkb25seSBkZXNjcmlwdGlvblRlbXBsYXRlTXVsdGlwbGU6IHN0cmluZyA9IGdldHRleHQoXG4gICAgJ1VwZGF0ZSBzb2Z0d2FyZSB0bzoge3sgbmFtZSB9fSAodmVyc2lvbiB7eyB2ZXJzaW9uIH19KSBhbmQge3sgY291bnQgfX0gb3RoZXJzJ1xuICApO1xuXG4gIHNlbGVjdGVkU29mdHdhcmU6IElTZWxlY3RlZFNvZnR3YXJlW10gPSBbXTtcbiAgQFZpZXdDaGlsZChTZWxlY3RTb2Z0d2FyZVN0ZXBDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzZWxlY3RTb2Z0d2FyZTogU2VsZWN0U29mdHdhcmVTdGVwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb25Tb2Z0d2FyZVNlbGVjdGVkKHNlbGVjdGVkSXRlbSkge1xuICAgIHRoaXMuc2VsZWN0ZWRTb2Z0d2FyZSA9IHRoaXMuc2VsZWN0ZWRTb2Z0d2FyZS5maWx0ZXIoXG4gICAgICBpdGVtID0+IGl0ZW0uc29mdHdhcmUuaWQgIT09IHNlbGVjdGVkSXRlbS5zb2Z0d2FyZS5pZFxuICAgICk7XG4gICAgdGhpcy5zZWxlY3RlZFNvZnR3YXJlLnB1c2goc2VsZWN0ZWRJdGVtKTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1Tb2Z0d2FyZVNlbGVjdGlvbigkZXZlbnQ6IHsgc3RlcHBlcjogQzh5U3RlcHBlcjsgc3RlcDogQ2RrU3RlcCB9KSB7XG4gICAgY29uc3QgZGV2aWNlVHlwZXM6IHN0cmluZ1tdID0gdGhpcy5nZXRVbmlxdWVEZXZpY2VUeXBlcygpO1xuICAgIHRoaXMuZGV2aWNlVHlwZXMgPSBkZXZpY2VUeXBlcztcbiAgICBpZiAoZGV2aWNlVHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb2RhbC5jb25maXJtKFxuICAgICAgICAgIGdldHRleHQoJ1NlbGVjdGVkIHNvZnR3YXJlIGZvciB2YXJpb3VzIGRldmljZSB0eXBlcycpLFxuICAgICAgICAgIGdldHRleHQoJ09wZXJhdGlvbiBtYXkgZmFpbCBkdWUgdG8gdW5zdXBwb3J0ZWQgc29mdHdhcmUuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/JyksXG4gICAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgICAgeyBvazogZ2V0dGV4dCgnQ29uZmlybScpLCBjYW5jZWw6IGdldHRleHQoJ0NhbmNlbCcpIH1cbiAgICAgICAgKTtcbiAgICAgICAgJGV2ZW50LnN0ZXBwZXIubmV4dCgpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNvZnR3YXJlID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0U29mdHdhcmUucmVzZXRTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgJGV2ZW50LnN0ZXBwZXIubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZXRyaWV2ZU9wZXJhdGlvblByb3RvdHlwZSgpOiBPcGVyYXRpb25EZXRhaWxzIHtcbiAgICBjb25zdCBzb2Z0d2FyZUxpc3Q6IElTb2Z0d2FyZVVwZGF0ZU9wZXJhdGlvblByb3RvdHlwZVtdID0gdGhpcy5zZWxlY3RlZFNvZnR3YXJlLm1hcChpdGVtID0+ICh7XG4gICAgICBuYW1lOiBpdGVtLnNvZnR3YXJlLm5hbWUsXG4gICAgICB2ZXJzaW9uOiBpdGVtLnZlcnNpb24uYzh5X1NvZnR3YXJlLnZlcnNpb24sXG4gICAgICB1cmw6IGl0ZW0udmVyc2lvbi5jOHlfU29mdHdhcmUudXJsLFxuICAgICAgYWN0aW9uOiBpdGVtLmFjdGlvblxuICAgIH0pKTtcblxuICAgIGNvbnN0IGludGVycG9sYXRpb25QYXJhbXM6IG9iamVjdCA9IHtcbiAgICAgIG5hbWU6IHNvZnR3YXJlTGlzdFswXS5uYW1lLFxuICAgICAgdmVyc2lvbjogc29mdHdhcmVMaXN0WzBdLnZlcnNpb24sXG4gICAgICBjb3VudDogc29mdHdhcmVMaXN0Lmxlbmd0aCAtIDFcbiAgICB9O1xuICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHN3aXRjaCAoc29mdHdhcmVMaXN0Lmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBkZXNjcmlwdGlvbiA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5kZXNjcmlwdGlvblRlbXBsYXRlU2luZ2xlLCBpbnRlcnBvbGF0aW9uUGFyYW1zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGRlc2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLmRlc2NyaXB0aW9uVGVtcGxhdGVPbmVPdGhlciwgaW50ZXJwb2xhdGlvblBhcmFtcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZGVzY3JpcHRpb24gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRoaXMuZGVzY3JpcHRpb25UZW1wbGF0ZU11bHRpcGxlLCBpbnRlcnBvbGF0aW9uUGFyYW1zKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZ2V0dGV4dCgnU29mdHdhcmUgdXBkYXRlJyksXG4gICAgICBwcm90b3R5cGU6IHtcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIGM4eV9Tb2Z0d2FyZVVwZGF0ZTogc29mdHdhcmVMaXN0XG4gICAgICB9IGFzIHVua25vd24gYXMgSU9wZXJhdGlvblxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFVuaXF1ZURldmljZVR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdW5pcShcbiAgICAgIHRoaXMuc2VsZWN0ZWRTb2Z0d2FyZVxuICAgICAgICAubWFwKGl0ZW0gPT4gaXRlbS5zb2Z0d2FyZS5jOHlfRmlsdGVyICYmIGl0ZW0uc29mdHdhcmUuYzh5X0ZpbHRlci50eXBlKVxuICAgICAgICAuZmlsdGVyKHR5cGUgPT4gISF0eXBlKVxuICAgICk7XG4gIH1cbn1cbiIsIjxjOHktYnVsay1vcGVyYXRpb24tc3RlcHBlciBbdHlwZV09XCJ0eXBlXCI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqY3VzdG9tU3RlcD1cIlxuICAgICAgJ1NlbGVjdCBzb2Z0d2FyZScgfCB0cmFuc2xhdGU7XG4gICAgICBjb21wbGV0ZWQ6ICEhc2VsZWN0ZWRTb2Z0d2FyZS5sZW5ndGg7XG4gICAgICBidXR0b25zRGlzYWJsZWQ6ICFzZWxlY3RlZFNvZnR3YXJlLmxlbmd0aDtcbiAgICAgIG9uTmV4dDogY29uZmlybVNvZnR3YXJlU2VsZWN0aW9uLmJpbmQodGhpcylcbiAgICBcIlxuICA+XG4gICAgPGM4eS1zZWxlY3Qtc29mdHdhcmUtc3RlcFxuICAgICAgKHNvZnR3YXJlKT1cIm9uU29mdHdhcmVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgPjwvYzh5LXNlbGVjdC1zb2Z0d2FyZS1zdGVwPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciAqY3VzdG9tU3RlcD1cIidDb25maXJtIHNlbGVjdGVkIHNvZnR3YXJlJyB8IHRyYW5zbGF0ZVwiPlxuICAgIDxjOHktY29uZmlybS1zb2Z0d2FyZS1zZWxlY3Rpb24tc3RlcFxuICAgICAgY2xhc3M9XCJkLWNvbnRlbnRzXCJcbiAgICAgIFtzZWxlY3RlZEl0ZW1zXT1cInNlbGVjdGVkU29mdHdhcmVcIlxuICAgID48L2M4eS1jb25maXJtLXNvZnR3YXJlLXNlbGVjdGlvbi1zdGVwPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvYzh5LWJ1bGstb3BlcmF0aW9uLXN0ZXBwZXI+XG4iXX0=