@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
86 lines • 21.2 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { NgForm } from '@angular/forms';
import { gettext } from '@c8y/ngx-components';
import { LWM2MPostOperationsParametersService } from '@c8y/ngx-components/protocol-lwm2m/services';
import { AlertService, CoreModule, CommonModule } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/protocol-lwm2m/services";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
export class LWM2MPostOperationsComponent {
constructor(lwm2mPostOperationsSvc, alertService) {
this.lwm2mPostOperationsSvc = lwm2mPostOperationsSvc;
this.alertService = alertService;
this.exampleCommands = [
{
command: 'discover',
resource: '<objectId>',
description: gettext('Discover all resources of Object 3300, the generic sensor.')
},
{
command: 'read',
resource: '<objectId>/<objectInstanceId>/<resourceId>',
description: gettext('Read maximum sensor value')
},
{
command: 'write',
resource: '<objectId>/<objectInstanceId>/<resourceId> <applicationType>',
description: gettext('Write application type "CO2" to device')
},
{
command: 'execute',
resource: '<objectId>/<objectInstanceId>/<resourceId>',
description: gettext('Reset min and max values')
},
{
command: 'observe',
resource: '<objectId>/<objectInstanceId>/<resourceId>',
description: gettext('Observe sensor value. Causes device to send every new sensor value')
},
{
command: 'writeattr',
resource: '<objectId>/<objectInstanceId>/<resourceId> greater=<value>',
description: gettext('Only send observations if sensor value is higher than 100')
}
];
this.operations = {
commands: '',
type: '',
id: ''
};
}
async ngOnInit() {
this.operations = (await this.getPostOperationsParameters());
}
async save(operations) {
try {
await this.lwm2mPostOperationsSvc.put(operations);
this.alertService.success(gettext('Post-operations saved'));
this.commandsForm.form.markAsPristine();
}
catch (error) {
this.alertService.addServerFailure(error);
}
}
async getPostOperationsParameters() {
try {
const res = await this.lwm2mPostOperationsSvc.get();
return (await res.json());
}
catch (error) {
this.alertService.addServerFailure(error);
return {};
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LWM2MPostOperationsComponent, deps: [{ token: i1.LWM2MPostOperationsParametersService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LWM2MPostOperationsComponent, isStandalone: true, selector: "lwm2m-post-operations", viewQueries: [{ propertyName: "commandsForm", first: true, predicate: ["commandsForm"], descendants: true }], ngImport: i0, template: "<c8y-title>{{ 'LWM2M post-operations' | translate }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [label]=\"'Device types' | translate\"\n [icon]=\"'c8y-device-protocols'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'LWM2M post-operations' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"card content-fullpage card--grid grid__col--7-5--md grid__row--auto-min-content\">\n <div class=\"inner-scroll bg-component\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"h4 m-r-16\" id=\"commands\">\n {{ 'Commands' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <form\n #commandsForm=\"ngForm\"\n id=\"commandsForm\"\n class=\"d-flex d-col flex-grow fit-h\"\n (ngSubmit)=\"save(operations)\"\n >\n <div class=\"form-group\">\n <textarea\n [(ngModel)]=\"operations.commands\"\n class=\"form-control\"\n aria-labelledby=\"commands\"\n name=\"commands\"\n rows=\"20\"\n ></textarea>\n </div>\n </form>\n </div>\n </div>\n\n <div class=\"inner-scroll bg-level-1\" tabindex=\"0\">\n <div class=\"card-block large-padding\">\n <p class=\"m-b-16\">\n <i class=\"text-info m-r-4 text-14\" c8yIcon=\"info-circle\"></i>\n {{\n 'You can enter a set of LWM2M shell commands. Each command will be sent to every newly registered LWM2M device. Each command must be entered in a new line. Use the following syntax for specifying post-registration actions:'\n | translate\n }}\n </p>\n <pre class=\"bg-level-0 text-pre-normal m-b-0\">\n <ul class=\"list-unstyled m-b-0\">\n <li class=\"m-16\" *ngFor=\"let c of exampleCommands\">\n <p class=\"text-muted\"># {{c.description | translate}}</p>\n <span class=\"text-danger\">{{c.command}}</span>\n <span class=\"text-muted\">{{c.resource}}</span>\n </li>\n </ul>\n </pre>\n </div>\n </div>\n\n <div class=\"card-footer large-padding separator grid__col--fullspan\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n form=\"commandsForm\"\n [disabled]=\"commandsForm.valid && !commandsForm.dirty\"\n [attr.aria-label]=\"'Save' | translate\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: CoreModule }, { 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.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LWM2MPostOperationsComponent, decorators: [{
type: Component,
args: [{ selector: 'lwm2m-post-operations', standalone: true, imports: [CommonModule, CoreModule], template: "<c8y-title>{{ 'LWM2M post-operations' | translate }}</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [label]=\"'Device types' | translate\"\n [icon]=\"'c8y-device-protocols'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"'LWM2M post-operations' | translate\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"card content-fullpage card--grid grid__col--7-5--md grid__row--auto-min-content\">\n <div class=\"inner-scroll bg-component\">\n <div class=\"card-header large-padding separator sticky-top\">\n <div class=\"h4 m-r-16\" id=\"commands\">\n {{ 'Commands' | translate }}\n </div>\n </div>\n <div class=\"card-block large-padding\">\n <form\n #commandsForm=\"ngForm\"\n id=\"commandsForm\"\n class=\"d-flex d-col flex-grow fit-h\"\n (ngSubmit)=\"save(operations)\"\n >\n <div class=\"form-group\">\n <textarea\n [(ngModel)]=\"operations.commands\"\n class=\"form-control\"\n aria-labelledby=\"commands\"\n name=\"commands\"\n rows=\"20\"\n ></textarea>\n </div>\n </form>\n </div>\n </div>\n\n <div class=\"inner-scroll bg-level-1\" tabindex=\"0\">\n <div class=\"card-block large-padding\">\n <p class=\"m-b-16\">\n <i class=\"text-info m-r-4 text-14\" c8yIcon=\"info-circle\"></i>\n {{\n 'You can enter a set of LWM2M shell commands. Each command will be sent to every newly registered LWM2M device. Each command must be entered in a new line. Use the following syntax for specifying post-registration actions:'\n | translate\n }}\n </p>\n <pre class=\"bg-level-0 text-pre-normal m-b-0\">\n <ul class=\"list-unstyled m-b-0\">\n <li class=\"m-16\" *ngFor=\"let c of exampleCommands\">\n <p class=\"text-muted\"># {{c.description | translate}}</p>\n <span class=\"text-danger\">{{c.command}}</span>\n <span class=\"text-muted\">{{c.resource}}</span>\n </li>\n </ul>\n </pre>\n </div>\n </div>\n\n <div class=\"card-footer large-padding separator grid__col--fullspan\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n form=\"commandsForm\"\n [disabled]=\"commandsForm.valid && !commandsForm.dirty\"\n [attr.aria-label]=\"'Save' | translate\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.LWM2MPostOperationsParametersService }, { type: i2.AlertService }], propDecorators: { commandsForm: [{
type: ViewChild,
args: ['commandsForm']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHdtMm0tcG9zdC1vcGVyYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb3RvY29sLWx3bTJtL2NvbXBvbmVudHMvcG9zdC1yZWdpc3RyYXRpb24tb3BlcmF0aW9ucy9sd20ybS1wb3N0LW9wZXJhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvdG9jb2wtbHdtMm0vY29tcG9uZW50cy9wb3N0LXJlZ2lzdHJhdGlvbi1vcGVyYXRpb25zL2x3bTJtLXBvc3Qtb3BlcmF0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFTN0UsTUFBTSxPQUFPLDRCQUE0QjtJQTBDdkMsWUFDVSxzQkFBNEQsRUFDNUQsWUFBMEI7UUFEMUIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUFzQztRQUM1RCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXpDcEMsb0JBQWUsR0FBRztZQUNoQjtnQkFDRSxPQUFPLEVBQUUsVUFBVTtnQkFDbkIsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFdBQVcsRUFBRSxPQUFPLENBQUMsNERBQTRELENBQUM7YUFDbkY7WUFDRDtnQkFDRSxPQUFPLEVBQUUsTUFBTTtnQkFDZixRQUFRLEVBQUUsNENBQTRDO2dCQUN0RCxXQUFXLEVBQUUsT0FBTyxDQUFDLDJCQUEyQixDQUFDO2FBQ2xEO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLFFBQVEsRUFBRSw4REFBOEQ7Z0JBQ3hFLFdBQVcsRUFBRSxPQUFPLENBQUMsd0NBQXdDLENBQUM7YUFDL0Q7WUFDRDtnQkFDRSxPQUFPLEVBQUUsU0FBUztnQkFDbEIsUUFBUSxFQUFFLDRDQUE0QztnQkFDdEQsV0FBVyxFQUFFLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQzthQUNqRDtZQUNEO2dCQUNFLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixRQUFRLEVBQUUsNENBQTRDO2dCQUN0RCxXQUFXLEVBQUUsT0FBTyxDQUFDLG9FQUFvRSxDQUFDO2FBQzNGO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLFFBQVEsRUFBRSw0REFBNEQ7Z0JBQ3RFLFdBQVcsRUFBRSxPQUFPLENBQUMsMkRBQTJELENBQUM7YUFDbEY7U0FDRixDQUFDO1FBRUYsZUFBVSxHQUFrQztZQUMxQyxRQUFRLEVBQUUsRUFBRTtZQUNaLElBQUksRUFBRSxFQUFFO1lBQ1IsRUFBRSxFQUFFLEVBQUU7U0FDUCxDQUFDO0lBS0MsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQWtDLENBQUM7SUFDaEcsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBeUM7UUFDbEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLDJCQUEyQjtRQUMvQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQWtDLENBQUM7UUFDN0QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7K0dBckVVLDRCQUE0QjttR0FBNUIsNEJBQTRCLCtMQ2J6QyxzK0VBc0VBLDJDRDNEWSxZQUFZLHNUQUFFLFVBQVU7OzRGQUV2Qiw0QkFBNEI7a0JBTnhDLFNBQVM7K0JBQ0UsdUJBQXVCLGNBRXJCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUM7b0lBR1IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTFdNMk1Qb3N0T3BlcmF0aW9uc1BhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9wcm90b2NvbC1sd20ybS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIENvcmVNb2R1bGUsIENvbW1vbk1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTFdNMk1Qb3N0T3BlcmF0aW9uc1BhcmFtZXRlcnMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3Byb3RvY29sLWx3bTJtL21vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHdtMm0tcG9zdC1vcGVyYXRpb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2x3bTJtLXBvc3Qtb3BlcmF0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvcmVNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIExXTTJNUG9zdE9wZXJhdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKCdjb21tYW5kc0Zvcm0nKSBjb21tYW5kc0Zvcm06IE5nRm9ybTtcblxuICBleGFtcGxlQ29tbWFuZHMgPSBbXG4gICAge1xuICAgICAgY29tbWFuZDogJ2Rpc2NvdmVyJyxcbiAgICAgIHJlc291cmNlOiAnPG9iamVjdElkPicsXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnRGlzY292ZXIgYWxsIHJlc291cmNlcyBvZiBPYmplY3QgMzMwMCwgdGhlIGdlbmVyaWMgc2Vuc29yLicpXG4gICAgfSxcbiAgICB7XG4gICAgICBjb21tYW5kOiAncmVhZCcsXG4gICAgICByZXNvdXJjZTogJzxvYmplY3RJZD4vPG9iamVjdEluc3RhbmNlSWQ+LzxyZXNvdXJjZUlkPicsXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnUmVhZCBtYXhpbXVtIHNlbnNvciB2YWx1ZScpXG4gICAgfSxcbiAgICB7XG4gICAgICBjb21tYW5kOiAnd3JpdGUnLFxuICAgICAgcmVzb3VyY2U6ICc8b2JqZWN0SWQ+LzxvYmplY3RJbnN0YW5jZUlkPi88cmVzb3VyY2VJZD4gPGFwcGxpY2F0aW9uVHlwZT4nLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoJ1dyaXRlIGFwcGxpY2F0aW9uIHR5cGUgXCJDTzJcIiB0byBkZXZpY2UnKVxuICAgIH0sXG4gICAge1xuICAgICAgY29tbWFuZDogJ2V4ZWN1dGUnLFxuICAgICAgcmVzb3VyY2U6ICc8b2JqZWN0SWQ+LzxvYmplY3RJbnN0YW5jZUlkPi88cmVzb3VyY2VJZD4nLFxuICAgICAgZGVzY3JpcHRpb246IGdldHRleHQoJ1Jlc2V0IG1pbiBhbmQgbWF4IHZhbHVlcycpXG4gICAgfSxcbiAgICB7XG4gICAgICBjb21tYW5kOiAnb2JzZXJ2ZScsXG4gICAgICByZXNvdXJjZTogJzxvYmplY3RJZD4vPG9iamVjdEluc3RhbmNlSWQ+LzxyZXNvdXJjZUlkPicsXG4gICAgICBkZXNjcmlwdGlvbjogZ2V0dGV4dCgnT2JzZXJ2ZSBzZW5zb3IgdmFsdWUuIENhdXNlcyBkZXZpY2UgdG8gc2VuZCBldmVyeSBuZXcgc2Vuc29yIHZhbHVlJylcbiAgICB9LFxuICAgIHtcbiAgICAgIGNvbW1hbmQ6ICd3cml0ZWF0dHInLFxuICAgICAgcmVzb3VyY2U6ICc8b2JqZWN0SWQ+LzxvYmplY3RJbnN0YW5jZUlkPi88cmVzb3VyY2VJZD4gZ3JlYXRlcj08dmFsdWU+JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXh0KCdPbmx5IHNlbmQgb2JzZXJ2YXRpb25zIGlmIHNlbnNvciB2YWx1ZSBpcyBoaWdoZXIgdGhhbiAxMDAnKVxuICAgIH1cbiAgXTtcblxuICBvcGVyYXRpb25zOiBMV00yTVBvc3RPcGVyYXRpb25zUGFyYW1ldGVycyA9IHtcbiAgICBjb21tYW5kczogJycsXG4gICAgdHlwZTogJycsXG4gICAgaWQ6ICcnXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsd20ybVBvc3RPcGVyYXRpb25zU3ZjOiBMV00yTVBvc3RPcGVyYXRpb25zUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5vcGVyYXRpb25zID0gKGF3YWl0IHRoaXMuZ2V0UG9zdE9wZXJhdGlvbnNQYXJhbWV0ZXJzKCkpIGFzIExXTTJNUG9zdE9wZXJhdGlvbnNQYXJhbWV0ZXJzO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShvcGVyYXRpb25zOiBMV00yTVBvc3RPcGVyYXRpb25zUGFyYW1ldGVycykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmx3bTJtUG9zdE9wZXJhdGlvbnNTdmMucHV0KG9wZXJhdGlvbnMpO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdQb3N0LW9wZXJhdGlvbnMgc2F2ZWQnKSk7XG4gICAgICB0aGlzLmNvbW1hbmRzRm9ybS5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFBvc3RPcGVyYXRpb25zUGFyYW1ldGVycygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sd20ybVBvc3RPcGVyYXRpb25zU3ZjLmdldCgpO1xuICAgICAgcmV0dXJuIChhd2FpdCByZXMuanNvbigpKSBhcyBMV00yTVBvc3RPcGVyYXRpb25zUGFyYW1ldGVycztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlcnJvcik7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7ICdMV00yTSBwb3N0LW9wZXJhdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2xhYmVsXT1cIidEZXZpY2UgdHlwZXMnIHwgdHJhbnNsYXRlXCJcbiAgICBbaWNvbl09XCInYzh5LWRldmljZS1wcm90b2NvbHMnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIidMV00yTSBwb3N0LW9wZXJhdGlvbnMnIHwgdHJhbnNsYXRlXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGRpdiBjbGFzcz1cImNhcmQgY29udGVudC1mdWxscGFnZSBjYXJkLS1ncmlkIGdyaWRfX2NvbC0tNy01LS1tZCBncmlkX19yb3ctLWF1dG8tbWluLWNvbnRlbnRcIj5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1jb21wb25lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgbGFyZ2UtcGFkZGluZyBzZXBhcmF0b3Igc3RpY2t5LXRvcFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImg0IG0tci0xNlwiIGlkPVwiY29tbWFuZHNcIj5cbiAgICAgICAge3sgJ0NvbW1hbmRzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZ1wiPlxuICAgICAgPGZvcm1cbiAgICAgICAgI2NvbW1hbmRzRm9ybT1cIm5nRm9ybVwiXG4gICAgICAgIGlkPVwiY29tbWFuZHNGb3JtXCJcbiAgICAgICAgY2xhc3M9XCJkLWZsZXggZC1jb2wgZmxleC1ncm93IGZpdC1oXCJcbiAgICAgICAgKG5nU3VibWl0KT1cInNhdmUob3BlcmF0aW9ucylcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvcGVyYXRpb25zLmNvbW1hbmRzXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cImNvbW1hbmRzXCJcbiAgICAgICAgICAgIG5hbWU9XCJjb21tYW5kc1wiXG4gICAgICAgICAgICByb3dzPVwiMjBcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbCBiZy1sZXZlbC0xXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgbGFyZ2UtcGFkZGluZ1wiPlxuICAgICAgPHAgY2xhc3M9XCJtLWItMTZcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJ0ZXh0LWluZm8gbS1yLTQgdGV4dC0xNFwiIGM4eUljb249XCJpbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAge3tcbiAgICAgICAgICAnWW91IGNhbiBlbnRlciBhIHNldCBvZiBMV00yTSBzaGVsbCBjb21tYW5kcy4gRWFjaCBjb21tYW5kIHdpbGwgYmUgc2VudCB0byBldmVyeSBuZXdseSByZWdpc3RlcmVkIExXTTJNIGRldmljZS4gRWFjaCBjb21tYW5kIG11c3QgYmUgZW50ZXJlZCBpbiBhIG5ldyBsaW5lLiBVc2UgdGhlIGZvbGxvd2luZyBzeW50YXggZm9yIHNwZWNpZnlpbmcgcG9zdC1yZWdpc3RyYXRpb24gYWN0aW9uczonXG4gICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICB9fVxuICAgICAgPC9wPlxuICAgICAgPHByZSBjbGFzcz1cImJnLWxldmVsLTAgdGV4dC1wcmUtbm9ybWFsIG0tYi0wXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgbS1iLTBcIj5cbiAgICAgICAgICA8bGkgY2xhc3M9XCJtLTE2XCIgKm5nRm9yPVwibGV0IGMgb2YgZXhhbXBsZUNvbW1hbmRzXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj4jIHt7Yy5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7Yy5jb21tYW5kfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWRcIj57e2MucmVzb3VyY2V9fTwvc3Bhbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9wcmU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBsYXJnZS1wYWRkaW5nIHNlcGFyYXRvciBncmlkX19jb2wtLWZ1bGxzcGFuXCI+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBmb3JtPVwiY29tbWFuZHNGb3JtXCJcbiAgICAgIFtkaXNhYmxlZF09XCJjb21tYW5kc0Zvcm0udmFsaWQgJiYgIWNvbW1hbmRzRm9ybS5kaXJ0eVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTYXZlJyB8IHRyYW5zbGF0ZVwiXG4gICAgPlxuICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=