UNPKG

@nova-ui/dashboards

Version:

Nova Dashboards is a framework designed to provide feature developers with a common solution for presenting data coming from various sources within a single view, as well as a set of predefined widget visualizations that are 100% configuration-driven and

107 lines 14.7 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Inject, Injectable, Optional } from "@angular/core"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { PizzagnaService } from "../../pizzagna/services/pizzagna.service"; import { KpiColorComparatorsRegistryService } from "../../services/kpi-color-comparators-registry.service"; import { DATA_SOURCE } from "../../types"; import * as i0 from "@angular/core"; import * as i1 from "../../pizzagna/services/pizzagna.service"; import * as i2 from "../../services/kpi-color-comparators-registry.service"; export class KpiColorPrioritizer { constructor(dataSource, pizzagnaService, comparatorsRegistry) { this.dataSource = dataSource; this.pizzagnaService = pizzagnaService; this.destroy$ = new Subject(); this.propertyPath = "backgroundColor"; this.comparators = comparatorsRegistry.getComparators(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } updateConfiguration(properties) { if (properties?.rules) { this.rules = properties?.rules; this.subscribeToDataChanges(); this.checkColorConditions(); } } setComponent(component, componentId) { this.subscribeToDataChanges(); this.componentId = componentId; } subscribeToDataChanges() { if (!this.dataSource) { return; } this.dsSubscription$?.unsubscribe(); this.dsSubscription$ = this.dataSource.outputsSubject .pipe(takeUntil(this.destroy$)) .subscribe((event) => { this.latestValueFromDS = event.result?.value || this.latestValueFromDS; this.checkColorConditions(); }); } checkColorConditions() { if (!this.rules) { return; } if (this.rules.length === 0) { this.setColor(undefined); this.dsSubscription$?.unsubscribe(); return; } let colorToSet; // reverse because last rule has top priority const newRules = this.rules && [...this.rules].reverse(); for (const rule of newRules) { if (this.comparators[rule.comparisonType]?.comparatorFn(this.latestValueFromDS, rule.value)) { colorToSet = rule.color; break; // exit if the rule matches } } this.setColor(colorToSet); } /** * Sets the color to pizzagna * * @param color - Color to set */ setColor(color) { this.pizzagnaService.setProperty({ componentId: this.componentId, propertyPath: [this.propertyPath], }, color); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer, deps: [{ token: DATA_SOURCE, optional: true }, { token: i1.PizzagnaService }, { token: i2.KpiColorComparatorsRegistryService }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: KpiColorPrioritizer, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_SOURCE] }] }, { type: i1.PizzagnaService }, { type: i2.KpiColorComparatorsRegistryService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3BpLWNvbG9yLXByaW9yaXRpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL3Byb3ZpZGVycy9rcGktY29sb3ItcHJpb3JpdGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxXQUFXLEVBQW1DLE1BQU0sYUFBYSxDQUFDOzs7O0FBSTNFLE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDNEMsVUFBdUIsRUFDckQsZUFBZ0MsRUFDMUMsbUJBQXVEO1FBRmYsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUNyRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFYM0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFeEMsaUJBQVksR0FBVyxpQkFBaUIsQ0FBQztRQVkvQyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxVQUFlO1FBQ3RDLElBQUksVUFBVSxFQUFFLEtBQUssRUFBRTtZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRU0sWUFBWSxDQUFDLFNBQWMsRUFBRSxXQUFtQjtRQUNuRCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNuQyxDQUFDO0lBRU8sc0JBQXNCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWM7YUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsS0FBa0MsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ2xCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUNsRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDYixPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTztTQUNWO1FBRUQsSUFBSSxVQUE4QixDQUFDO1FBQ25DLDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekQsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDekIsSUFDSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxZQUFZLENBQy9DLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FDYixFQUNIO2dCQUNFLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN4QixNQUFNLENBQUMsMkJBQTJCO2FBQ3JDO1NBQ0o7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssUUFBUSxDQUFDLEtBQXlCO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUM1QjtZQUNJLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3BDLEVBQ0QsS0FBSyxDQUNSLENBQUM7SUFDTixDQUFDO2tJQS9GUSxtQkFBbUIsa0JBV0osV0FBVztzSUFYMUIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVOzswQkFZRixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgSURhdGFTb3VyY2UgfSBmcm9tIFwiQG5vdmEtdWkvYml0c1wiO1xuXG5pbXBvcnQgeyBJRGF0YVNvdXJjZU91dHB1dCwgSUtwaUNvbG9yUnVsZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGl6emFnbmFTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3BpenphZ25hL3NlcnZpY2VzL3BpenphZ25hLnNlcnZpY2VcIjtcbmltcG9ydCB7IEtwaUNvbG9yQ29tcGFyYXRvcnNSZWdpc3RyeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMva3BpLWNvbG9yLWNvbXBhcmF0b3JzLXJlZ2lzdHJ5LnNlcnZpY2VcIjtcbmltcG9ydCB7IERBVEFfU09VUkNFLCBJQ29tcGFyYXRvcnNEaWN0LCBJQ29uZmlndXJhYmxlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJS3BpRGF0YSB9IGZyb20gXCIuLi9rcGktd2lkZ2V0L3R5cGVzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBLcGlDb2xvclByaW9yaXRpemVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSwgT25EZXN0cm95IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBwcm9wZXJ0eVBhdGg6IHN0cmluZyA9IFwiYmFja2dyb3VuZENvbG9yXCI7XG4gICAgcHJvdGVjdGVkIHJ1bGVzOiBJS3BpQ29sb3JSdWxlc1tdIHwgdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBjb21wYXJhdG9yczogSUNvbXBhcmF0b3JzRGljdDtcblxuICAgIHByaXZhdGUgZHNTdWJzY3JpcHRpb24kOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsYXRlc3RWYWx1ZUZyb21EUzogYW55O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9TT1VSQ0UpIHB1YmxpYyBkYXRhU291cmNlOiBJRGF0YVNvdXJjZSxcbiAgICAgICAgcHJvdGVjdGVkIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlLFxuICAgICAgICBjb21wYXJhdG9yc1JlZ2lzdHJ5OiBLcGlDb2xvckNvbXBhcmF0b3JzUmVnaXN0cnlTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY29tcGFyYXRvcnMgPSBjb21wYXJhdG9yc1JlZ2lzdHJ5LmdldENvbXBhcmF0b3JzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDb25maWd1cmF0aW9uKHByb3BlcnRpZXM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAocHJvcGVydGllcz8ucnVsZXMpIHtcbiAgICAgICAgICAgIHRoaXMucnVsZXMgPSBwcm9wZXJ0aWVzPy5ydWxlcztcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9EYXRhQ2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0NvbG9yQ29uZGl0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbXBvbmVudChjb21wb25lbnQ6IGFueSwgY29tcG9uZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1YnNjcmliZVRvRGF0YUNoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVUb0RhdGFDaGFuZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kc1N1YnNjcmlwdGlvbiQ/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy5kc1N1YnNjcmlwdGlvbiQgPSB0aGlzLmRhdGFTb3VyY2Uub3V0cHV0c1N1YmplY3RcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBJRGF0YVNvdXJjZU91dHB1dDxJS3BpRGF0YT4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFZhbHVlRnJvbURTID1cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucmVzdWx0Py52YWx1ZSB8fCB0aGlzLmxhdGVzdFZhbHVlRnJvbURTO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb2xvckNvbmRpdGlvbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tDb2xvckNvbmRpdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5ydWxlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucnVsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbG9yKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLmRzU3Vic2NyaXB0aW9uJD8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb2xvclRvU2V0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHJldmVyc2UgYmVjYXVzZSBsYXN0IHJ1bGUgaGFzIHRvcCBwcmlvcml0eVxuICAgICAgICBjb25zdCBuZXdSdWxlcyA9IHRoaXMucnVsZXMgJiYgWy4uLnRoaXMucnVsZXNdLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIG5ld1J1bGVzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yc1tydWxlLmNvbXBhcmlzb25UeXBlXT8uY29tcGFyYXRvckZuKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFZhbHVlRnJvbURTLFxuICAgICAgICAgICAgICAgICAgICBydWxlLnZhbHVlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29sb3JUb1NldCA9IHJ1bGUuY29sb3I7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIGV4aXQgaWYgdGhlIHJ1bGUgbWF0Y2hlc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDb2xvcihjb2xvclRvU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2xvciB0byBwaXp6YWduYVxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbG9yIC0gQ29sb3IgdG8gc2V0XG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRDb2xvcihjb2xvcjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGl6emFnbmFTZXJ2aWNlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOiB0aGlzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aDogW3RoaXMucHJvcGVydHlQYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xvclxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==