UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

109 lines 24.1 kB
import { Component, forwardRef, Input } from '@angular/core'; import { FormBuilder, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { take } from 'rxjs/operators'; import { AlarmEventAttributesFormService } from './alarm-event-attributes-form.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "./alarm-event-attributes-form.service"; import * as i3 from "@angular/common"; import * as i4 from "@c8y/ngx-components"; export class AlarmEventAttributesFormComponent { constructor(formBuilder, alarmEventAttributesFormService) { this.formBuilder = formBuilder; this.alarmEventAttributesFormService = alarmEventAttributesFormService; this.omitProperties = {}; this.selectedItems = []; this.datapoints = []; } ngOnInit() { this.formGroup = this.formBuilder.group({ filters: this.formBuilder.group({ type: new FormControl('', [ Validators.required, this.alarmEventAttributesFormService.duplicateTypeValidator(this.selectedItems) ]) }), timelineType: new FormControl(''), selectedDatapoint: new FormControl(null) }); if (!this.omitProperties.label) { this.formGroup.addControl('label', new FormControl('', Validators.required)); } if (this.datapoints?.length > 0) { this.filterKpis(); } } validate(_control) { return this.formGroup?.valid ? null : { formInvalid: {} }; } writeValue(obj) { this.formGroup.patchValue(obj); } registerOnChange(fn) { this.formGroup.valueChanges.subscribe(fn); } registerOnTouched(fn) { this.formGroup.valueChanges.pipe(take(1)).subscribe(fn); } setDisabledState(isDisabled) { isDisabled ? this.formGroup.disable() : this.formGroup.enable(); } changeDatapointSelection(event) { const selectElement = event.target; const selectedIndex = selectElement.selectedIndex; const selectedDatapoint = this.datapoints[selectedIndex]; const trimmedDatapoint = { target: selectedDatapoint.__target.id, fragment: selectedDatapoint.fragment, series: selectedDatapoint.series }; this.formGroup.patchValue({ selectedDatapoint: trimmedDatapoint }); } trackByFn(_index, item) { return `${item.fragment}-${item.series}-${item.__target?.id}`; } filterKpis() { if (this.target && this.target.id) { this.datapoints = this.datapoints.filter(dp => dp.__target?.id === this.target.id); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmEventAttributesFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.AlarmEventAttributesFormService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AlarmEventAttributesFormComponent, selector: "c8y-alarm-event-attributes-form", inputs: { timelineType: "timelineType", omitProperties: "omitProperties", selectedItems: "selectedItems", target: "target", datapoints: "datapoints" }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AlarmEventAttributesFormComponent), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => AlarmEventAttributesFormComponent), multi: true } ], ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"formGroup.controls.label\"\n >\n <label class=\"m-0\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example: timelineType === 'ALARM' ? 'Alarm unavailable' : 'Location update'\n }\n \"\n />\n </c8y-form-group>\n\n <div formGroupName=\"filters\">\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"m-0\">{{ 'Type' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"type\"\n formControlName=\"type\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n timelineType === 'ALARM' ? 'c8y_UnavailabilityAlarm' : 'c8y_LocationUpdate'\n }\n \"\n />\n <c8y-messages>\n <c8y-message\n name=\"duplicateType\"\n [text]=\"'Type already used.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"datapoints?.length > 0\"\n >\n <label>{{ 'Select data point' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n (change)=\"changeDatapointSelection($event)\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n *ngFor=\"let datapoint of datapoints; trackBy: trackByFn\"\n [ngValue]=\"{\n target: datapoint.__target.id,\n fragment: datapoint.fragment,\n series: datapoint.series\n }\"\n [selected]=\"\n datapoint.__target.id === formGroup.value.selectedDatapoint?.target &&\n datapoint.fragment === formGroup.value.selectedDatapoint?.fragment &&\n datapoint.series === formGroup.value.selectedDatapoint?.series\n \"\n >\n {{ datapoint?.label }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i4.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AlarmEventAttributesFormComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-alarm-event-attributes-form', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AlarmEventAttributesFormComponent), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => AlarmEventAttributesFormComponent), multi: true } ], template: "<div [formGroup]=\"formGroup\">\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"formGroup.controls.label\"\n >\n <label class=\"m-0\">{{ 'Label' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"label\"\n formControlName=\"label\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example: timelineType === 'ALARM' ? 'Alarm unavailable' : 'Location update'\n }\n \"\n />\n </c8y-form-group>\n\n <div formGroupName=\"filters\">\n <c8y-form-group class=\"form-group-sm\">\n <label class=\"m-0\">{{ 'Type' | translate }}</label>\n <input\n class=\"form-control flex-grow\"\n name=\"type\"\n formControlName=\"type\"\n [placeholder]=\"\n 'e.g. {{ example }}'\n | translate\n : {\n example:\n timelineType === 'ALARM' ? 'c8y_UnavailabilityAlarm' : 'c8y_LocationUpdate'\n }\n \"\n />\n <c8y-messages>\n <c8y-message\n name=\"duplicateType\"\n [text]=\"'Type already used.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group\n class=\"form-group-sm\"\n *ngIf=\"datapoints?.length > 0\"\n >\n <label>{{ 'Select data point' | translate }}</label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control input-sm\"\n (change)=\"changeDatapointSelection($event)\"\n >\n <option\n title=\"{{ 'Widget configuration' | translate }}\"\n *ngFor=\"let datapoint of datapoints; trackBy: trackByFn\"\n [ngValue]=\"{\n target: datapoint.__target.id,\n fragment: datapoint.fragment,\n series: datapoint.series\n }\"\n [selected]=\"\n datapoint.__target.id === formGroup.value.selectedDatapoint?.target &&\n datapoint.fragment === formGroup.value.selectedDatapoint?.fragment &&\n datapoint.series === formGroup.value.selectedDatapoint?.series\n \"\n >\n {{ datapoint?.label }}\n </option>\n </select>\n </div>\n </c8y-form-group>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.AlarmEventAttributesFormService }], propDecorators: { timelineType: [{ type: Input }], omitProperties: [{ type: Input }], selectedItems: [{ type: Input }], target: [{ type: Input }], datapoints: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FsYXJtLWV2ZW50LXNlbGVjdG9yL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS9hbGFybS1ldmVudC1hdHRyaWJ1dGVzLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vYWxhcm0tZXZlbnQtc2VsZWN0b3IvYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUdMLFdBQVcsRUFDWCxXQUFXLEVBRVgsYUFBYSxFQUNiLGlCQUFpQixFQUdqQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7OztBQTJCeEYsTUFBTSxPQUFPLGlDQUFpQztJQVE1QyxZQUNVLFdBQXdCLEVBQ3hCLCtCQUFnRTtRQURoRSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQ0FBK0IsR0FBL0IsK0JBQStCLENBQWlDO1FBUmpFLG1CQUFjLEdBQTJCLEVBQUUsQ0FBQztRQUM1QyxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFFbkMsZUFBVSxHQUFpQixFQUFFLENBQUM7SUFNcEMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxFQUFFLElB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TSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7SUFDSCxDQUFDOytHQTFFVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyxrTkFiakM7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlDQUFpQyxDQUFDO2dCQUNoRSxLQUFLLEVBQUUsSUFBSTthQUNaO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUM7Z0JBQ2hFLEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRiwwQkN2Q0gsa3dFQTJFQTs7NEZEbENhLGlDQUFpQztrQkFoQjdDLFNBQVM7K0JBQ0UsaUNBQWlDLGFBRWhDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtDQUFrQyxDQUFDOzRCQUNoRSxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0NBQWtDLENBQUM7NEJBQ2hFLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzhIQUdRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQnVpbGRlcixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZSB9IGZyb20gJy4vYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQWxhcm1PckV2ZW50LFxuICBPbWl0U2VsZWN0b3JQcm9wZXJ0aWVzLFxuICBTZWxlY3RlZERhdGFwb2ludCxcbiAgVGltZWxpbmVUeXBlXG59IGZyb20gJy4uL2FsYXJtLWV2ZW50LXNlbGVjdG9yLm1vZGVsJztcbmltcG9ydCB7IElJZGVudGlmaWVkIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IEFsYXJtRXZlbnRBdHRyaWJ1dGVGb3JtIH0gZnJvbSAnLi9hbGFybS1ldmVudC1hdHRyaWJ1dGVzLWZvcm0ubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYWxhcm0tZXZlbnQtYXR0cmlidXRlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FsYXJtLWV2ZW50LWF0dHJpYnV0ZXMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFsYXJtRXZlbnRBdHRyaWJ1dGVzRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHRpbWVsaW5lVHlwZTogVGltZWxpbmVUeXBlO1xuICBASW5wdXQoKSBvbWl0UHJvcGVydGllczogT21pdFNlbGVjdG9yUHJvcGVydGllcyA9IHt9O1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBBbGFybU9yRXZlbnRbXSA9IFtdO1xuICBASW5wdXQoKSB0YXJnZXQ6IElJZGVudGlmaWVkO1xuICBASW5wdXQoKSBkYXRhcG9pbnRzOiBLUElEZXRhaWxzW10gPSBbXTtcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXA8QWxhcm1FdmVudEF0dHJpYnV0ZUZvcm0+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgYWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZTogQWxhcm1FdmVudEF0dHJpYnV0ZXNGb3JtU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGZpbHRlcnM6IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICB0eXBlOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgdGhpcy5hbGFybUV2ZW50QXR0cmlidXRlc0Zvcm1TZXJ2aWNlLmR1cGxpY2F0ZVR5cGVWYWxpZGF0b3IodGhpcy5zZWxlY3RlZEl0ZW1zKVxuICAgICAgICBdKVxuICAgICAgfSksXG4gICAgICB0aW1lbGluZVR5cGU6IG5ldyBGb3JtQ29udHJvbDxUaW1lbGluZVR5cGU+KCcnIGFzIFRpbWVsaW5lVHlwZSksXG4gICAgICBzZWxlY3RlZERhdGFwb2ludDogbmV3IEZvcm1Db250cm9sPG51bGwgfCBTZWxlY3RlZERhdGFwb2ludD4obnVsbClcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5vbWl0UHJvcGVydGllcy5sYWJlbCkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuYWRkQ29udHJvbCgnbGFiZWwnLCBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YXBvaW50cz8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5maWx0ZXJLcGlzKCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cD8udmFsaWQgPyBudWxsIDogeyBmb3JtSW52YWxpZDoge30gfTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKG9iaik7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKGZuKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Hcm91cC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaXNEaXNhYmxlZCA/IHRoaXMuZm9ybUdyb3VwLmRpc2FibGUoKSA6IHRoaXMuZm9ybUdyb3VwLmVuYWJsZSgpO1xuICB9XG5cbiAgY2hhbmdlRGF0YXBvaW50U2VsZWN0aW9uKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IHNlbGVjdEVsZW1lbnQuc2VsZWN0ZWRJbmRleDtcbiAgICBjb25zdCBzZWxlY3RlZERhdGFwb2ludCA9IHRoaXMuZGF0YXBvaW50c1tzZWxlY3RlZEluZGV4XTtcbiAgICBjb25zdCB0cmltbWVkRGF0YXBvaW50ID0ge1xuICAgICAgdGFyZ2V0OiBzZWxlY3RlZERhdGFwb2ludC5fX3RhcmdldC5pZCBhcyBzdHJpbmcsXG4gICAgICBmcmFnbWVudDogc2VsZWN0ZWREYXRhcG9pbnQuZnJhZ21lbnQsXG4gICAgICBzZXJpZXM6IHNlbGVjdGVkRGF0YXBvaW50LnNlcmllc1xuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHsgc2VsZWN0ZWREYXRhcG9pbnQ6IHRyaW1tZWREYXRhcG9pbnQgfSk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIGl0ZW06IEtQSURldGFpbHMpIHtcbiAgICByZXR1cm4gYCR7aXRlbS5mcmFnbWVudH0tJHtpdGVtLnNlcmllc30tJHtpdGVtLl9fdGFyZ2V0Py5pZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJLcGlzKCkge1xuICAgIGlmICh0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5pZCkge1xuICAgICAgdGhpcy5kYXRhcG9pbnRzID0gdGhpcy5kYXRhcG9pbnRzLmZpbHRlcihkcCA9PiBkcC5fX3RhcmdldD8uaWQgPT09IHRoaXMudGFyZ2V0LmlkKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cbiAgPGM4eS1mb3JtLWdyb3VwXG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtXCJcbiAgICAqbmdJZj1cImZvcm1Hcm91cC5jb250cm9scy5sYWJlbFwiXG4gID5cbiAgICA8bGFiZWwgY2xhc3M9XCJtLTBcIj57eyAnTGFiZWwnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZ3Jvd1wiXG4gICAgICBuYW1lPVwibGFiZWxcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBleGFtcGxlOiB0aW1lbGluZVR5cGUgPT09ICdBTEFSTScgPyAnQWxhcm0gdW5hdmFpbGFibGUnIDogJ0xvY2F0aW9uIHVwZGF0ZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgXCJcbiAgICAvPlxuICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gIDxkaXYgZm9ybUdyb3VwTmFtZT1cImZpbHRlcnNcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJtLTBcIj57eyAnVHlwZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZsZXgtZ3Jvd1wiXG4gICAgICAgIG5hbWU9XCJ0eXBlXCJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBleGFtcGxlOlxuICAgICAgICAgICAgICAgICAgICB0aW1lbGluZVR5cGUgPT09ICdBTEFSTScgPyAnYzh5X1VuYXZhaWxhYmlsaXR5QWxhcm0nIDogJ2M4eV9Mb2NhdGlvblVwZGF0ZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFwiXG4gICAgICAvPlxuICAgICAgPGM4eS1tZXNzYWdlcz5cbiAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgbmFtZT1cImR1cGxpY2F0ZVR5cGVcIlxuICAgICAgICAgIFt0ZXh0XT1cIidUeXBlIGFscmVhZHkgdXNlZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cblxuICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICBjbGFzcz1cImZvcm0tZ3JvdXAtc21cIlxuICAgICpuZ0lmPVwiZGF0YXBvaW50cz8ubGVuZ3RoID4gMFwiXG4gID5cbiAgICA8bGFiZWw+e3sgJ1NlbGVjdCBkYXRhIHBvaW50JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgPHNlbGVjdFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC1zbVwiXG4gICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlRGF0YXBvaW50U2VsZWN0aW9uKCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnV2lkZ2V0IGNvbmZpZ3VyYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YXBvaW50IG9mIGRhdGFwb2ludHM7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgW25nVmFsdWVdPVwie1xuICAgICAgICAgICAgdGFyZ2V0OiBkYXRhcG9pbnQuX190YXJnZXQuaWQsXG4gICAgICAgICAgICBmcmFnbWVudDogZGF0YXBvaW50LmZyYWdtZW50LFxuICAgICAgICAgICAgc2VyaWVzOiBkYXRhcG9pbnQuc2VyaWVzXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW3NlbGVjdGVkXT1cIlxuICAgICAgICAgICAgZGF0YXBvaW50Ll9fdGFyZ2V0LmlkID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LnRhcmdldCAmJlxuICAgICAgICAgICAgZGF0YXBvaW50LmZyYWdtZW50ID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LmZyYWdtZW50ICYmXG4gICAgICAgICAgICBkYXRhcG9pbnQuc2VyaWVzID09PSBmb3JtR3JvdXAudmFsdWUuc2VsZWN0ZWREYXRhcG9pbnQ/LnNlcmllc1xuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBkYXRhcG9pbnQ/LmxhYmVsIH19XG4gICAgICAgIDwvb3B0aW9uPlxuICAgICAgPC9zZWxlY3Q+XG4gICAgPC9kaXY+XG4gIDwvYzh5LWZvcm0tZ3JvdXA+XG48L2Rpdj5cbiJdfQ==