@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
349 lines • 43.7 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { InventoryService } from '@c8y/client';
import { gettext } from '@c8y/ngx-components';
import { TranslateService } from '@ngx-translate/core';
import { from } from 'rxjs';
import { map, mergeMap, tap, toArray } from 'rxjs/operators';
import { WidgetService } from '../widget.service';
import { ContextDashboardComponent } from '../context-dashboard.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "../widget.service";
import * as i3 from "@ngx-translate/core";
import * as i4 from "@c8y/client";
import * as i5 from "@angular/common";
import * as i6 from "@c8y/ngx-components";
import * as i7 from "../context-dashboard.component";
export class DeviceInfoDashboardComponent {
constructor(router, widgetService, translateService, inventoryService) {
this.router = router;
this.widgetService = widgetService;
this.translateService = translateService;
this.inventoryService = inventoryService;
this.isLoading = true;
this.dashboardName = '';
this.DEVICE_INFO_WIDGETS = [
{
name: 'deviceStatusWidget',
title: gettext('Device status'),
_x: 0,
_y: 0,
_height: 5,
_width: 8
},
{
name: 'Data points graph',
title: gettext('Device and communication'),
_x: 8,
_y: 0,
_height: 5,
_width: 16,
config: {
interval: 'hours',
aggregation: 'NONE',
realtime: true,
datapointsInitialDisplayLimit: 3,
datapoints: [
{
fragment: 'c8y_Battery',
series: 'level',
label: this.translateService.instant('Battery: level'),
unit: '%',
renderType: 'min',
lineType: 'line',
color: '#5e07b3',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'rssi',
label: this.translateService.instant('Signal: RSSI'),
unit: 'dBm',
renderType: 'min',
lineType: 'line',
color: '#a7d0f1',
__active: true
},
{
fragment: 'c8y_MemoryMeasurement',
series: 'Used',
label: this.translateService.instant('Memory: used'),
unit: 'MB',
renderType: 'min',
lineType: 'line',
color: '#f75229',
__active: true
},
{
fragment: 'c8y_CPUMeasurement',
series: 'Workload',
label: this.translateService.instant('CPU: workload'),
unit: '%',
renderType: 'min',
lineType: 'line',
color: '#b24f3e',
__active: true
},
{
fragment: 'c8y_NetworkStatistics',
series: 'Upload',
label: this.translateService.instant('Network: upload'),
unit: 'KB/s',
renderType: 'min',
lineType: 'line',
color: '#88c039',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'RCSP',
label: this.translateService.instant('Signal: RCSP'),
renderType: 'min',
lineType: 'line',
color: '#5e2f19',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'RSCP',
label: this.translateService.instant('Signal: RSCP'),
renderType: 'min',
lineType: 'line',
color: '#5e2f19',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'RSRP',
label: this.translateService.instant('Signal: RSRP'),
renderType: 'min',
lineType: 'line',
color: '#43ba3b',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'RSRQ',
label: this.translateService.instant('Signal: RSRQ'),
renderType: 'min',
lineType: 'line',
color: '#14b0b3',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'ber',
label: this.translateService.instant('Signal: BER'),
unit: '%',
renderType: 'min',
lineType: 'line',
color: '#44ff33',
__active: true
},
{
fragment: 'c8y_SignalStrength',
series: 'ECN0',
label: this.translateService.instant('Signal: ECN0'),
renderType: 'min',
lineType: 'line',
color: '#873efa',
__active: true
},
{
fragment: 'c8y_NetworkStatistics',
series: 'Download',
label: this.translateService.instant('Network: download'),
unit: 'KB/s',
renderType: 'min',
lineType: 'line',
color: '#f27a45',
__active: true
},
{
fragment: 'c8y_MemoryMeasurement',
series: 'Total',
label: this.translateService.instant('Memory: total'),
unit: 'MB',
renderType: 'min',
lineType: 'line',
color: '#dadd8c',
__active: true
}
],
alarmsEventsConfigs: [
{
label: 'c8y_LocationUpdate',
timelineType: 'EVENT',
color: '#6f6cd0',
filters: {
type: 'c8y_LocationUpdate'
},
__active: true
},
{
label: 'c8y_UnavailabilityAlarm',
timelineType: 'ALARM',
color: '#375bf2',
filters: {
type: 'c8y_UnavailabilityAlarm'
},
__active: true
}
]
}
},
{
name: 'Asset Properties',
title: gettext('Device data'),
config: {
options: {
properties: [
{
id: 'c8ySchema!!id',
__active: true,
keyPath: ['id'],
type: 'string',
label: 'ID'
},
{
id: 'c8ySchema!!name',
__active: true,
keyPath: ['name'],
type: 'string',
label: 'Name'
},
{
id: 'c8ySchema!!type',
__active: true,
keyPath: ['type'],
type: 'string',
label: 'Type'
},
{
id: 'c8ySchema!!lastUpdated',
__active: true,
keyPath: ['lastUpdated'],
type: 'string',
label: 'Last Updated'
},
{
id: 'c8ySchema!!creationTime',
__active: true,
keyPath: ['creationTime'],
type: 'string',
label: 'Creation Time'
}
],
allowDisplayAndEditKnownProperties: false,
hiddenPropertiesKeyPaths: ['owner']
}
},
_x: 0,
_y: 5,
_height: 8,
_width: 8
},
{
name: 'Alarm list',
title: gettext('Active, critical alarms'),
_x: 8,
_y: 5,
_height: 4,
_width: 8,
config: {
options: {
orderMode: 'ACTIVE_FIRST',
severity: { CRITICAL: true },
status: {
ACTIVE: true,
ACKNOWLEDGED: false,
CLEARED: false
},
types: []
}
}
},
{
name: 'deviceGroupAssignmentWidget',
title: gettext('Group assignment'),
_x: 16,
_y: 5,
_height: 4,
_width: 8
},
{
componentId: 'Map',
title: gettext('Location'),
_x: 8,
_y: 9,
_height: 4,
_width: 16
}
];
}
ngOnInit() {
this.contextSubscription = this.router.parent.data
.pipe(tap(({ contextData }) => {
const contextNameValid = contextData.name && contextData.name.trim();
this.title = contextNameValid ? contextData.name : contextData.id;
this.dashboardName = `${contextData.id}-device-info`;
}))
.subscribe(async (data) => {
this.currentContext = data;
this.addDeviceTargetForDP(data.contextData.id, data.contextData.name);
});
this.widgetsSubscription = from(this.DEVICE_INFO_WIDGETS)
.pipe(mergeMap(widget => this.widgetService.mapLegacy(widget)), map(widget => {
let device = this.router.parent.snapshot.data.contextData;
if (device) {
device = {
name: device.name,
id: device.id
};
}
return {
...widget,
config: {
...widget.config,
device
}
};
}), toArray())
.subscribe(async (data) => {
await this.filterSupportedSeriesForDP(this.currentContext.contextData.id, data);
this.widgetsList = data;
this.isLoading = false;
});
}
addDeviceTargetForDP(id, name) {
const dpWidget = this.DEVICE_INFO_WIDGETS.filter(item => item.name == 'Data points graph')[0];
// Add target to dataPoint config
dpWidget.config.datapoints.map(item => (item['__target'] = { id, name }));
// Add target to alarmEvents Config
dpWidget.config.alarmsEventsConfigs.map(item => (item['__target'] = { id, name }));
}
async filterSupportedSeriesForDP(id, widgets) {
const supportedMeasurements = await this.inventoryService.getMeasurementsAndSeries(id);
const isDataPointSupported = dp => supportedMeasurements.some(({ fragment, series }) => dp.fragment === fragment && dp.series === series);
const dpWidget = widgets.find(({ name }) => name === 'Data points graph');
dpWidget.config.datapoints = dpWidget.config.datapoints.filter(isDataPointSupported);
}
ngOnDestroy() {
this.widgetsSubscription.unsubscribe();
this.contextSubscription.unsubscribe();
}
canDeactivate() {
return this.contextDashboard?.canDeactivate();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceInfoDashboardComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.WidgetService }, { token: i3.TranslateService }, { token: i4.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DeviceInfoDashboardComponent, selector: "c8y-device-info-dashboard-dashboard", viewQueries: [{ propertyName: "contextDashboard", first: true, predicate: ContextDashboardComponent, descendants: true }], ngImport: i0, template: "<div *ngIf=\"!isLoading\">\n <c8y-title>\n {{ title }}\n </c8y-title>\n <c8y-context-dashboard\n [translateWidgetTitle]=\"true\"\n [name]=\"dashboardName\"\n [context]=\"currentContext\"\n [defaultWidgets]=\"widgetsList\"\n [canDelete]=\"false\"\n [hideAvailability]=\"true\"\n [canCopy]=\"false\"\n ></c8y-context-dashboard>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: i7.ContextDashboardComponent, selector: "c8y-context-dashboard", inputs: ["name", "childrenClasses", "context", "setTitle", "defaultWidgets", "canCopy", "canDelete", "isLoading", "breadcrumbSettings", "showContextHelpButton", "translateWidgetTitle", "hideAvailability"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DeviceInfoDashboardComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-device-info-dashboard-dashboard', template: "<div *ngIf=\"!isLoading\">\n <c8y-title>\n {{ title }}\n </c8y-title>\n <c8y-context-dashboard\n [translateWidgetTitle]=\"true\"\n [name]=\"dashboardName\"\n [context]=\"currentContext\"\n [defaultWidgets]=\"widgetsList\"\n [canDelete]=\"false\"\n [hideAvailability]=\"true\"\n [canCopy]=\"false\"\n ></c8y-context-dashboard>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.WidgetService }, { type: i3.TranslateService }, { type: i4.InventoryService }], propDecorators: { contextDashboard: [{
type: ViewChild,
args: [ContextDashboardComponent, { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWluZm8tZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2RldmljZS1pbmZvLWRhc2hib2FyZC9kZXZpY2UtaW5mby1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29udGV4dC1kYXNoYm9hcmQvZGV2aWNlLWluZm8tZGFzaGJvYXJkL2RldmljZS1pbmZvLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBZSxPQUFPLEVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7QUFNM0UsTUFBTSxPQUFPLDRCQUE0QjtJQThRdkMsWUFDVSxNQUFzQixFQUN0QixhQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsZ0JBQWtDO1FBSGxDLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMscUJBQWdC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RUFBRSxDQUFDLENBQUM7UUFDdkYsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUNoQyxxQkFBcUIsQ0FBQyxJQUFJLENBQ3hCLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUMzRSxDQUFDO1FBQ0osTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2hELENBQUM7K0dBeFZVLDRCQUE0QjttR0FBNUIsNEJBQTRCLDZIQVE1Qix5QkFBeUIsZ0RDdkJ0Qyw2V0FjQTs7NEZEQ2EsNEJBQTRCO2tCQUp4QyxTQUFTOytCQUNFLHFDQUFxQzs2S0FZL0MsZ0JBQWdCO3NCQURmLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDb250ZXh0RGF0YSwgZ2V0dGV4dCwgV2lkZ2V0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBmcm9tLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VNYXAsIHRhcCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFdpZGdldFNlcnZpY2UgfSBmcm9tICcuLi93aWRnZXQuc2VydmljZSc7XG5pbXBvcnQgeyBDYW5EZWFjdGl2YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbnRleHQtZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kZXZpY2UtaW5mby1kYXNoYm9hcmQtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RldmljZS1pbmZvLWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGV2aWNlSW5mb0Rhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIENhbkRlYWN0aXZhdGVDb21wb25lbnQge1xuICBpc0xvYWRpbmcgPSB0cnVlO1xuICB0aXRsZTogc3RyaW5nO1xuICBkYXNoYm9hcmROYW1lID0gJyc7XG4gIHdpZGdldHNMaXN0OiBXaWRnZXRbXTtcbiAgY3VycmVudENvbnRleHQ6IENvbnRleHREYXRhO1xuICBjb250ZXh0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHdpZGdldHNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgQFZpZXdDaGlsZChDb250ZXh0RGFzaGJvYXJkQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY29udGV4dERhc2hib2FyZDogQ29udGV4dERhc2hib2FyZENvbXBvbmVudDtcblxuICBERVZJQ0VfSU5GT19XSURHRVRTID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICdkZXZpY2VTdGF0dXNXaWRnZXQnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0RldmljZSBzdGF0dXMnKSxcbiAgICAgIF94OiAwLFxuICAgICAgX3k6IDAsXG4gICAgICBfaGVpZ2h0OiA1LFxuICAgICAgX3dpZHRoOiA4XG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YSBwb2ludHMgZ3JhcGgnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0RldmljZSBhbmQgY29tbXVuaWNhdGlvbicpLFxuICAgICAgX3g6IDgsXG4gICAgICBfeTogMCxcbiAgICAgIF9oZWlnaHQ6IDUsXG4gICAgICBfd2lkdGg6IDE2LFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGludGVydmFsOiAnaG91cnMnLFxuICAgICAgICBhZ2dyZWdhdGlvbjogJ05PTkUnLFxuICAgICAgICByZWFsdGltZTogdHJ1ZSxcbiAgICAgICAgZGF0YXBvaW50c0luaXRpYWxEaXNwbGF5TGltaXQ6IDMsXG4gICAgICAgIGRhdGFwb2ludHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcmFnbWVudDogJ2M4eV9CYXR0ZXJ5JyxcbiAgICAgICAgICAgIHNlcmllczogJ2xldmVsJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQmF0dGVyeTogbGV2ZWwnKSxcbiAgICAgICAgICAgIHVuaXQ6ICclJyxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdtaW4nLFxuICAgICAgICAgICAgbGluZVR5cGU6ICdsaW5lJyxcbiAgICAgICAgICAgIGNvbG9yOiAnIzVlMDdiMycsXG4gICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJhZ21lbnQ6ICdjOHlfU2lnbmFsU3RyZW5ndGgnLFxuICAgICAgICAgICAgc2VyaWVzOiAncnNzaScsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1NpZ25hbDogUlNTSScpLFxuICAgICAgICAgICAgdW5pdDogJ2RCbScsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnbWluJyxcbiAgICAgICAgICAgIGxpbmVUeXBlOiAnbGluZScsXG4gICAgICAgICAgICBjb2xvcjogJyNhN2QwZjEnLFxuICAgICAgICAgICAgX19hY3RpdmU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyYWdtZW50OiAnYzh5X01lbW9yeU1lYXN1cmVtZW50JyxcbiAgICAgICAgICAgIHNlcmllczogJ1VzZWQnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNZW1vcnk6IHVzZWQnKSxcbiAgICAgICAgICAgIHVuaXQ6ICdNQicsXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnbWluJyxcbiAgICAgICAgICAgIGxpbmVUeXBlOiAnbGluZScsXG4gICAgICAgICAgICBjb2xvcjogJyNmNzUyMjknLFxuICAgICAgICAgICAgX19hY3RpdmU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyYWdtZW50OiAnYzh5X0NQVU1lYXN1cmVtZW50JyxcbiAgICAgICAgICAgIHNlcmllczogJ1dvcmtsb2FkJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQ1BVOiB3b3JrbG9hZCcpLFxuICAgICAgICAgICAgdW5pdDogJyUnLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ21pbicsXG4gICAgICAgICAgICBsaW5lVHlwZTogJ2xpbmUnLFxuICAgICAgICAgICAgY29sb3I6ICcjYjI0ZjNlJyxcbiAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcmFnbWVudDogJ2M4eV9OZXR3b3JrU3RhdGlzdGljcycsXG4gICAgICAgICAgICBzZXJpZXM6ICdVcGxvYWQnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdOZXR3b3JrOiB1cGxvYWQnKSxcbiAgICAgICAgICAgIHVuaXQ6ICdLQi9zJyxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdtaW4nLFxuICAgICAgICAgICAgbGluZVR5cGU6ICdsaW5lJyxcbiAgICAgICAgICAgIGNvbG9yOiAnIzg4YzAzOScsXG4gICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJhZ21lbnQ6ICdjOHlfU2lnbmFsU3RyZW5ndGgnLFxuICAgICAgICAgICAgc2VyaWVzOiAnUkNTUCcsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1NpZ25hbDogUkNTUCcpLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ21pbicsXG4gICAgICAgICAgICBsaW5lVHlwZTogJ2xpbmUnLFxuICAgICAgICAgICAgY29sb3I6ICcjNWUyZjE5JyxcbiAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcmFnbWVudDogJ2M4eV9TaWduYWxTdHJlbmd0aCcsXG4gICAgICAgICAgICBzZXJpZXM6ICdSU0NQJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnU2lnbmFsOiBSU0NQJyksXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnbWluJyxcbiAgICAgICAgICAgIGxpbmVUeXBlOiAnbGluZScsXG4gICAgICAgICAgICBjb2xvcjogJyM1ZTJmMTknLFxuICAgICAgICAgICAgX19hY3RpdmU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyYWdtZW50OiAnYzh5X1NpZ25hbFN0cmVuZ3RoJyxcbiAgICAgICAgICAgIHNlcmllczogJ1JTUlAnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdTaWduYWw6IFJTUlAnKSxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdtaW4nLFxuICAgICAgICAgICAgbGluZVR5cGU6ICdsaW5lJyxcbiAgICAgICAgICAgIGNvbG9yOiAnIzQzYmEzYicsXG4gICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJhZ21lbnQ6ICdjOHlfU2lnbmFsU3RyZW5ndGgnLFxuICAgICAgICAgICAgc2VyaWVzOiAnUlNSUScsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1NpZ25hbDogUlNSUScpLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ21pbicsXG4gICAgICAgICAgICBsaW5lVHlwZTogJ2xpbmUnLFxuICAgICAgICAgICAgY29sb3I6ICcjMTRiMGIzJyxcbiAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcmFnbWVudDogJ2M4eV9TaWduYWxTdHJlbmd0aCcsXG4gICAgICAgICAgICBzZXJpZXM6ICdiZXInLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdTaWduYWw6IEJFUicpLFxuICAgICAgICAgICAgdW5pdDogJyUnLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ21pbicsXG4gICAgICAgICAgICBsaW5lVHlwZTogJ2xpbmUnLFxuICAgICAgICAgICAgY29sb3I6ICcjNDRmZjMzJyxcbiAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmcmFnbWVudDogJ2M4eV9TaWduYWxTdHJlbmd0aCcsXG4gICAgICAgICAgICBzZXJpZXM6ICdFQ04wJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnU2lnbmFsOiBFQ04wJyksXG4gICAgICAgICAgICByZW5kZXJUeXBlOiAnbWluJyxcbiAgICAgICAgICAgIGxpbmVUeXBlOiAnbGluZScsXG4gICAgICAgICAgICBjb2xvcjogJyM4NzNlZmEnLFxuICAgICAgICAgICAgX19hY3RpdmU6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZyYWdtZW50OiAnYzh5X05ldHdvcmtTdGF0aXN0aWNzJyxcbiAgICAgICAgICAgIHNlcmllczogJ0Rvd25sb2FkJyxcbiAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnTmV0d29yazogZG93bmxvYWQnKSxcbiAgICAgICAgICAgIHVuaXQ6ICdLQi9zJyxcbiAgICAgICAgICAgIHJlbmRlclR5cGU6ICdtaW4nLFxuICAgICAgICAgICAgbGluZVR5cGU6ICdsaW5lJyxcbiAgICAgICAgICAgIGNvbG9yOiAnI2YyN2E0NScsXG4gICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZnJhZ21lbnQ6ICdjOHlfTWVtb3J5TWVhc3VyZW1lbnQnLFxuICAgICAgICAgICAgc2VyaWVzOiAnVG90YWwnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdNZW1vcnk6IHRvdGFsJyksXG4gICAgICAgICAgICB1bml0OiAnTUInLFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogJ21pbicsXG4gICAgICAgICAgICBsaW5lVHlwZTogJ2xpbmUnLFxuICAgICAgICAgICAgY29sb3I6ICcjZGFkZDhjJyxcbiAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBhbGFybXNFdmVudHNDb25maWdzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdjOHlfTG9jYXRpb25VcGRhdGUnLFxuICAgICAgICAgICAgdGltZWxpbmVUeXBlOiAnRVZFTlQnLFxuICAgICAgICAgICAgY29sb3I6ICcjNmY2Y2QwJyxcbiAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2M4eV9Mb2NhdGlvblVwZGF0ZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICdjOHlfVW5hdmFpbGFiaWxpdHlBbGFybScsXG4gICAgICAgICAgICB0aW1lbGluZVR5cGU6ICdBTEFSTScsXG4gICAgICAgICAgICBjb2xvcjogJyMzNzViZjInLFxuICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICB0eXBlOiAnYzh5X1VuYXZhaWxhYmlsaXR5QWxhcm0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX19hY3RpdmU6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdBc3NldCBQcm9wZXJ0aWVzJyxcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdEZXZpY2UgZGF0YScpLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnYzh5U2NoZW1hISFpZCcsXG4gICAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICBrZXlQYXRoOiBbJ2lkJ10sXG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lEJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdjOHlTY2hlbWEhIW5hbWUnLFxuICAgICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAga2V5UGF0aDogWyduYW1lJ10sXG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2M4eVNjaGVtYSEhdHlwZScsXG4gICAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICBrZXlQYXRoOiBbJ3R5cGUnXSxcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVHlwZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnYzh5U2NoZW1hISFsYXN0VXBkYXRlZCcsXG4gICAgICAgICAgICAgIF9fYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICBrZXlQYXRoOiBbJ2xhc3RVcGRhdGVkJ10sXG4gICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0xhc3QgVXBkYXRlZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnYzh5U2NoZW1hISFjcmVhdGlvblRpbWUnLFxuICAgICAgICAgICAgICBfX2FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAga2V5UGF0aDogWydjcmVhdGlvblRpbWUnXSxcbiAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgIGxhYmVsOiAnQ3JlYXRpb24gVGltZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIGFsbG93RGlzcGxheUFuZEVkaXRLbm93blByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIGhpZGRlblByb3BlcnRpZXNLZXlQYXRoczogWydvd25lciddXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfeDogMCxcbiAgICAgIF95OiA1LFxuICAgICAgX2hlaWdodDogOCxcbiAgICAgIF93aWR0aDogOFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0FsYXJtIGxpc3QnLFxuICAgICAgdGl0bGU6IGdldHRleHQoJ0FjdGl2ZSwgY3JpdGljYWwgYWxhcm1zJyksXG4gICAgICBfeDogOCxcbiAgICAgIF95OiA1LFxuICAgICAgX2hlaWdodDogNCxcbiAgICAgIF93aWR0aDogOCxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgb3JkZXJNb2RlOiAnQUNUSVZFX0ZJUlNUJyxcbiAgICAgICAgICBzZXZlcml0eTogeyBDUklUSUNBTDogdHJ1ZSB9LFxuICAgICAgICAgIHN0YXR1czoge1xuICAgICAgICAgICAgQUNUSVZFOiB0cnVlLFxuICAgICAgICAgICAgQUNLTk9XTEVER0VEOiBmYWxzZSxcbiAgICAgICAgICAgIENMRUFSRUQ6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eXBlczogW11cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2RldmljZUdyb3VwQXNzaWdubWVudFdpZGdldCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnR3JvdXAgYXNzaWdubWVudCcpLFxuICAgICAgX3g6IDE2LFxuICAgICAgX3k6IDUsXG4gICAgICBfaGVpZ2h0OiA0LFxuICAgICAgX3dpZHRoOiA4XG4gICAgfSxcbiAgICB7XG4gICAgICBjb21wb25lbnRJZDogJ01hcCcsXG4gICAgICB0aXRsZTogZ2V0dGV4dCgnTG9jYXRpb24nKSxcbiAgICAgIF94OiA4LFxuICAgICAgX3k6IDksXG4gICAgICBfaGVpZ2h0OiA0LFxuICAgICAgX3dpZHRoOiAxNlxuICAgIH1cbiAgXSBhcyBXaWRnZXRbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB3aWRnZXRTZXJ2aWNlOiBXaWRnZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udGV4dFN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLnBhcmVudC5kYXRhXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCh7IGNvbnRleHREYXRhIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0TmFtZVZhbGlkID0gY29udGV4dERhdGEubmFtZSAmJiBjb250ZXh0RGF0YS5uYW1lLnRyaW0oKTtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gY29udGV4dE5hbWVWYWxpZCA/IGNvbnRleHREYXRhLm5hbWUgOiBjb250ZXh0RGF0YS5pZDtcbiAgICAgICAgICB0aGlzLmRhc2hib2FyZE5hbWUgPSBgJHtjb250ZXh0RGF0YS5pZH0tZGV2aWNlLWluZm9gO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShhc3luYyBkYXRhID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9IGRhdGEgYXMgQ29udGV4dERhdGE7XG4gICAgICAgIHRoaXMuYWRkRGV2aWNlVGFyZ2V0Rm9yRFAoZGF0YS5jb250ZXh0RGF0YS5pZCwgZGF0YS5jb250ZXh0RGF0YS5uYW1lKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy53aWRnZXRzU3Vic2NyaXB0aW9uID0gZnJvbSh0aGlzLkRFVklDRV9JTkZPX1dJREdFVFMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VNYXAod2lkZ2V0ID0+IHRoaXMud2lkZ2V0U2VydmljZS5tYXBMZWdhY3kod2lkZ2V0KSksXG4gICAgICAgIG1hcCh3aWRnZXQgPT4ge1xuICAgICAgICAgIGxldCBkZXZpY2UgPSB0aGlzLnJvdXRlci5wYXJlbnQuc25hcHNob3QuZGF0YS5jb250ZXh0RGF0YTtcbiAgICAgICAgICBpZiAoZGV2aWNlKSB7XG4gICAgICAgICAgICBkZXZpY2UgPSB7XG4gICAgICAgICAgICAgIG5hbWU6IGRldmljZS5uYW1lLFxuICAgICAgICAgICAgICBpZDogZGV2aWNlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ud2lkZ2V0LFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgIC4uLndpZGdldC5jb25maWcsXG4gICAgICAgICAgICAgIGRldmljZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgICB0b0FycmF5KClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgZGF0YSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsdGVyU3VwcG9ydGVkU2VyaWVzRm9yRFAodGhpcy5jdXJyZW50Q29udGV4dC5jb250ZXh0RGF0YS5pZCwgZGF0YSk7XG4gICAgICAgIHRoaXMud2lkZ2V0c0xpc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gIH1cblxuICBhZGREZXZpY2VUYXJnZXRGb3JEUChpZDogc3RyaW5nIHwgbnVtYmVyLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkcFdpZGdldCA9IHRoaXMuREVWSUNFX0lORk9fV0lER0VUUy5maWx0ZXIoaXRlbSA9PiBpdGVtLm5hbWUgPT0gJ0RhdGEgcG9pbnRzIGdyYXBoJylbMF07XG4gICAgLy8gQWRkIHRhcmdldCB0byBkYXRhUG9pbnQgY29uZmlnXG4gICAgZHBXaWRnZXQuY29uZmlnLmRhdGFwb2ludHMubWFwKGl0ZW0gPT4gKGl0ZW1bJ19fdGFyZ2V0J10gPSB7IGlkLCBuYW1lIH0pKTtcbiAgICAvLyBBZGQgdGFyZ2V0IHRvIGFsYXJtRXZlbnRzIENvbmZpZ1xuICAgIGRwV2lkZ2V0LmNvbmZpZy5hbGFybXNFdmVudHNDb25maWdzLm1hcChpdGVtID0+IChpdGVtWydfX3RhcmdldCddID0geyBpZCwgbmFtZSB9KSk7XG4gIH1cblxuICBhc3luYyBmaWx0ZXJTdXBwb3J0ZWRTZXJpZXNGb3JEUChpZDogc3RyaW5nIHwgbnVtYmVyLCB3aWRnZXRzOiBXaWRnZXRbXSkge1xuICAgIGNvbnN0IHN1cHBvcnRlZE1lYXN1cmVtZW50cyA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5nZXRNZWFzdXJlbWVudHNBbmRTZXJpZXMoaWQpO1xuICAgIGNvbnN0IGlzRGF0YVBvaW50U3VwcG9ydGVkID0gZHAgPT5cbiAgICAgIHN1cHBvcnRlZE1lYXN1cmVtZW50cy5zb21lKFxuICAgICAgICAoeyBmcmFnbWVudCwgc2VyaWVzIH0pID0+IGRwLmZyYWdtZW50ID09PSBmcmFnbWVudCAmJiBkcC5zZXJpZXMgPT09IHNlcmllc1xuICAgICAgKTtcbiAgICBjb25zdCBkcFdpZGdldCA9IHdpZGdldHMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdEYXRhIHBvaW50cyBncmFwaCcpO1xuICAgIGRwV2lkZ2V0LmNvbmZpZy5kYXRhcG9pbnRzID0gZHBXaWRnZXQuY29uZmlnLmRhdGFwb2ludHMuZmlsdGVyKGlzRGF0YVBvaW50U3VwcG9ydGVkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMud2lkZ2V0c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY29udGV4dFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgY2FuRGVhY3RpdmF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0RGFzaGJvYXJkPy5jYW5EZWFjdGl2YXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nXCI+XG4gIDxjOHktdGl0bGU+XG4gICAge3sgdGl0bGUgfX1cbiAgPC9jOHktdGl0bGU+XG4gIDxjOHktY29udGV4dC1kYXNoYm9hcmRcbiAgICBbdHJhbnNsYXRlV2lkZ2V0VGl0bGVdPVwidHJ1ZVwiXG4gICAgW25hbWVdPVwiZGFzaGJvYXJkTmFtZVwiXG4gICAgW2NvbnRleHRdPVwiY3VycmVudENvbnRleHRcIlxuICAgIFtkZWZhdWx0V2lkZ2V0c109XCJ3aWRnZXRzTGlzdFwiXG4gICAgW2NhbkRlbGV0ZV09XCJmYWxzZVwiXG4gICAgW2hpZGVBdmFpbGFiaWxpdHldPVwidHJ1ZVwiXG4gICAgW2NhbkNvcHldPVwiZmFsc2VcIlxuICA+PC9jOHktY29udGV4dC1kYXNoYm9hcmQ+XG48L2Rpdj5cbiJdfQ==