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

127 lines 24.5 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 { ChangeDetectorRef, Component, HostBinding, Inject, Input, Optional, } from "@angular/core"; import moment from "moment/moment"; import { EventBus, HistoryStorage, TimeframeService, } from "@nova-ui/bits"; import { TimeframeSerializationService } from "../../configurator/services/timeframe-serialization.service"; import { PizzagnaService } from "../../pizzagna/services/pizzagna.service"; import { REFRESH, SET_TIMEFRAME } 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"; import * as i3 from "../../configurator/services/timeframe-serialization.service"; export class TimeframeSelectionComponent { static { this.lateLoadKey = "TimeframeSelectionComponent"; } constructor(pizzagnaService, timeframeService, tfSerialization, history, dataSource, eventBus, changeDetector) { this.pizzagnaService = pizzagnaService; this.timeframeService = timeframeService; this.tfSerialization = tfSerialization; this.history = history; this.dataSource = dataSource; this.eventBus = eventBus; this.changeDetector = changeDetector; // just setting the timeframe to some reasonable default value this.currentTimeframe = this.timeframeService.getTimeframeByPresetId("last7Days"); } ngOnChanges(changes) { if (changes.timeframe) { let timeframe = this.tfSerialization.convertFromSerializable(this.timeframe); timeframe = this.timeframeService.reconcileTimeframe(timeframe); if (timeframe.selectedPresetId) { // populate the title timeframe = this.timeframeService.getTimeframeByPresetId(timeframe.selectedPresetId); } this.currentTimeframe = timeframe; if (!changes.timeframe.isFirstChange()) { this.eventBus.getStream(REFRESH).next({}); } } if (changes.minDate) { this.minDateAsMoment = moment(this.minDate, moment.defaultFormat); } if (changes.maxDate) { this.maxDateAsMoment = moment(this.maxDate, moment.defaultFormat); } } ngOnInit() { this.history.restart(this.currentTimeframe); this.eventBus.getStream(SET_TIMEFRAME).subscribe((event) => { if (!event.payload) { throw new Error("Unable to set timeframe. Event payload is undefined"); } this.onTimeframeChange(this.history.save(this.tfSerialization.convertFromSerializable(event.payload))); }); if (this.dataSource) { this.dataSource.registerComponent({ timeframe: { componentInstance: { getFilters: () => { const timeframe = this.timeframeService.reconcileTimeframe(this.currentTimeframe); return { type: "timeframe", value: timeframe, }; }, }, }, }); } } onTimeframeChange(timeframe) { const newTimeframe = this.timeframeService.reconcileTimeframe(timeframe); // replace undefined preset value with empty string to explicitly override any value on the pizzagna's config layer newTimeframe.selectedPresetId = newTimeframe.selectedPresetId || ""; if (!this.timeframeService.isEqual(newTimeframe, this.currentTimeframe)) { this.pizzagnaService.setProperty({ pizzagnaKey: PizzagnaLayer.Data, componentId: this.componentId, propertyPath: ["timeframe"], }, this.tfSerialization.convertToSerializable(newTimeframe)); } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeframeSelectionComponent, deps: [{ token: i1.PizzagnaService }, { token: i2.TimeframeService }, { token: i3.TimeframeSerializationService }, { token: i2.HistoryStorage }, { token: DATA_SOURCE, optional: true }, { token: PIZZAGNA_EVENT_BUS }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TimeframeSelectionComponent, selector: "nui-timeframe-selection", inputs: { componentId: "componentId", minDate: "minDate", maxDate: "maxDate", timeframe: "timeframe" }, host: { properties: { "class": "this.elementClass" } }, providers: [HistoryStorage], usesOnChanges: true, ngImport: i0, template: "<nui-time-frame-bar\n [minDate]=\"minDateAsMoment\"\n [maxDate]=\"maxDateAsMoment\"\n [timeFrame]=\"currentTimeframe\"\n (timeFrameChange)=\"onTimeframeChange(history.restart($event))\"\n [historyIndex]=\"history.index\"\n (undo)=\"onTimeframeChange(history.undo())\"\n (clear)=\"onTimeframeChange(history.restart())\"\n>\n <!-- content for default projection slot -->\n <nui-icon icon=\"calendar\" class=\"pr-3\"></nui-icon>\n {{ currentTimeframe | timeFrame }}\n\n <!-- content for time frame selection projection slot -->\n <nui-quick-picker\n [presets]=\"timeframeService.currentPresets\"\n timeFrameSelection\n >\n <nui-time-frame-picker></nui-time-frame-picker>\n </nui-quick-picker>\n</nui-time-frame-bar>\n", styles: [":host{border-top:1px solid;border-top-color:var(--nui-color-line-default,#d9d9d9);border-bottom:1px solid;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}\n"], dependencies: [{ kind: "component", type: i2.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "component", type: i2.TimeFrameBarComponent, selector: "nui-time-frame-bar", inputs: ["minDate", "maxDate", "timeFrame", "historyIndex"], outputs: ["timeFrameChange", "undo", "clear"] }, { kind: "component", type: i2.QuickPickerComponent, selector: "nui-quick-picker", inputs: ["presets", "pickerTitle", "presetsTitle", "selectedPreset", "presetKeysOrder"], outputs: ["presetSelected"] }, { kind: "component", type: i2.TimeFramePickerComponent, selector: "nui-time-frame-picker", inputs: ["minDate", "maxDate", "startModel", "appendToBody"], outputs: ["changed"] }, { kind: "pipe", type: i2.TimeFrameFormatPipe, name: "timeFrame" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TimeframeSelectionComponent, decorators: [{ type: Component, args: [{ selector: "nui-timeframe-selection", providers: [HistoryStorage], template: "<nui-time-frame-bar\n [minDate]=\"minDateAsMoment\"\n [maxDate]=\"maxDateAsMoment\"\n [timeFrame]=\"currentTimeframe\"\n (timeFrameChange)=\"onTimeframeChange(history.restart($event))\"\n [historyIndex]=\"history.index\"\n (undo)=\"onTimeframeChange(history.undo())\"\n (clear)=\"onTimeframeChange(history.restart())\"\n>\n <!-- content for default projection slot -->\n <nui-icon icon=\"calendar\" class=\"pr-3\"></nui-icon>\n {{ currentTimeframe | timeFrame }}\n\n <!-- content for time frame selection projection slot -->\n <nui-quick-picker\n [presets]=\"timeframeService.currentPresets\"\n timeFrameSelection\n >\n <nui-time-frame-picker></nui-time-frame-picker>\n </nui-quick-picker>\n</nui-time-frame-bar>\n", styles: [":host{border-top:1px solid;border-top-color:var(--nui-color-line-default,#d9d9d9);border-bottom:1px solid;border-bottom-color:var(--nui-color-line-default,#d9d9d9)}\n"] }] }], ctorParameters: () => [{ type: i1.PizzagnaService }, { type: i2.TimeframeService }, { type: i3.TimeframeSerializationService }, { type: i2.HistoryStorage }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_SOURCE] }] }, { type: i2.EventBus, decorators: [{ type: Inject, args: [PIZZAGNA_EVENT_BUS] }] }, { type: i0.ChangeDetectorRef }], propDecorators: { componentId: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], timeframe: [{ type: Input }], elementClass: [{ type: HostBinding, args: ["class"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWZyYW1lLXNlbGVjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGltZS1mcmFtZS1zZWxlY3Rpb24vdGltZWZyYW1lLXNlbGVjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGltZS1mcmFtZS1zZWxlY3Rpb24vdGltZWZyYW1lLXNlbGVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxHQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUNILFFBQVEsRUFDUixjQUFjLEVBS2QsZ0JBQWdCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQzVHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFDSCxXQUFXLEVBR1gsYUFBYSxFQUNiLGtCQUFrQixH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QixLQUFLO2dCQUV1QixZQUFZO3NCQUF4QyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBtb21lbnQsIHsgTW9tZW50IH0gZnJvbSBcIm1vbWVudC9tb21lbnRcIjtcblxuaW1wb3J0IHtcbiAgICBFdmVudEJ1cyxcbiAgICBIaXN0b3J5U3RvcmFnZSxcbiAgICBJRGF0YVNvdXJjZSxcbiAgICBJRXZlbnQsXG4gICAgSUZpbHRlcixcbiAgICBJVGltZWZyYW1lLFxuICAgIFRpbWVmcmFtZVNlcnZpY2UsXG59IGZyb20gXCJAbm92YS11aS9iaXRzXCI7XG5cbmltcG9ydCB7IFRpbWVmcmFtZVNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ3VyYXRvci9zZXJ2aWNlcy90aW1lZnJhbWUtc2VyaWFsaXphdGlvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQaXp6YWduYVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vcGl6emFnbmEvc2VydmljZXMvcGl6emFnbmEuc2VydmljZVwiO1xuaW1wb3J0IHsgUkVGUkVTSCwgU0VUX1RJTUVGUkFNRSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgICBEQVRBX1NPVVJDRSxcbiAgICBJSGFzQ2hhbmdlRGV0ZWN0b3IsXG4gICAgSVNlcmlhbGl6YWJsZVRpbWVmcmFtZSxcbiAgICBQaXp6YWduYUxheWVyLFxuICAgIFBJWlpBR05BX0VWRU5UX0JVUyxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS10aW1lZnJhbWUtc2VsZWN0aW9uXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi90aW1lZnJhbWUtc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL3RpbWVmcmFtZS1zZWxlY3Rpb24uY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgcHJvdmlkZXJzOiBbSGlzdG9yeVN0b3JhZ2VdLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lZnJhbWVTZWxlY3Rpb25Db21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBJSGFzQ2hhbmdlRGV0ZWN0b3JcbntcbiAgICBwdWJsaWMgc3RhdGljIGxhdGVMb2FkS2V5ID0gXCJUaW1lZnJhbWVTZWxlY3Rpb25Db21wb25lbnRcIjtcblxuICAgIHB1YmxpYyBjdXJyZW50VGltZWZyYW1lOiBJVGltZWZyYW1lO1xuICAgIHB1YmxpYyBtaW5EYXRlQXNNb21lbnQ6IE1vbWVudDtcbiAgICBwdWJsaWMgbWF4RGF0ZUFzTW9tZW50OiBNb21lbnQ7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcG9uZW50SWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluRGF0ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhEYXRlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHRpbWVmcmFtZTogSVNlcmlhbGl6YWJsZVRpbWVmcmFtZTtcblxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzXCIpIHB1YmxpYyBlbGVtZW50Q2xhc3M6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHBpenphZ25hU2VydmljZTogUGl6emFnbmFTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgdGltZWZyYW1lU2VydmljZTogVGltZWZyYW1lU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0ZlNlcmlhbGl6YXRpb246IFRpbWVmcmFtZVNlcmlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgaGlzdG9yeTogSGlzdG9yeVN0b3JhZ2U8SVRpbWVmcmFtZT4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9TT1VSQ0UpIHByaXZhdGUgZGF0YVNvdXJjZTogSURhdGFTb3VyY2UsXG4gICAgICAgIEBJbmplY3QoUElaWkFHTkFfRVZFTlRfQlVTKSBwcml2YXRlIGV2ZW50QnVzOiBFdmVudEJ1czxJRXZlbnQ+LFxuICAgICAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXG4gICAgKSB7XG4gICAgICAgIC8vIGp1c3Qgc2V0dGluZyB0aGUgdGltZWZyYW1lIHRvIHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZSA9XG4gICAgICAgICAgICB0aGlzLnRpbWVmcmFtZVNlcnZpY2UuZ2V0VGltZWZyYW1lQnlQcmVzZXRJZChcImxhc3Q3RGF5c1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlcy50aW1lZnJhbWUpIHtcbiAgICAgICAgICAgIGxldCB0aW1lZnJhbWUgPSB0aGlzLnRmU2VyaWFsaXphdGlvbi5jb252ZXJ0RnJvbVNlcmlhbGl6YWJsZShcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVmcmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRpbWVmcmFtZSA9IHRoaXMudGltZWZyYW1lU2VydmljZS5yZWNvbmNpbGVUaW1lZnJhbWUodGltZWZyYW1lKTtcbiAgICAgICAgICAgIGlmICh0aW1lZnJhbWUuc2VsZWN0ZWRQcmVzZXRJZCkge1xuICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSB0aXRsZVxuICAgICAgICAgICAgICAgIHRpbWVmcmFtZSA9IHRoaXMudGltZWZyYW1lU2VydmljZS5nZXRUaW1lZnJhbWVCeVByZXNldElkKFxuICAgICAgICAgICAgICAgICAgICB0aW1lZnJhbWUuc2VsZWN0ZWRQcmVzZXRJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWUgPSB0aW1lZnJhbWU7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZXMudGltZWZyYW1lLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZ2V0U3RyZWFtKFJFRlJFU0gpLm5leHQoe30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMubWluRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5taW5EYXRlQXNNb21lbnQgPSBtb21lbnQodGhpcy5taW5EYXRlLCBtb21lbnQuZGVmYXVsdEZvcm1hdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLm1heERhdGVBc01vbWVudCA9IG1vbWVudCh0aGlzLm1heERhdGUsIG1vbWVudC5kZWZhdWx0Rm9ybWF0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnJlc3RhcnQodGhpcy5jdXJyZW50VGltZWZyYW1lKTtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5nZXRTdHJlYW0oU0VUX1RJTUVGUkFNRSkuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC5wYXlsb2FkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlVuYWJsZSB0byBzZXQgdGltZWZyYW1lLiBFdmVudCBwYXlsb2FkIGlzIHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25UaW1lZnJhbWVDaGFuZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5oaXN0b3J5LnNhdmUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGZTZXJpYWxpemF0aW9uLmNvbnZlcnRGcm9tU2VyaWFsaXphYmxlKGV2ZW50LnBheWxvYWQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLnJlZ2lzdGVyQ29tcG9uZW50KHtcbiAgICAgICAgICAgICAgICB0aW1lZnJhbWU6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbHRlcnM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVmcmFtZVNlcnZpY2UucmVjb25jaWxlVGltZWZyYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGltZWZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJRmlsdGVyPElUaW1lZnJhbWU+PntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0aW1lZnJhbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRpbWVmcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25UaW1lZnJhbWVDaGFuZ2UodGltZWZyYW1lOiBJVGltZWZyYW1lKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5ld1RpbWVmcmFtZSA9XG4gICAgICAgICAgICB0aGlzLnRpbWVmcmFtZVNlcnZpY2UucmVjb25jaWxlVGltZWZyYW1lKHRpbWVmcmFtZSk7XG5cbiAgICAgICAgLy8gcmVwbGFjZSB1bmRlZmluZWQgcHJlc2V0IHZhbHVlIHdpdGggZW1wdHkgc3RyaW5nIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgYW55IHZhbHVlIG9uIHRoZSBwaXp6YWduYSdzIGNvbmZpZyBsYXllclxuICAgICAgICBuZXdUaW1lZnJhbWUuc2VsZWN0ZWRQcmVzZXRJZCA9IG5ld1RpbWVmcmFtZS5zZWxlY3RlZFByZXNldElkIHx8IFwiXCI7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMudGltZWZyYW1lU2VydmljZS5pc0VxdWFsKG5ld1RpbWVmcmFtZSwgdGhpcy5jdXJyZW50VGltZWZyYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucGl6emFnbmFTZXJ2aWNlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGl6emFnbmFLZXk6IFBpenphZ25hTGF5ZXIuRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aDogW1widGltZWZyYW1lXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy50ZlNlcmlhbGl6YXRpb24uY29udmVydFRvU2VyaWFsaXphYmxlKG5ld1RpbWVmcmFtZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bnVpLXRpbWUtZnJhbWUtYmFyXG4gICAgW21pbkRhdGVdPVwibWluRGF0ZUFzTW9tZW50XCJcbiAgICBbbWF4RGF0ZV09XCJtYXhEYXRlQXNNb21lbnRcIlxuICAgIFt0aW1lRnJhbWVdPVwiY3VycmVudFRpbWVmcmFtZVwiXG4gICAgKHRpbWVGcmFtZUNoYW5nZSk9XCJvblRpbWVmcmFtZUNoYW5nZShoaXN0b3J5LnJlc3RhcnQoJGV2ZW50KSlcIlxuICAgIFtoaXN0b3J5SW5kZXhdPVwiaGlzdG9yeS5pbmRleFwiXG4gICAgKHVuZG8pPVwib25UaW1lZnJhbWVDaGFuZ2UoaGlzdG9yeS51bmRvKCkpXCJcbiAgICAoY2xlYXIpPVwib25UaW1lZnJhbWVDaGFuZ2UoaGlzdG9yeS5yZXN0YXJ0KCkpXCJcbj5cbiAgICA8IS0tIGNvbnRlbnQgZm9yIGRlZmF1bHQgcHJvamVjdGlvbiBzbG90IC0tPlxuICAgIDxudWktaWNvbiBpY29uPVwiY2FsZW5kYXJcIiBjbGFzcz1cInByLTNcIj48L251aS1pY29uPlxuICAgIHt7IGN1cnJlbnRUaW1lZnJhbWUgfCB0aW1lRnJhbWUgfX1cblxuICAgIDwhLS0gY29udGVudCBmb3IgdGltZSBmcmFtZSBzZWxlY3Rpb24gcHJvamVjdGlvbiBzbG90IC0tPlxuICAgIDxudWktcXVpY2stcGlja2VyXG4gICAgICAgIFtwcmVzZXRzXT1cInRpbWVmcmFtZVNlcnZpY2UuY3VycmVudFByZXNldHNcIlxuICAgICAgICB0aW1lRnJhbWVTZWxlY3Rpb25cbiAgICA+XG4gICAgICAgIDxudWktdGltZS1mcmFtZS1waWNrZXI+PC9udWktdGltZS1mcmFtZS1waWNrZXI+XG4gICAgPC9udWktcXVpY2stcGlja2VyPlxuPC9udWktdGltZS1mcmFtZS1iYXI+XG4iXX0=