@firestitch/report 18.9.0 → 18.10.1

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 (186) hide show
  1. package/app/reports/anchor-at-point.d.ts +14 -0
  2. package/app/reports/canvas-landing-page.d.ts +2 -0
  3. package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
  4. package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -0
  6. package/app/reports/components/report-component/report-component.component.d.ts +35 -1
  7. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
  8. package/app/reports/data/report.data.d.ts +20 -7
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +45 -8
  11. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
  12. package/app/reports/drill-crumbs.d.ts +12 -0
  13. package/app/reports/export/report-export-collector.service.d.ts +13 -4
  14. package/app/reports/export/report-filter-lines.d.ts +18 -0
  15. package/app/reports/filter-settings-rules.d.ts +37 -0
  16. package/app/reports/format.d.ts +0 -1
  17. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
  18. package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
  19. package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
  20. package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
  21. package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
  22. package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
  23. package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
  24. package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
  25. package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
  26. package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
  27. package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
  28. package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
  29. package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
  30. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
  31. package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
  32. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
  33. package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
  34. package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
  35. package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
  36. package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
  37. package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
  38. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
  39. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
  40. package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
  41. package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
  42. package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
  43. package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
  44. package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
  45. package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
  46. package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
  47. package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
  48. package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
  49. package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
  50. package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
  51. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
  52. package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
  53. package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
  54. package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
  55. package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
  56. package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
  57. package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
  58. package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
  59. package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
  60. package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
  61. package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
  62. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
  63. package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
  64. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
  65. package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
  66. package/app/reports/interfaces/report-view.interface.d.ts +7 -0
  67. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
  68. package/app/reports/interfaces/report-views.interface.d.ts +7 -0
  69. package/app/reports/interfaces/report.interface.d.ts +27 -16
  70. package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
  71. package/app/reports/mark-click.d.ts +20 -0
  72. package/app/reports/option-builder.d.ts +12 -1
  73. package/app/reports/report-chat-viewer-state.d.ts +8 -0
  74. package/app/reports/report-date-presets.d.ts +2 -0
  75. package/app/reports/report-filter-items.d.ts +20 -21
  76. package/app/reports/report-tile.d.ts +2 -0
  77. package/app/reports/report-view-config.d.ts +34 -0
  78. package/app/reports/report-view-menu.d.ts +15 -0
  79. package/app/reports/report-viewer-features.d.ts +5 -0
  80. package/app/reports/services/report-filter-options.service.d.ts +26 -0
  81. package/app/reports/services/report-filter-state.service.d.ts +65 -11
  82. package/app/reports/services/report-view.service.d.ts +39 -0
  83. package/app/reports/tile-data-state.d.ts +7 -0
  84. package/app/reports/tile-loads.d.ts +4 -0
  85. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -8
  86. package/app/reports/views/report/report.component.d.ts +6 -0
  87. package/esm2022/app/reports/anchor-at-point.mjs +49 -0
  88. package/esm2022/app/reports/canvas-landing-page.mjs +26 -0
  89. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
  90. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
  91. package/esm2022/app/reports/components/component-list/component-list.component.mjs +11 -5
  92. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +56 -40
  93. package/esm2022/app/reports/components/report-component/report-component.component.mjs +261 -65
  94. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
  95. package/esm2022/app/reports/data/report.data.mjs +94 -14
  96. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
  97. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +248 -104
  98. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
  99. package/esm2022/app/reports/drill-crumbs.mjs +73 -0
  100. package/esm2022/app/reports/export/report-export-collector.service.mjs +187 -117
  101. package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
  102. package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
  103. package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
  104. package/esm2022/app/reports/filter-settings-rules.mjs +290 -0
  105. package/esm2022/app/reports/format.mjs +2 -22
  106. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
  107. package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
  108. package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
  109. package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
  110. package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
  111. package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
  112. package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
  113. package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
  114. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
  115. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
  116. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
  117. package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
  118. package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
  119. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  120. package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
  121. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  122. package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
  123. package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
  124. package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
  125. package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
  126. package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
  127. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
  128. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
  129. package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
  130. package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
  131. package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
  132. package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
  133. package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
  134. package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
  135. package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
  136. package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
  137. package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
  138. package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
  139. package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
  140. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
  141. package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
  142. package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
  143. package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
  144. package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
  145. package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
  146. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
  147. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
  148. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
  149. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
  150. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
  151. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
  152. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
  153. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
  154. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
  155. package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
  156. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
  157. package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
  158. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  159. package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
  160. package/esm2022/app/reports/mark-click.mjs +193 -0
  161. package/esm2022/app/reports/option-builder.mjs +159 -15
  162. package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
  163. package/esm2022/app/reports/report-date-presets.mjs +18 -0
  164. package/esm2022/app/reports/report-filter-items.mjs +263 -72
  165. package/esm2022/app/reports/report-tile.mjs +12 -0
  166. package/esm2022/app/reports/report-view-config.mjs +587 -0
  167. package/esm2022/app/reports/report-view-menu.mjs +119 -0
  168. package/esm2022/app/reports/report-viewer-features.mjs +42 -0
  169. package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
  170. package/esm2022/app/reports/services/report-filter-state.service.mjs +668 -210
  171. package/esm2022/app/reports/services/report-view.service.mjs +218 -0
  172. package/esm2022/app/reports/tile-data-state.mjs +127 -0
  173. package/esm2022/app/reports/tile-loads.mjs +38 -0
  174. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +194 -127
  175. package/esm2022/app/reports/views/report/report.component.mjs +112 -29
  176. package/esm2022/public_api.mjs +23 -1
  177. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
  178. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
  179. package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +8222 -4447
  180. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
  181. package/fesm2022/firestitch-report.mjs +1 -1
  182. package/package.json +1 -1
  183. package/public_api.d.ts +22 -0
  184. package/app/reports/report-url-state.d.ts +0 -19
  185. package/esm2022/app/reports/report-url-state.mjs +0 -189
  186. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, NgZone, computed, inject, input, model, output, untracked, } from '@angular/core';
2
2
  import { NgxEchartsDirective } from 'ngx-echarts';
3
+ import { chartMarkClick } from '../../mark-click';
3
4
  import { buildChartOption } from '../../option-builder';
4
5
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
5
6
  import { ComponentNoteComponent } from '../component-note/component-note.component';
@@ -11,19 +12,69 @@ import * as i0 from "@angular/core";
11
12
  // theme/echarts.ts). The shared note under the plot names the days a
12
13
  // comparison compares and why windowed series read as they do; the series'
13
14
  // tooltips describe the windows themselves.
15
+ //
16
+ // A click on a mark (a bar, a point or the line, a slice, a step, or a
17
+ // category's empty band) is reported as a ReportMarkClick (markClick); the
18
+ // tile decides what it does. The tile's actions only shape the option: the
19
+ // hand pointer and the tooltip's hint.
14
20
  export class ComponentChartComponent {
15
21
  component = input.required();
16
22
  data = input(null);
23
+ // Which legend entries are on, by series name. The tile holds it (two-way),
24
+ // so it outlives this chart and every option: each new option carries it
25
+ // (legend.selected), because ngx-echarts sets an option with notMerge. A
26
+ // click on the legend only records it: the chart has already toggled the
27
+ // series, so the option is not built again for it (untracked).
28
+ legendSelected = model({});
29
+ // What a click on the chart's marks does, from the tile (tileMarkActions).
30
+ actions = input([]);
31
+ markClick = output();
32
+ // A click or a tap on the chart that no mark answered (an empty band by
33
+ // touch, outside the plot, a waterfall's Total): the tile forgets a tap
34
+ // it was holding, so the next tap on a mark shows its tooltip first.
35
+ markMiss = output();
17
36
  options = computed(() => {
18
37
  const data = this.data();
19
38
  return data
20
- ? buildChartOption(this.component(), data, this._filterState.formatContext())
39
+ ? buildChartOption(this.component(), data, this._filterState.formatContext(), untracked(this.legendSelected), this.actions())
21
40
  : null;
22
41
  });
23
42
  _chart = null;
43
+ // The browser event of the last click a mark answered, so the empty-band
44
+ // handler skips that event.
45
+ _markEvent = null;
24
46
  _filterState = inject(ReportFilterStateService);
47
+ _zone = inject(NgZone);
25
48
  onChartInit(chart) {
26
49
  this._chart = chart;
50
+ // A click in a category's empty band is no element's click: the chart's
51
+ // drawing surface reports it. ECharts runs it outside Angular, and
52
+ // before the chart's own click on a mark (ECharts calls its element
53
+ // handler last), so it waits a microtask: by then a mark has answered
54
+ // the same click.
55
+ chart.getZr().on('click', (event) => {
56
+ queueMicrotask(() => this._zone.run(() => this._onBandClick(event)));
57
+ });
58
+ }
59
+ // ECharts reports every entry of the legend after a click.
60
+ onLegendSelectChanged(event) {
61
+ this.legendSelected.set({ ...(event?.selected ?? {}) });
62
+ }
63
+ // A click on a series element. A click on a line or an area's line itself
64
+ // carries no category, so it takes the category whose band it fell in, and
65
+ // no series id, so it takes the id the option gave that series (a partial
66
+ // segment's id names the series it continues).
67
+ onChartClick(params) {
68
+ this._markEvent = params.event?.event ?? null;
69
+ if (params.componentType !== 'series') {
70
+ this.markMiss.emit();
71
+ return;
72
+ }
73
+ const seriesIndex = params.seriesIndex ?? null;
74
+ const dataIndex = typeof params.dataIndex === 'number'
75
+ ? params.dataIndex
76
+ : this._bandIndex(params.event?.offsetX, params.event?.offsetY);
77
+ this._emit({ seriesIndex, seriesId: params.seriesId ?? this._seriesId(seriesIndex), dataIndex: dataIndex ?? -1 }, params.event?.event);
27
78
  }
28
79
  // Called by the canvas when the box is resized in edit mode.
29
80
  resize() {
@@ -37,14 +88,55 @@ export class ComponentChartComponent {
37
88
  backgroundColor: '#ffffff',
38
89
  }) ?? null;
39
90
  }
91
+ // A click on the chart that no element answered: the category whose band
92
+ // it fell in. Outside the plot it is a miss.
93
+ _onBandClick(event) {
94
+ if (event.event === this._markEvent) {
95
+ return;
96
+ }
97
+ this._emit({ seriesIndex: null, seriesId: null, dataIndex: this._bandIndex(event.offsetX, event.offsetY) ?? -1 }, event.event);
98
+ }
99
+ // The category index under a point of the chart, read off the category
100
+ // axis (the y axis of a horizontal chart); null outside the plot or on a
101
+ // chart without one. An axis finder takes the one coordinate along its
102
+ // axis, not the point.
103
+ _bandIndex(x, y) {
104
+ const chart = this._chart;
105
+ if (!chart || typeof x !== 'number' || typeof y !== 'number' || !chart.containPixel('grid', [x, y])) {
106
+ return null;
107
+ }
108
+ const horizontal = this.component().config?.orientation === 'horizontal';
109
+ const index = Number(horizontal
110
+ ? chart.convertFromPixel({ yAxisIndex: 0 }, y)
111
+ : chart.convertFromPixel({ xAxisIndex: 0 }, x));
112
+ return Number.isFinite(index) ? Math.round(index) : null;
113
+ }
114
+ // The id the option gave a drawn series, by its index.
115
+ _seriesId(seriesIndex) {
116
+ const series = this.options()?.series;
117
+ const id = Array.isArray(series) && seriesIndex !== null ? series[seriesIndex]?.id : null;
118
+ return id === null || id === undefined ? null : String(id);
119
+ }
120
+ _emit(hit, event) {
121
+ const data = this.data();
122
+ const click = data
123
+ ? chartMarkClick(this.component(), data, this._filterState.formatContext(), hit, event)
124
+ : null;
125
+ if (click) {
126
+ this.markClick.emit(click);
127
+ }
128
+ else {
129
+ this.markMiss.emit();
130
+ }
131
+ }
40
132
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, legendSelected: { classPropertyName: "legendSelected", publicName: "legendSelected", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { legendSelected: "legendSelectedChange", markClick: "markClick", markMiss: "markMiss" }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42
134
  }
43
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, decorators: [{
44
136
  type: Component,
45
137
  args: [{ selector: 'app-report-component-chart', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
46
138
  ComponentNoteComponent,
47
139
  NgxEchartsDirective,
48
- ], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
140
+ ], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
49
141
  }] });
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBWTVDLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEIsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFDOUMsSUFBSSxHQUFHLEtBQUssQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLFFBQVEsQ0FBdUIsR0FBRyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6QixPQUFPLElBQUk7WUFDVCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVLLE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUUxRCxXQUFXLENBQUMsS0FBYztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsNkRBQTZEO0lBQ3RELE1BQU07UUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDN0IsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVO1lBQ1YsZUFBZSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNiLENBQUM7d0dBaENVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDBWQzdCcEMsd1BBU0EsMktEZ0JJLHNCQUFzQix3SUFDdEIsbUJBQW1COzs0RkFHVix1QkFBdUI7a0JBWG5DLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLG1CQUFtQjtxQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IEVDaGFydHNPcHRpb24sIEVDaGFydHMgfSBmcm9tICdlY2hhcnRzJztcbmltcG9ydCB7IE5neEVjaGFydHNEaXJlY3RpdmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEVDaGFydHMgaG9zdCBmb3IgYSBjaGFydCBjb21wb25lbnQuIFB1cmUgcmVuZGVyaW5nOiB0aGUgcGFyZW50IG93bnMgdGhlXG4vLyBkYXRhIGZldGNoOyB0aGlzIG1hcHMgKGNvbXBvbmVudCBjb25maWcsIHJvd3MsIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdFxuLy8gY29udGV4dCkg4oaSIG9wdGlvbiBhbmQgZXhwb3NlcyB0aGUgY2hhcnQgaW5zdGFuY2UgZm9yIHJlc2l6ZSArIHRoZSBmdXR1cmVcbi8vIGltYWdlIGV4cG9ydHMgKGdldERhdGFVUkwgbmVlZHMgdGhlIGNhbnZhcyByZW5kZXJlciByZWdpc3RlcmVkIGluXG4vLyB0aGVtZS9lY2hhcnRzLnRzKS4gVGhlIHNoYXJlZCBub3RlIHVuZGVyIHRoZSBwbG90IG5hbWVzIHRoZSBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMgYW5kIHdoeSB3aW5kb3dlZCBzZXJpZXMgcmVhZCBhcyB0aGV5IGRvOyB0aGUgc2VyaWVzJ1xuLy8gdG9vbHRpcHMgZGVzY3JpYmUgdGhlIHdpbmRvd3MgdGhlbXNlbHZlcy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgTmd4RWNoYXJ0c0RpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhID0gaW5wdXQ8Q29tcG9uZW50RGF0YSB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8RUNoYXJ0c09wdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG5cbiAgICByZXR1cm4gZGF0YVxuICAgICAgPyBidWlsZENoYXJ0T3B0aW9uKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSlcbiAgICAgIDogbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfY2hhcnQ6IEVDaGFydHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgb25DaGFydEluaXQoY2hhcnQ6IEVDaGFydHMpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IHRoZSBjYW52YXMgd2hlbiB0aGUgYm94IGlzIHJlc2l6ZWQgaW4gZWRpdCBtb2RlLlxuICBwdWJsaWMgcmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0Py5yZXNpemUoKTtcbiAgfVxuXG4gIC8vIEhpZ2gtcmVzIGltYWdlIGZvciB0aGUgKGxhdGVyLXBoYXNlKSBQUFQvUERGIGV4cG9ydHMuXG4gIHB1YmxpYyBnZXREYXRhVVJMKHBpeGVsUmF0aW8gPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0Py5nZXREYXRhVVJMKHtcbiAgICAgIHR5cGU6ICdwbmcnLFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgIH0pID8/IG51bGw7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FDOUYsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBQzVDLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSx1Q0FBdUM7QUFZdkMsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUN6RCw0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QUssR0FBRyxJQUFJO1lBQ2hCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUF3QixDQUFDO1lBQzFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFVCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO3dHQWxKVSx1QkFBdUI7NEZBQXZCLHVCQUF1Qiw4c0JDekNwQyxpV0FXQSwyS0QwQkksc0JBQXNCLHdJQUN0QixtQkFBbUI7OzRGQUdWLHVCQUF1QjtrQkFYbkMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLHNCQUFzQjt3QkFDdEIsbUJBQW1CO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE5nWm9uZSwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRUNFbGVtZW50RXZlbnQsIEVDaGFydHNPcHRpb24sIEVDaGFydHMsIEVsZW1lbnRFdmVudCB9IGZyb20gJ2VjaGFydHMnO1xuaW1wb3J0IHsgTmd4RWNoYXJ0c0RpcmVjdGl2ZSB9IGZyb20gJ25neC1lY2hhcnRzJztcblxuaW1wb3J0IHsgQ2hhcnRDb25maWcsIENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydEhpdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXJ0LWhpdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0FjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstYWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2hhcnRNYXJrQ2xpY2sgfSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7IGJ1aWxkQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cblxuLy8gRUNoYXJ0cyBob3N0IGZvciBhIGNoYXJ0IGNvbXBvbmVudC4gUHVyZSByZW5kZXJpbmc6IHRoZSBwYXJlbnQgb3ducyB0aGVcbi8vIGRhdGEgZmV0Y2g7IHRoaXMgbWFwcyAoY29tcG9uZW50IGNvbmZpZywgcm93cywgdGhlIG9wZW4gcmVwb3J0J3MgZm9ybWF0XG4vLyBjb250ZXh0KSDihpIgb3B0aW9uIGFuZCBleHBvc2VzIHRoZSBjaGFydCBpbnN0YW5jZSBmb3IgcmVzaXplICsgdGhlIGZ1dHVyZVxuLy8gaW1hZ2UgZXhwb3J0cyAoZ2V0RGF0YVVSTCBuZWVkcyB0aGUgY2FudmFzIHJlbmRlcmVyIHJlZ2lzdGVyZWQgaW5cbi8vIHRoZW1lL2VjaGFydHMudHMpLiBUaGUgc2hhcmVkIG5vdGUgdW5kZXIgdGhlIHBsb3QgbmFtZXMgdGhlIGRheXMgYVxuLy8gY29tcGFyaXNvbiBjb21wYXJlcyBhbmQgd2h5IHdpbmRvd2VkIHNlcmllcyByZWFkIGFzIHRoZXkgZG87IHRoZSBzZXJpZXMnXG4vLyB0b29sdGlwcyBkZXNjcmliZSB0aGUgd2luZG93cyB0aGVtc2VsdmVzLlxuLy9cbi8vIEEgY2xpY2sgb24gYSBtYXJrIChhIGJhciwgYSBwb2ludCBvciB0aGUgbGluZSwgYSBzbGljZSwgYSBzdGVwLCBvciBhXG4vLyBjYXRlZ29yeSdzIGVtcHR5IGJhbmQpIGlzIHJlcG9ydGVkIGFzIGEgUmVwb3J0TWFya0NsaWNrIChtYXJrQ2xpY2spOyB0aGVcbi8vIHRpbGUgZGVjaWRlcyB3aGF0IGl0IGRvZXMuIFRoZSB0aWxlJ3MgYWN0aW9ucyBvbmx5IHNoYXBlIHRoZSBvcHRpb246IHRoZVxuLy8gaGFuZCBwb2ludGVyIGFuZCB0aGUgdG9vbHRpcCdzIGhpbnQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIE5neEVjaGFydHNEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENoYXJ0Q29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcbiAgLy8gV2hpY2ggbGVnZW5kIGVudHJpZXMgYXJlIG9uLCBieSBzZXJpZXMgbmFtZS4gVGhlIHRpbGUgaG9sZHMgaXQgKHR3by13YXkpLFxuICAvLyBzbyBpdCBvdXRsaXZlcyB0aGlzIGNoYXJ0IGFuZCBldmVyeSBvcHRpb246IGVhY2ggbmV3IG9wdGlvbiBjYXJyaWVzIGl0XG4gIC8vIChsZWdlbmQuc2VsZWN0ZWQpLCBiZWNhdXNlIG5neC1lY2hhcnRzIHNldHMgYW4gb3B0aW9uIHdpdGggbm90TWVyZ2UuIEFcbiAgLy8gY2xpY2sgb24gdGhlIGxlZ2VuZCBvbmx5IHJlY29yZHMgaXQ6IHRoZSBjaGFydCBoYXMgYWxyZWFkeSB0b2dnbGVkIHRoZVxuICAvLyBzZXJpZXMsIHNvIHRoZSBvcHRpb24gaXMgbm90IGJ1aWx0IGFnYWluIGZvciBpdCAodW50cmFja2VkKS5cbiAgcHVibGljIHJlYWRvbmx5IGxlZ2VuZFNlbGVjdGVkID0gbW9kZWw8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pih7fSk7XG4gIC8vIFdoYXQgYSBjbGljayBvbiB0aGUgY2hhcnQncyBtYXJrcyBkb2VzLCBmcm9tIHRoZSB0aWxlICh0aWxlTWFya0FjdGlvbnMpLlxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9ucyA9IGlucHV0PHJlYWRvbmx5IFJlcG9ydE1hcmtBY3Rpb25bXT4oW10pO1xuXG4gIHB1YmxpYyByZWFkb25seSBtYXJrQ2xpY2sgPSBvdXRwdXQ8UmVwb3J0TWFya0NsaWNrPigpO1xuICAvLyBBIGNsaWNrIG9yIGEgdGFwIG9uIHRoZSBjaGFydCB0aGF0IG5vIG1hcmsgYW5zd2VyZWQgKGFuIGVtcHR5IGJhbmQgYnlcbiAgLy8gdG91Y2gsIG91dHNpZGUgdGhlIHBsb3QsIGEgd2F0ZXJmYWxsJ3MgVG90YWwpOiB0aGUgdGlsZSBmb3JnZXRzIGEgdGFwXG4gIC8vIGl0IHdhcyBob2xkaW5nLCBzbyB0aGUgbmV4dCB0YXAgb24gYSBtYXJrIHNob3dzIGl0cyB0b29sdGlwIGZpcnN0LlxuICBwdWJsaWMgcmVhZG9ubHkgbWFya01pc3MgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPEVDaGFydHNPcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgID8gYnVpbGRDaGFydE9wdGlvbihcbiAgICAgICAgdGhpcy5jb21wb25lbnQoKSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgICB1bnRyYWNrZWQodGhpcy5sZWdlbmRTZWxlY3RlZCksXG4gICAgICAgIHRoaXMuYWN0aW9ucygpLFxuICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIF9jaGFydDogRUNoYXJ0cyB8IG51bGwgPSBudWxsO1xuICAvLyBUaGUgYnJvd3NlciBldmVudCBvZiB0aGUgbGFzdCBjbGljayBhIG1hcmsgYW5zd2VyZWQsIHNvIHRoZSBlbXB0eS1iYW5kXG4gIC8vIGhhbmRsZXIgc2tpcHMgdGhhdCBldmVudC5cbiAgcHJpdmF0ZSBfbWFya0V2ZW50OiB1bmtub3duID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIHB1YmxpYyBvbkNoYXJ0SW5pdChjaGFydDogRUNoYXJ0cyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgLy8gQSBjbGljayBpbiBhIGNhdGVnb3J5J3MgZW1wdHkgYmFuZCBpcyBubyBlbGVtZW50J3MgY2xpY2s6IHRoZSBjaGFydCdzXG4gICAgLy8gZHJhd2luZyBzdXJmYWNlIHJlcG9ydHMgaXQuIEVDaGFydHMgcnVucyBpdCBvdXRzaWRlIEFuZ3VsYXIsIGFuZFxuICAgIC8vIGJlZm9yZSB0aGUgY2hhcnQncyBvd24gY2xpY2sgb24gYSBtYXJrIChFQ2hhcnRzIGNhbGxzIGl0cyBlbGVtZW50XG4gICAgLy8gaGFuZGxlciBsYXN0KSwgc28gaXQgd2FpdHMgYSBtaWNyb3Rhc2s6IGJ5IHRoZW4gYSBtYXJrIGhhcyBhbnN3ZXJlZFxuICAgIC8vIHRoZSBzYW1lIGNsaWNrLlxuICAgIGNoYXJ0LmdldFpyKCkub24oJ2NsaWNrJywgKGV2ZW50OiBFbGVtZW50RXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuX29uQmFuZENsaWNrKGV2ZW50KSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRUNoYXJ0cyByZXBvcnRzIGV2ZXJ5IGVudHJ5IG9mIHRoZSBsZWdlbmQgYWZ0ZXIgYSBjbGljay5cbiAgcHVibGljIG9uTGVnZW5kU2VsZWN0Q2hhbmdlZChldmVudDogeyBzZWxlY3RlZD86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IH0gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5sZWdlbmRTZWxlY3RlZC5zZXQoeyAuLi4oZXZlbnQ/LnNlbGVjdGVkID8/IHt9KSB9KTtcbiAgfVxuXG4gIC8vIEEgY2xpY2sgb24gYSBzZXJpZXMgZWxlbWVudC4gQSBjbGljayBvbiBhIGxpbmUgb3IgYW4gYXJlYSdzIGxpbmUgaXRzZWxmXG4gIC8vIGNhcnJpZXMgbm8gY2F0ZWdvcnksIHNvIGl0IHRha2VzIHRoZSBjYXRlZ29yeSB3aG9zZSBiYW5kIGl0IGZlbGwgaW4sIGFuZFxuICAvLyBubyBzZXJpZXMgaWQsIHNvIGl0IHRha2VzIHRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgdGhhdCBzZXJpZXMgKGEgcGFydGlhbFxuICAvLyBzZWdtZW50J3MgaWQgbmFtZXMgdGhlIHNlcmllcyBpdCBjb250aW51ZXMpLlxuICBwdWJsaWMgb25DaGFydENsaWNrKHBhcmFtczogRUNFbGVtZW50RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXJrRXZlbnQgPSBwYXJhbXMuZXZlbnQ/LmV2ZW50ID8/IG51bGw7XG5cbiAgICBpZiAocGFyYW1zLmNvbXBvbmVudFR5cGUgIT09ICdzZXJpZXMnKSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmllc0luZGV4ID0gcGFyYW1zLnNlcmllc0luZGV4ID8/IG51bGw7XG4gICAgY29uc3QgZGF0YUluZGV4ID0gdHlwZW9mIHBhcmFtcy5kYXRhSW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHBhcmFtcy5kYXRhSW5kZXhcbiAgICAgIDogdGhpcy5fYmFuZEluZGV4KHBhcmFtcy5ldmVudD8ub2Zmc2V0WCwgcGFyYW1zLmV2ZW50Py5vZmZzZXRZKTtcblxuICAgIHRoaXMuX2VtaXQoXG4gICAgICB7IHNlcmllc0luZGV4LCBzZXJpZXNJZDogcGFyYW1zLnNlcmllc0lkID8/IHRoaXMuX3Nlcmllc0lkKHNlcmllc0luZGV4KSwgZGF0YUluZGV4OiBkYXRhSW5kZXggPz8gLTEgfSxcbiAgICAgIHBhcmFtcy5ldmVudD8uZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSB0aGUgY2FudmFzIHdoZW4gdGhlIGJveCBpcyByZXNpemVkIGluIGVkaXQgbW9kZS5cbiAgcHVibGljIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydD8ucmVzaXplKCk7XG4gIH1cblxuICAvLyBIaWdoLXJlcyBpbWFnZSBmb3IgdGhlIChsYXRlci1waGFzZSkgUFBUL1BERiBleHBvcnRzLlxuICBwdWJsaWMgZ2V0RGF0YVVSTChwaXhlbFJhdGlvID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jaGFydD8uZ2V0RGF0YVVSTCh7XG4gICAgICB0eXBlOiAncG5nJyxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9KSA/PyBudWxsO1xuICB9XG5cbiAgLy8gQSBjbGljayBvbiB0aGUgY2hhcnQgdGhhdCBubyBlbGVtZW50IGFuc3dlcmVkOiB0aGUgY2F0ZWdvcnkgd2hvc2UgYmFuZFxuICAvLyBpdCBmZWxsIGluLiBPdXRzaWRlIHRoZSBwbG90IGl0IGlzIGEgbWlzcy5cbiAgcHJpdmF0ZSBfb25CYW5kQ2xpY2soZXZlbnQ6IEVsZW1lbnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5ldmVudCA9PT0gdGhpcy5fbWFya0V2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdChcbiAgICAgIHsgc2VyaWVzSW5kZXg6IG51bGwsIHNlcmllc0lkOiBudWxsLCBkYXRhSW5kZXg6IHRoaXMuX2JhbmRJbmRleChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKSA/PyAtMSB9LFxuICAgICAgZXZlbnQuZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjYXRlZ29yeSBpbmRleCB1bmRlciBhIHBvaW50IG9mIHRoZSBjaGFydCwgcmVhZCBvZmYgdGhlIGNhdGVnb3J5XG4gIC8vIGF4aXMgKHRoZSB5IGF4aXMgb2YgYSBob3Jpem9udGFsIGNoYXJ0KTsgbnVsbCBvdXRzaWRlIHRoZSBwbG90IG9yIG9uIGFcbiAgLy8gY2hhcnQgd2l0aG91dCBvbmUuIEFuIGF4aXMgZmluZGVyIHRha2VzIHRoZSBvbmUgY29vcmRpbmF0ZSBhbG9uZyBpdHNcbiAgLy8gYXhpcywgbm90IHRoZSBwb2ludC5cbiAgcHJpdmF0ZSBfYmFuZEluZGV4KHg6IG51bWJlciB8IHVuZGVmaW5lZCwgeTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLl9jaGFydDtcblxuICAgIGlmICghY2hhcnQgfHwgdHlwZW9mIHggIT09ICdudW1iZXInIHx8IHR5cGVvZiB5ICE9PSAnbnVtYmVyJyB8fCAhY2hhcnQuY29udGFpblBpeGVsKCdncmlkJywgW3gsIHldKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyBhcyBDaGFydENvbmZpZyk/Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgY29uc3QgaW5kZXggPSBOdW1iZXIoaG9yaXpvbnRhbFxuICAgICAgPyBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeUF4aXNJbmRleDogMCB9LCB5KVxuICAgICAgOiBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeEF4aXNJbmRleDogMCB9LCB4KSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGluZGV4KSA/IE1hdGgucm91bmQoaW5kZXgpIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgYSBkcmF3biBzZXJpZXMsIGJ5IGl0cyBpbmRleC5cbiAgcHJpdmF0ZSBfc2VyaWVzSWQoc2VyaWVzSW5kZXg6IG51bWJlciB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLm9wdGlvbnMoKT8uc2VyaWVzO1xuICAgIGNvbnN0IGlkID0gQXJyYXkuaXNBcnJheShzZXJpZXMpICYmIHNlcmllc0luZGV4ICE9PSBudWxsID8gc2VyaWVzW3Nlcmllc0luZGV4XT8uaWQgOiBudWxsO1xuXG4gICAgcmV0dXJuIGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQoaGl0OiBSZXBvcnRDaGFydEhpdCwgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG4gICAgY29uc3QgY2xpY2sgPSBkYXRhXG4gICAgICA/IGNoYXJ0TWFya0NsaWNrKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgaGl0LCBldmVudCBhcyBSZXBvcnRNYXJrRXZlbnQpXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAoY2xpY2spIHtcbiAgICAgIHRoaXMubWFya0NsaWNrLmVtaXQoY2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCJcbiAgKGNoYXJ0Q2xpY2spPVwib25DaGFydENsaWNrKCRldmVudClcIlxuICAoY2hhcnRMZWdlbmRTZWxlY3RDaGFuZ2VkKT1cIm9uTGVnZW5kU2VsZWN0Q2hhbmdlZCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
@@ -1,7 +1,8 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
2
2
  import { ReportChangePolarity } from '../../enums/report-change-polarity.enum';
3
3
  import { ReportKpiTrend } from '../../enums/report-kpi-trend.enum';
4
4
  import { kpiCardView } from '../../kpi-card';
5
+ import { kpiMarkClick } from '../../mark-click';
5
6
  import { componentNoteLines } from '../../output-notes';
6
7
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
7
8
  import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR } from '../../theme/palette';
@@ -26,6 +27,9 @@ import * as i0 from "@angular/core";
26
27
  export class ComponentKpiComponent {
27
28
  component = input.required();
28
29
  data = input(null);
30
+ // A click on the value, as a mark with no points (kpiMarkClick); the tile
31
+ // decides what it does.
32
+ markClick = output();
29
33
  ReportKpiTrend = ReportKpiTrend;
30
34
  tokens = {
31
35
  valueSize: `${REPORT_KPI_VALUE_FONT_SIZE}px`,
@@ -43,8 +47,11 @@ export class ComponentKpiComponent {
43
47
  // empty one takes no room.
44
48
  hasNote = computed(() => componentNoteLines(this.data(), { locale: this._filterState.formatContext().locale, timezone: this._filterState.timezone() }, { windows: false, windowDescriptions: true }).length > 0);
45
49
  _filterState = inject(ReportFilterStateService);
50
+ onValueClick(event) {
51
+ this.markClick.emit(kpiMarkClick(this.component(), this.data(), event));
52
+ }
46
53
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--report-kpi-value-size": "tokens.valueSize", "style.--report-kpi-text-default": "tokens.text", "style.--report-kpi-good-default": "tokens.good", "style.--report-kpi-bad-default": "tokens.bad", "style.--report-kpi-neutral-default": "tokens.neutral", "style.--report-kpi-sparkline-default": "tokens.sparkline" } }, ngImport: i0, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div class=\"kpi-value\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "component", type: SparklineComponent, selector: "app-component-kpi-sparkline", inputs: ["values", "partial"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { markClick: "markClick" }, host: { properties: { "style.--report-kpi-value-size": "tokens.valueSize", "style.--report-kpi-text-default": "tokens.text", "style.--report-kpi-good-default": "tokens.good", "style.--report-kpi-bad-default": "tokens.bad", "style.--report-kpi-neutral-default": "tokens.neutral", "style.--report-kpi-sparkline-default": "tokens.sparkline" } }, ngImport: i0, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div\n class=\"kpi-value\"\n (click)=\"onValueClick($event)\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "component", type: SparklineComponent, selector: "app-component-kpi-sparkline", inputs: ["values", "partial"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
55
  }
49
56
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, decorators: [{
50
57
  type: Component,
@@ -58,6 +65,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
58
65
  '[style.--report-kpi-bad-default]': 'tokens.bad',
59
66
  '[style.--report-kpi-neutral-default]': 'tokens.neutral',
60
67
  '[style.--report-kpi-sparkline-default]': 'tokens.sparkline',
61
- }, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div class=\"kpi-value\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"] }]
68
+ }, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div\n class=\"kpi-value\"\n (click)=\"onValueClick($event)\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"] }]
62
69
  }] });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBR2hGLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSxRQUFRO0FBQ1IsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsMkRBQTJEO0FBQzNELGdGQUFnRjtBQW9CaEYsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUV6QyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBRWhDLE1BQU0sR0FBRztRQUN2QixTQUFTLEVBQUUsR0FBRywwQkFBMEIsSUFBSTtRQUM1QyxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLElBQUksRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFO1FBQy9ELEdBQUcsRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzdELE9BQU8sRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3JFLFNBQVMsRUFBRSxJQUFJLDBCQUEwQixFQUFFO0tBQzVDLENBQUM7SUFFRiw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLG1DQUFtQztJQUNuQixJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FDL0MsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBYyxFQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQ1gsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN0RixDQUFDLENBQUM7SUFFSCx3RUFBd0U7SUFDeEUsMkJBQTJCO0lBQ1gsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDekQsSUFBSSxDQUFDLElBQUksRUFBRSxFQUNYLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQzVGLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FDN0MsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFRyxZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7d0dBakN0RCxxQkFBcUI7NEZBQXJCLHFCQUFxQiwrcUJDaERsQyw0aUVBa0VBLG05Q0Q5Qkksc0JBQXNCLHdJQUN0QixrQkFBa0I7OzRGQVdULHFCQUFxQjtrQkFuQmpDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUduQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLGtCQUFrQjtxQkFDbkIsUUFDSzt3QkFDSixpQ0FBaUMsRUFBRSxrQkFBa0I7d0JBQ3JELG1DQUFtQyxFQUFFLGFBQWE7d0JBQ2xELG1DQUFtQyxFQUFFLGFBQWE7d0JBQ2xELGtDQUFrQyxFQUFFLFlBQVk7d0JBQ2hELHNDQUFzQyxFQUFFLGdCQUFnQjt3QkFDeEQsd0NBQXdDLEVBQUUsa0JBQWtCO3FCQUM3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydENoYW5nZVBvbGFyaXR5IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWNoYW5nZS1wb2xhcml0eS5lbnVtJztcbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IENvbXBvbmVudERhdGEsIEtwaUNvbmZpZywgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGtwaUNhcmRWaWV3IH0gZnJvbSAnLi4vLi4va3BpLWNhcmQnO1xuaW1wb3J0IHsgY29tcG9uZW50Tm90ZUxpbmVzIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlMsIFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SIH0gZnJvbSAnLi4vLi4vdGhlbWUvcGFsZXR0ZSc7XG5pbXBvcnQgeyBSRVBPUlRfS1BJX1ZBTFVFX0ZPTlRfU0laRSB9IGZyb20gJy4uLy4uL3RoZW1lL3R5cG9ncmFwaHknO1xuaW1wb3J0IHsgREVGQVVMVF9URVhUX0NPTE9SIH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuaW1wb3J0IHsgU3BhcmtsaW5lQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NwYXJrbGluZS9zcGFya2xpbmUuY29tcG9uZW50JztcblxuXG4vLyBBIHNpbmdsZSBiaWcgbnVtYmVyOiB0aGUgY29tcG9uZW50J3MgbWVhc3VyZSBhZ2dyZWdhdGVkIG92ZXIgYWxsIChmaWx0ZXJlZClcbi8vIHJvd3Mgc2VydmVyLXNpZGUsIGluIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0IChpdHMgbG9jYWxlLCBpdHNcbi8vIGN1cnJlbmN5LCBhbmQgd2hldGhlciBhIHBlcmNlbnQgYXJyaXZlcyBhcyBhIDAtMSByYXRpbyBvciwgZnJvbSBhbiBvbGRlclxuLy8gc2VydmVyLCBhbHJlYWR5IHgxMDApLiBXaXRoIGEgY29tcGFyaXNvbiwgYSB0YXJnZXQgb3IgYSBzcGFya2xpbmUgdGhlIHNlcnZlclxuLy8gc2VuZHMgZXZlcnkgb3RoZXIgbnVtYmVyIHRoZSBjYXJkIHNob3dzIHRvbyAoQ29tcG9uZW50RGF0YS5rcGkpOyBrcGktY2FyZC50c1xuLy8gZGVjaWRlcyB3aGF0IGVhY2ggbGluZSBzYXlzLCBhbmQgdGhpcyBvbmx5IGxheXMgdGhlbSBvdXQsIGluIG9yZGVyOiB0aGVcbi8vIHZhbHVlIGFuZCBpdHMgbGFiZWwsIHRoZSBkZWx0YSwgdGhlIGRheXMsIHRoZSB0YXJnZXQgYW5kIHRoZSB0cmVuZCwgdGhlbiB0aGVcbi8vIG5vdGUuXG4vL1xuLy8gVGhlIHBhbGV0dGUncyBjb2xvcnMgYW5kIHRoZSB2YWx1ZSdzIHNpemUgYXJyaXZlIGFzIGN1c3RvbSBwcm9wZXJ0aWVzIGZyb21cbi8vIHRoZSBzYW1lIGNvbnN0YW50cyB0aGUgZXhwb3J0cyBkcmF3IHdpdGguIEEgaG9zdCBwYWdlIG92ZXJyaWRlcyBhIGNvbG9yIGJ5XG4vLyBzZXR0aW5nIC0tcmVwb3J0LWtwaS1nb29kLWNvbG9yLCAtLXJlcG9ydC1rcGktYmFkLWNvbG9yLFxuLy8gLS1yZXBvcnQta3BpLW5ldXRyYWwtY29sb3Igb3IgLS1yZXBvcnQta3BpLXNwYXJrbGluZS1jb2xvciBhcm91bmQgdGhlIHJlcG9ydC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWtwaScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgU3BhcmtsaW5lQ29tcG9uZW50LFxuICBdLFxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktdmFsdWUtc2l6ZV0nOiAndG9rZW5zLnZhbHVlU2l6ZScsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktdGV4dC1kZWZhdWx0XSc6ICd0b2tlbnMudGV4dCcsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktZ29vZC1kZWZhdWx0XSc6ICd0b2tlbnMuZ29vZCcsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktYmFkLWRlZmF1bHRdJzogJ3Rva2Vucy5iYWQnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLW5ldXRyYWwtZGVmYXVsdF0nOiAndG9rZW5zLm5ldXRyYWwnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXNwYXJrbGluZS1kZWZhdWx0XSc6ICd0b2tlbnMuc3BhcmtsaW5lJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50S3BpQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0S3BpVHJlbmQgPSBSZXBvcnRLcGlUcmVuZDtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5zID0ge1xuICAgIHZhbHVlU2l6ZTogYCR7UkVQT1JUX0tQSV9WQUxVRV9GT05UX1NJWkV9cHhgLFxuICAgIHRleHQ6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgICBnb29kOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5Lkdvb2RdfWAsXG4gICAgYmFkOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5LkJhZF19YCxcbiAgICBuZXV0cmFsOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5Lk5ldXRyYWxdfWAsXG4gICAgc3BhcmtsaW5lOiBgIyR7UkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1J9YCxcbiAgfTtcblxuICAvLyBSZWFkIG9mZiB0aGUgY29tcG9uZW50IG9uIGV2ZXJ5IGRhdGEgY2hhbmdlIHJhdGhlciB0aGFuIHRocm91Z2ggYSBtZW1vIG9mXG4gIC8vIHRoZSBjb25maWc6IGEgc2V0dGluZ3Mgc2F2ZSByZXBhaW50cyB0aGUgc2FtZSBjb21wb25lbnQgb2JqZWN0IHdpdGggbmV3XG4gIC8vIEtQSSBrZXlzLCB0aGVuIHJlbG9hZHMgaXRzIGRhdGEuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ID0gY29tcHV0ZWQoKCkgPT4ga3BpQ2FyZFZpZXcoXG4gICAgKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBLcGlDb25maWcsXG4gICAgdGhpcy5kYXRhKCksXG4gICAgeyBmb3JtYXQ6IHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgdGltZXpvbmU6IHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCkgfSxcbiAgKSk7XG5cbiAgLy8gVGhlIG5vdGUgc2l0cyB1bmRlciB0aGUgY2FyZCBvbmx5IHdoZW4gaXQgaGFzIHNvbWV0aGluZyB0byBzYXksIHNvIGFuXG4gIC8vIGVtcHR5IG9uZSB0YWtlcyBubyByb29tLlxuICBwdWJsaWMgcmVhZG9ubHkgaGFzTm90ZSA9IGNvbXB1dGVkKCgpID0+IGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgICB0aGlzLmRhdGEoKSxcbiAgICB7IGxvY2FsZTogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSwgdGltZXpvbmU6IHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCkgfSxcbiAgICB7IHdpbmRvd3M6IGZhbHNlLCB3aW5kb3dEZXNjcmlwdGlvbnM6IHRydWUgfSxcbiAgKS5sZW5ndGggPiAwKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xufVxuIiwiQGxldCBjYXJkID0gdmlldygpO1xuPGRpdiBjbGFzcz1cImtwaSBmcy1jb2x1bW4uZ2FwLXhzLmFsaWduLWNlbnRlci5qdXN0aWZ5LWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgY2FyZC52YWx1ZSB9fTwvZGl2PlxuICBAaWYgKGNhcmQubGFiZWwpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWxhYmVsIHNtYWxsXCI+e3sgY2FyZC5sYWJlbCB9fTwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC5kZWx0YTsgYXMgZGVsdGEpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWRlbHRhIGZzLXJvdy5nYXAteHMuYWxpZ24tYmFzZWxpbmUuanVzdGlmeS1jZW50ZXIud3JhcFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImtwaS1jaGFuZ2VcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdG9uZV09XCJkZWx0YS50b25lXCI+XG4gICAgICAgIEBpZiAoZGVsdGEudHJlbmQgIT09IFJlcG9ydEtwaVRyZW5kLkZsYXQpIHtcbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgIGNsYXNzPVwia3BpLWFycm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRvd25dPVwiZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLkRvd25cIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCI+XG4gICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDEgOS41LDkgMC41LDlcIj48L3BvbHlnb24+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIH1cbiAgICAgICAge3sgZGVsdGEudGV4dCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgQGlmIChkZWx0YS5jb21wYXJlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInNtYWxsXCI+e3sgZGVsdGEuY29tcGFyZWQgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLndpbmRvdykge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktbGluZSBzbWFsbFwiPnt7IGNhcmQud2luZG93IH19PC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLnRhcmdldDsgYXMgdGFyZ2V0KSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS10YXJnZXQgZnMtY29sdW1uLmdhcC14cy5hbGlnbi1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJrcGktbGluZSBzbWFsbFwiPlxuICAgICAgICB7eyB0YXJnZXQudGV4dCB9fVxuICAgICAgICBAaWYgKHRhcmdldC5wcm9ncmVzcykge1xuICAgICAgICAgIMK3IHt7IHRhcmdldC5wcm9ncmVzcyB9fVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAodGFyZ2V0LmZpbGwgIT09IG51bGwpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJrcGktcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10b25lXT1cInRhcmdldC50b25lXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJrcGktcHJvZ3Jlc3MtZmlsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJ0YXJnZXQuZmlsbCAqIDEwMFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGNhcmQuc3BhcmtsaW5lOyBhcyBzcGFya2xpbmUpIHtcbiAgICA8YXBwLWNvbXBvbmVudC1rcGktc3BhcmtsaW5lXG4gICAgICBjbGFzcz1cImtwaS1zcGFya2xpbmVcIlxuICAgICAgW3ZhbHVlc109XCJzcGFya2xpbmUudmFsdWVzXCJcbiAgICAgIFtwYXJ0aWFsXT1cInNwYXJrbGluZS5wYXJ0aWFsXCI+XG4gICAgPC9hcHAtY29tcG9uZW50LWtwaS1zcGFya2xpbmU+XG4gIH1cbiAgPCEtLSBUaGUgY2FyZCBwcmludHMgaXRzIG93biBkYXlzLCBzbyB0aGUgbm90ZSBsZWF2ZXMgdGhlbSBvdXQuIEEgS1BJIGhhcyBub1xuICAgICAgIHRvb2x0aXAsIHNvIGl0cyBub3RlIGFsc28gc2F5cyB3aGF0IGEgd2luZG93ZWQgdmFsdWUgaXMuIC0tPlxuICBAaWYgKGhhc05vdGUoKSkge1xuICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlXG4gICAgICBbZGF0YV09XCJkYXRhKClcIlxuICAgICAgW3dpbmRvd3NdPVwiZmFsc2VcIlxuICAgICAgW3dpbmRvd0Rlc2NyaXB0aW9uc109XCJ0cnVlXCI+XG4gICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlPlxuICB9XG48L2Rpdj5cbiJdfQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUduRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHaEYsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6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bnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhbmdlUG9sYXJpdHkgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhbmdlLXBvbGFyaXR5LmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0S3BpVHJlbmQgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQta3BpLXRyZW5kLmVudW0nO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YSwgS3BpQ29uZmlnLCBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsga3BpQ2FyZFZpZXcgfSBmcm9tICcuLi8uLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBrcGlNYXJrQ2xpY2sgfSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7IGNvbXBvbmVudE5vdGVMaW5lcyB9IGZyb20gJy4uLy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTLCBSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUiB9IGZyb20gJy4uLy4uL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9WQUxVRV9GT05UX1NJWkUgfSBmcm9tICcuLi8uLi90aGVtZS90eXBvZ3JhcGh5JztcbmltcG9ydCB7IERFRkFVTFRfVEVYVF9DT0xPUiB9IGZyb20gJy4uLy4uL3RleHQnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNwYXJrbGluZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zcGFya2xpbmUvc3BhcmtsaW5lLmNvbXBvbmVudCc7XG5cblxuLy8gQSBzaW5nbGUgYmlnIG51bWJlcjogdGhlIGNvbXBvbmVudCdzIG1lYXN1cmUgYWdncmVnYXRlZCBvdmVyIGFsbCAoZmlsdGVyZWQpXG4vLyByb3dzIHNlcnZlci1zaWRlLCBpbiB0aGUgb3BlbiByZXBvcnQncyBmb3JtYXQgY29udGV4dCAoaXRzIGxvY2FsZSwgaXRzXG4vLyBjdXJyZW5jeSwgYW5kIHdoZXRoZXIgYSBwZXJjZW50IGFycml2ZXMgYXMgYSAwLTEgcmF0aW8gb3IsIGZyb20gYW4gb2xkZXJcbi8vIHNlcnZlciwgYWxyZWFkeSB4MTAwKS4gV2l0aCBhIGNvbXBhcmlzb24sIGEgdGFyZ2V0IG9yIGEgc3BhcmtsaW5lIHRoZSBzZXJ2ZXJcbi8vIHNlbmRzIGV2ZXJ5IG90aGVyIG51bWJlciB0aGUgY2FyZCBzaG93cyB0b28gKENvbXBvbmVudERhdGEua3BpKTsga3BpLWNhcmQudHNcbi8vIGRlY2lkZXMgd2hhdCBlYWNoIGxpbmUgc2F5cywgYW5kIHRoaXMgb25seSBsYXlzIHRoZW0gb3V0LCBpbiBvcmRlcjogdGhlXG4vLyB2YWx1ZSBhbmQgaXRzIGxhYmVsLCB0aGUgZGVsdGEsIHRoZSBkYXlzLCB0aGUgdGFyZ2V0IGFuZCB0aGUgdHJlbmQsIHRoZW4gdGhlXG4vLyBub3RlLlxuLy9cbi8vIFRoZSBwYWxldHRlJ3MgY29sb3JzIGFuZCB0aGUgdmFsdWUncyBzaXplIGFycml2ZSBhcyBjdXN0b20gcHJvcGVydGllcyBmcm9tXG4vLyB0aGUgc2FtZSBjb25zdGFudHMgdGhlIGV4cG9ydHMgZHJhdyB3aXRoLiBBIGhvc3QgcGFnZSBvdmVycmlkZXMgYSBjb2xvciBieVxuLy8gc2V0dGluZyAtLXJlcG9ydC1rcGktZ29vZC1jb2xvciwgLS1yZXBvcnQta3BpLWJhZC1jb2xvcixcbi8vIC0tcmVwb3J0LWtwaS1uZXV0cmFsLWNvbG9yIG9yIC0tcmVwb3J0LWtwaS1zcGFya2xpbmUtY29sb3IgYXJvdW5kIHRoZSByZXBvcnQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1rcGknLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIFNwYXJrbGluZUNvbXBvbmVudCxcbiAgXSxcbiAgaG9zdDoge1xuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXZhbHVlLXNpemVdJzogJ3Rva2Vucy52YWx1ZVNpemUnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXRleHQtZGVmYXVsdF0nOiAndG9rZW5zLnRleHQnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLWdvb2QtZGVmYXVsdF0nOiAndG9rZW5zLmdvb2QnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLWJhZC1kZWZhdWx0XSc6ICd0b2tlbnMuYmFkJyxcbiAgICAnW3N0eWxlLi0tcmVwb3J0LWtwaS1uZXV0cmFsLWRlZmF1bHRdJzogJ3Rva2Vucy5uZXV0cmFsJyxcbiAgICAnW3N0eWxlLi0tcmVwb3J0LWtwaS1zcGFya2xpbmUtZGVmYXVsdF0nOiAndG9rZW5zLnNwYXJrbGluZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEtwaUNvbXBvbmVudCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGEgPSBpbnB1dDxDb21wb25lbnREYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQSBjbGljayBvbiB0aGUgdmFsdWUsIGFzIGEgbWFyayB3aXRoIG5vIHBvaW50cyAoa3BpTWFya0NsaWNrKTsgdGhlIHRpbGVcbiAgLy8gZGVjaWRlcyB3aGF0IGl0IGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtYXJrQ2xpY2sgPSBvdXRwdXQ8UmVwb3J0TWFya0NsaWNrPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBSZXBvcnRLcGlUcmVuZCA9IFJlcG9ydEtwaVRyZW5kO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b2tlbnMgPSB7XG4gICAgdmFsdWVTaXplOiBgJHtSRVBPUlRfS1BJX1ZBTFVFX0ZPTlRfU0laRX1weGAsXG4gICAgdGV4dDogREVGQVVMVF9URVhUX0NPTE9SLFxuICAgIGdvb2Q6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuR29vZF19YCxcbiAgICBiYWQ6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuQmFkXX1gLFxuICAgIG5ldXRyYWw6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuTmV1dHJhbF19YCxcbiAgICBzcGFya2xpbmU6IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gLFxuICB9O1xuXG4gIC8vIFJlYWQgb2ZmIHRoZSBjb21wb25lbnQgb24gZXZlcnkgZGF0YSBjaGFuZ2UgcmF0aGVyIHRoYW4gdGhyb3VnaCBhIG1lbW8gb2ZcbiAgLy8gdGhlIGNvbmZpZzogYSBzZXR0aW5ncyBzYXZlIHJlcGFpbnRzIHRoZSBzYW1lIGNvbXBvbmVudCBvYmplY3Qgd2l0aCBuZXdcbiAgLy8gS1BJIGtleXMsIHRoZW4gcmVsb2FkcyBpdHMgZGF0YS5cbiAgcHVibGljIHJlYWRvbmx5IHZpZXcgPSBjb21wdXRlZCgoKSA9PiBrcGlDYXJkVmlldyhcbiAgICAodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIEtwaUNvbmZpZyxcbiAgICB0aGlzLmRhdGEoKSxcbiAgICB7IGZvcm1hdDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLCB0aW1lem9uZTogdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSB9LFxuICApKTtcblxuICAvLyBUaGUgbm90ZSBzaXRzIHVuZGVyIHRoZSBjYXJkIG9ubHkgd2hlbiBpdCBoYXMgc29tZXRoaW5nIHRvIHNheSwgc28gYW5cbiAgLy8gZW1wdHkgb25lIHRha2VzIG5vIHJvb20uXG4gIHB1YmxpYyByZWFkb25seSBoYXNOb3RlID0gY29tcHV0ZWQoKCkgPT4gY29tcG9uZW50Tm90ZUxpbmVzKFxuICAgIHRoaXMuZGF0YSgpLFxuICAgIHsgbG9jYWxlOiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkubG9jYWxlLCB0aW1lem9uZTogdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSB9LFxuICAgIHsgd2luZG93czogZmFsc2UsIHdpbmRvd0Rlc2NyaXB0aW9uczogdHJ1ZSB9LFxuICApLmxlbmd0aCA+IDApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgcHVibGljIG9uVmFsdWVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubWFya0NsaWNrLmVtaXQoa3BpTWFya0NsaWNrKHRoaXMuY29tcG9uZW50KCksIHRoaXMuZGF0YSgpLCBldmVudCkpO1xuICB9XG59XG4iLCJAbGV0IGNhcmQgPSB2aWV3KCk7XG48ZGl2IGNsYXNzPVwia3BpIGZzLWNvbHVtbi5nYXAteHMuYWxpZ24tY2VudGVyLmp1c3RpZnktY2VudGVyXCI+XG4gIDxkaXZcbiAgICAgIGNsYXNzPVwia3BpLXZhbHVlXCJcbiAgICAgIChjbGljayk9XCJvblZhbHVlQ2xpY2soJGV2ZW50KVwiPnt7IGNhcmQudmFsdWUgfX08L2Rpdj5cbiAgQGlmIChjYXJkLmxhYmVsKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1sYWJlbCBzbWFsbFwiPnt7IGNhcmQubGFiZWwgfX08L2Rpdj5cbiAgfVxuICBAaWYgKGNhcmQuZGVsdGE7IGFzIGRlbHRhKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1kZWx0YSBmcy1yb3cuZ2FwLXhzLmFsaWduLWJhc2VsaW5lLmp1c3RpZnktY2VudGVyLndyYXBcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJrcGktY2hhbmdlXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRvbmVdPVwiZGVsdGEudG9uZVwiPlxuICAgICAgICBAaWYgKGRlbHRhLnRyZW5kICE9PSBSZXBvcnRLcGlUcmVuZC5GbGF0KSB7XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICBjbGFzcz1cImtwaS1hcnJvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5kb3duXT1cImRlbHRhLnRyZW5kID09PSBSZXBvcnRLcGlUcmVuZC5Eb3duXCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwxIDkuNSw5IDAuNSw5XCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICB9XG4gICAgICAgIHt7IGRlbHRhLnRleHQgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIEBpZiAoZGVsdGEuY29tcGFyZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWFsbFwiPnt7IGRlbHRhLmNvbXBhcmVkIH19PC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC53aW5kb3cpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWxpbmUgc21hbGxcIj57eyBjYXJkLndpbmRvdyB9fTwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC50YXJnZXQ7IGFzIHRhcmdldCkge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktdGFyZ2V0IGZzLWNvbHVtbi5nYXAteHMuYWxpZ24tY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwia3BpLWxpbmUgc21hbGxcIj5cbiAgICAgICAge3sgdGFyZ2V0LnRleHQgfX1cbiAgICAgICAgQGlmICh0YXJnZXQucHJvZ3Jlc3MpIHtcbiAgICAgICAgICDCtyB7eyB0YXJnZXQucHJvZ3Jlc3MgfX1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKHRhcmdldC5maWxsICE9PSBudWxsKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwia3BpLXByb2dyZXNzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdG9uZV09XCJ0YXJnZXQudG9uZVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwia3BpLXByb2dyZXNzLWZpbGxcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwidGFyZ2V0LmZpbGwgKiAxMDBcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLnNwYXJrbGluZTsgYXMgc3BhcmtsaW5lKSB7XG4gICAgPGFwcC1jb21wb25lbnQta3BpLXNwYXJrbGluZVxuICAgICAgY2xhc3M9XCJrcGktc3BhcmtsaW5lXCJcbiAgICAgIFt2YWx1ZXNdPVwic3BhcmtsaW5lLnZhbHVlc1wiXG4gICAgICBbcGFydGlhbF09XCJzcGFya2xpbmUucGFydGlhbFwiPlxuICAgIDwvYXBwLWNvbXBvbmVudC1rcGktc3BhcmtsaW5lPlxuICB9XG4gIDwhLS0gVGhlIGNhcmQgcHJpbnRzIGl0cyBvd24gZGF5cywgc28gdGhlIG5vdGUgbGVhdmVzIHRoZW0gb3V0LiBBIEtQSSBoYXMgbm9cbiAgICAgICB0b29sdGlwLCBzbyBpdHMgbm90ZSBhbHNvIHNheXMgd2hhdCBhIHdpbmRvd2VkIHZhbHVlIGlzLiAtLT5cbiAgQGlmIChoYXNOb3RlKCkpIHtcbiAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICAgICAgW2RhdGFdPVwiZGF0YSgpXCJcbiAgICAgIFt3aW5kb3dzXT1cImZhbHNlXCJcbiAgICAgIFt3aW5kb3dEZXNjcmlwdGlvbnNdPVwidHJ1ZVwiPlxuICAgIDwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiAgfVxuPC9kaXY+XG4iXX0=