@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
118 lines • 20.4 kB
JavaScript
import { Component, Input, Optional } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { BehaviorSubject } from 'rxjs';
import { distinctUntilChanged, filter, map, shareReplay, switchMap } from 'rxjs/operators';
import { DynamicComponentAlert, DynamicComponentComponent, MeasurementRealtimeService, RangeDisplayModule, gettext } from '@c8y/ngx-components';
import { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';
import { AsyncPipe, NgClass, NgIf } from '@angular/common';
import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@c8y/ngx-components/context-dashboard";
export class LinearGaugeWidgetViewComponent {
constructor(measurementRealtime, dashboard, dynamicComponent) {
this.measurementRealtime = measurementRealtime;
this.dashboard = dashboard;
this.dynamicComponent = dynamicComponent;
this.activeDatapoint$ = new BehaviorSubject(null);
const activeDatapoint = this.activeDatapoint$.pipe(filter(dp => !!dp), map(dp => this.assignContextFromContextDashboard(dp)), distinctUntilChanged());
this.rangeDisplayConfig$ = activeDatapoint.pipe(switchMap(dp => this.getRangeDisplayConfig$(dp)), shareReplay({ refCount: true, bufferSize: 1 }));
this.rangeDisplayConfig$
.pipe(map(data => this.getErrorType(data)), distinctUntilChanged(), takeUntilDestroyed())
.subscribe(inRange => this.updateAlertStatus(inRange));
}
ngOnChanges() {
const activeDp = this.config.datapoints.find(dp => dp.__active);
this.activeDatapoint$.next(activeDp);
}
getRangeDisplayConfig$(dp) {
return this.measurementRealtime
.latestValueOfSpecificMeasurement$(dp.fragment, dp.series, dp.__target, 1, true)
.pipe(map(m => {
if (!m) {
return null;
}
const date = m.time;
const measurement = m[dp.fragment][dp.series];
return {
current: measurement.value,
fractionSize: this.config.fractionSize || 1,
max: dp.max,
min: dp.min,
redRangeMax: dp.redRangeMax,
redRangeMin: dp.redRangeMin,
target: dp.target,
time: date,
yellowRangeMax: dp.yellowRangeMax,
yellowRangeMin: dp.yellowRangeMin,
unit: measurement.unit || dp.unit,
orientation: this.getOrientation()
};
}));
}
assignContextFromContextDashboard(datapoint) {
if (!this.dashboard?.isDeviceTypeDashboard) {
return datapoint;
}
const context = this.dashboard?.context;
if (context?.id) {
const { name, id } = context;
datapoint.__target = { name, id };
}
return datapoint;
}
getOrientation() {
return this.dynamicComponent?.componentId === defaultWidgetIds.LINEAR_GAUGE
? 'horizontal'
: 'vertical';
}
getErrorType(data) {
if (!data) {
return 'NOT_FOUND';
}
if (!this.isInRange(data)) {
return 'OUT_OF_RANGE';
}
return 'NONE';
}
isInRange(data) {
if (!Number.isFinite(data.max) || !Number.isFinite(data.min)) {
// default range is 0-100
return data.current <= 100 && data.current >= 0;
}
return data.current <= data.max && data.current >= data.min;
}
updateAlertStatus(errorType) {
if (!this.alerts) {
return;
}
this.alerts.clear();
let msg;
if (errorType === 'OUT_OF_RANGE') {
msg = gettext('Current value out of defined range.');
}
else if (errorType === 'NOT_FOUND') {
msg = gettext('Configured data point not available on the selected device.');
}
if (!msg) {
return;
}
this.alerts.addAlerts(new DynamicComponentAlert({
type: 'warning',
text: msg
}));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinearGaugeWidgetViewComponent, deps: [{ token: i1.MeasurementRealtimeService }, { token: i2.ContextDashboardComponent, optional: true }, { token: i1.DynamicComponentComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: LinearGaugeWidgetViewComponent, isStandalone: true, selector: "c8y-linear-gauge-widget-view", inputs: { config: "config" }, providers: [MeasurementRealtimeService], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"p-l-16 p-r-16 p-b-16 fit-h d-flex d-col flex-center\"\n *ngIf=\"rangeDisplayConfig$ | async as rangeDisplayConfig\"\n [ngClass]=\"{\n 'p-t-40 j-c-center': rangeDisplayConfig.orientation === 'horizontal',\n }\"\n>\n <c8y-range-display [config]=\"rangeDisplayConfig\" [ngClass]=\"{'flex-grow': rangeDisplayConfig.orientation == 'vertical'}\"></c8y-range-display>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: RangeDisplayModule }, { kind: "component", type: i1.RangeDisplayComponent, selector: "c8y-range-display", inputs: ["config", "display"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LinearGaugeWidgetViewComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-linear-gauge-widget-view', providers: [MeasurementRealtimeService], standalone: true, imports: [NgIf, NgClass, AsyncPipe, RangeDisplayModule], template: "<div\n class=\"p-l-16 p-r-16 p-b-16 fit-h d-flex d-col flex-center\"\n *ngIf=\"rangeDisplayConfig$ | async as rangeDisplayConfig\"\n [ngClass]=\"{\n 'p-t-40 j-c-center': rangeDisplayConfig.orientation === 'horizontal',\n }\"\n>\n <c8y-range-display [config]=\"rangeDisplayConfig\" [ngClass]=\"{'flex-grow': rangeDisplayConfig.orientation == 'vertical'}\"></c8y-range-display>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.MeasurementRealtimeService }, { type: i2.ContextDashboardComponent, decorators: [{
type: Optional
}] }, { type: i1.DynamicComponentComponent, decorators: [{
type: Optional
}] }], propDecorators: { config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2xpbmVhci1nYXVnZS9saW5lYXItZ2F1Z2Utd2lkZ2V0LXZpZXcvbGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2xpbmVhci1nYXVnZS9saW5lYXItZ2F1Z2Utd2lkZ2V0LXZpZXcvbGluZWFyLWdhdWdlLXdpZGdldC12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQWMsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRixPQUFPLEVBRUwscUJBQXFCLEVBRXJCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFFMUIsa0JBQWtCLEVBQ2xCLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBRzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7O0FBVWxGLE1BQU0sT0FBTyw4QkFBOEI7SUFPekMsWUFDVSxtQkFBK0MsRUFDbkMsU0FBb0MsRUFDcEMsZ0JBQTRD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bnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBEeW5hbWljQ29tcG9uZW50LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIER5bmFtaWNDb21wb25lbnRDb21wb25lbnQsXG4gIE1lYXN1cmVtZW50UmVhbHRpbWVTZXJ2aWNlLFxuICBSYW5nZURpc3BsYXksXG4gIFJhbmdlRGlzcGxheU1vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgS1BJRGV0YWlscyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvZGF0YXBvaW50LXNlbGVjdG9yJztcbmltcG9ydCB7IElNZWFzdXJlbWVudFZhbHVlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZGVmYXVsdFdpZGdldElkcyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvd2lkZ2V0cy9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgTGluZWFyR2F1Z2VXaWRnZXRDb25maWcgfSBmcm9tICcuLi9saW5lYXItZ2F1Z2UubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbGluZWFyLWdhdWdlLXdpZGdldC12aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpbmVhci1nYXVnZS13aWRnZXQtdmlldy5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW01lYXN1cmVtZW50UmVhbHRpbWVTZXJ2aWNlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIE5nQ2xhc3MsIEFzeW5jUGlwZSwgUmFuZ2VEaXNwbGF5TW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBMaW5lYXJHYXVnZVdpZGdldFZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIER5bmFtaWNDb21wb25lbnQge1xuICBASW5wdXQoKSBjb25maWc6IExpbmVhckdhdWdlV2lkZ2V0Q29uZmlnO1xuXG4gIHJhbmdlRGlzcGxheUNvbmZpZyQ6IE9ic2VydmFibGU8UmFuZ2VEaXNwbGF5PjtcbiAgYWxlcnRzOiBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yO1xuICBwcml2YXRlIGFjdGl2ZURhdGFwb2ludCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtQSURldGFpbHM+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWVhc3VyZW1lbnRSZWFsdGltZTogTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkYXNoYm9hcmQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50PzogRHluYW1pY0NvbXBvbmVudENvbXBvbmVudFxuICApIHtcbiAgICBjb25zdCBhY3RpdmVEYXRhcG9pbnQgPSB0aGlzLmFjdGl2ZURhdGFwb2ludCQucGlwZShcbiAgICAgIGZpbHRlcihkcCA9PiAhIWRwKSxcbiAgICAgIG1hcChkcCA9PiB0aGlzLmFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkcCkpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gICAgdGhpcy5yYW5nZURpc3BsYXlDb25maWckID0gYWN0aXZlRGF0YXBvaW50LnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoZHAgPT4gdGhpcy5nZXRSYW5nZURpc3BsYXlDb25maWckKGRwKSksXG4gICAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pXG4gICAgKTtcbiAgICB0aGlzLnJhbmdlRGlzcGxheUNvbmZpZyRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoZGF0YSA9PiB0aGlzLmdldEVycm9yVHlwZShkYXRhKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkPFJldHVyblR5cGU8TGluZWFyR2F1Z2VXaWRnZXRWaWV3Q29tcG9uZW50WydnZXRFcnJvclR5cGUnXT4+KCksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZDxSZXR1cm5UeXBlPExpbmVhckdhdWdlV2lkZ2V0Vmlld0NvbXBvbmVudFsnZ2V0RXJyb3JUeXBlJ10+PigpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGluUmFuZ2UgPT4gdGhpcy51cGRhdGVBbGVydFN0YXR1cyhpblJhbmdlKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVEcCA9IHRoaXMuY29uZmlnLmRhdGFwb2ludHMuZmluZChkcCA9PiBkcC5fX2FjdGl2ZSk7XG4gICAgdGhpcy5hY3RpdmVEYXRhcG9pbnQkLm5leHQoYWN0aXZlRHApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSYW5nZURpc3BsYXlDb25maWckKGRwOiBLUElEZXRhaWxzKTogT2JzZXJ2YWJsZTxSYW5nZURpc3BsYXk+IHtcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFJlYWx0aW1lXG4gICAgICAubGF0ZXN0VmFsdWVPZlNwZWNpZmljTWVhc3VyZW1lbnQkKGRwLmZyYWdtZW50LCBkcC5zZXJpZXMsIGRwLl9fdGFyZ2V0LCAxLCB0cnVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChtID0+IHtcbiAgICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkYXRlID0gbS50aW1lO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZSA9IG1bZHAuZnJhZ21lbnRdW2RwLnNlcmllc107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IG1lYXN1cmVtZW50LnZhbHVlLFxuICAgICAgICAgICAgZnJhY3Rpb25TaXplOiB0aGlzLmNvbmZpZy5mcmFjdGlvblNpemUgfHwgMSxcbiAgICAgICAgICAgIG1heDogZHAubWF4LFxuICAgICAgICAgICAgbWluOiBkcC5taW4sXG4gICAgICAgICAgICByZWRSYW5nZU1heDogZHAucmVkUmFuZ2VNYXgsXG4gICAgICAgICAgICByZWRSYW5nZU1pbjogZHAucmVkUmFuZ2VNaW4sXG4gICAgICAgICAgICB0YXJnZXQ6IGRwLnRhcmdldCxcbiAgICAgICAgICAgIHRpbWU6IGRhdGUsXG4gICAgICAgICAgICB5ZWxsb3dSYW5nZU1heDogZHAueWVsbG93UmFuZ2VNYXgsXG4gICAgICAgICAgICB5ZWxsb3dSYW5nZU1pbjogZHAueWVsbG93UmFuZ2VNaW4sXG4gICAgICAgICAgICB1bml0OiBtZWFzdXJlbWVudC51bml0IHx8IGRwLnVuaXQsXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5nZXRPcmllbnRhdGlvbigpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzc2lnbkNvbnRleHRGcm9tQ29udGV4dERhc2hib2FyZChkYXRhcG9pbnQ6IEtQSURldGFpbHMpOiBLUElEZXRhaWxzIHtcbiAgICBpZiAoIXRoaXMuZGFzaGJvYXJkPy5pc0RldmljZVR5cGVEYXNoYm9hcmQpIHtcbiAgICAgIHJldHVybiBkYXRhcG9pbnQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmRhc2hib2FyZD8uY29udGV4dDtcbiAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgaWQgfSA9IGNvbnRleHQ7XG4gICAgICBkYXRhcG9pbnQuX190YXJnZXQgPSB7IG5hbWUsIGlkIH07XG4gICAgfVxuICAgIHJldHVybiBkYXRhcG9pbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldE9yaWVudGF0aW9uKCk6ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNDb21wb25lbnQ/LmNvbXBvbmVudElkID09PSBkZWZhdWx0V2lkZ2V0SWRzLkxJTkVBUl9HQVVHRVxuICAgICAgPyAnaG9yaXpvbnRhbCdcbiAgICAgIDogJ3ZlcnRpY2FsJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JUeXBlKGRhdGE6IFJhbmdlRGlzcGxheSB8IG51bGwpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybiAnTk9UX0ZPVU5EJztcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNJblJhbmdlKGRhdGEpKSB7XG4gICAgICByZXR1cm4gJ09VVF9PRl9SQU5HRSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdOT05FJztcbiAgfVxuXG4gIHByaXZhdGUgaXNJblJhbmdlKGRhdGE6IFJhbmdlRGlzcGxheSk6IGJvb2xlYW4ge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGRhdGEubWF4KSB8fCAhTnVtYmVyLmlzRmluaXRlKGRhdGEubWluKSkge1xuICAgICAgLy8gZGVmYXVsdCByYW5nZSBpcyAwLTEwMFxuICAgICAgcmV0dXJuIGRhdGEuY3VycmVudCA8PSAxMDAgJiYgZGF0YS5jdXJyZW50ID49IDA7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmN1cnJlbnQgPD0gZGF0YS5tYXggJiYgZGF0YS5jdXJyZW50ID49IGRhdGEubWluO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGVydFN0YXR1cyhcbiAgICBlcnJvclR5cGU6IFJldHVyblR5cGU8TGluZWFyR2F1Z2VXaWRnZXRWaWV3Q29tcG9uZW50WydnZXRFcnJvclR5cGUnXT5cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsZXJ0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFsZXJ0cy5jbGVhcigpO1xuICAgIGxldCBtc2c6IHN0cmluZztcbiAgICBpZiAoZXJyb3JUeXBlID09PSAnT1VUX09GX1JBTkdFJykge1xuICAgICAgbXNnID0gZ2V0dGV4dCgnQ3VycmVudCB2YWx1ZSBvdXQgb2YgZGVmaW5lZCByYW5nZS4nKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yVHlwZSA9PT0gJ05PVF9GT1VORCcpIHtcbiAgICAgIG1zZyA9IGdldHRleHQoJ0NvbmZpZ3VyZWQgZGF0YSBwb2ludCBub3QgYXZhaWxhYmxlIG9uIHRoZSBzZWxlY3RlZCBkZXZpY2UuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFtc2cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFsZXJ0cy5hZGRBbGVydHMoXG4gICAgICBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0KHtcbiAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxuICAgICAgICB0ZXh0OiBtc2dcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInAtbC0xNiBwLXItMTYgcC1iLTE2IGZpdC1oIGQtZmxleCBkLWNvbCBmbGV4LWNlbnRlclwiXG4gICpuZ0lmPVwicmFuZ2VEaXNwbGF5Q29uZmlnJCB8IGFzeW5jIGFzIHJhbmdlRGlzcGxheUNvbmZpZ1wiXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAncC10LTQwIGotYy1jZW50ZXInOiByYW5nZURpc3BsYXlDb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyxcbiAgfVwiXG4+XG4gIDxjOHktcmFuZ2UtZGlzcGxheSBbY29uZmlnXT1cInJhbmdlRGlzcGxheUNvbmZpZ1wiIFtuZ0NsYXNzXT1cInsnZmxleC1ncm93JzogcmFuZ2VEaXNwbGF5Q29uZmlnLm9yaWVudGF0aW9uID09ICd2ZXJ0aWNhbCd9XCI+PC9jOHktcmFuZ2UtZGlzcGxheT5cbjwvZGl2PlxuIl19