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

145 lines 22.1 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 isUndefined from "lodash/isUndefined"; import { Subject } from "rxjs"; import { takeUntil } from "rxjs/operators"; import { EventBus, } from "@nova-ui/bits"; import { DATA_SOURCE_DESTROYED, DATA_SOURCE_OUTPUT, } from "../../configurator/types"; import { PizzagnaService } from "../../pizzagna/services/pizzagna.service"; import { DATA_SOURCE_BUSY, DATA_SOURCE_INVOKED, REFRESH, } from "../../services/types"; import { DATA_SOURCE, PizzagnaLayer, PIZZAGNA_EVENT_BUS, } from "../../types"; import * as i0 from "@angular/core"; import * as i1 from "../../pizzagna/services/pizzagna.service"; import * as i2 from "@nova-ui/bits"; export class DataSourceAdapter { constructor(eventBus, dataSource, pizzagnaService) { this.eventBus = eventBus; this.dataSource = dataSource; this.pizzagnaService = pizzagnaService; this.destroy$ = new Subject(); if (!this.dataSource) { return; } this.setupRefreshListener(); this.dataSource.outputsSubject .pipe(takeUntil(this.destroy$)) .subscribe((event) => this.handleDataSourceUpdate(event)); if (this.dataSource.busy) { this.dataSource.busy .pipe(takeUntil(this.destroy$)) .subscribe((busy) => { this.eventBus.getStream(DATA_SOURCE_BUSY).next({ payload: { componentId: this.componentId, busy, }, }); }); } } setupRefreshListener() { this.eventBus .getStream(REFRESH) .pipe(takeUntil(this.destroy$)) .subscribe(() => this.handleRefresh()); } handleRefresh() { this.eventBus.getStream(DATA_SOURCE_INVOKED).next({}); this.dataSource.applyFilters(); } handleDataSourceUpdate(value) { this.lastValue = isUndefined(value?.result) ? value : value?.result; this.updateOutput(this.lastValue); this.eventBus .getStream(DATA_SOURCE_OUTPUT) .next({ payload: { componentId: this.componentId, ...value } }); } ngOnDestroy() { this.updateOutput(undefined); const destroyedEvent = { payload: { componentId: this.componentId }, }; this.eventBus.getStream(DATA_SOURCE_DESTROYED).next(destroyedEvent); const busyEvent = { payload: { componentId: this.componentId, busy: false }, }; this.eventBus.getStream(DATA_SOURCE_BUSY).next(busyEvent); this.destroy$.next(); this.destroy$.complete(); } updateConfiguration(properties) { if (properties.componentId) { this.componentId = properties.componentId; } this.updateAdapterProperties(properties); this.updateDataSourceProperties(properties); if (typeof this.lastValue !== "undefined") { this.updateOutput(this.lastValue); } } updateAdapterProperties(properties) { this.propertyPath = properties.propertyPath; } updateDataSourceProperties(properties) { const dataSourceConfiguration = properties?.dataSource?.properties; if (this.dataSourceConfiguration !== dataSourceConfiguration) { this.dataSourceConfiguration = dataSourceConfiguration; const configurableDataSource = this .dataSource; if (configurableDataSource?.updateConfiguration) { configurableDataSource.updateConfiguration(properties.dataSource?.properties); } this.eventBus.getStream(REFRESH).next({}); } // check if this is the first call of updateConfiguration and there is no dataSource configuration present in the incoming properties // This results in two initial invocations of the data source, and we should eventually remove it. But, currently, // widgets sometimes rely on it in order to display their initial data. if (typeof this.dataSourceConfiguration === "undefined" && typeof dataSourceConfiguration === "undefined") { // using a setTimeout here to give configurable data sources time to receive their configurations before they're invoked setTimeout(() => this.eventBus.getStream(REFRESH).next({})); } } updateOutput(value) { this.pizzagnaService.setProperty({ pizzagnaKey: PizzagnaLayer.Data, componentId: this.componentId, propertyPath: [this.propertyPath], }, this.processOutput(value)); } processOutput(value) { return value; } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceAdapter, deps: [{ token: PIZZAGNA_EVENT_BUS }, { token: DATA_SOURCE, optional: true }, { token: i1.PizzagnaService }], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceAdapter }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DataSourceAdapter, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i2.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_SOURCE] }] }, { type: i1.PizzagnaService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zb3VyY2UtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9wcm92aWRlcnMvZGF0YS1zb3VyY2UtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFDSCxRQUFRLEdBSVgsTUFBTSxlQUFlLENBQUM7QUFPdkIsT0FBTyxFQUNILHFCQUFxQixFQUNyQixrQkFBa0IsR0FDckIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUNILGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsT0FBTyxHQUNWLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNILFdBQVcsRUFHWCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ3JCLE1BQU0sYUFBYSxDQUFDOzs7O0FBR3JCLE1BQU0sT0FBTyxpQkFBaUI7SUFVMUIsWUFDdUMsUUFBMEIs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QUN2RSxJQUNJLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixLQUFLLFdBQVc7WUFDbkQsT0FBTyx1QkFBdUIsS0FBSyxXQUFXLEVBQ2hEO1lBQ0Usd0hBQXdIO1lBQ3hILFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvRDtJQUNMLENBQUM7SUFFUyxZQUFZLENBQUMsS0FBb0I7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQzVCO1lBQ0ksV0FBVyxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQy9CLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQ3BDLEVBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FDNUIsQ0FBQztJQUNOLENBQUM7SUFFUyxhQUFhLENBQUMsS0FBb0I7UUFDeEMsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztrSUFySVEsaUJBQWlCLGtCQVdkLGtCQUFrQixhQUNOLFdBQVc7c0lBWjFCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVTs7MEJBWUYsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBpc1VuZGVmaW5lZCBmcm9tIFwibG9kYXNoL2lzVW5kZWZpbmVkXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5pbXBvcnQge1xuICAgIEV2ZW50QnVzLFxuICAgIElEYXRhU291cmNlLFxuICAgIElFdmVudCxcbiAgICBJRmlsdGVyaW5nT3V0cHV0cyxcbn0gZnJvbSBcIkBub3ZhLXVpL2JpdHNcIjtcblxuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50SWRQYXlsb2FkLFxuICAgIElEYXRhU291cmNlQnVzeVBheWxvYWQsXG4gICAgSURhdGFTb3VyY2VPdXRwdXQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICAgIERBVEFfU09VUkNFX0RFU1RST1lFRCxcbiAgICBEQVRBX1NPVVJDRV9PVVRQVVQsXG59IGZyb20gXCIuLi8uLi9jb25maWd1cmF0b3IvdHlwZXNcIjtcbmltcG9ydCB7IFBpenphZ25hU2VydmljZSB9IGZyb20gXCIuLi8uLi9waXp6YWduYS9zZXJ2aWNlcy9waXp6YWduYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICAgIERBVEFfU09VUkNFX0JVU1ksXG4gICAgREFUQV9TT1VSQ0VfSU5WT0tFRCxcbiAgICBSRUZSRVNILFxufSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdHlwZXNcIjtcbmltcG9ydCB7XG4gICAgREFUQV9TT1VSQ0UsXG4gICAgSUNvbmZpZ3VyYWJsZSxcbiAgICBJUHJvcGVydGllcyxcbiAgICBQaXp6YWduYUxheWVyLFxuICAgIFBJWlpBR05BX0VWRU5UX0JVUyxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlQWRhcHRlcjxUIGV4dGVuZHMgSUZpbHRlcmluZ091dHB1dHMgPSBJRmlsdGVyaW5nT3V0cHV0cz5cbiAgICBpbXBsZW1lbnRzIElDb25maWd1cmFibGUsIE9uRGVzdHJveVxue1xuICAgIHByb3RlY3RlZCBjb21wb25lbnRJZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBsYXN0VmFsdWU6IFQ7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBwcm90ZWN0ZWQgZGF0YVNvdXJjZUNvbmZpZ3VyYXRpb246IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBwcml2YXRlIHByb3BlcnR5UGF0aDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoUElaWkFHTkFfRVZFTlRfQlVTKSBwdWJsaWMgZXZlbnRCdXM6IEV2ZW50QnVzPElFdmVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9TT1VSQ0UpIHB1YmxpYyBkYXRhU291cmNlOiBJRGF0YVNvdXJjZTxUPixcbiAgICAgICAgcHJvdGVjdGVkIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhU291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cFJlZnJlc2hMaXN0ZW5lcigpO1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5vdXRwdXRzU3ViamVjdFxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IFQgfCBJRGF0YVNvdXJjZU91dHB1dDxUPikgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFTb3VyY2VVcGRhdGUoZXZlbnQpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2UuYnVzeSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmJ1c3lcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoYnVzeTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbShEQVRBX1NPVVJDRV9CVVNZKS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXN5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGF0YVNvdXJjZUJ1c3lQYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXR1cFJlZnJlc2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1c1xuICAgICAgICAgICAgLmdldFN0cmVhbShSRUZSRVNIKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZVJlZnJlc2goKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZ2V0U3RyZWFtKERBVEFfU09VUkNFX0lOVk9LRUQpLm5leHQoe30pO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZURhdGFTb3VyY2VVcGRhdGUodmFsdWU6IFQgfCBJRGF0YVNvdXJjZU91dHB1dDxUPik6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IGlzVW5kZWZpbmVkKHZhbHVlPy5yZXN1bHQpID8gdmFsdWUgOiB2YWx1ZT8ucmVzdWx0O1xuICAgICAgICB0aGlzLnVwZGF0ZU91dHB1dCh0aGlzLmxhc3RWYWx1ZSk7XG4gICAgICAgIHRoaXMuZXZlbnRCdXNcbiAgICAgICAgICAgIC5nZXRTdHJlYW0oREFUQV9TT1VSQ0VfT1VUUFVUKVxuICAgICAgICAgICAgLm5leHQoeyBwYXlsb2FkOiB7IGNvbXBvbmVudElkOiB0aGlzLmNvbXBvbmVudElkLCAuLi52YWx1ZSB9IH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVPdXRwdXQodW5kZWZpbmVkKTtcblxuICAgICAgICBjb25zdCBkZXN0cm95ZWRFdmVudDogSUV2ZW50PElDb21wb25lbnRJZFBheWxvYWQ+ID0ge1xuICAgICAgICAgICAgcGF5bG9hZDogeyBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnRJZCB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbShEQVRBX1NPVVJDRV9ERVNUUk9ZRUQpLm5leHQoZGVzdHJveWVkRXZlbnQpO1xuXG4gICAgICAgIGNvbnN0IGJ1c3lFdmVudDogSUV2ZW50PElEYXRhU291cmNlQnVzeVBheWxvYWQ+ID0ge1xuICAgICAgICAgICAgcGF5bG9hZDogeyBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnRJZCwgYnVzeTogZmFsc2UgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5nZXRTdHJlYW0oREFUQV9TT1VSQ0VfQlVTWSkubmV4dChidXN5RXZlbnQpO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUNvbmZpZ3VyYXRpb24ocHJvcGVydGllczogSVByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMuY29tcG9uZW50SWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SWQgPSBwcm9wZXJ0aWVzLmNvbXBvbmVudElkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVBZGFwdGVyUHJvcGVydGllcyhwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhU291cmNlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGFzdFZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU91dHB1dCh0aGlzLmxhc3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlQWRhcHRlclByb3BlcnRpZXMocHJvcGVydGllczogSVByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eVBhdGggPSBwcm9wZXJ0aWVzLnByb3BlcnR5UGF0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRGF0YVNvdXJjZVByb3BlcnRpZXMocHJvcGVydGllczogSVByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZUNvbmZpZ3VyYXRpb24gPSBwcm9wZXJ0aWVzPy5kYXRhU291cmNlPy5wcm9wZXJ0aWVzO1xuICAgICAgICBpZiAodGhpcy5kYXRhU291cmNlQ29uZmlndXJhdGlvbiAhPT0gZGF0YVNvdXJjZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZUNvbmZpZ3VyYXRpb24gPSBkYXRhU291cmNlQ29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyYWJsZURhdGFTb3VyY2UgPSB0aGlzXG4gICAgICAgICAgICAgICAgLmRhdGFTb3VyY2UgYXMgdW5rbm93biBhcyBJQ29uZmlndXJhYmxlO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYWJsZURhdGFTb3VyY2U/LnVwZGF0ZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGVEYXRhU291cmNlLnVwZGF0ZUNvbmZpZ3VyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZGF0YVNvdXJjZT8ucHJvcGVydGllc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmV2ZW50QnVzLmdldFN0cmVhbShSRUZSRVNIKS5uZXh0KHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgdXBkYXRlQ29uZmlndXJhdGlvbiBhbmQgdGhlcmUgaXMgbm8gZGF0YVNvdXJjZSBjb25maWd1cmF0aW9uIHByZXNlbnQgaW4gdGhlIGluY29taW5nIHByb3BlcnRpZXNcbiAgICAgICAgLy8gVGhpcyByZXN1bHRzIGluIHR3byBpbml0aWFsIGludm9jYXRpb25zIG9mIHRoZSBkYXRhIHNvdXJjZSwgYW5kIHdlIHNob3VsZCBldmVudHVhbGx5IHJlbW92ZSBpdC4gQnV0LCBjdXJyZW50bHksXG4gICAgICAgIC8vIHdpZGdldHMgc29tZXRpbWVzIHJlbHkgb24gaXQgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGVpciBpbml0aWFsIGRhdGEuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmRhdGFTb3VyY2VDb25maWd1cmF0aW9uID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgZGF0YVNvdXJjZUNvbmZpZ3VyYXRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyB1c2luZyBhIHNldFRpbWVvdXQgaGVyZSB0byBnaXZlIGNvbmZpZ3VyYWJsZSBkYXRhIHNvdXJjZXMgdGltZSB0byByZWNlaXZlIHRoZWlyIGNvbmZpZ3VyYXRpb25zIGJlZm9yZSB0aGV5J3JlIGludm9rZWRcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5ldmVudEJ1cy5nZXRTdHJlYW0oUkVGUkVTSCkubmV4dCh7fSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZU91dHB1dCh2YWx1ZTogVCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpenphZ25hU2VydmljZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwaXp6YWduYUtleTogUGl6emFnbmFMYXllci5EYXRhLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudElkOiB0aGlzLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aDogW3RoaXMucHJvcGVydHlQYXRoXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NPdXRwdXQodmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NPdXRwdXQodmFsdWU6IFQgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbiJdfQ==