@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
150 lines • 22.3 kB
JavaScript
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=