@c8y/ngx-components 1021.22.54 → 1021.22.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/core/common/interval-based-reload.abstract.d.ts +13 -3
  2. package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
  3. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts +5 -4
  4. package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
  5. package/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.d.ts.map +1 -1
  6. package/core/dashboard/widgets-dashboard-event.service.d.ts +1 -0
  7. package/core/dashboard/widgets-dashboard-event.service.d.ts.map +1 -1
  8. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts +9 -3
  9. package/core/dashboard/wiget-time-context/widget-time-context.component.d.ts.map +1 -1
  10. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts +11 -8
  11. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.d.ts.map +1 -1
  12. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts +4 -2
  13. package/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.d.ts.map +1 -1
  14. package/datapoints-export-selector/datapoints-export-selector.component.d.ts +6 -2
  15. package/datapoints-export-selector/datapoints-export-selector.component.d.ts.map +1 -1
  16. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +17 -0
  17. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
  18. package/esm2022/core/common/aggregation/aggregation.model.mjs +2 -2
  19. package/esm2022/core/common/interval-based-reload.abstract.mjs +13 -13
  20. package/esm2022/core/dashboard/dashboard-child.component.mjs +3 -3
  21. package/esm2022/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.mjs +12 -10
  22. package/esm2022/core/dashboard/widget-auto-refresh-context/widget-auto-refresh-context.component.mjs +2 -2
  23. package/esm2022/core/dashboard/widgets-dashboard-event.service.mjs +10 -1
  24. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +3 -3
  25. package/esm2022/core/dashboard/wiget-time-context/widget-time-context-icon-bar/widget-time-context-icon-bar.component.mjs +3 -3
  26. package/esm2022/core/dashboard/wiget-time-context/widget-time-context.component.mjs +37 -15
  27. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.mjs +22 -27
  28. package/esm2022/datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.mjs +29 -6
  29. package/esm2022/datapoints-export-selector/datapoints-export-selector.component.mjs +18 -8
  30. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +18 -1
  31. package/esm2022/interval-picker/interval-picker.model.mjs +5 -1
  32. package/esm2022/widgets/definitions/datapoints-table/index.mjs +3 -2
  33. package/esm2022/widgets/implementations/alarms/alarm-list-widget-view/alarm-list-widget.component.mjs +3 -3
  34. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +17 -100
  35. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +45 -41
  36. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +35 -13
  37. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table/datapoints-table.component.mjs +3 -3
  38. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.mjs +81 -38
  39. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-widget.model.mjs +3 -5
  40. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +79 -36
  41. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  42. package/fesm2022/c8y-ngx-components-interval-picker.mjs +5 -1
  43. package/fesm2022/c8y-ngx-components-interval-picker.mjs.map +1 -1
  44. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs +2 -1
  45. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-table.mjs.map +1 -1
  46. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +18 -101
  47. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +152 -88
  49. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components.mjs +75 -42
  51. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  52. package/interval-picker/interval-picker.model.d.ts +6 -0
  53. package/interval-picker/interval-picker.model.d.ts.map +1 -1
  54. package/locales/de.po +60 -62
  55. package/locales/es.po +10 -12
  56. package/locales/fr.po +109 -109
  57. package/locales/ja_JP.po +149 -94
  58. package/locales/ko.po +10 -12
  59. package/locales/locales.pot +3 -4
  60. package/locales/nl.po +11 -13
  61. package/locales/pl.po +11 -13
  62. package/locales/pt_BR.po +9 -11
  63. package/locales/zh_CN.po +9 -11
  64. package/locales/zh_TW.po +11 -13
  65. package/package.json +1 -1
  66. package/widgets/definitions/datapoints-table/index.d.ts.map +1 -1
  67. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +18 -63
  68. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  69. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts +4 -3
  70. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
  71. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +16 -8
  72. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
  73. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts +23 -5
  74. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-table-view.component.d.ts.map +1 -1
  75. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts +4 -1
  76. package/widgets/implementations/datapoints-table/datapoints-table-widget.model.d.ts.map +1 -1
@@ -1,10 +1,11 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
2
  import { FormBuilder } from '@angular/forms';
3
- import { ActivationEnd, NavigationEnd, NavigationStart, Router } from '@angular/router';
3
+ import { ActivatedRoute, ActivationEnd, NavigationEnd, NavigationStart, Router } from '@angular/router';
4
4
  import { aggregationType } from '@c8y/client';
5
+ import { INTERVAL_TITLES } from '@c8y/ngx-components/interval-picker';
5
6
  import { BsDropdownDirective } from 'ngx-bootstrap/dropdown';
6
7
  import { interval, Subject } from 'rxjs';
7
- import { filter, takeUntil } from 'rxjs/operators';
8
+ import { distinctUntilChanged, filter, map, takeUntil } from 'rxjs/operators';
8
9
  import { ActionBarService } from '../../action-bar';
9
10
  import { AGGREGATION_LIMITS } from '../../common/aggregation/aggregation.model';
10
11
  import { AggregationService } from '../../common/aggregation/aggregation.service';
@@ -14,7 +15,6 @@ import { DashboardChildComponent } from '../dashboard-child.component';
14
15
  import { WidgetsDashboardEventService } from '../widgets-dashboard-event.service';
15
16
  import { WidgetTimeContextHelperService } from './widget-time-context-helper.service';
16
17
  import { WidgetTimeContextQueryService } from './widget-time-context-query.service';
17
- import { INTERVAL_TITLES } from '@c8y/ngx-components/interval-picker';
18
18
  import * as i0 from "@angular/core";
19
19
  import * as i1 from "../widgets-dashboard-event.service";
20
20
  import * as i2 from "../dashboard-child.component";
@@ -44,7 +44,7 @@ export class WidgetTimeContextComponent {
44
44
  /**
45
45
  * @ignore only DI.
46
46
  */
47
- constructor(widgetEventService, dashboardChild, formBuilder, queryService, helperService, router, actionBarService, aggregationService) {
47
+ constructor(widgetEventService, dashboardChild, formBuilder, queryService, helperService, router, actionBarService, aggregationService, route) {
48
48
  this.widgetEventService = widgetEventService;
49
49
  this.dashboardChild = dashboardChild;
50
50
  this.formBuilder = formBuilder;
@@ -53,6 +53,7 @@ export class WidgetTimeContextComponent {
53
53
  this.router = router;
54
54
  this.actionBarService = actionBarService;
55
55
  this.aggregationService = aggregationService;
56
+ this.route = route;
56
57
  this.INTERVAL_TITLES = INTERVAL_TITLES;
57
58
  this.DATE_FORMAT = 'short';
58
59
  /**
@@ -111,6 +112,9 @@ export class WidgetTimeContextComponent {
111
112
  if (this.canDecouple) {
112
113
  this.dashboardChild.addActions([this.action]);
113
114
  }
115
+ this.route.queryParams
116
+ .pipe(distinctUntilChanged(), map(params => params['globalContextAutoRefresh'] === 'true'), takeUntil(this.destroy$))
117
+ .subscribe(this.handleAutoRefreshChange.bind(this));
114
118
  }
115
119
  /**
116
120
  * Toggles the coupling on or off.
@@ -162,6 +166,7 @@ export class WidgetTimeContextComponent {
162
166
  ngOnDestroy() {
163
167
  this.unsubscribeFromGlobalContext();
164
168
  this.clearQueryParamsIfNeeded();
169
+ this.widgetEventService.setRealtimeTimeContextSetting();
165
170
  this.destroy$.next();
166
171
  this.destroy$.complete();
167
172
  }
@@ -370,9 +375,7 @@ export class WidgetTimeContextComponent {
370
375
  };
371
376
  }
372
377
  startRealtime() {
373
- this.form.controls.temporaryUserSelectedFromDate.disable();
374
- this.form.controls.temporaryUserSelectedToDate.disable();
375
- this.form.controls.aggregation.disable();
378
+ this.disableDateRangeAndAggregation();
376
379
  this.realtimeSubscription = interval(this.REALTIME_INTERVAL)
377
380
  .pipe(takeUntil(this.destroy$))
378
381
  .subscribe(() => {
@@ -386,11 +389,30 @@ export class WidgetTimeContextComponent {
386
389
  });
387
390
  });
388
391
  }
392
+ handleAutoRefreshChange(isEnabled) {
393
+ this.isAutoRefreshEnabled = isEnabled;
394
+ isEnabled ? this.onDisableAutoRefresh() : this.enableDateRangeAndAggregation();
395
+ }
396
+ onDisableAutoRefresh() {
397
+ this.form.controls.aggregation.setValue(null);
398
+ this.disableDateRangeAndAggregation();
399
+ }
400
+ disableDateRangeAndAggregation() {
401
+ this.form.controls.temporaryUserSelectedFromDate.disable();
402
+ this.form.controls.temporaryUserSelectedToDate.disable();
403
+ this.form.controls.aggregation.disable();
404
+ }
405
+ enableDateRangeAndAggregation() {
406
+ if (this.form.controls.realtime.value || this.isAutoRefreshEnabled) {
407
+ return;
408
+ }
409
+ this.form.controls.temporaryUserSelectedFromDate.enable();
410
+ this.form.controls.temporaryUserSelectedToDate.enable();
411
+ this.form.controls.aggregation.enable();
412
+ }
389
413
  stopRealtime() {
390
414
  this.realtimeSubscription?.unsubscribe();
391
- this.form?.controls.temporaryUserSelectedFromDate.enable();
392
- this.form?.controls.temporaryUserSelectedToDate.enable();
393
- this.form?.controls.aggregation.enable();
415
+ this.enableDateRangeAndAggregation();
394
416
  }
395
417
  onRealtimeValueChange(realtime) {
396
418
  let dateTimeContext;
@@ -431,13 +453,13 @@ export class WidgetTimeContextComponent {
431
453
  return null;
432
454
  }
433
455
  }
434
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: i1.WidgetsDashboardEventService }, { token: i2.DashboardChildComponent }, { token: i3.FormBuilder }, { token: i4.WidgetTimeContextQueryService }, { token: i5.WidgetTimeContextHelperService }, { token: i6.Router }, { token: i7.ActionBarService }, { token: i8.AggregationService }], target: i0.ɵɵFactoryTarget.Component }); }
435
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: i9.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i10.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i12.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i13.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i13.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i13.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i14.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i15.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i16.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i17.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i18.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "directive", type: i19.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i20.IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: i21.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i22.RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: i23.AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "pipe", type: i24.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] }); }
456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: i1.WidgetsDashboardEventService }, { token: i2.DashboardChildComponent }, { token: i3.FormBuilder }, { token: i4.WidgetTimeContextQueryService }, { token: i5.WidgetTimeContextHelperService }, { token: i6.Router }, { token: i7.ActionBarService }, { token: i8.AggregationService }, { token: i6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
457
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple", displaySettings: "displaySettings", hidden: "hidden" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }, { propertyName: "dropdown", first: true, predicate: BsDropdownDirective, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime || isAutoRefreshEnabled\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime || isAutoRefreshEnabled\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: i9.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i10.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i12.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: i13.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i13.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i13.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i14.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i15.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i16.MessageDirective, selector: "c8y-message", inputs: ["name", "text"] }, { kind: "component", type: i17.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i18.DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: ["minDate", "maxDate", "placeholder", "dateInputFormat", "adaptivePosition", "size", "dateType", "config"], outputs: ["onDateSelected"] }, { kind: "directive", type: i19.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i20.IntervalPickerComponent, selector: "c8y-interval-picker", inputs: ["INTERVALS"] }, { kind: "component", type: i21.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i22.RealtimeControlComponent, selector: "c8y-realtime-control" }, { kind: "component", type: i23.AggregationPickerComponent, selector: "c8y-aggregation-picker", inputs: ["disabledAggregations"] }, { kind: "pipe", type: i24.DatePipe, name: "c8yDate" }, { kind: "pipe", type: i19.TranslatePipe, name: "translate" }] }); }
436
458
  }
437
459
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: WidgetTimeContextComponent, decorators: [{
438
460
  type: Component,
439
- args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
440
- }], ctorParameters: () => [{ type: i1.WidgetsDashboardEventService }, { type: i2.DashboardChildComponent }, { type: i3.FormBuilder }, { type: i4.WidgetTimeContextQueryService }, { type: i5.WidgetTimeContextHelperService }, { type: i6.Router }, { type: i7.ActionBarService }, { type: i8.AggregationService }], propDecorators: { canDecouple: [{
461
+ args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled && !hidden\"\n [priority]=\"ACTION_BAR_PRIORITY\"\n [groupId]=\"ACTION_BAR_GROUP_ID\"\n [inGroupPriority]=\"actionBarInGroupPriority\"\n [placement]=\"'left'\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{\n date: [form.value.currentDateContextFromDate, form.value.currentDateContextToDate]\n }\"\n></ng-container>\n\n<ng-template\n #dateTimePicker\n let-date=\"date\"\n>\n <form\n class=\"d-flex gap-16 p-l-xs-16 p-r-xs-16 m-t-xs-8 m-b-xs-8\"\n [formGroup]=\"form\"\n >\n <ng-container *ngIf=\"displaySettings.globalTimeContext\">\n <div>\n <div\n class=\"dropdown flex-grow\"\n #dropdown=\"bs-dropdown\"\n dropdown\n [insideClick]=\"true\"\n *ngIf=\"date\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-tight d-flex a-i-center\"\n attr.aria-label=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{\n date[1] | c8yDate: DATE_FORMAT\n }}\"\n tooltip=\"{{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"widget-time-context--date-picker-dropdown-button\"\n [adaptivePosition]=\"false\"\n [delay]=\"500\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"schedule1\"\n ></i>\n <div class=\"d-col text-left fit-w\">\n <span\n class=\"text-12\"\n data-cy=\"widget-time-context--selected-interval\"\n >\n {{ INTERVAL_TITLES[form.controls.currentDateContextInterval.value] | translate }}\n </span>\n <span\n class=\"text-10 text-muted text-truncate\"\n data-cy=\"widget-time-context--selected-time-range\"\n >\n {{ date[0] | c8yDate: DATE_FORMAT }} \u2014 {{ date[1] | c8yDate: DATE_FORMAT }}\n </span>\n </div>\n <span class=\"caret m-r-16 m-l-4\"></span>\n </button>\n\n <ul\n class=\"dropdown-menu dropdown-menu--date-range\"\n *dropdownMenu\n >\n <c8y-interval-picker\n class=\"d-contents\"\n formControlName=\"currentDateContextInterval\"\n ></c8y-interval-picker>\n\n <ng-container *ngIf=\"form.controls.currentDateContextInterval.value === 'custom'\">\n <div class=\"p-l-16 p-r-16\">\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'From`date`' | translate\"\n for=\"temporaryUserSelectedFromDate\"\n translate\n >\n From`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedFromDate\"\n [maxDate]=\"form.value.temporaryUserSelectedToDate\"\n [placeholder]=\"'From`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedFromDate\"\n [ngClass]=\"\n form.controls.temporaryUserSelectedFromDate.errors ? 'has-error' : ''\n \"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedFromDate.errors\">\n <c8y-message\n name=\"dateAfterRangeMax\"\n [text]=\"'This date is after the latest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n >\n <label\n [title]=\"'To`date`' | translate\"\n for=\"temporaryUserSelectedToDate\"\n translate\n >\n To`date`\n </label>\n <c8y-date-time-picker\n id=\"temporaryUserSelectedToDate\"\n [minDate]=\"form.value.temporaryUserSelectedFromDate\"\n [placeholder]=\"'To`date`' | translate\"\n [formControl]=\"form.controls.temporaryUserSelectedToDate\"\n [ngClass]=\"form.controls.temporaryUserSelectedToDate.errors ? 'has-error' : ''\"\n ></c8y-date-time-picker>\n <c8y-messages [show]=\"form.controls.temporaryUserSelectedToDate.errors\">\n <c8y-message\n name=\"dateBeforeRangeMin\"\n [text]=\"'This date is before the earliest allowed date.' | translate\"\n ></c8y-message>\n <c8y-message\n name=\"invalidDateTime\"\n [text]=\"'This date is invalid.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n (click)=\"reset(); dropdown.isOpen = false\"\n [disabled]=\"form.value.realtime || isAutoRefreshEnabled\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"\n (form.pristine && form.untouched) || form.invalid || form.value.realtime || isAutoRefreshEnabled\n \"\n translate\n >\n Apply\n </button>\n </div>\n </ng-container>\n </ul>\n </div>\n </div>\n </ng-container>\n\n <div class=\"input-group w-auto\">\n <c8y-realtime-control\n class=\"form-control p-0 flex-no-grow w-auto\"\n *ngIf=\"displaySettings.globalRealtimeContext\"\n formControlName=\"realtime\"\n ></c8y-realtime-control>\n\n <c8y-aggregation-picker\n *ngIf=\"displaySettings.globalAggregationContext\"\n formControlName=\"aggregation\"\n [disabledAggregations]=\"disabledAggregations\"\n ></c8y-aggregation-picker>\n </div>\n </form>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button\n type=\"button\"\n (click)=\"toggleDecoupling()\"\n >\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
462
+ }], ctorParameters: () => [{ type: i1.WidgetsDashboardEventService }, { type: i2.DashboardChildComponent }, { type: i3.FormBuilder }, { type: i4.WidgetTimeContextQueryService }, { type: i5.WidgetTimeContextHelperService }, { type: i6.Router }, { type: i7.ActionBarService }, { type: i8.AggregationService }, { type: i6.ActivatedRoute }], propDecorators: { canDecouple: [{
441
463
  type: Input
442
464
  }], displaySettings: [{
443
465
  type: Input
@@ -452,4 +474,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
452
474
  type: ViewChild,
453
475
  args: [BsDropdownDirective]
454
476
  }] } });
455
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRixPQUFPLEVBQUUs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QUFXO3NCQURWLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBTU4saUJBQWlCO3NCQURoQixNQUFNO2dCQUttQyxNQUFNO3NCQUEvQyxTQUFTO3VCQUFDLDZCQUE2QjtnQkFDUixRQUFRO3NCQUF2QyxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0aW9uRW5kLCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBhZ2dyZWdhdGlvblR5cGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBCc0Ryb3Bkb3duRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9kcm9wZG93bic7XG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFjdGlvbkJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9hY3Rpb24tYmFyJztcbmltcG9ydCB7IEFHR1JFR0FUSU9OX0xJTUlUUyB9IGZyb20gJy4uLy4uL2NvbW1vbi9hZ2dyZWdhdGlvbi9hZ2dyZWdhdGlvbi5tb2RlbCc7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vYWdncmVnYXRpb24vYWdncmVnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vLi4vaTE4bic7XG5pbXBvcnQgeyBEYXNoYm9hcmRDaGlsZEFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2Rhc2hib2FyZC1jaGlsZC1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IERhc2hib2FyZENoaWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZGFzaGJvYXJkLWNoaWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlVGltZUNvbnRleHQsIFRpbWVDb250ZXh0RXZlbnQsIFdpZGdldFRpbWVDb250ZXh0IH0gZnJvbSAnLi4vd2lkZ2V0LWNoYW5nZS1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vd2lkZ2V0cy1kYXNoYm9hcmQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBXaWRnZXRUaW1lQ29udGV4dEhlbHBlclNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2UgfSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQtcXVlcnkuc2VydmljZSc7XG5pbXBvcnQge1xuICBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMsXG4gIFdpZGdldERpc3BsYXlTZXR0aW5ncyxcbiAgV2lkZ2V0VGltZUNvbnRleHRDaGFuZ2UsXG4gIFdpZGdldFRpbWVDb250ZXh0U3RhdGVcbn0gZnJvbSAnLi93aWRnZXQtdGltZS1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7IEludGVydmFsLCBJTlRFUlZBTF9USVRMRVMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS13aWRnZXQtdGltZS1jb250ZXh0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldC10aW1lLWNvbnRleHQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQnIH1cbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJlYWRvbmx5IElOVEVSVkFMX1RJVExFUyA9IElOVEVSVkFMX1RJVExFUztcbiAgcmVhZG9ubHkgREFURV9GT1JNQVQgPSAnc2hvcnQnO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBjb21wb25lbnQgY2FuIGRlY291cGxlIG9yIG5vdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGNhbkRlY291cGxlID0gdHJ1ZTtcblxuICBASW5wdXQoKSBkaXNwbGF5U2V0dGluZ3M6IFdpZGdldERpc3BsYXlTZXR0aW5ncztcblxuICBASW5wdXQoKSBoaWRkZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgZWFjaCBjaGFuZ2UgYXMgYW4gYXJyYXkgb2YgZGF0ZXMgW2Zyb20sIHRvXS5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBkYXRlQ29udGV4dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8V2lkZ2V0VGltZUNvbnRleHRDaGFuZ2U+KCk7XG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50KSBhY3Rpb246IERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKEJzRHJvcGRvd25EaXJlY3RpdmUpIGRyb3Bkb3duOiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0aW1lIGNvbnRleHQgaXMgYm91bmQgdG8gdGhlIGdsb2JhbCBzY29wZS5cbiAgICovXG4gIGlzQ291cGxlZCA9IHRydWU7XG4gIGRlY291cGxlVGltZUNvbnRleHRMYWJlbCA9IGdldHRleHQoJ0RlY291cGxlIHRpbWUgY29udGV4dCcpO1xuICBjb3VwbGVUaW1lQ29udGV4dExhYmVsID0gZ2V0dGV4dCgnQ291cGxlIHRpbWUgY29udGV4dCcpO1xuICBmb3JtOiBSZXR1cm5UeXBlPFdpZGdldFRpbWVDb250ZXh0Q29tcG9uZW50WydjcmVhdGVGb3JtJ10+O1xuICBhY3Rpb25CYXJJbkdyb3VwUHJpb3JpdHk6IG51bWJlcjtcbiAgZGlzYWJsZWRBZ2dyZWdhdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGFnZ3JlZ2F0aW9uVHlwZSwgYm9vbGVhbj4+ID0ge307XG4gIHJlYWRvbmx5IERFRkFVTFRfSU5URVJWQUw6IEludGVydmFsWydpZCddID0gJ2RheXMnO1xuICByZWFkb25seSBBQ1RJT05fQkFSX1BSSU9SSVRZID0gNztcbiAgcmVhZG9ubHkgQUNUSU9OX0JBUl9HUk9VUF9JRCA9ICd0aW1lY29udGV4dCc7XG4gIHJlYWRvbmx5IFJFQUxUSU1FX0lOVEVSVkFMID0gMTAwMDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBkZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgbmF2aWdhdGlvbkluUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhbHRpbWVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAvKipcbiAgICogQGlnbm9yZSBvbmx5IERJLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3aWRnZXRFdmVudFNlcnZpY2U6IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXNoYm9hcmRDaGlsZDogRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFdpZGdldFRpbWVDb250ZXh0UXVlcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaGVscGVyU2VydmljZTogV2lkZ2V0VGltZUNvbnRleHRIZWxwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBhY3Rpb25CYXJTZXJ2aWNlOiBBY3Rpb25CYXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWdncmVnYXRpb25TZXJ2aWNlOiBBZ2dyZWdhdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIFN1YnNjcmliaW5nIHRvIHRoZSBnbG9iYWwgY29udGV4dC5cbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQmFySW5Hcm91cFByaW9yaXR5ID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldEFjdGlvbkJhclByaW9yaXR5KHRoaXMuZGlzcGxheVNldHRpbmdzKTtcbiAgICBjb25zdCBpbml0aWFsQ29udGV4dDogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSA9XG4gICAgICB0aGlzLmdldEluaXRpYWxDb250ZXh0KCkgfHwgdGhpcy5nZXREZWZhdWx0Q29udGV4dCgpO1xuICAgIGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uID0gdGhpcy5jYWxjdWxhdGVBZ2dyZWdhdGlvbihcbiAgICAgIGluaXRpYWxDb250ZXh0LmRhdGUsXG4gICAgICBpbml0aWFsQ29udGV4dC5hZ2dyZWdhdGlvblxuICAgICk7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5jcmVhdGVGb3JtKGluaXRpYWxDb250ZXh0KTtcblxuICAgIHRoaXMuZGF0ZUNvbnRleHRDaGFuZ2UuZW1pdCh7XG4gICAgICBkYXRlOiBpbml0aWFsQ29udGV4dC5kYXRlLFxuICAgICAgcmVhbHRpbWU6IGluaXRpYWxDb250ZXh0LnJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgfSk7XG4gICAgaWYgKHRoaXMuaXNDb3VwbGVkKSB7XG4gICAgICB0aGlzLnF1ZXJ5U2VydmljZS5zZXREYXRlQ29udGV4dFF1ZXJ5UGFyYW1zKGluaXRpYWxDb250ZXh0KTtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpYmVUb0dsb2JhbENvbnRleHQoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUXVlcnlQYXJhbXNDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUm91dGVyRXZlbnRzKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk7XG4gICAgdGhpcy5zdWJzY3JpYmVUb0FnZ3JlZ2F0aW9uQ2hhbmdlKCk7XG5cbiAgICBpZiAoaW5pdGlhbENvbnRleHQucmVhbHRpbWUpIHtcbiAgICAgIHRoaXMub25SZWFsdGltZVZhbHVlQ2hhbmdlKGluaXRpYWxDb250ZXh0LnJlYWx0aW1lKTtcbiAgICAgIHRoaXMuc3RhcnRSZWFsdGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIEFkZGluZyBjdXN0b20gYWN0aW9ucy5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYW5EZWNvdXBsZSkge1xuICAgICAgdGhpcy5kYXNoYm9hcmRDaGlsZC5hZGRBY3Rpb25zKFt0aGlzLmFjdGlvbl0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBjb3VwbGluZyBvbiBvciBvZmYuXG4gICAqL1xuICB0b2dnbGVEZWNvdXBsaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDb3VwbGVkID0gIXRoaXMuaXNDb3VwbGVkO1xuICAgIGNvbnN0IGxhc3RFdmVudFZhbHVlID0gdGhpcy53aWRnZXRFdmVudFNlcnZpY2UuZ2V0TGFzdFZhbHVlKCdUSU1FX0NPTlRFWFQnKTtcbiAgICBjb25zdCB7IHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiwgaW50ZXJ2YWwgfSA9IGxhc3RFdmVudFZhbHVlO1xuICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgaWYgKGludGVydmFsKSB7XG4gICAgICBkYXRlID0gdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRlID0gbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0O1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuXG4gICAgaWYgKHRoaXMuaXNDb3VwbGVkKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvR2xvYmFsQ29udGV4dCgpO1xuICAgICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHsgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBmb3JtIHZhbHVlIHRvIGdsb2JhbCBvciBsb2NhbCBkYXRlIGNvbnRleHQuXG4gICAqL1xuICBhcHBseURhdGV0aW1lQ29udGV4dCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSh7XG4gICAgICBkYXRlOiBbXG4gICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZSksXG4gICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUpXG4gICAgICBdLFxuICAgICAgaW50ZXJ2YWw6IG51bGwsXG4gICAgICByZWFsdGltZTogdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyBmb3JtIHRvIGluaXRpYWwgdmFsdWUgYW5kIHVwZGF0ZSBjb250ZXh0LlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVhbHRpbWUoKTtcbiAgICB0aGlzLnVwZGF0ZSh0aGlzLmdldERlZmF1bHRDb250ZXh0KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmUgdW5zdWJzY3JpYmluZy5cbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tR2xvYmFsQ29udGV4dCgpO1xuICAgIHRoaXMuY2xlYXJRdWVyeVBhcmFtc0lmTmVlZGVkKCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBsZXQgZGF0ZTogRGF0ZVRpbWVDb250ZXh0O1xuICAgICAgICBpZiAoaW50ZXJ2YWwgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgZGF0ZSA9IFtcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZS52YWx1ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHMuY3VycmVudERhdGVDb250ZXh0VG9EYXRlLnZhbHVlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5yZWFsdGltZS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShyZWFsdGltZSA9PiB7XG4gICAgICB0aGlzLm9uUmVhbHRpbWVWYWx1ZUNoYW5nZShyZWFsdGltZSk7XG5cbiAgICAgIGlmIChyZWFsdGltZSkge1xuICAgICAgICB0aGlzLnN0YXJ0UmVhbHRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcFJlYWx0aW1lKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvQWdncmVnYXRpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShhZ2dyZWdhdGlvbiA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlOiBbXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIGludGVydmFsOiB0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAgICAgcmVhbHRpbWU6IHRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSxcbiAgICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKGNvbnRleHQ6IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZTogY29udGV4dC5kYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGU6IGNvbnRleHQuZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0RnJvbURhdGU6IGNvbnRleHQuZGF0ZVswXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0VG9EYXRlOiBjb250ZXh0LmRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgIGN1cnJlbnREYXRlQ29udGV4dEludGVydmFsOiBjb250ZXh0LmludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgcmVhbHRpbWU6IGNvbnRleHQucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogY29udGV4dC5hZ2dyZWdhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGEgbmV3IFdpZGdldENoYW5nZUV2ZW50IGVpdGhlciBvbiB0aGUgbG9jYWwgY2hhbmdlIGVtaXR0ZXIgb3Igb24gdGhlIGdsb2JhbCBvbmUuXG4gICAqIEBwYXJhbSB3aWRnZXRUaW1lQ29udGV4dFN0YXRlIE5ldyB3aWRnZXQgdGltZSBjb250ZXh0IHZhbHVlLiovXG4gIHByaXZhdGUgdXBkYXRlKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRBZ2dyZWdhdGlvbiA9IHRoaXMuY2FsY3VsYXRlQWdncmVnYXRpb24oZGF0ZSwgYWdncmVnYXRpb24pO1xuICAgIGlmICh0aGlzLmlzQ291cGxlZCkge1xuICAgICAgY29uc3QgZXZlbnREYXRhOiBXaWRnZXRUaW1lQ29udGV4dCA9XG4gICAgICAgIGludGVydmFsICYmIGludGVydmFsICE9PSAnY3VzdG9tJ1xuICAgICAgICAgID8geyBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH1cbiAgICAgICAgICA6IHsgZGF0ZVRpbWVDb250ZXh0OiBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfTtcbiAgICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmVtaXQoeyB0eXBlOiAnVElNRV9DT05URVhUJywgZGF0YTogZXZlbnREYXRhIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHsgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9HbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50JCA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldE9ic2VydmFibGU8VGltZUNvbnRleHRFdmVudD4oJ1RJTUVfQ09OVEVYVCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gZXZlbnQkLnN1YnNjcmliZSgoY29udGV4dDogV2lkZ2V0VGltZUNvbnRleHQpID0+IHtcbiAgICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgICBjb25zdCB7IHJlYWx0aW1lLCBpbnRlcnZhbCwgYWdncmVnYXRpb24gfSA9IGNvbnRleHQ7XG4gICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGNvbnRleHQuaW50ZXJ2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZSA9IGNvbnRleHQuZGF0ZVRpbWVDb250ZXh0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGVDb250ZXh0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBkYXRlLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLnNldERhdGVDb250ZXh0UXVlcnlQYXJhbXMoeyBpbnRlcnZhbCwgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtVmFsdWVzKHtcbiAgICBkYXRlLFxuICAgIGludGVydmFsLFxuICAgIHJlYWx0aW1lLFxuICAgIGFnZ3JlZ2F0aW9uXG4gIH06IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGU6IGRhdGVbMF0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlOiBkYXRlWzFdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlOiBkYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZTogZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb24gfHwgbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyA9IHRoaXMucXVlcnlTZXJ2aWNlLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcygpO1xuICAgIGlmIChkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyxcbiAgICAgICAgcmVhbHRpbWU6IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZSA/PyBmYWxzZSxcbiAgICAgICAgYWdncmVnYXRpb246IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLmFnZ3JlZ2F0aW9uIHx8IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGdldCB2YWx1ZSBmcm9tIGxhc3QgdmFsdWUgb2YgZXZlbnRzIHNlcnZpY2VcbiAgICBjb25zdCBsYXN0RXZlbnRWYWx1ZSA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldExhc3RWYWx1ZSgnVElNRV9DT05URVhUJyk7XG4gICAgY29uc3QgcmVhbHRpbWUgPSBsYXN0RXZlbnRWYWx1ZT8ucmVhbHRpbWUgPz8gZmFsc2U7XG4gICAgaWYgKGxhc3RFdmVudFZhbHVlICYmIGxhc3RFdmVudFZhbHVlLmRhdGVUaW1lQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgICBpbnRlcnZhbDogJ2N1c3RvbScsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChsYXN0RXZlbnRWYWx1ZSAmJiBsYXN0RXZlbnRWYWx1ZS5pbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwobGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwpLFxuICAgICAgICBpbnRlcnZhbDogbGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUXVlcnlQYXJhbXNDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2VcbiAgICAgIC5xdWVyeVBhcmFtc0NoYW5nZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKHtcbiAgICAgICAgICBkYXRlQ29udGV4dEZyb20sXG4gICAgICAgICAgZGF0ZUNvbnRleHRUbyxcbiAgICAgICAgICBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIGRhdGVDb250ZXh0UmVhbHRpbWUsXG4gICAgICAgICAgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICB9OiBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFsdGltZSA9IGRhdGVDb250ZXh0UmVhbHRpbWUgPz8gdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lO1xuICAgICAgICAgIGlmIChkYXRlQ29udGV4dEludGVydmFsKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbDogZGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICByZWFsdGltZSxcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGlvbjogZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRleHQ6IERhdGVUaW1lQ29udGV4dCA9IFtcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRGcm9tKSxcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRUbylcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZUNvbnRleHQ6IGRhdGVDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlYWx0aW1lLFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJRdWVyeVBhcmFtc0lmTmVlZGVkKCk6IHZvaWQge1xuICAgIC8vIElmIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHJvdXRlciB3aWxsIHRha2UgY2FyZSBvZiBjbGVhcmluZyBxdWVyeSBwYXJhbXMuIFRoaXMgd2F5IHdlIGF2b2lkIHVubmVjZXNzYXJ5IG1hbmlwdWxhdGlvbiBvZiBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgYWN0aW9uIGluIGFjdGlvbiBiYXIgZXhpc3RzXG4gICAgY29uc3QgYW55V2lkZ2V0VGltZUNvbnRleHRBY3Rpb25MZWZ0ID0gQXJyYXkuZnJvbSh0aGlzLmFjdGlvbkJhclNlcnZpY2Uuc3RhdGUpLnNvbWUoXG4gICAgICBhY3Rpb24gPT4gYWN0aW9uLmdyb3VwSWQgPT09IHRoaXMuQUNUSU9OX0JBUl9HUk9VUF9JRFxuICAgICk7XG4gICAgaWYgKCFhbnlXaWRnZXRUaW1lQ29udGV4dEFjdGlvbkxlZnQpIHtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLmNsZWFyUXVlcnlQYXJhbXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUm91dGVyRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICBlID0+XG4gICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0IHx8IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8IGUgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKHRoaXMuREVGQVVMVF9JTlRFUlZBTCksXG4gICAgICBpbnRlcnZhbDogdGhpcy5ERUZBVUxUX0lOVEVSVkFMLFxuICAgICAgcmVhbHRpbWU6IGZhbHNlLFxuICAgICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZS5NSU5VVEVMWVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UmVhbHRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuYWdncmVnYXRpb24uZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5yZWFsdGltZVN1YnNjcmlwdGlvbiA9IGludGVydmFsKHRoaXMuUkVBTFRJTUVfSU5URVJWQUwpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3RGF0ZUZyb20gPSBuZXcgRGF0ZShcbiAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLnZhbHVlT2YoKSArIHRoaXMuUkVBTFRJTUVfSU5URVJWQUxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3RGF0ZVRvID0gbmV3IERhdGUoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpICsgdGhpcy5SRUFMVElNRV9JTlRFUlZBTFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoe1xuICAgICAgICAgIGRhdGU6IFtuZXdEYXRlRnJvbSwgbmV3RGF0ZVRvXSxcbiAgICAgICAgICBpbnRlcnZhbDogdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0cnVlLFxuICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZm9ybT8uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtPy5jb250cm9scy5hZ2dyZWdhdGlvbi5lbmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWFsdGltZVZhbHVlQ2hhbmdlKHJlYWx0aW1lOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGRhdGVUaW1lQ29udGV4dDogRGF0ZVRpbWVDb250ZXh0O1xuICAgIGlmICh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgIT09ICdjdXN0b20nKSB7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50VGltZVNwYW5Jbk1zID1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpIC1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBkYXRlVG8gPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZGF0ZUZyb20gPSBuZXcgRGF0ZShkYXRlVG8udmFsdWVPZigpIC0gY3VycmVudFRpbWVTcGFuSW5Ncyk7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSBbZGF0ZUZyb20sIGRhdGVUb107XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgIHJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQWdncmVnYXRpb24oXG4gICAgW2RhdGVGcm9tLCBkYXRlVG9dOiBEYXRlVGltZUNvbnRleHQsXG4gICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZVxuICApOiBhZ2dyZWdhdGlvblR5cGUge1xuICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnMgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5nZXREaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyhcbiAgICAgIGRhdGVGcm9tLFxuICAgICAgZGF0ZVRvXG4gICAgKTtcbiAgICBjb25zdCB0aW1lUmFuZ2VJbk1zID0gZGF0ZVRvLnZhbHVlT2YoKSAtIGRhdGVGcm9tLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1Byb3BlckFnZ3JlZ2F0aW9uID0gIXRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25dIHx8IGFnZ3JlZ2F0aW9uID09PSBudWxsO1xuXG4gICAgaWYgKGlzUHJvcGVyQWdncmVnYXRpb24pIHtcbiAgICAgIHJldHVybiBhZ2dyZWdhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLkRBSUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkRBSUxZO1xuICAgIH0gZWxzZSBpZiAodGltZVJhbmdlSW5NcyA+PSBBR0dSRUdBVElPTl9MSU1JVFMuSE9VUkxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkhPVVJMWTtcbiAgICB9IGVsc2UgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLk1JTlVURUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLk1JTlVURUxZO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtXG4gICpuZ0lmPVwiaXNDb3VwbGVkICYmICFoaWRkZW5cIlxuICBbcHJpb3JpdHldPVwiQUNUSU9OX0JBUl9QUklPUklUWVwiXG4gIFtncm91cElkXT1cIkFDVElPTl9CQVJfR1JPVVBfSURcIlxuICBbaW5Hcm91cFByaW9yaXR5XT1cImFjdGlvbkJhckluR3JvdXBQcmlvcml0eVwiXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVUaW1lUGlja2VyXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgZGF0ZTogW2Zvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUsIGZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlXVxuICAgIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCIhaXNDb3VwbGVkXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVQaWNrZXJcIlxuICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgIGRhdGU6IFtmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLCBmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZV1cbiAgfVwiXG4+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVRpbWVQaWNrZXJcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cImQtZmxleCBnYXAtMTYgcC1sLXhzLTE2IHAtci14cy0xNiBtLXQteHMtOCBtLWIteHMtOFwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5U2V0dGluZ3MuZ2xvYmFsVGltZUNvbnRleHRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duIGZsZXgtZ3Jvd1wiXG4gICAgICAgICAgI2Ryb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICpuZ0lmPVwiZGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBmb3JtLWNvbnRyb2wgbC1oLXRpZ2h0IGQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3tcbiAgICAgICAgICAgICAgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICB0b29sdGlwPVwie3sgZGF0ZVswXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19IOKAlCB7eyBkYXRlWzFdIHwgYzh5RGF0ZTogREFURV9GT1JNQVQgfX1cIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgZGF0YS1jeT1cIndpZGdldC10aW1lLWNvbnRleHQtLWRhdGUtcGlja2VyLWRyb3Bkb3duLWJ1dHRvblwiXG4gICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJzY2hlZHVsZTFcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbCB0ZXh0LWxlZnQgZml0LXdcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMTJcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC1pbnRlcnZhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBJTlRFUlZBTF9USVRMRVNbZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMCB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC10aW1lLXJhbmdlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJldCBtLXItMTYgbS1sLTRcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1kYXRlLXJhbmdlXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWludGVydmFsLXBpY2tlclxuICAgICAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbFwiXG4gICAgICAgICAgICA+PC9jOHktaW50ZXJ2YWwtcGlja2VyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZSA9PT0gJ2N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtbC0xNiBwLXItMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBGcm9tYGRhdGVgXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGM4eS1kYXRlLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWRhdGUtdGltZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkYXRlQWZ0ZXJSYW5nZU1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBhZnRlciB0aGUgbGF0ZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVG9gZGF0ZWBcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWRhdGUtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlcyBbc2hvd109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVCZWZvcmVSYW5nZU1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBiZWZvcmUgdGhlIGVhcmxpZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xNiBkLWZsZXggZ2FwLTggc2VwYXJhdG9yLXRvcFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVzZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0KCk7IGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLnZhbHVlLnJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFJlc2V0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseURhdGV0aW1lQ29udGV4dCgpOyBkcm9wZG93bi5pc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtLnByaXN0aW5lICYmIGZvcm0udW50b3VjaGVkKSB8fCBmb3JtLmludmFsaWQgfHwgZm9ybS52YWx1ZS5yZWFsdGltZVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LWF1dG9cIj5cbiAgICAgIDxjOHktcmVhbHRpbWUtY29udHJvbFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBwLTAgZmxleC1uby1ncm93IHctYXV0b1wiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheVNldHRpbmdzLmdsb2JhbFJlYWx0aW1lQ29udGV4dFwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlYWx0aW1lXCJcbiAgICAgID48L2M4eS1yZWFsdGltZS1jb250cm9sPlxuXG4gICAgICA8Yzh5LWFnZ3JlZ2F0aW9uLXBpY2tlclxuICAgICAgICAqbmdJZj1cImRpc3BsYXlTZXR0aW5ncy5nbG9iYWxBZ2dyZWdhdGlvbkNvbnRleHRcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uc1wiXG4gICAgICA+PC9jOHktYWdncmVnYXRpb24tcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRGVjb3VwbGluZygpXCJcbiAgPlxuICAgIDxpIFtjOHlJY29uXT1cImlzQ291cGxlZCA/ICdzY2hlZHVsZTEnIDogJ3RvZGF5J1wiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCI+XG4gICAgICB7eyAoaXNDb3VwbGVkID8gZGVjb3VwbGVUaW1lQ29udGV4dExhYmVsIDogY291cGxlVGltZUNvbnRleHRMYWJlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cbiJdfQ==
477
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9jb3JlL2Rhc2hib2FyZC93aWdldC10aW1lLWNvbnRleHQvd2lkZ2V0LXRpbWUtY29udGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGVBQWUsRUFDZixNQUFNLEVBQ1AsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBWSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxN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QUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFNTixpQkFBaUI7c0JBRGhCLE1BQU07Z0JBS21DLE1BQU07c0JBQS9DLFNBQVM7dUJBQUMsNkJBQTZCO2dCQUNSLFFBQVE7c0JBQXZDLFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uU3RhcnQsXG4gIFJvdXRlclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgSW50ZXJ2YWwsIElOVEVSVkFMX1RJVExFUyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaW50ZXJ2YWwtcGlja2VyJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IGludGVydmFsLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWN0aW9uQmFyU2VydmljZSB9IGZyb20gJy4uLy4uL2FjdGlvbi1iYXInO1xuaW1wb3J0IHsgQUdHUkVHQVRJT05fTElNSVRTIH0gZnJvbSAnLi4vLi4vY29tbW9uL2FnZ3JlZ2F0aW9uL2FnZ3JlZ2F0aW9uLm1vZGVsJztcbmltcG9ydCB7IEFnZ3JlZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9hZ2dyZWdhdGlvbi9hZ2dyZWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi8uLi9pMThuJztcbmltcG9ydCB7IERhc2hib2FyZENoaWxkQWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vZGFzaGJvYXJkLWNoaWxkLWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQgfSBmcm9tICcuLi9kYXNoYm9hcmQtY2hpbGQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVUaW1lQ29udGV4dCwgVGltZUNvbnRleHRFdmVudCwgV2lkZ2V0VGltZUNvbnRleHQgfSBmcm9tICcuLi93aWRnZXQtY2hhbmdlLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi93aWRnZXRzLWRhc2hib2FyZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFdpZGdldFRpbWVDb250ZXh0SGVscGVyU2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LXRpbWUtY29udGV4dC1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBXaWRnZXRUaW1lQ29udGV4dFF1ZXJ5U2VydmljZSB9IGZyb20gJy4vd2lkZ2V0LXRpbWUtY29udGV4dC1xdWVyeS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyxcbiAgV2lkZ2V0RGlzcGxheVNldHRpbmdzLFxuICBXaWRnZXRUaW1lQ29udGV4dENoYW5nZSxcbiAgV2lkZ2V0VGltZUNvbnRleHRTdGF0ZVxufSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2lkZ2V0LXRpbWUtY29udGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtdGltZS1jb250ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtZmxleCBhLWktY2VudGVyIGdhcC00JyB9XG59KVxuZXhwb3J0IGNsYXNzIFdpZGdldFRpbWVDb250ZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICByZWFkb25seSBJTlRFUlZBTF9USVRMRVMgPSBJTlRFUlZBTF9USVRMRVM7XG4gIHJlYWRvbmx5IERBVEVfRk9STUFUID0gJ3Nob3J0JztcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgY29tcG9uZW50IGNhbiBkZWNvdXBsZSBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKVxuICBjYW5EZWNvdXBsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgZGlzcGxheVNldHRpbmdzOiBXaWRnZXREaXNwbGF5U2V0dGluZ3M7XG5cbiAgQElucHV0KCkgaGlkZGVuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGVhY2ggY2hhbmdlIGFzIGFuIGFycmF5IG9mIGRhdGVzIFtmcm9tLCB0b10uXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZGF0ZUNvbnRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFdpZGdldFRpbWVDb250ZXh0Q2hhbmdlPigpO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQFZpZXdDaGlsZChEYXNoYm9hcmRDaGlsZEFjdGlvbkNvbXBvbmVudCkgYWN0aW9uOiBEYXNoYm9hcmRDaGlsZEFjdGlvbkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZChCc0Ryb3Bkb3duRGlyZWN0aXZlKSBkcm9wZG93bjogQnNEcm9wZG93bkRpcmVjdGl2ZTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGltZSBjb250ZXh0IGlzIGJvdW5kIHRvIHRoZSBnbG9iYWwgc2NvcGUuXG4gICAqL1xuICBpc0NvdXBsZWQgPSB0cnVlO1xuICBkZWNvdXBsZVRpbWVDb250ZXh0TGFiZWwgPSBnZXR0ZXh0KCdEZWNvdXBsZSB0aW1lIGNvbnRleHQnKTtcbiAgY291cGxlVGltZUNvbnRleHRMYWJlbCA9IGdldHRleHQoJ0NvdXBsZSB0aW1lIGNvbnRleHQnKTtcbiAgZm9ybTogUmV0dXJuVHlwZTxXaWRnZXRUaW1lQ29udGV4dENvbXBvbmVudFsnY3JlYXRlRm9ybSddPjtcbiAgYWN0aW9uQmFySW5Hcm91cFByaW9yaXR5OiBudW1iZXI7XG4gIGRpc2FibGVkQWdncmVnYXRpb25zOiBQYXJ0aWFsPFJlY29yZDxhZ2dyZWdhdGlvblR5cGUsIGJvb2xlYW4+PiA9IHt9O1xuICBpc0F1dG9SZWZyZXNoRW5hYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgREVGQVVMVF9JTlRFUlZBTDogSW50ZXJ2YWxbJ2lkJ10gPSAnZGF5cyc7XG4gIHJlYWRvbmx5IEFDVElPTl9CQVJfUFJJT1JJVFkgPSA3O1xuICByZWFkb25seSBBQ1RJT05fQkFSX0dST1VQX0lEID0gJ3RpbWVjb250ZXh0JztcbiAgcmVhZG9ubHkgUkVBTFRJTUVfSU5URVJWQUwgPSAxMDAwO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFsdGltZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlIG9ubHkgREkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHdpZGdldEV2ZW50U2VydmljZTogV2lkZ2V0c0Rhc2hib2FyZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHF1ZXJ5U2VydmljZTogV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoZWxwZXJTZXJ2aWNlOiBXaWRnZXRUaW1lQ29udGV4dEhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGlvbkJhclNlcnZpY2U6IEFjdGlvbkJhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhZ2dyZWdhdGlvblNlcnZpY2U6IEFnZ3JlZ2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmUgU3Vic2NyaWJpbmcgdG8gdGhlIGdsb2JhbCBjb250ZXh0LlxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb25CYXJJbkdyb3VwUHJpb3JpdHkgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0QWN0aW9uQmFyUHJpb3JpdHkodGhpcy5kaXNwbGF5U2V0dGluZ3MpO1xuICAgIGNvbnN0IGluaXRpYWxDb250ZXh0OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlID1cbiAgICAgIHRoaXMuZ2V0SW5pdGlhbENvbnRleHQoKSB8fCB0aGlzLmdldERlZmF1bHRDb250ZXh0KCk7XG4gICAgaW5pdGlhbENvbnRleHQuYWdncmVnYXRpb24gPSB0aGlzLmNhbGN1bGF0ZUFnZ3JlZ2F0aW9uKFxuICAgICAgaW5pdGlhbENvbnRleHQuZGF0ZSxcbiAgICAgIGluaXRpYWxDb250ZXh0LmFnZ3JlZ2F0aW9uXG4gICAgKTtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmNyZWF0ZUZvcm0oaW5pdGlhbENvbnRleHQpO1xuXG4gICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHtcbiAgICAgIGRhdGU6IGluaXRpYWxDb250ZXh0LmRhdGUsXG4gICAgICByZWFsdGltZTogaW5pdGlhbENvbnRleHQucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogaW5pdGlhbENvbnRleHQuYWdncmVnYXRpb25cbiAgICB9KTtcbiAgICBpZiAodGhpcy5pc0NvdXBsZWQpIHtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLnNldERhdGVDb250ZXh0UXVlcnlQYXJhbXMoaW5pdGlhbENvbnRleHQpO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmliZVRvR2xvYmFsQ29udGV4dCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9RdWVyeVBhcmFtc0NoYW5nZSgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9Sb3V0ZXJFdmVudHMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvSW50ZXJ2YWxDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUmVhbHRpbWVDaGFuZ2UoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvQWdncmVnYXRpb25DaGFuZ2UoKTtcblxuICAgIGlmIChpbml0aWFsQ29udGV4dC5yZWFsdGltZSkge1xuICAgICAgdGhpcy5vblJlYWx0aW1lVmFsdWVDaGFuZ2UoaW5pdGlhbENvbnRleHQucmVhbHRpbWUpO1xuICAgICAgdGhpcy5zdGFydFJlYWx0aW1lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmUgQWRkaW5nIGN1c3RvbSBhY3Rpb25zLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbkRlY291cGxlKSB7XG4gICAgICB0aGlzLmRhc2hib2FyZENoaWxkLmFkZEFjdGlvbnMoW3RoaXMuYWN0aW9uXSk7XG4gICAgfVxuXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zWydnbG9iYWxDb250ZXh0QXV0b1JlZnJlc2gnXSA9PT0gJ3RydWUnKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaGFuZGxlQXV0b1JlZnJlc2hDaGFuZ2UuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgY291cGxpbmcgb24gb3Igb2ZmLlxuICAgKi9cbiAgdG9nZ2xlRGVjb3VwbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ291cGxlZCA9ICF0aGlzLmlzQ291cGxlZDtcbiAgICBjb25zdCBsYXN0RXZlbnRWYWx1ZSA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldExhc3RWYWx1ZSgnVElNRV9DT05URVhUJyk7XG4gICAgY29uc3QgeyByZWFsdGltZSwgYWdncmVnYXRpb24sIGludGVydmFsIH0gPSBsYXN0RXZlbnRWYWx1ZTtcbiAgICBsZXQgZGF0ZTogRGF0ZVRpbWVDb250ZXh0O1xuICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGludGVydmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0ZSA9IGxhc3RFdmVudFZhbHVlLmRhdGVUaW1lQ29udGV4dDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTtcblxuICAgIGlmICh0aGlzLmlzQ291cGxlZCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmVUb0dsb2JhbENvbnRleHQoKTtcbiAgICAgIHRoaXMuZGF0ZUNvbnRleHRDaGFuZ2UuZW1pdCh7IGRhdGUsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21HbG9iYWxDb250ZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZm9ybSB2YWx1ZSB0byBnbG9iYWwgb3IgbG9jYWwgZGF0ZSBjb250ZXh0LlxuICAgKi9cbiAgYXBwbHlEYXRldGltZUNvbnRleHQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogW1xuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUpLFxuICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUudGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlKVxuICAgICAgXSxcbiAgICAgIGludGVydmFsOiBudWxsLFxuICAgICAgcmVhbHRpbWU6IHRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSxcbiAgICAgIGFnZ3JlZ2F0aW9uOiB0aGlzLmZvcm0udmFsdWUuYWdncmVnYXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgZm9ybSB0byBpbml0aWFsIHZhbHVlIGFuZCB1cGRhdGUgY29udGV4dC5cbiAgICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlYWx0aW1lKCk7XG4gICAgdGhpcy51cGRhdGUodGhpcy5nZXREZWZhdWx0Q29udGV4dCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlIHVuc3Vic2NyaWJpbmcuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTtcbiAgICB0aGlzLmNsZWFyUXVlcnlQYXJhbXNJZk5lZWRlZCgpO1xuICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLnNldFJlYWx0aW1lVGltZUNvbnRleHRTZXR0aW5nKCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0ludGVydmFsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoaW50ZXJ2YWwgPT4ge1xuICAgICAgICBsZXQgZGF0ZTogRGF0ZVRpbWVDb250ZXh0O1xuICAgICAgICBpZiAoaW50ZXJ2YWwgPT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgZGF0ZSA9IFtcbiAgICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRGcm9tRGF0ZS52YWx1ZSksXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0uY29udHJvbHMuY3VycmVudERhdGVDb250ZXh0VG9EYXRlLnZhbHVlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIGludGVydmFsLFxuICAgICAgICAgIHJlYWx0aW1lOiB0aGlzLmZvcm0udmFsdWUucmVhbHRpbWUsXG4gICAgICAgICAgYWdncmVnYXRpb246IHRoaXMuZm9ybS52YWx1ZS5hZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1JlYWx0aW1lQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5yZWFsdGltZS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShyZWFsdGltZSA9PiB7XG4gICAgICB0aGlzLm9uUmVhbHRpbWVWYWx1ZUNoYW5nZShyZWFsdGltZSk7XG5cbiAgICAgIGlmIChyZWFsdGltZSkge1xuICAgICAgICB0aGlzLnN0YXJ0UmVhbHRpbWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RvcFJlYWx0aW1lKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvQWdncmVnYXRpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShhZ2dyZWdhdGlvbiA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICBkYXRlOiBbXG4gICAgICAgICAgICBuZXcgRGF0ZSh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUpLFxuICAgICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSlcbiAgICAgICAgICBdLFxuICAgICAgICAgIGludGVydmFsOiB0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwsXG4gICAgICAgICAgcmVhbHRpbWU6IHRoaXMuZm9ybS52YWx1ZS5yZWFsdGltZSxcbiAgICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtKGNvbnRleHQ6IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZTogY29udGV4dC5kYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICB0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGU6IGNvbnRleHQuZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0RnJvbURhdGU6IGNvbnRleHQuZGF0ZVswXS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudERhdGVDb250ZXh0VG9EYXRlOiBjb250ZXh0LmRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgIGN1cnJlbnREYXRlQ29udGV4dEludGVydmFsOiBjb250ZXh0LmludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgcmVhbHRpbWU6IGNvbnRleHQucmVhbHRpbWUsXG4gICAgICBhZ2dyZWdhdGlvbjogY29udGV4dC5hZ2dyZWdhdGlvblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIGEgbmV3IFdpZGdldENoYW5nZUV2ZW50IGVpdGhlciBvbiB0aGUgbG9jYWwgY2hhbmdlIGVtaXR0ZXIgb3Igb24gdGhlIGdsb2JhbCBvbmUuXG4gICAqIEBwYXJhbSB3aWRnZXRUaW1lQ29udGV4dFN0YXRlIE5ldyB3aWRnZXQgdGltZSBjb250ZXh0IHZhbHVlLiovXG4gIHByaXZhdGUgdXBkYXRlKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRBZ2dyZWdhdGlvbiA9IHRoaXMuY2FsY3VsYXRlQWdncmVnYXRpb24oZGF0ZSwgYWdncmVnYXRpb24pO1xuICAgIGlmICh0aGlzLmlzQ291cGxlZCkge1xuICAgICAgY29uc3QgZXZlbnREYXRhOiBXaWRnZXRUaW1lQ29udGV4dCA9XG4gICAgICAgIGludGVydmFsICYmIGludGVydmFsICE9PSAnY3VzdG9tJ1xuICAgICAgICAgID8geyBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH1cbiAgICAgICAgICA6IHsgZGF0ZVRpbWVDb250ZXh0OiBkYXRlLCByZWFsdGltZSwgYWdncmVnYXRpb246IHZhbGlkQWdncmVnYXRpb24gfTtcbiAgICAgIHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmVtaXQoeyB0eXBlOiAnVElNRV9DT05URVhUJywgZGF0YTogZXZlbnREYXRhIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1WYWx1ZXMoeyBkYXRlLCBpbnRlcnZhbCwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgICAgdGhpcy5kYXRlQ29udGV4dENoYW5nZS5lbWl0KHsgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uOiB2YWxpZEFnZ3JlZ2F0aW9uIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9HbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50JCA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldE9ic2VydmFibGU8VGltZUNvbnRleHRFdmVudD4oJ1RJTUVfQ09OVEVYVCcpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gZXZlbnQkLnN1YnNjcmliZSgoY29udGV4dDogV2lkZ2V0VGltZUNvbnRleHQpID0+IHtcbiAgICAgIGxldCBkYXRlOiBEYXRlVGltZUNvbnRleHQ7XG4gICAgICBjb25zdCB7IHJlYWx0aW1lLCBpbnRlcnZhbCwgYWdncmVnYXRpb24gfSA9IGNvbnRleHQ7XG4gICAgICBpZiAoaW50ZXJ2YWwpIHtcbiAgICAgICAgZGF0ZSA9IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKGNvbnRleHQuaW50ZXJ2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0ZSA9IGNvbnRleHQuZGF0ZVRpbWVDb250ZXh0O1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGVDb250ZXh0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBkYXRlLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHsgZGF0ZSwgaW50ZXJ2YWwsIHJlYWx0aW1lLCBhZ2dyZWdhdGlvbiB9KTtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLnNldERhdGVDb250ZXh0UXVlcnlQYXJhbXMoeyBpbnRlcnZhbCwgZGF0ZSwgcmVhbHRpbWUsIGFnZ3JlZ2F0aW9uIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtVmFsdWVzKHtcbiAgICBkYXRlLFxuICAgIGludGVydmFsLFxuICAgIHJlYWx0aW1lLFxuICAgIGFnZ3JlZ2F0aW9uXG4gIH06IFdpZGdldFRpbWVDb250ZXh0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGU6IGRhdGVbMF0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgdGVtcG9yYXJ5VXNlclNlbGVjdGVkVG9EYXRlOiBkYXRlWzFdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlOiBkYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZTogZGF0ZVsxXS50b0lTT1N0cmluZygpLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWw6IGludGVydmFsIHx8ICdjdXN0b20nLFxuICAgICAgICBhZ2dyZWdhdGlvbjogYWdncmVnYXRpb24gfHwgbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVuc3Vic2NyaWJlRnJvbUdsb2JhbENvbnRleHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5pdGlhbENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyA9IHRoaXMucXVlcnlTZXJ2aWNlLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcygpO1xuICAgIGlmIChkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcyxcbiAgICAgICAgcmVhbHRpbWU6IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZSA/PyBmYWxzZSxcbiAgICAgICAgYWdncmVnYXRpb246IGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcy5yZWFsdGltZVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLmFnZ3JlZ2F0aW9uIHx8IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIC8vIGdldCB2YWx1ZSBmcm9tIGxhc3QgdmFsdWUgb2YgZXZlbnRzIHNlcnZpY2VcbiAgICBjb25zdCBsYXN0RXZlbnRWYWx1ZSA9IHRoaXMud2lkZ2V0RXZlbnRTZXJ2aWNlLmdldExhc3RWYWx1ZSgnVElNRV9DT05URVhUJyk7XG4gICAgY29uc3QgcmVhbHRpbWUgPSBsYXN0RXZlbnRWYWx1ZT8ucmVhbHRpbWUgPz8gZmFsc2U7XG4gICAgaWYgKGxhc3RFdmVudFZhbHVlICYmIGxhc3RFdmVudFZhbHVlLmRhdGVUaW1lQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogbGFzdEV2ZW50VmFsdWUuZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgICBpbnRlcnZhbDogJ2N1c3RvbScsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChsYXN0RXZlbnRWYWx1ZSAmJiBsYXN0RXZlbnRWYWx1ZS5pbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwobGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwpLFxuICAgICAgICBpbnRlcnZhbDogbGFzdEV2ZW50VmFsdWUuaW50ZXJ2YWwsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvbjogcmVhbHRpbWUgPyBudWxsIDogbGFzdEV2ZW50VmFsdWUuYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUXVlcnlQYXJhbXNDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2VcbiAgICAgIC5xdWVyeVBhcmFtc0NoYW5nZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKHtcbiAgICAgICAgICBkYXRlQ29udGV4dEZyb20sXG4gICAgICAgICAgZGF0ZUNvbnRleHRUbyxcbiAgICAgICAgICBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICAgIGRhdGVDb250ZXh0UmVhbHRpbWUsXG4gICAgICAgICAgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICB9OiBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZWFsdGltZSA9IGRhdGVDb250ZXh0UmVhbHRpbWUgPz8gdGhpcy5mb3JtLnZhbHVlLnJlYWx0aW1lO1xuICAgICAgICAgIGlmIChkYXRlQ29udGV4dEludGVydmFsKSB7XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBpbnRlcnZhbDogZGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICAgICAgICByZWFsdGltZSxcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGlvbjogZGF0ZUNvbnRleHRBZ2dyZWdhdGlvblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGF0ZUNvbnRleHQ6IERhdGVUaW1lQ29udGV4dCA9IFtcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRGcm9tKSxcbiAgICAgICAgICAgICAgbmV3IERhdGUoZGF0ZUNvbnRleHRUbylcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICB0aGlzLndpZGdldEV2ZW50U2VydmljZS5lbWl0KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1RJTUVfQ09OVEVYVCcsXG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZUNvbnRleHQ6IGRhdGVDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlYWx0aW1lLFxuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uOiBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJRdWVyeVBhcmFtc0lmTmVlZGVkKCk6IHZvaWQge1xuICAgIC8vIElmIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MsIHJvdXRlciB3aWxsIHRha2UgY2FyZSBvZiBjbGVhcmluZyBxdWVyeSBwYXJhbXMuIFRoaXMgd2F5IHdlIGF2b2lkIHVubmVjZXNzYXJ5IG1hbmlwdWxhdGlvbiBvZiBicm93c2VyIGhpc3RvcnlcbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBpZiBhbnkgb3RoZXIgV2lkZ2V0VGltZUNvbnRleHRDb21wb25lbnQgYWN0aW9uIGluIGFjdGlvbiBiYXIgZXhpc3RzXG4gICAgY29uc3QgYW55V2lkZ2V0VGltZUNvbnRleHRBY3Rpb25MZWZ0ID0gQXJyYXkuZnJvbSh0aGlzLmFjdGlvbkJhclNlcnZpY2Uuc3RhdGUpLnNvbWUoXG4gICAgICBhY3Rpb24gPT4gYWN0aW9uLmdyb3VwSWQgPT09IHRoaXMuQUNUSU9OX0JBUl9HUk9VUF9JRFxuICAgICk7XG4gICAgaWYgKCFhbnlXaWRnZXRUaW1lQ29udGV4dEFjdGlvbkxlZnQpIHtcbiAgICAgIHRoaXMucXVlcnlTZXJ2aWNlLmNsZWFyUXVlcnlQYXJhbXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUm91dGVyRXZlbnRzKCk6IHZvaWQge1xuICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihcbiAgICAgICAgICBlID0+XG4gICAgICAgICAgICBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0IHx8IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8IGUgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcyA9IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdENvbnRleHQoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGU6IHRoaXMuaGVscGVyU2VydmljZS5nZXREYXRlVGltZUNvbnRleHRCeUludGVydmFsKHRoaXMuREVGQVVMVF9JTlRFUlZBTCksXG4gICAgICBpbnRlcnZhbDogdGhpcy5ERUZBVUxUX0lOVEVSVkFMLFxuICAgICAgcmVhbHRpbWU6IGZhbHNlLFxuICAgICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZS5NSU5VVEVMWVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UmVhbHRpbWUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlRGF0ZVJhbmdlQW5kQWdncmVnYXRpb24oKTtcblxuICAgIHRoaXMucmVhbHRpbWVTdWJzY3JpcHRpb24gPSBpbnRlcnZhbCh0aGlzLlJFQUxUSU1FX0lOVEVSVkFMKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGVGcm9tID0gbmV3IERhdGUoXG4gICAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKS52YWx1ZU9mKCkgKyB0aGlzLlJFQUxUSU1FX0lOVEVSVkFMXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGVUbyA9IG5ldyBEYXRlKFxuICAgICAgICAgIG5ldyBEYXRlKHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRUb0RhdGUpLnZhbHVlT2YoKSArIHRoaXMuUkVBTFRJTUVfSU5URVJWQUxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtVmFsdWVzKHtcbiAgICAgICAgICBkYXRlOiBbbmV3RGF0ZUZyb20sIG5ld0RhdGVUb10sXG4gICAgICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgICAgICByZWFsdGltZTogdHJ1ZSxcbiAgICAgICAgICBhZ2dyZWdhdGlvbjogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdXRvUmVmcmVzaENoYW5nZShpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkID0gaXNFbmFibGVkO1xuICAgIGlzRW5hYmxlZCA/IHRoaXMub25EaXNhYmxlQXV0b1JlZnJlc2goKSA6IHRoaXMuZW5hYmxlRGF0ZVJhbmdlQW5kQWdncmVnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgb25EaXNhYmxlQXV0b1JlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmFnZ3JlZ2F0aW9uLnNldFZhbHVlKG51bGwpO1xuICAgIHRoaXMuZGlzYWJsZURhdGVSYW5nZUFuZEFnZ3JlZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVEYXRlUmFuZ2VBbmRBZ2dyZWdhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5hZ2dyZWdhdGlvbi5kaXNhYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZURhdGVSYW5nZUFuZEFnZ3JlZ2F0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHMucmVhbHRpbWUudmFsdWUgfHwgdGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZW5hYmxlKCk7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lbmFibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMuYWdncmVnYXRpb24uZW5hYmxlKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZWFsdGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWx0aW1lU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZW5hYmxlRGF0ZVJhbmdlQW5kQWdncmVnYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWFsdGltZVZhbHVlQ2hhbmdlKHJlYWx0aW1lOiBib29sZWFuKTogdm9pZCB7XG4gICAgbGV0IGRhdGVUaW1lQ29udGV4dDogRGF0ZVRpbWVDb250ZXh0O1xuICAgIGlmICh0aGlzLmZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0SW50ZXJ2YWwgIT09ICdjdXN0b20nKSB7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSB0aGlzLmhlbHBlclNlcnZpY2UuZ2V0RGF0ZVRpbWVDb250ZXh0QnlJbnRlcnZhbChcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEludGVydmFsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50VGltZVNwYW5Jbk1zID1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZSkudmFsdWVPZigpIC1cbiAgICAgICAgbmV3IERhdGUodGhpcy5mb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBkYXRlVG8gPSBuZXcgRGF0ZSgpO1xuICAgICAgY29uc3QgZGF0ZUZyb20gPSBuZXcgRGF0ZShkYXRlVG8udmFsdWVPZigpIC0gY3VycmVudFRpbWVTcGFuSW5Ncyk7XG4gICAgICBkYXRlVGltZUNvbnRleHQgPSBbZGF0ZUZyb20sIGRhdGVUb107XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGUoe1xuICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0LFxuICAgICAgaW50ZXJ2YWw6IHRoaXMuZm9ybS52YWx1ZS5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbCxcbiAgICAgIHJlYWx0aW1lLFxuICAgICAgYWdncmVnYXRpb246IG51bGxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQWdncmVnYXRpb24oXG4gICAgW2RhdGVGcm9tLCBkYXRlVG9dOiBEYXRlVGltZUNvbnRleHQsXG4gICAgYWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uVHlwZVxuICApOiBhZ2dyZWdhdGlvblR5cGUge1xuICAgIHRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnMgPSB0aGlzLmFnZ3JlZ2F0aW9uU2VydmljZS5nZXREaXNhYmxlZEFnZ3JlZ2F0aW9uT3B0aW9ucyhcbiAgICAgIGRhdGVGcm9tLFxuICAgICAgZGF0ZVRvXG4gICAgKTtcbiAgICBjb25zdCB0aW1lUmFuZ2VJbk1zID0gZGF0ZVRvLnZhbHVlT2YoKSAtIGRhdGVGcm9tLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpc1Byb3BlckFnZ3JlZ2F0aW9uID0gIXRoaXMuZGlzYWJsZWRBZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25dIHx8IGFnZ3JlZ2F0aW9uID09PSBudWxsO1xuXG4gICAgaWYgKGlzUHJvcGVyQWdncmVnYXRpb24pIHtcbiAgICAgIHJldHVybiBhZ2dyZWdhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLkRBSUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkRBSUxZO1xuICAgIH0gZWxzZSBpZiAodGltZVJhbmdlSW5NcyA+PSBBR0dSRUdBVElPTl9MSU1JVFMuSE9VUkxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLkhPVVJMWTtcbiAgICB9IGVsc2UgaWYgKHRpbWVSYW5nZUluTXMgPj0gQUdHUkVHQVRJT05fTElNSVRTLk1JTlVURUxZX0xJTUlUKSB7XG4gICAgICByZXR1cm4gYWdncmVnYXRpb25UeXBlLk1JTlVURUxZO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtXG4gICpuZ0lmPVwiaXNDb3VwbGVkICYmICFoaWRkZW5cIlxuICBbcHJpb3JpdHldPVwiQUNUSU9OX0JBUl9QUklPUklUWVwiXG4gIFtncm91cElkXT1cIkFDVElPTl9CQVJfR1JPVVBfSURcIlxuICBbaW5Hcm91cFByaW9yaXR5XT1cImFjdGlvbkJhckluR3JvdXBQcmlvcml0eVwiXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbj5cbiAgPG5nLWNvbnRhaW5lclxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVUaW1lUGlja2VyXCJcbiAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgZGF0ZTogW2Zvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0RnJvbURhdGUsIGZvcm0udmFsdWUuY3VycmVudERhdGVDb250ZXh0VG9EYXRlXVxuICAgIH1cIlxuICA+PC9uZy1jb250YWluZXI+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxuZy1jb250YWluZXJcbiAgKm5nSWY9XCIhaXNDb3VwbGVkXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVRpbWVQaWNrZXJcIlxuICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgIGRhdGU6IFtmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dEZyb21EYXRlLCBmb3JtLnZhbHVlLmN1cnJlbnREYXRlQ29udGV4dFRvRGF0ZV1cbiAgfVwiXG4+PC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZVxuICAjZGF0ZVRpbWVQaWNrZXJcbiAgbGV0LWRhdGU9XCJkYXRlXCJcbj5cbiAgPGZvcm1cbiAgICBjbGFzcz1cImQtZmxleCBnYXAtMTYgcC1sLXhzLTE2IHAtci14cy0xNiBtLXQteHMtOCBtLWIteHMtOFwiXG4gICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5U2V0dGluZ3MuZ2xvYmFsVGltZUNvbnRleHRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duIGZsZXgtZ3Jvd1wiXG4gICAgICAgICAgI2Ryb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICpuZ0lmPVwiZGF0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBmb3JtLWNvbnRyb2wgbC1oLXRpZ2h0IGQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3tcbiAgICAgICAgICAgICAgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICB0b29sdGlwPVwie3sgZGF0ZVswXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19IOKAlCB7eyBkYXRlWzFdIHwgYzh5RGF0ZTogREFURV9GT1JNQVQgfX1cIlxuICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgZGF0YS1jeT1cIndpZGdldC10aW1lLWNvbnRleHQtLWRhdGUtcGlja2VyLWRyb3Bkb3duLWJ1dHRvblwiXG4gICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJzY2hlZHVsZTFcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbCB0ZXh0LWxlZnQgZml0LXdcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtMTJcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC1pbnRlcnZhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBJTlRFUlZBTF9USVRMRVNbZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZV0gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC0xMCB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXQtdGltZS1jb250ZXh0LS1zZWxlY3RlZC10aW1lLXJhbmdlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGVbMF0gfCBjOHlEYXRlOiBEQVRFX0ZPUk1BVCB9fSDigJQge3sgZGF0ZVsxXSB8IGM4eURhdGU6IERBVEVfRk9STUFUIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJldCBtLXItMTYgbS1sLTRcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LS1kYXRlLXJhbmdlXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Yzh5LWludGVydmFsLXBpY2tlclxuICAgICAgICAgICAgICBjbGFzcz1cImQtY29udGVudHNcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbFwiXG4gICAgICAgICAgICA+PC9jOHktaW50ZXJ2YWwtcGlja2VyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS5jb250cm9scy5jdXJyZW50RGF0ZUNvbnRleHRJbnRlcnZhbC52YWx1ZSA9PT0gJ2N1c3RvbSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtbC0xNiBwLXItMTZcIj5cbiAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXBcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBGcm9tYGRhdGVgXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGM4eS1kYXRlLXRpbWUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwidGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRnJvbWBkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRGcm9tRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzID8gJ2hhcy1lcnJvcicgOiAnJ1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWRhdGUtdGltZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LW1lc3NhZ2VzIFtzaG93XT1cImZvcm0uY29udHJvbHMudGVtcG9yYXJ5VXNlclNlbGVjdGVkRnJvbURhdGUuZXJyb3JzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJkYXRlQWZ0ZXJSYW5nZU1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBhZnRlciB0aGUgbGF0ZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBmb3I9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgVG9gZGF0ZWBcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWRhdGUtdGltZS1waWNrZXJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJ0ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbWluRGF0ZV09XCJmb3JtLnZhbHVlLnRlbXBvcmFyeVVzZXJTZWxlY3RlZEZyb21EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidUb2BkYXRlYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybS5jb250cm9scy50ZW1wb3JhcnlVc2VyU2VsZWN0ZWRUb0RhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnMgPyAnaGFzLWVycm9yJyA6ICcnXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1kYXRlLXRpbWUtcGlja2VyPlxuICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlcyBbc2hvd109XCJmb3JtLmNvbnRyb2xzLnRlbXBvcmFyeVVzZXJTZWxlY3RlZFRvRGF0ZS5lcnJvcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVCZWZvcmVSYW5nZU1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwiJ1RoaXMgZGF0ZSBpcyBiZWZvcmUgdGhlIGVhcmxpZXN0IGFsbG93ZWQgZGF0ZS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJpbnZhbGlkRGF0ZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cIidUaGlzIGRhdGUgaXMgaW52YWxpZC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LW1lc3NhZ2U+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1tZXNzYWdlcz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0xNiBkLWZsZXggZ2FwLTggc2VwYXJhdG9yLXRvcFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBmbGV4LWdyb3dcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVzZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0KCk7IGRyb3Bkb3duLmlzT3BlbiA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLnZhbHVlLnJlYWx0aW1lIHx8IGlzQXV0b1JlZnJlc2hFbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIFJlc2V0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxleC1ncm93XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGx5JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhcHBseURhdGV0aW1lQ29udGV4dCgpOyBkcm9wZG93bi5pc09wZW4gPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgIChmb3JtLnByaXN0aW5lICYmIGZvcm0udW50b3VjaGVkKSB8fCBmb3JtLmludmFsaWQgfHwgZm9ybS52YWx1ZS5yZWFsdGltZSB8fCBpc0F1dG9SZWZyZXNoRW5hYmxlZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEFwcGx5XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LWF1dG9cIj5cbiAgICAgIDxjOHktcmVhbHRpbWUtY29udHJvbFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBwLTAgZmxleC1uby1ncm93IHctYXV0b1wiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheVNldHRpbmdzLmdsb2JhbFJlYWx0aW1lQ29udGV4dFwiXG4gICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlYWx0aW1lXCJcbiAgICAgID48L2M4eS1yZWFsdGltZS1jb250cm9sPlxuXG4gICAgICA8Yzh5LWFnZ3JlZ2F0aW9uLXBpY2tlclxuICAgICAgICAqbmdJZj1cImRpc3BsYXlTZXR0aW5ncy5nbG9iYWxBZ2dyZWdhdGlvbkNvbnRleHRcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJhZ2dyZWdhdGlvblwiXG4gICAgICAgIFtkaXNhYmxlZEFnZ3JlZ2F0aW9uc109XCJkaXNhYmxlZEFnZ3JlZ2F0aW9uc1wiXG4gICAgICA+PC9jOHktYWdncmVnYXRpb24tcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwidG9nZ2xlRGVjb3VwbGluZygpXCJcbiAgPlxuICAgIDxpIFtjOHlJY29uXT1cImlzQ291cGxlZCA/ICdzY2hlZHVsZTEnIDogJ3RvZGF5J1wiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCI+XG4gICAgICB7eyAoaXNDb3VwbGVkID8gZGVjb3VwbGVUaW1lQ29udGV4dExhYmVsIDogY291cGxlVGltZUNvbnRleHRMYWJlbCkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cbiJdfQ==