UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

150 lines 22.3 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectorRef, Component, ElementRef, Inject, Input, NgZone, PLATFORM_ID, ViewChild, } from '@angular/core'; import { HeatMapComponent, LegendPosition } from '@swimlane/ngx-charts'; import { MonitoringAppGenComponent } from '../../metadata/decorators'; import { ChartDataModel, } from '../ChartDataModel'; import { dataWithSeriesToCsv } from '../ExportDataFormat'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@swimlane/ngx-charts"; import * as i3 from "../../ui-directive/export-data.directive"; import * as i4 from "@ionic/angular"; let TapVariableHeatMapChartComponent = class TapVariableHeatMapChartComponent extends HeatMapComponent { set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } set variable(variableOrArray) { this.inputStream = this.chartModel.initVariable(variableOrArray); } set inputStream(inputs) { this.subscription = this.chartModel .defineInputStreamMulti(inputs, this.history, this.valueCountLimit) .subscribe((result) => { result.map((e) => { e.series.map((v) => { if (typeof v.value === 'number' && v.value > this.maxValue) { this.maxValue = v.value; } }); }); this.heatChart.max = this.maxValue; this.chartHeight = result[0].series.length * 50; if (this.chartHeight <= 100) { this.chartHeight = 100; } this.results = result; }); } constructor(myChartElement, zone, platformId, cd) { super(myChartElement, zone, cd, platformId); this.colorScheme = { domain: [ '#e0f7fa', '#b2ebf2', '#80deea', '#4dd0e1', '#26c6da', '#00bcd4', '#00acc1', '#0097a7', '#00838f', '#006064', ], }; this.showExportButton = false; this.yAxis = true; this.showYAxisLabel = true; this.xAxis = true; this.showXAxisLabel = false; this.legend = true; this.legendPosition = LegendPosition.Below; this.valueCountLimit = 15; this.history = false; this.xAxisTickFormatting = this.defaultDateTickFormatting.bind(this); this.chartHeight = 100; this.maxValue = 1; this.results = [ { name: '---', series: [ { name: '---', value: 0, extra: 0, }, ], }, ]; this.chartModel = new ChartDataModel(); } createExportedData() { return dataWithSeriesToCsv(this.results); } ngAfterContentChecked() { this.cd.detectChanges(); } defaultDateTickFormatting(val) { if (val instanceof Date) { return val.toLocaleTimeString(); } return val; } ngOnDestroy() { this.subscription?.unsubscribe(); this.chartModel.destroyCurrentSub(); } onSelect(event) { /* Not implemented this.chartModel.showDetail(event, this.modalController, TapVariableDataPopupComponent); */ } }; /** @nocollapse */ TapVariableHeatMapChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableHeatMapChartComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: PLATFORM_ID }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TapVariableHeatMapChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapVariableHeatMapChartComponent, selector: "tap-variable-heat-map-chart", inputs: { colorScheme: "colorScheme", showExportButton: "showExportButton", exportedFileName: "exportedFileName", yAxis: "yAxis", showYAxisLabel: "showYAxisLabel", xAxis: "xAxis", showXAxisLabel: "showXAxisLabel", legend: "legend", legendPosition: "legendPosition", valueCountLimit: "valueCountLimit", history: "history", label: "label", xAxisTickFormatting: "xAxisTickFormatting", variable: "variable", inputStream: "inputStream" }, viewQueries: [{ propertyName: "heatChart", first: true, predicate: HeatMapComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n style=\"position: relative\"\n #containerRef\n [style.height.px]=\"chartHeight\"\n [ngClass]=\"legendPosition === 'below' ? 'belowLegend' : 'rightLegend'\"\n>\n <ngx-charts-heat-map\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [animations]=\"false\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"xAxis\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"false\"\n [showYAxisLabel]=\"false\"\n [innerPadding]=\"[1.5, 1, 1, 1]\"\n [results]=\"results\"\n [xAxisTickFormatting]=\"xAxisTickFormatting\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-heat-map>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: ["::ng-deep .scale-legend{padding:20px!important}::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{width:100%;margin-bottom:100px}.rightLegend{width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.HeatMapComponent, selector: "ngx-charts-heat-map", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "gradient", "innerPadding", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "tooltipDisabled", "tooltipText", "min", "max", "activeEntries", "wrapTicks"], outputs: ["activate", "deactivate"] }, { kind: "directive", type: i3.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); TapVariableHeatMapChartComponent = __decorate([ MonitoringAppGenComponent({}), __metadata("design:paramtypes", [ElementRef, NgZone, String, ChangeDetectorRef]) ], TapVariableHeatMapChartComponent); export { TapVariableHeatMapChartComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableHeatMapChartComponent, decorators: [{ type: Component, args: [{ selector: 'tap-variable-heat-map-chart', template: "<div\n style=\"position: relative\"\n #containerRef\n [style.height.px]=\"chartHeight\"\n [ngClass]=\"legendPosition === 'below' ? 'belowLegend' : 'rightLegend'\"\n>\n <ngx-charts-heat-map\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [animations]=\"false\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"xAxis\"\n [yAxis]=\"yAxis\"\n [showXAxisLabel]=\"false\"\n [showYAxisLabel]=\"false\"\n [innerPadding]=\"[1.5, 1, 1, 1]\"\n [results]=\"results\"\n [xAxisTickFormatting]=\"xAxisTickFormatting\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-heat-map>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: ["::ng-deep .scale-legend{padding:20px!important}::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{width:100%;margin-bottom:100px}.rightLegend{width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { heatChart: [{ type: ViewChild, args: [HeatMapComponent] }], colorScheme: [{ type: Input }], showExportButton: [{ type: Input }], exportedFileName: [{ type: Input }], yAxis: [{ type: Input }], showYAxisLabel: [{ type: Input }], xAxis: [{ type: Input }], showXAxisLabel: [{ type: Input }], legend: [{ type: Input }], legendPosition: [{ type: Input }], valueCountLimit: [{ type: Input }], history: [{ type: Input }], label: [{ type: Input }], xAxisTickFormatting: [{ type: Input }], variable: [{ type: Input }], inputStream: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLWhlYXQtbWFwLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtaGVhdC1tYXAtY2hhcnQvdGFwLXZhcmlhYmxlLWhlYXQtbWFwLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtaGVhdC1tYXAtY2hhcnQvdGFwLXZhcmlhYmxlLWhlYXQtbWFwLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FHZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFTbkQsSUFBTSxnQ0FBZ0MsR0FBdEMsTUFBTSxnQ0FDWCxTQUFRLGdCQUFnQjtJQW1EeEIsSUFDSSxLQUFLLENBQUMsWUFBc0Q7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQVNELElBQ0ksUUFBUSxDQUNWLGVBR2E7UUFFYixJQUFJLENBQUMs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b3J0IHtcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgSGVhdE1hcENvbXBvbmVudCwgTGVnZW5kUG9zaXRpb24gfSBmcm9tICdAc3dpbWxhbmUvbmd4LWNoYXJ0cyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIENoYXJ0RGF0YU1vZGVsLFxuICBDaGFydElucHV0TXV0bGksXG4gIENoYXJ0SW5wdXRTdHJlYW1WYXIsXG59IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7IGRhdGFXaXRoU2VyaWVzVG9Dc3YgfSBmcm9tICcuLi9FeHBvcnREYXRhRm9ybWF0JztcbmltcG9ydCB7IE9uQ2hhcnRTZWxlY3RFdmVudCB9IGZyb20gJy4uL3NoYXJlZC10eXBlcyc7XG5cbkBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50KHt9KVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFwLXZhcmlhYmxlLWhlYXQtbWFwLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhcC12YXJpYWJsZS1oZWF0LW1hcC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhcC12YXJpYWJsZS1oZWF0LW1hcC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYXBWYXJpYWJsZUhlYXRNYXBDaGFydENvbXBvbmVudFxuICBleHRlbmRzIEhlYXRNYXBDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZChIZWF0TWFwQ29tcG9uZW50KSBoZWF0Q2hhcnQhOiBIZWF0TWFwQ29tcG9uZW50O1xuXG4gIEBJbnB1dCgpXG4gIGNvbG9yU2NoZW1lID0ge1xuICAgIGRvbWFpbjogW1xuICAgICAgJyNlMGY3ZmEnLFxuICAgICAgJyNiMmViZjInLFxuICAgICAgJyM4MGRlZWEnLFxuICAgICAgJyM0ZGQwZTEnLFxuICAgICAgJyMyNmM2ZGEnLFxuICAgICAgJyMwMGJjZDQnLFxuICAgICAgJyMwMGFjYzEnLFxuICAgICAgJyMwMDk3YTcnLFxuICAgICAgJyMwMDgzOGYnLFxuICAgICAgJyMwMDYwNjQnLFxuICAgIF0sXG4gIH07XG5cbiAgQElucHV0KClcbiAgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGV4cG9ydGVkRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgeUF4aXM6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dZQXhpc0xhYmVsID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICB4QXhpczogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd1hBeGlzTGFiZWwgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBsZWdlbmQgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGxlZ2VuZFBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbiA9IExlZ2VuZFBvc2l0aW9uLkJlbG93O1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlQ291bnRMaW1pdCA9IDE1O1xuXG4gIEBJbnB1dCgpXG4gIGhpc3Rvcnk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgbGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmluaXRMYWJlbChpbmRleE9yQXJyYXkpO1xuICB9XG5cbiAgQElucHV0KCkgeEF4aXNUaWNrRm9ybWF0dGluZzogKGlucHV0OiBhbnkpID0+IHN0cmluZyA9XG4gICAgdGhpcy5kZWZhdWx0RGF0ZVRpY2tGb3JtYXR0aW5nLmJpbmQodGhpcyk7XG5cbiAgaXNBcnJheT86IGJvb2xlYW47XG4gIGNoYXJ0SGVpZ2h0ID0gMTAwO1xuICBtYXhWYWx1ZSA9IDE7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKFxuICAgIHZhcmlhYmxlT3JBcnJheTpcbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5cbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5bXVxuICAgICAgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5pbnB1dFN0cmVhbSA9IHRoaXMuY2hhcnRNb2RlbC5pbml0VmFyaWFibGUodmFyaWFibGVPckFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBpbnB1dFN0cmVhbShpbnB1dHM6IENoYXJ0SW5wdXRTdHJlYW1WYXJbXSkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFydE1vZGVsXG4gICAgICAuZGVmaW5lSW5wdXRTdHJlYW1NdWx0aShpbnB1dHMsIHRoaXMuaGlzdG9yeSwgdGhpcy52YWx1ZUNvdW50TGltaXQpXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgcmVzdWx0Lm1hcCgoZSkgPT4ge1xuICAgICAgICAgIGUuc2VyaWVzLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2LnZhbHVlID09PSAnbnVtYmVyJyAmJiB2LnZhbHVlID4gdGhpcy5tYXhWYWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gdi52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGVhdENoYXJ0Lm1heCA9IHRoaXMubWF4VmFsdWU7XG4gICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPSByZXN1bHRbMF0uc2VyaWVzLmxlbmd0aCAqIDUwO1xuICAgICAgICBpZiAodGhpcy5jaGFydEhlaWdodCA8PSAxMDApIHtcbiAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gMTAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzdWx0czogQ2hhcnRJbnB1dE11dGxpW10gPSBbXG4gICAge1xuICAgICAgbmFtZTogJy0tLScsXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICctLS0nLFxuICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgIGV4dHJhOiAwLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdO1xuXG4gIHByaXZhdGUgY2hhcnRNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG15Q2hhcnRFbGVtZW50OiBFbGVtZW50UmVmPGFueT4sXG4gICAgem9uZTogTmdab25lLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIobXlDaGFydEVsZW1lbnQsIHpvbmUsIGNkLCBwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIGNyZWF0ZUV4cG9ydGVkRGF0YSgpIHtcbiAgICByZXR1cm4gZGF0YVdpdGhTZXJpZXNUb0Nzdih0aGlzLnJlc3VsdHMpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgZGVmYXVsdERhdGVUaWNrRm9ybWF0dGluZyh2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNoYXJ0TW9kZWwuZGVzdHJveUN1cnJlbnRTdWIoKTtcbiAgfVxuXG4gIG9uU2VsZWN0KGV2ZW50OiBPbkNoYXJ0U2VsZWN0RXZlbnQpIHtcbiAgICAvKiBOb3QgaW1wbGVtZW50ZWRcbiAgICB0aGlzLmNoYXJ0TW9kZWwuc2hvd0RldGFpbChldmVudCwgdGhpcy5tb2RhbENvbnRyb2xsZXIsIFRhcFZhcmlhYmxlRGF0YVBvcHVwQ29tcG9uZW50KTtcbiAgICAqL1xuICB9XG59XG4iLCI8ZGl2XG4gIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcbiAgI2NvbnRhaW5lclJlZlxuICBbc3R5bGUuaGVpZ2h0LnB4XT1cImNoYXJ0SGVpZ2h0XCJcbiAgW25nQ2xhc3NdPVwibGVnZW5kUG9zaXRpb24gPT09ICdiZWxvdycgPyAnYmVsb3dMZWdlbmQnIDogJ3JpZ2h0TGVnZW5kJ1wiXG4+XG4gIDxuZ3gtY2hhcnRzLWhlYXQtbWFwXG4gICAgW3ZpZXddPVwiW2NvbnRhaW5lclJlZi5vZmZzZXRXaWR0aCwgY29udGFpbmVyUmVmLm9mZnNldEhlaWdodF1cIlxuICAgIFtzY2hlbWVdPVwiY29sb3JTY2hlbWVcIlxuICAgIFthbmltYXRpb25zXT1cImZhbHNlXCJcbiAgICBbbGVnZW5kXT1cImxlZ2VuZFwiXG4gICAgW2xlZ2VuZFBvc2l0aW9uXT1cImxlZ2VuZFBvc2l0aW9uXCJcbiAgICBbeEF4aXNdPVwieEF4aXNcIlxuICAgIFt5QXhpc109XCJ5QXhpc1wiXG4gICAgW3Nob3dYQXhpc0xhYmVsXT1cImZhbHNlXCJcbiAgICBbc2hvd1lBeGlzTGFiZWxdPVwiZmFsc2VcIlxuICAgIFtpbm5lclBhZGRpbmddPVwiWzEuNSwgMSwgMSwgMV1cIlxuICAgIFtyZXN1bHRzXT1cInJlc3VsdHNcIlxuICAgIFt4QXhpc1RpY2tGb3JtYXR0aW5nXT1cInhBeGlzVGlja0Zvcm1hdHRpbmdcIlxuICAgIChzZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gID5cbiAgPC9uZ3gtY2hhcnRzLWhlYXQtbWFwPlxuICA8aW9uLWZhYi1idXR0b25cbiAgICBpZD1cImV4cG9ydEZhYkJ1dHRvblwiXG4gICAgc2l6ZT1cInNtYWxsXCJcbiAgICB0YXBFeHBvcnREYXRhXG4gICAgW2RhdGFUb0V4cG9ydF09XCJjcmVhdGVFeHBvcnRlZERhdGEuYmluZCh0aGlzKVwiXG4gICAgW2V4cG9ydGVkRmlsZU5hbWVdPVwiZXhwb3J0ZWRGaWxlTmFtZVwiXG4gICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgPlxuICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9kaXY+XG4iXX0=