@firestitch/report 18.3.2 → 18.4.0
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.
- package/app/reports/export/report-pptx.service.d.ts +1 -0
- package/app/reports/interfaces/report.interface.d.ts +3 -1
- package/app/reports/option-builder.d.ts +3 -1
- package/esm2022/app/reports/export/report-pptx.service.mjs +33 -4
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/option-builder.mjs +30 -8
- package/fesm2022/{firestitch-report-echarts-D4xJt3zs.mjs → firestitch-report-echarts-CFkoNvo_.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-D4xJt3zs.mjs.map → firestitch-report-echarts-CFkoNvo_.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-DY8HwvAU.mjs → firestitch-report-firestitch-report-PZzkYYTD.mjs} +66 -15
- package/fesm2022/firestitch-report-firestitch-report-PZzkYYTD.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/fesm2022/firestitch-report-firestitch-report-DY8HwvAU.mjs.map +0 -1
|
@@ -17,8 +17,12 @@ import { GRANULARITY_OPTIONS } from './interfaces/report.interface';
|
|
|
17
17
|
// unrelated groups. Explicitly opting out — colorBy: {column: ''} or a
|
|
18
18
|
// config.legend of 'hidden' — still wins, so a caller that wants one flat color
|
|
19
19
|
// can say so.
|
|
20
|
+
//
|
|
21
|
+
// "Bar chart" is the type the lone measure is actually DRAWN as: its own type
|
|
22
|
+
// when it names one, which can turn a line chart's single series into bars or
|
|
23
|
+
// a bar chart's into a line.
|
|
20
24
|
export function isColorBy(config) {
|
|
21
|
-
if (config.splitBy?.column || (config.chartType ?? 'bar') !== 'bar') {
|
|
25
|
+
if (config.splitBy?.column || (config.measures?.[0]?.type ?? config.chartType ?? 'bar') !== 'bar') {
|
|
22
26
|
return false;
|
|
23
27
|
}
|
|
24
28
|
if (config.colorBy) {
|
|
@@ -62,6 +66,7 @@ export function extractChartSeries(component, data) {
|
|
|
62
66
|
series.push({
|
|
63
67
|
name: String(groupValue ?? '—'),
|
|
64
68
|
values: rawCategories.map((category) => numeric(byCategory.get(category))),
|
|
69
|
+
type: measure.type,
|
|
65
70
|
});
|
|
66
71
|
}
|
|
67
72
|
}
|
|
@@ -74,11 +79,19 @@ export function extractChartSeries(component, data) {
|
|
|
74
79
|
series.push({
|
|
75
80
|
name: measure.label ?? measure.column,
|
|
76
81
|
values: rawCategories.map((category) => numeric(byCategory.get(category))),
|
|
82
|
+
type: measure.type,
|
|
77
83
|
});
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
return { categories, series };
|
|
81
87
|
}
|
|
88
|
+
// The type each extracted series is drawn as: its measure's own type when it
|
|
89
|
+
// names one, the chart's chartType otherwise. More than one distinct type is a
|
|
90
|
+
// combo chart. Shared with the PowerPoint export so both media draw each series
|
|
91
|
+
// the same way.
|
|
92
|
+
export function seriesTypes(extracted, chartType) {
|
|
93
|
+
return extracted.series.map((series) => series.type ?? chartType);
|
|
94
|
+
}
|
|
82
95
|
// The one pure mapping from our standard camelCase chart config + the data
|
|
83
96
|
// endpoint's rows to an ECharts option. Everything visual that isn't in the
|
|
84
97
|
// registered 'report' theme is decided here, so report standards have exactly
|
|
@@ -96,11 +109,17 @@ function buildAxisOption(component, data, chartType) {
|
|
|
96
109
|
const extracted = extractChartSeries(component, data);
|
|
97
110
|
const horizontal = config.orientation === 'horizontal';
|
|
98
111
|
const colorBy = isColorBy(config);
|
|
112
|
+
const types = seriesTypes(extracted, chartType);
|
|
113
|
+
const combo = new Set(types).size > 1;
|
|
99
114
|
// colorBy emits one series per category; overlapping them (barGap -100%) makes
|
|
100
115
|
// each render at the full category-band width — one full-width, distinctly
|
|
101
116
|
// colored bar per category — instead of side-by-side slivers. The layout props
|
|
102
117
|
// are read from the first series of the coordinate system.
|
|
103
|
-
|
|
118
|
+
//
|
|
119
|
+
// Stacking sums every series that shares a stack name, whatever its type. In
|
|
120
|
+
// a combo each type stacks only with its own kind, so a line of a rate never
|
|
121
|
+
// sits on top of the bars' total.
|
|
122
|
+
const series = extracted.series.map((extractedSeries, index) => buildSeries(extractedSeries.name, extractedSeries.values, types[index], config.stacked ? (combo ? `total-${types[index]}` : 'total') : undefined, colorBy && index === 0, combo));
|
|
104
123
|
const granularity = bucketGranularity(data);
|
|
105
124
|
const categoryAxis = {
|
|
106
125
|
type: 'category',
|
|
@@ -170,13 +189,13 @@ function axisGrid(position) {
|
|
|
170
189
|
return { ...base, top: 32 };
|
|
171
190
|
}
|
|
172
191
|
}
|
|
173
|
-
function buildSeries(name, values,
|
|
174
|
-
if (
|
|
192
|
+
function buildSeries(name, values, type, stack, overlap, combo) {
|
|
193
|
+
if (type === 'bar') {
|
|
175
194
|
return {
|
|
176
195
|
name,
|
|
177
196
|
type: 'bar',
|
|
178
197
|
data: values,
|
|
179
|
-
stack
|
|
198
|
+
stack,
|
|
180
199
|
barMaxWidth: 48,
|
|
181
200
|
// colorBy: overlap the per-category series so each bar renders full-width.
|
|
182
201
|
...(overlap ? { barGap: '-100%', barCategoryGap: '20%' } : {}),
|
|
@@ -186,10 +205,13 @@ function buildSeries(name, values, chartType, stacked, overlap) {
|
|
|
186
205
|
name,
|
|
187
206
|
type: 'line',
|
|
188
207
|
data: values,
|
|
189
|
-
stack
|
|
208
|
+
stack,
|
|
190
209
|
smooth: true,
|
|
191
210
|
symbolSize: 6,
|
|
192
|
-
areaStyle:
|
|
211
|
+
areaStyle: type === 'area' ? { opacity: 0.25 } : undefined,
|
|
212
|
+
// In a combo the line is drawn over the bars whatever order the measures
|
|
213
|
+
// come in; at the same z a later bar series would paint across it.
|
|
214
|
+
...(combo ? { z: 3 } : {}),
|
|
193
215
|
};
|
|
194
216
|
}
|
|
195
217
|
function buildPieOption(component, data, donut) {
|
|
@@ -321,4 +343,4 @@ function periodAxisLabel(granularity, categories) {
|
|
|
321
343
|
},
|
|
322
344
|
};
|
|
323
345
|
}
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvb3B0aW9uLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJELE9BQU8sRUFBZ0QsbUJBQW1CLEVBQW1DLE1BQU0sK0JBQStCLENBQUM7QUFHbkosNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFDdEUsRUFBRTtBQUNGLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSx1RUFBdUU7QUFDdkUsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQW1CO0lBQzNDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3BFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssVUFBVTtXQUNuRCxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVztXQUMxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBR0QsOEVB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QUssQ0FBQyxPQUFPLFNBQVMsS0FBSyxDQUFDLElBQUksR0FBRztvQkFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDcEIsQ0FBQztZQUNELElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7U0FDakU7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRUNoYXJ0c09wdGlvbiwgTGVnZW5kQ29tcG9uZW50T3B0aW9uLCBTZXJpZXNPcHRpb24gfSBmcm9tICdlY2hhcnRzJztcblxuaW1wb3J0IHsgZm9ybWF0LCBpc1ZhbGlkLCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgQ2hhcnRDb25maWcsIENoYXJ0R3JhbnVsYXJpdHksIENvbXBvbmVudERhdGEsIEdSQU5VTEFSSVRZX09QVElPTlMsIExlZ2VuZFBvc2l0aW9uLCBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gY29sb3JCeSBhcHBsaWVzIG9ubHkgdG8gc2luZ2xlLWRpbWVuc2lvbiBiYXIgY2hhcnRzLCBhbmQgb25seSB3aGVuIHNwbGl0Qnlcbi8vIGlzbid0IGFscmVhZHkgZHJpdmluZyBtdWx0aXBsZSBzZXJpZXM6IGl0IGNvbG9ycyBlYWNoIGJhciBieSBpdHMgY2F0ZWdvcnkgYW5kXG4vLyBzaG93cyBhIGxlZ2VuZCAob25lIHNlcmllcyBwZXIgY2F0ZWdvcnksIG92ZXJsYXBwZWQgdG8gZnVsbCB3aWR0aCkuXG4vL1xuLy8gSXQgaXMgdGhlIERFRkFVTFQgZm9yIGEgY2F0ZWdvcmljYWwgYmFyIGNoYXJ0IHJhdGhlciB0aGFuIHNvbWV0aGluZyB0aGUgY29uZmlnXG4vLyBoYXMgdG8gYXNrIGZvci4gQSBiYXIgY2hhcnQgd2hvc2UgeC1heGlzIGlzIGEgY2F0ZWdvcnkg4oCUIHByb3ZpbmNlcywgc3RhdHVzZXMsXG4vLyBjbGluaWNzIOKAlCBpcyBjb21wYXJpbmcgdGhvc2UgY2F0ZWdvcmllcyB0byBlYWNoIG90aGVyLCBhbmQgb25lIGZsYXQgY29sb3Igd2l0aFxuLy8gbm8gbGVnZW5kIGlzIHRoZSB3cm9uZyByZWFkaW5nIG9mIGl0IGluIGVzc2VudGlhbGx5IGV2ZXJ5IGNhc2UuIFJlcXVpcmluZ1xuLy8gY29sb3JCeSB0byBvcHQgaW4gbWVhbnQgZXZlcnkgc3VjaCBjaGFydCByZW5kZXJlZCBtb25vY2hyb21lIHVubGVzcyB3aG9ldmVyXG4vLyB3cm90ZSB0aGUgY29uZmlnIHJlbWVtYmVyZWQgYW4gb3B0aW9uYWwgcHJvcGVydHksIHdoaWNoIGlzIGEgZGVmYXVsdCBzZXQgdGhlXG4vLyB3cm9uZyB3YXkgcm91bmQ6IHRoZSBjb21tb24gY2FzZSBzaG91bGQgbm90IG5lZWQgdGhlIGZsYWcuXG4vL1xuLy8gQSBUSU1FIGF4aXMgaXMgZXhjbHVkZWQ6IGNvbnNlY3V0aXZlIHBlcmlvZHMgYXJlIG9uZSBzZXJpZXMgbW92aW5nLCBub3Rcbi8vIGNhdGVnb3JpZXMgYmVpbmcgY29tcGFyZWQsIGFuZCBjb2xvcmluZyBlYWNoIG1vbnRoIGRpZmZlcmVudGx5IHJlYWRzIGFzXG4vLyB1bnJlbGF0ZWQgZ3JvdXBzLiBFeHBsaWNpdGx5IG9wdGluZyBvdXQg4oCUIGNvbG9yQnk6IHtjb2x1bW46ICcnfSBvciBhXG4vLyBjb25maWcubGVnZW5kIG9mICdoaWRkZW4nIOKAlCBzdGlsbCB3aW5zLCBzbyBhIGNhbGxlciB0aGF0IHdhbnRzIG9uZSBmbGF0IGNvbG9yXG4vLyBjYW4gc2F5IHNvLlxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sb3JCeShjb25maWc6IENoYXJ0Q29uZmlnKTogYm9vbGVhbiB7XG4gIGlmIChjb25maWcuc3BsaXRCeT8uY29sdW1uIHx8IChjb25maWcuY2hhcnRUeXBlID8/ICdiYXInKSAhPT0gJ2JhcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY29uZmlnLmNvbG9yQnkpIHtcbiAgICByZXR1cm4gISFjb25maWcuY29sb3JCeS5jb2x1bW47XG4gIH1cblxuICByZXR1cm4gKGNvbmZpZy54QXhpcz8ua2luZCA/PyAnY2F0ZWdvcnknKSA9PT0gJ2NhdGVnb3J5J1xuICAgICYmICFjb25maWcueEF4aXM/LmdyYW51bGFyaXR5XG4gICAgJiYgKGNvbmZpZy5tZWFzdXJlcz8ubGVuZ3RoID8/IDEpIDw9IDE7XG59XG5cblxuLy8gVGhlIGNvbHVtbiBjb2xvckJ5IGdyb3VwcyBieSDigJQgaXRzIG93biB3aGVuIHRoZSBjb25maWcgbmFtZWQgb25lLCBvdGhlcndpc2Vcbi8vIHRoZSB4LWF4aXMgaXQgZGVmYXVsdHMgdG8gY29sb3JpbmcuXG5leHBvcnQgZnVuY3Rpb24gY29sb3JCeUNvbHVtbihjb25maWc6IENoYXJ0Q29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzQ29sb3JCeShjb25maWcpXG4gICAgPyAoY29uZmlnLmNvbG9yQnk/LmNvbHVtbiB8fCBjb25maWcueEF4aXM/LmNvbHVtbilcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBDYXRlZ29yaWVzICsgbmFtZWQgc2VyaWVzIGV4dHJhY3RlZCBmcm9tIGEgY2hhcnQgY29tcG9uZW50J3MgY29uZmlnICsgcm93cyDigJRcbi8vIHRoZSBvbmUgcGl2b3QgKHNwbGl0Qnkg4oaSIHNlcmllcywgbWVhc3VyZXMg4oaSIHNlcmllcykgc2hhcmVkIGJ5IHRoZSBvbi1zY3JlZW5cbi8vIEVDaGFydHMgb3B0aW9uIGJlbG93IEFORCB0aGUgUG93ZXJQb2ludCBleHBvcnQncyBuYXRpdmUgY2hhcnQgZGF0YSwgc28gYm90aFxuLy8gbWVkaWEgcGxvdCBpZGVudGljYWwgbnVtYmVycy5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdGVkQ2hhcnRTZXJpZXMge1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXTtcbiAgc2VyaWVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSB9W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q2hhcnRTZXJpZXMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGRhdGE6IENvbXBvbmVudERhdGEpOiBFeHRyYWN0ZWRDaGFydFNlcmllcyB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IHhDb2x1bW4gPSBjb25maWcueEF4aXM/LmNvbHVtbiA/PyBkYXRhLmNvbHVtbnNbMF07XG4gIGNvbnN0IHNwbGl0Q29sdW1uID0gY29uZmlnLnNwbGl0Qnk/LmNvbHVtbjtcbiAgLy8gY29sb3JCeSBlbWl0cyBvbmUgc2VyaWVzIHBlciBjYXRlZ29yeSB0b28gKHNvIGVhY2ggYmFyIGNhcnJpZXMgaXRzIG93blxuICAvLyBjb2xvciArIGxlZ2VuZCBlbnRyeSksIGJ1dCB0aGUgYmFycyBhcmUgb3ZlcmxhcHBlZCB0byBmdWxsIHdpZHRoIGluXG4gIC8vIGJ1aWxkQXhpc09wdGlvbiByYXRoZXIgdGhhbiBsYWlkIHNpZGUtYnktc2lkZS4gc3BsaXRCeSB3aW5zIGlmIGJvdGggYXJlIHNldC5cbiAgY29uc3QgZ3JvdXBDb2x1bW4gPSBzcGxpdENvbHVtbiB8fCBjb2xvckJ5Q29sdW1uKGNvbmZpZyk7XG4gIGNvbnN0IG1lYXN1cmVzID0gY29uZmlnLm1lYXN1cmVzPy5sZW5ndGhcbiAgICA/IGNvbmZpZy5tZWFzdXJlc1xuICAgIDogW3sgY29sdW1uOiBkYXRhLmNvbHVtbnNbZGF0YS5jb2x1bW5zLmxlbmd0aCAtIDFdIH1dO1xuXG4gIGNvbnN0IHJhd0NhdGVnb3JpZXMgPSB1bmlxdWVWYWx1ZXMoZGF0YS5yb3dzLCB4Q29sdW1uKTtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IHJhd0NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gU3RyaW5nKGNhdGVnb3J5ID8/ICfigJQnKSk7XG4gIGNvbnN0IHNlcmllczogRXh0cmFjdGVkQ2hhcnRTZXJpZXNbJ3NlcmllcyddID0gW107XG5cbiAgaWYgKGdyb3VwQ29sdW1uKSB7XG4gICAgLy8gT25lIHNlcmllcyBwZXIgZ3JvdXAgdmFsdWUgKHNwbGl0QnkvY29sb3JCeSksIHBpdm90ZWQgb3ZlciB0aGUgZmlyc3QgbWVhc3VyZS5cbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZXNbMF07XG4gICAgZm9yIChjb25zdCBncm91cFZhbHVlIG9mIHVuaXF1ZVZhbHVlcyhkYXRhLnJvd3MsIGdyb3VwQ29sdW1uKSkge1xuICAgICAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEucm93cykge1xuICAgICAgICBpZiAocm93W2dyb3VwQ29sdW1uXSA9PT0gZ3JvdXBWYWx1ZSkge1xuICAgICAgICAgIGJ5Q2F0ZWdvcnkuc2V0KHJvd1t4Q29sdW1uXSwgcm93W21lYXN1cmUuY29sdW1uXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VyaWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBTdHJpbmcoZ3JvdXBWYWx1ZSA/PyAn4oCUJyksXG4gICAgICAgIHZhbHVlczogcmF3Q2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBudW1lcmljKGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSkpLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgbWVhc3VyZSBvZiBtZWFzdXJlcykge1xuICAgICAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEucm93cykge1xuICAgICAgICBieUNhdGVnb3J5LnNldChyb3dbeENvbHVtbl0sIHJvd1ttZWFzdXJlLmNvbHVtbl0pO1xuICAgICAgfVxuXG4gICAgICBzZXJpZXMucHVzaCh7XG4gICAgICAgIG5hbWU6IG1lYXN1cmUubGFiZWwgPz8gbWVhc3VyZS5jb2x1bW4sXG4gICAgICAgIHZhbHVlczogcmF3Q2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBudW1lcmljKGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSkpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2F0ZWdvcmllcywgc2VyaWVzIH07XG59XG5cbi8vIFRoZSBvbmUgcHVyZSBtYXBwaW5nIGZyb20gb3VyIHN0YW5kYXJkIGNhbWVsQ2FzZSBjaGFydCBjb25maWcgKyB0aGUgZGF0YVxuLy8gZW5kcG9pbnQncyByb3dzIHRvIGFuIEVDaGFydHMgb3B0aW9uLiBFdmVyeXRoaW5nIHZpc3VhbCB0aGF0IGlzbid0IGluIHRoZVxuLy8gcmVnaXN0ZXJlZCAncmVwb3J0JyB0aGVtZSBpcyBkZWNpZGVkIGhlcmUsIHNvIHJlcG9ydCBzdGFuZGFyZHMgaGF2ZSBleGFjdGx5XG4vLyB0d28gaG9tZXMuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDaGFydE9wdGlvbihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZGF0YTogQ29tcG9uZW50RGF0YSk6IEVDaGFydHNPcHRpb24ge1xuICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIENoYXJ0Q29uZmlnO1xuICBjb25zdCBjaGFydFR5cGUgPSBjb25maWcuY2hhcnRUeXBlID8/ICdiYXInO1xuXG4gIGlmIChjaGFydFR5cGUgPT09ICdwaWUnIHx8IGNoYXJ0VHlwZSA9PT0gJ2RvbnV0Jykge1xuICAgIHJldHVybiBidWlsZFBpZU9wdGlvbihjb21wb25lbnQsIGRhdGEsIGNoYXJ0VHlwZSA9PT0gJ2RvbnV0Jyk7XG4gIH1cblxuICByZXR1cm4gYnVpbGRBeGlzT3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY2hhcnRUeXBlKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBeGlzT3B0aW9uKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY2hhcnRUeXBlOiAnYmFyJyB8ICdsaW5lJyB8ICdhcmVhJyxcbik6IEVDaGFydHNPcHRpb24ge1xuICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIENoYXJ0Q29uZmlnO1xuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0Q2hhcnRTZXJpZXMoY29tcG9uZW50LCBkYXRhKTtcbiAgY29uc3QgaG9yaXpvbnRhbCA9IGNvbmZpZy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICBjb25zdCBjb2xvckJ5ID0gaXNDb2xvckJ5KGNvbmZpZyk7XG5cbiAgLy8gY29sb3JCeSBlbWl0cyBvbmUgc2VyaWVzIHBlciBjYXRlZ29yeTsgb3ZlcmxhcHBpbmcgdGhlbSAoYmFyR2FwIC0xMDAlKSBtYWtlc1xuICAvLyBlYWNoIHJlbmRlciBhdCB0aGUgZnVsbCBjYXRlZ29yeS1iYW5kIHdpZHRoIOKAlCBvbmUgZnVsbC13aWR0aCwgZGlzdGluY3RseVxuICAvLyBjb2xvcmVkIGJhciBwZXIgY2F0ZWdvcnkg4oCUIGluc3RlYWQgb2Ygc2lkZS1ieS1zaWRlIHNsaXZlcnMuIFRoZSBsYXlvdXQgcHJvcHNcbiAgLy8gYXJlIHJlYWQgZnJvbSB0aGUgZmlyc3Qgc2VyaWVzIG9mIHRoZSBjb29yZGluYXRlIHN5c3RlbS5cbiAgY29uc3Qgc2VyaWVzOiBTZXJpZXNPcHRpb25bXSA9IGV4dHJhY3RlZC5zZXJpZXMubWFwKChleHRyYWN0ZWRTZXJpZXMsIGluZGV4KSA9PlxuICAgIGJ1aWxkU2VyaWVzKGV4dHJhY3RlZFNlcmllcy5uYW1lLCBleHRyYWN0ZWRTZXJpZXMudmFsdWVzLCBjaGFydFR5cGUsIGNvbmZpZy5zdGFja2VkLCBjb2xvckJ5ICYmIGluZGV4ID09PSAwKSk7XG5cbiAgY29uc3QgZ3JhbnVsYXJpdHkgPSBidWNrZXRHcmFudWxhcml0eShkYXRhKTtcbiAgY29uc3QgY2F0ZWdvcnlBeGlzID0ge1xuICAgIHR5cGU6ICdjYXRlZ29yeScgYXMgY29uc3QsXG4gICAgZGF0YTogZXh0cmFjdGVkLmNhdGVnb3JpZXMsXG4gICAgbmFtZTogY29uZmlnLnhBeGlzPy5sYWJlbCxcbiAgICBuYW1lTG9jYXRpb246ICdtaWRkbGUnIGFzIGNvbnN0LFxuICAgIG5hbWVHYXA6IGdyYW51bGFyaXR5ICYmIHNwYW5zTXVsdGlwbGVZZWFycyhleHRyYWN0ZWQuY2F0ZWdvcmllcykgPyA0MCA6IDI4LFxuICAgIC4uLnBlcmlvZEF4aXNMYWJlbChncmFudWxhcml0eSwgZXh0cmFjdGVkLmNhdGVnb3JpZXMpLFxuICB9O1xuICBjb25zdCB2YWx1ZUF4aXMgPSB7IHR5cGU6ICd2YWx1ZScgYXMgY29uc3QgfTtcblxuICBjb25zdCBsZWdlbmRQb3NpdGlvbiA9IHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWcsIHNlcmllcy5sZW5ndGgsIGNvbG9yQnkpO1xuXG4gIHJldHVybiB7XG4gICAgZ3JpZDogYXhpc0dyaWQobGVnZW5kUG9zaXRpb24pLFxuICAgIGxlZ2VuZDogbGVnZW5kT3B0aW9uKGxlZ2VuZFBvc2l0aW9uKSxcbiAgICAvLyBjb2xvckJ5IGNoYXJ0cyBvdmVybGFwIE4gbW9zdGx5LW51bGwgc2VyaWVzLCBzbyBhbiBheGlzIHRvb2x0aXAgd291bGQgbGlzdFxuICAgIC8vIGV2ZXJ5IGNhdGVnb3J5OyBhbiBpdGVtIHRvb2x0aXAgc2hvd3MganVzdCB0aGUgaG92ZXJlZCBiYXIuXG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBjb2xvckJ5ID8gJ2l0ZW0nIDogJ2F4aXMnIH0sXG4gICAgeEF4aXM6IGhvcml6b250YWwgPyB2YWx1ZUF4aXMgOiBjYXRlZ29yeUF4aXMsXG4gICAgeUF4aXM6IGhvcml6b250YWwgPyBjYXRlZ29yeUF4aXMgOiB2YWx1ZUF4aXMsXG4gICAgc2VyaWVzLFxuICB9O1xufVxuXG4vLyBEZWZhdWx0IGxlZ2VuZCBwbGFjZW1lbnQgd2hlbiB0aGUgY29uZmlnIGRvZXNuJ3QgcGluIG9uZTogcGllIGNoYXJ0cyByZWFkXG4vLyBiZXN0IHdpdGggdGhlIHNsaWNlIGtleSBiZXNpZGUgdGhlbSAocmlnaHQpOyBheGlzIGNoYXJ0cyBvbmx5IG5lZWQgYSBsZWdlbmRcbi8vIHRvIHRlbGwgbXVsdGlwbGUgc2VyaWVzIGFwYXJ0LCBzbyBhIHNpbmdsZS1zZXJpZXMgY2hhcnQgaGlkZXMgaXQuIEFuIGV4cGxpY2l0XG4vLyBjb25maWcubGVnZW5kIChpbmNsdWRpbmcgJ2hpZGRlbicpIGFsd2F5cyB3aW5zLiBTaGFyZWQgd2l0aCB0aGUgUG93ZXJQb2ludFxuLy8gZXhwb3J0IHNvIGJvdGggbWVkaWEgcGxhY2UgdGhlIGxlZ2VuZCBpZGVudGljYWxseS5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTGVnZW5kUG9zaXRpb24oY29uZmlnOiBDaGFydENvbmZpZywgc2VyaWVzQ291bnQ6IG51bWJlciwgY29sb3JCeSA9IGZhbHNlKTogTGVnZW5kUG9zaXRpb24ge1xuICBpZiAoY29uZmlnLmxlZ2VuZCkge1xuICAgIHJldHVybiBjb25maWcubGVnZW5kO1xuICB9XG5cbiAgY29uc3QgcGllID0gY29uZmlnLmNoYXJ0VHlwZSA9PT0gJ3BpZScgfHwgY29uZmlnLmNoYXJ0VHlwZSA9PT0gJ2RvbnV0JztcblxuICAvLyBjb2xvckJ5IG1hcHMgZWFjaCBiYXIncyBjb2xvciB0byBpdHMgY2F0ZWdvcnksIHNvIGl0IG5lZWRzIGEgbGVnZW5kIGV2ZW5cbiAgLy8gdGhvdWdoIGl0J3MgYSBzaW5nbGUgbWVhc3VyZS5cbiAgcmV0dXJuIHBpZSB8fCBjb2xvckJ5IHx8IHNlcmllc0NvdW50ID4gMSA/IChwaWUgPyAncmlnaHQnIDogJ3RvcCcpIDogJ2hpZGRlbic7XG59XG5cbmZ1bmN0aW9uIGxlZ2VuZE9wdGlvbihwb3NpdGlvbjogTGVnZW5kUG9zaXRpb24pOiBMZWdlbmRDb21wb25lbnRPcHRpb24ge1xuICBpZiAocG9zaXRpb24gPT09ICdoaWRkZW4nKSB7XG4gICAgcmV0dXJuIHsgc2hvdzogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGJhc2U6IExlZ2VuZENvbXBvbmVudE9wdGlvbiA9IHsgdHlwZTogJ3Njcm9sbCcgfTtcblxuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIGJvdHRvbTogMCB9O1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgb3JpZW50OiAndmVydGljYWwnLCBsZWZ0OiAwLCB0b3A6ICdtaWRkbGUnIH07XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgb3JpZW50OiAndmVydGljYWwnLCByaWdodDogMCwgdG9wOiAnbWlkZGxlJyB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCB0b3A6IDAgfTtcbiAgfVxufVxuXG4vLyBSZXNlcnZlIHBsb3QtZWRnZSByb29tIG9uIHdoaWNoZXZlciBzaWRlIHRoZSBsZWdlbmQgb2NjdXBpZXMgc28gaXQgbmV2ZXJcbi8vIG92ZXJsYXBzIHRoZSBiYXJzL2xpbmVzOyBjb250YWluTGFiZWwgYWxyZWFkeSBhY2NvdW50cyBmb3IgdGhlIGF4aXMgbGFiZWxzLlxuZnVuY3Rpb24gYXhpc0dyaWQocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogRUNoYXJ0c09wdGlvblsnZ3JpZCddIHtcbiAgY29uc3QgYmFzZSA9IHsgbGVmdDogOCwgcmlnaHQ6IDE2LCB0b3A6IDgsIGJvdHRvbTogOCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IDMyIH07XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBsZWZ0OiA5NiB9O1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIHJpZ2h0OiA5NiB9O1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgdG9wOiAzMiB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2VyaWVzKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlczogKG51bWJlciB8IG51bGwpW10sXG4gIGNoYXJ0VHlwZTogJ2JhcicgfCAnbGluZScgfCAnYXJlYScsXG4gIHN0YWNrZWQ/OiBib29sZWFuLFxuICBvdmVybGFwPzogYm9vbGVhbixcbik6IFNlcmllc09wdGlvbiB7XG4gIGlmIChjaGFydFR5cGUgPT09ICdiYXInKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIGRhdGE6IHZhbHVlcyxcbiAgICAgIHN0YWNrOiBzdGFja2VkID8gJ3RvdGFsJyA6IHVuZGVmaW5lZCxcbiAgICAgIGJhck1heFdpZHRoOiA0OCxcbiAgICAgIC8vIGNvbG9yQnk6IG92ZXJsYXAgdGhlIHBlci1jYXRlZ29yeSBzZXJpZXMgc28gZWFjaCBiYXIgcmVuZGVycyBmdWxsLXdpZHRoLlxuICAgICAgLi4uKG92ZXJsYXAgPyB7IGJhckdhcDogJy0xMDAlJywgYmFyQ2F0ZWdvcnlHYXA6ICcyMCUnIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiAnbGluZScsXG4gICAgZGF0YTogdmFsdWVzLFxuICAgIHN0YWNrOiBzdGFja2VkID8gJ3RvdGFsJyA6IHVuZGVmaW5lZCxcbiAgICBzbW9vdGg6IHRydWUsXG4gICAgc3ltYm9sU2l6ZTogNixcbiAgICBhcmVhU3R5bGU6IGNoYXJ0VHlwZSA9PT0gJ2FyZWEnID8geyBvcGFjaXR5OiAwLjI1IH0gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGllT3B0aW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhLCBkb251dDogYm9vbGVhbik6IEVDaGFydHNPcHRpb24ge1xuICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIENoYXJ0Q29uZmlnO1xuICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0Q2hhcnRTZXJpZXMoY29tcG9uZW50LCBkYXRhKTtcbiAgY29uc3QgdmFsdWVzID0gZXh0cmFjdGVkLnNlcmllc1swXT8udmFsdWVzID8/IFtdO1xuICBjb25zdCBsZWdlbmRQb3NpdGlvbiA9IHJlc29sdmVMZWdlbmRQb3NpdGlvbihjb25maWcsIGV4dHJhY3RlZC5zZXJpZXMubGVuZ3RoKTtcblxuICByZXR1cm4ge1xuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogJ2l0ZW0nIH0sXG4gICAgbGVnZW5kOiBsZWdlbmRPcHRpb24obGVnZW5kUG9zaXRpb24pLFxuICAgIHNlcmllczogW1xuICAgICAge1xuICAgICAgICB0eXBlOiAncGllJyxcbiAgICAgICAgcmFkaXVzOiBkb251dCA/IFsnNDUlJywgJzcyJSddIDogJzcyJScsXG4gICAgICAgIGNlbnRlcjogcGllQ2VudGVyKGxlZ2VuZFBvc2l0aW9uKSxcbiAgICAgICAgbGFiZWw6IHsgc2hvdzogZmFsc2UgfSxcbiAgICAgICAgZGF0YTogZXh0cmFjdGVkLmNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgbmFtZTogY2F0ZWdvcnksXG4gICAgICAgICAgdmFsdWU6IHZhbHVlc1tpbmRleF0gPz8gMCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufVxuXG4vLyBOdWRnZSB0aGUgcGllIG9mZi1jZW50ZXIgdG93YXJkIHRoZSBvcHBvc2l0ZSBlZGdlIGZyb20gaXRzIGxlZ2VuZCBzbyB0aGUgdHdvXG4vLyBkb24ndCBjb2xsaWRlOyBjZW50ZXJlZCB3aGVuIHRoZSBsZWdlbmQgaXMgaGlkZGVuLlxuZnVuY3Rpb24gcGllQ2VudGVyKHBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbik6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgICByZXR1cm4gWyc2MCUnLCAnNTAlJ107XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgcmV0dXJuIFsnNDAlJywgJzUwJSddO1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgICByZXR1cm4gWyc1MCUnLCAnNTglJ107XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIHJldHVybiBbJzUwJScsICc0NiUnXTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFsnNTAlJywgJzUwJSddO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZVZhbHVlcyhyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCBjb2x1bW46IHN0cmluZyk6IHVua25vd25bXSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW5dO1xuICAgIGlmICghc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gbnVtZXJpYyh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwYXJzZWQpID8gcGFyc2VkIDogbnVsbDtcbn1cblxuLy8gVGhlIGVmZmVjdGl2ZSB0aW1lIGJ1Y2tldCB0aGUgcm93cyB3ZXJlIGdyb3VwZWQgaW50byAoZnJvbSB0aGUgZGF0YSBlbmRwb2ludCksXG4vLyBvciBudWxsIHdoZW4gdGhlIHgtYXhpcyBpc24ndCBhIHRpbWUgYXhpcyDigJQgZ2F0ZXMgdGhlIGNvbXBhY3QgcGVyaW9kIGxhYmVscy5cbmZ1bmN0aW9uIGJ1Y2tldEdyYW51bGFyaXR5KGRhdGE6IENvbXBvbmVudERhdGEpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gIHJldHVybiBkYXRhLmdyYW51bGFyaXR5ICYmIEdSQU5VTEFSSVRZX09QVElPTlMuc29tZSgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT09IGRhdGEuZ3JhbnVsYXJpdHkpXG4gICAgPyBkYXRhLmdyYW51bGFyaXR5XG4gICAgOiBudWxsO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBwZXJpb2Qtc3RhcnQgY2F0ZWdvcmllcyBjcm9zcyBhIHllYXIgYm91bmRhcnkuIFdoZW4gdGhleSBkb24ndCxcbi8vIHRoZSB5ZWFyIGlzIHB1cmUgbm9pc2Ugb24gZXZlcnkgbGFiZWwsIHNvIGl0J3MgZHJvcHBlZCBlbnRpcmVseS5cbmV4cG9ydCBmdW5jdGlvbiBzcGFuc011bHRpcGxlWWVhcnMoY2F0ZWdvcmllczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgeWVhcnMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBjYXRlZ29yaWVzKSB7XG4gICAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKGNhdGVnb3J5KTtcbiAgICBpZiAoaXNWYWxpZChkYXRlKSkge1xuICAgICAgeWVhcnMuYWRkKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHllYXJzLnNpemUgPiAxO1xufVxuXG4vLyBBIGJ1Y2tldCdzIHBlcmlvZC1zdGFydCBzcGxpdCBpbnRvIGl0cyBwcmltYXJ5IGxhYmVsIGFuZCBpdHMgeWVhci4gRGF5L3dlZWtcbi8vIHJlYWQgYXMgXCJNYXkgMVwiLCBtb250aCBhcyBcIk1heVwiLCBxdWFydGVyIGFzIFwiUTJcIiwgeWVhciBhcyBcIjIwMjVcIi4gUmV0dXJucyBudWxsXG4vLyBmb3IgYSB2YWx1ZSB0aGF0IGlzbid0IGEgcGFyc2VhYmxlIGRhdGUgKGxlZnQgYXMtaXMgYnkgY2FsbGVycykuXG5mdW5jdGlvbiBwZXJpb2RMYWJlbFBhcnRzKHZhbHVlOiBzdHJpbmcsIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5KTogeyBwcmltYXJ5OiBzdHJpbmc7IHllYXI6IHN0cmluZyB9IHwgbnVsbCB7XG4gIGNvbnN0IGRhdGUgPSBwYXJzZUlTTyh2YWx1ZSk7XG4gIGlmICghaXNWYWxpZChkYXRlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeWVhciA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICBzd2l0Y2ggKGdyYW51bGFyaXR5KSB7XG4gICAgY2FzZSAneWVhcic6XG4gICAgICByZXR1cm4geyBwcmltYXJ5OiB5ZWFyLCB5ZWFyIH07XG4gICAgY2FzZSAncXVhcnRlcic6XG4gICAgICByZXR1cm4geyBwcmltYXJ5OiBgUSR7TWF0aC5mbG9vcihkYXRlLmdldE1vbnRoKCkgLyAzKSArIDF9YCwgeWVhciB9O1xuICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIHJldHVybiB7IHByaW1hcnk6IGZvcm1hdChkYXRlLCAnTU1NTScpLCB5ZWFyIH07XG4gICAgZGVmYXVsdDogLy8gZGF5LCB3ZWVrIOKAlCB0aGUgYnVja2V0IHN0YXJ0IGFzIGEgY29tcGFjdCBcIk1NTSBkXCJcbiAgICAgIHJldHVybiB7IHByaW1hcnk6IGZvcm1hdChkYXRlLCAnTU1NIGQnKSwgeWVhciB9O1xuICB9XG59XG5cbi8vIEEgY29tcGFjdCBzaW5nbGUtbGluZSBwZXJpb2QgbGFiZWwgKHllYXIgYXBwZW5kZWQgb25seSB3aGVuIHRoZSBkYXRhIHNwYW5zXG4vLyB5ZWFycykg4oCUIGZvciBtZWRpYSB0aGF0IGNhbid0IGRvIGEgc3R5bGVkIHNlY29uZCBsaW5lLCBlLmcuIFBvd2VyUG9pbnQuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGVyaW9kTGFiZWwodmFsdWU6IHN0cmluZywgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHksIG11bHRpWWVhcjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzID0gcGVyaW9kTGFiZWxQYXJ0cyh2YWx1ZSwgZ3JhbnVsYXJpdHkpO1xuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG11bHRpWWVhciAmJiBncmFudWxhcml0eSAhPT0gJ3llYXInID8gYCR7cGFydHMucHJpbWFyeX0gJHtwYXJ0cy55ZWFyfWAgOiBwYXJ0cy5wcmltYXJ5O1xufVxuXG4vLyBFQ2hhcnRzIGNhdGVnb3J5LWF4aXMgbGFiZWwgY29uZmlnIGZvciBhIHRpbWUgYnVja2V0OiB0aGUgcHJpbWFyeSBsYWJlbCBvblxuLy8gbGluZSBvbmUsIGFuZCDigJQgb25seSB3aGVuIHRoZSBkYXRhIHNwYW5zIG11bHRpcGxlIHllYXJzIOKAlCB0aGUgeWVhciBvbiBhIHNtYWxsXG4vLyBncmF5IHNlY29uZCBsaW5lLCBjZW50ZXJlZCB1bmRlciB0aGUgdGljayAoeWVhciBncmFudWxhcml0eSBuZWVkcyBubyBzZWNvbmRcbi8vIGxpbmUsIGl0IGFscmVhZHkgaXMgdGhlIHllYXIpLiBFbXB0eSBmb3IgYSBub24tdGltZSBheGlzIChsYWJlbHMgYXMtaXMpLlxuZnVuY3Rpb24gcGVyaW9kQXhpc0xhYmVsKGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCwgY2F0ZWdvcmllczogc3RyaW5nW10pOiB7IGF4aXNMYWJlbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0ge1xuICBpZiAoIWdyYW51bGFyaXR5KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgbXVsdGlZZWFyID0gc3BhbnNNdWx0aXBsZVllYXJzKGNhdGVnb3JpZXMpO1xuXG4gIHJldHVybiB7XG4gICAgYXhpc0xhYmVsOiB7XG4gICAgICBmb3JtYXR0ZXI6ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGVyaW9kTGFiZWxQYXJ0cyh2YWx1ZSwgZ3JhbnVsYXJpdHkpO1xuICAgICAgICBpZiAoIXBhcnRzKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG11bHRpWWVhciAmJiBncmFudWxhcml0eSAhPT0gJ3llYXInXG4gICAgICAgICAgPyBgJHtwYXJ0cy5wcmltYXJ5fVxcbnt5cnwke3BhcnRzLnllYXJ9fWBcbiAgICAgICAgICA6IHBhcnRzLnByaW1hcnk7XG4gICAgICB9LFxuICAgICAgcmljaDogeyB5cjogeyBmb250U2l6ZTogMTAsIGNvbG9yOiAnIzlhYTBhNicsIGxpbmVIZWlnaHQ6IDE0IH0gfSxcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
346
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvb3B0aW9uLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXJELE9BQU8sRUFBK0QsbUJBQW1CLEVBQW1DLE1BQU0sK0JBQStCLENBQUM7QUFHbEssNkVBQTZFO0FBQzdFLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFDdEUsRUFBRTtBQUNGLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsaUZBQWlGO0FBQ2pGLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSx1RUFBdUU7QUFDdkUsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw2QkFBNkI7QUFDN0IsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFtQjtJQUMzQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ2xHLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssVUFBVTtXQUNuRCxDQUFDLE1BQU0sQ0FBQyxL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S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRUNoYXJ0c09wdGlvbiwgTGVnZW5kQ29tcG9uZW50T3B0aW9uLCBTZXJpZXNPcHRpb24gfSBmcm9tICdlY2hhcnRzJztcblxuaW1wb3J0IHsgZm9ybWF0LCBpc1ZhbGlkLCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgQXhpc0NoYXJ0VHlwZSwgQ2hhcnRDb25maWcsIENoYXJ0R3JhbnVsYXJpdHksIENvbXBvbmVudERhdGEsIEdSQU5VTEFSSVRZX09QVElPTlMsIExlZ2VuZFBvc2l0aW9uLCBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gY29sb3JCeSBhcHBsaWVzIG9ubHkgdG8gc2luZ2xlLWRpbWVuc2lvbiBiYXIgY2hhcnRzLCBhbmQgb25seSB3aGVuIHNwbGl0Qnlcbi8vIGlzbid0IGFscmVhZHkgZHJpdmluZyBtdWx0aXBsZSBzZXJpZXM6IGl0IGNvbG9ycyBlYWNoIGJhciBieSBpdHMgY2F0ZWdvcnkgYW5kXG4vLyBzaG93cyBhIGxlZ2VuZCAob25lIHNlcmllcyBwZXIgY2F0ZWdvcnksIG92ZXJsYXBwZWQgdG8gZnVsbCB3aWR0aCkuXG4vL1xuLy8gSXQgaXMgdGhlIERFRkFVTFQgZm9yIGEgY2F0ZWdvcmljYWwgYmFyIGNoYXJ0IHJhdGhlciB0aGFuIHNvbWV0aGluZyB0aGUgY29uZmlnXG4vLyBoYXMgdG8gYXNrIGZvci4gQSBiYXIgY2hhcnQgd2hvc2UgeC1heGlzIGlzIGEgY2F0ZWdvcnkg4oCUIHByb3ZpbmNlcywgc3RhdHVzZXMsXG4vLyBjbGluaWNzIOKAlCBpcyBjb21wYXJpbmcgdGhvc2UgY2F0ZWdvcmllcyB0byBlYWNoIG90aGVyLCBhbmQgb25lIGZsYXQgY29sb3Igd2l0aFxuLy8gbm8gbGVnZW5kIGlzIHRoZSB3cm9uZyByZWFkaW5nIG9mIGl0IGluIGVzc2VudGlhbGx5IGV2ZXJ5IGNhc2UuIFJlcXVpcmluZ1xuLy8gY29sb3JCeSB0byBvcHQgaW4gbWVhbnQgZXZlcnkgc3VjaCBjaGFydCByZW5kZXJlZCBtb25vY2hyb21lIHVubGVzcyB3aG9ldmVyXG4vLyB3cm90ZSB0aGUgY29uZmlnIHJlbWVtYmVyZWQgYW4gb3B0aW9uYWwgcHJvcGVydHksIHdoaWNoIGlzIGEgZGVmYXVsdCBzZXQgdGhlXG4vLyB3cm9uZyB3YXkgcm91bmQ6IHRoZSBjb21tb24gY2FzZSBzaG91bGQgbm90IG5lZWQgdGhlIGZsYWcuXG4vL1xuLy8gQSBUSU1FIGF4aXMgaXMgZXhjbHVkZWQ6IGNvbnNlY3V0aXZlIHBlcmlvZHMgYXJlIG9uZSBzZXJpZXMgbW92aW5nLCBub3Rcbi8vIGNhdGVnb3JpZXMgYmVpbmcgY29tcGFyZWQsIGFuZCBjb2xvcmluZyBlYWNoIG1vbnRoIGRpZmZlcmVudGx5IHJlYWRzIGFzXG4vLyB1bnJlbGF0ZWQgZ3JvdXBzLiBFeHBsaWNpdGx5IG9wdGluZyBvdXQg4oCUIGNvbG9yQnk6IHtjb2x1bW46ICcnfSBvciBhXG4vLyBjb25maWcubGVnZW5kIG9mICdoaWRkZW4nIOKAlCBzdGlsbCB3aW5zLCBzbyBhIGNhbGxlciB0aGF0IHdhbnRzIG9uZSBmbGF0IGNvbG9yXG4vLyBjYW4gc2F5IHNvLlxuLy9cbi8vIFwiQmFyIGNoYXJ0XCIgaXMgdGhlIHR5cGUgdGhlIGxvbmUgbWVhc3VyZSBpcyBhY3R1YWxseSBEUkFXTiBhczogaXRzIG93biB0eXBlXG4vLyB3aGVuIGl0IG5hbWVzIG9uZSwgd2hpY2ggY2FuIHR1cm4gYSBsaW5lIGNoYXJ0J3Mgc2luZ2xlIHNlcmllcyBpbnRvIGJhcnMgb3Jcbi8vIGEgYmFyIGNoYXJ0J3MgaW50byBhIGxpbmUuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xvckJ5KGNvbmZpZzogQ2hhcnRDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKGNvbmZpZy5zcGxpdEJ5Py5jb2x1bW4gfHwgKGNvbmZpZy5tZWFzdXJlcz8uWzBdPy50eXBlID8/IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2JhcicpICE9PSAnYmFyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjb25maWcuY29sb3JCeSkge1xuICAgIHJldHVybiAhIWNvbmZpZy5jb2xvckJ5LmNvbHVtbjtcbiAgfVxuXG4gIHJldHVybiAoY29uZmlnLnhBeGlzPy5raW5kID8/ICdjYXRlZ29yeScpID09PSAnY2F0ZWdvcnknXG4gICAgJiYgIWNvbmZpZy54QXhpcz8uZ3JhbnVsYXJpdHlcbiAgICAmJiAoY29uZmlnLm1lYXN1cmVzPy5sZW5ndGggPz8gMSkgPD0gMTtcbn1cblxuXG4vLyBUaGUgY29sdW1uIGNvbG9yQnkgZ3JvdXBzIGJ5IOKAlCBpdHMgb3duIHdoZW4gdGhlIGNvbmZpZyBuYW1lZCBvbmUsIG90aGVyd2lzZVxuLy8gdGhlIHgtYXhpcyBpdCBkZWZhdWx0cyB0byBjb2xvcmluZy5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckJ5Q29sdW1uKGNvbmZpZzogQ2hhcnRDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNDb2xvckJ5KGNvbmZpZylcbiAgICA/IChjb25maWcuY29sb3JCeT8uY29sdW1uIHx8IGNvbmZpZy54QXhpcz8uY29sdW1uKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5cbi8vIENhdGVnb3JpZXMgKyBuYW1lZCBzZXJpZXMgZXh0cmFjdGVkIGZyb20gYSBjaGFydCBjb21wb25lbnQncyBjb25maWcgKyByb3dzIOKAlFxuLy8gdGhlIG9uZSBwaXZvdCAoc3BsaXRCeSDihpIgc2VyaWVzLCBtZWFzdXJlcyDihpIgc2VyaWVzKSBzaGFyZWQgYnkgdGhlIG9uLXNjcmVlblxuLy8gRUNoYXJ0cyBvcHRpb24gYmVsb3cgQU5EIHRoZSBQb3dlclBvaW50IGV4cG9ydCdzIG5hdGl2ZSBjaGFydCBkYXRhLCBzbyBib3RoXG4vLyBtZWRpYSBwbG90IGlkZW50aWNhbCBudW1iZXJzLlxuLy9cbi8vIEEgc2VyaWVzJyBgdHlwZWAgaXMgdGhlIHR5cGUgaXRzIG1lYXN1cmUgYXNrcyB0byBiZSBkcmF3biBhcywgYW5kIGlzIGFic2VudFxuLy8gd2hlbiB0aGUgbWVhc3VyZSBsZWF2ZXMgaXQgdG8gdGhlIGNoYXJ0J3MgY2hhcnRUeXBlIChzZWUgc2VyaWVzVHlwZXMpLlxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0ZWRDaGFydFNlcmllcyB7XG4gIGNhdGVnb3JpZXM6IHN0cmluZ1tdO1xuICBzZXJpZXM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdOyB0eXBlPzogQXhpc0NoYXJ0VHlwZSB9W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q2hhcnRTZXJpZXMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGRhdGE6IENvbXBvbmVudERhdGEpOiBFeHRyYWN0ZWRDaGFydFNlcmllcyB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IHhDb2x1bW4gPSBjb25maWcueEF4aXM/LmNvbHVtbiA/PyBkYXRhLmNvbHVtbnNbMF07XG4gIGNvbnN0IHNwbGl0Q29sdW1uID0gY29uZmlnLnNwbGl0Qnk/LmNvbHVtbjtcbiAgLy8gY29sb3JCeSBlbWl0cyBvbmUgc2VyaWVzIHBlciBjYXRlZ29yeSB0b28gKHNvIGVhY2ggYmFyIGNhcnJpZXMgaXRzIG93blxuICAvLyBjb2xvciArIGxlZ2VuZCBlbnRyeSksIGJ1dCB0aGUgYmFycyBhcmUgb3ZlcmxhcHBlZCB0byBmdWxsIHdpZHRoIGluXG4gIC8vIGJ1aWxkQXhpc09wdGlvbiByYXRoZXIgdGhhbiBsYWlkIHNpZGUtYnktc2lkZS4gc3BsaXRCeSB3aW5zIGlmIGJvdGggYXJlIHNldC5cbiAgY29uc3QgZ3JvdXBDb2x1bW4gPSBzcGxpdENvbHVtbiB8fCBjb2xvckJ5Q29sdW1uKGNvbmZpZyk7XG4gIGNvbnN0IG1lYXN1cmVzID0gY29uZmlnLm1lYXN1cmVzPy5sZW5ndGhcbiAgICA/IGNvbmZpZy5tZWFzdXJlc1xuICAgIDogW3sgY29sdW1uOiBkYXRhLmNvbHVtbnNbZGF0YS5jb2x1bW5zLmxlbmd0aCAtIDFdIH1dO1xuXG4gIGNvbnN0IHJhd0NhdGVnb3JpZXMgPSB1bmlxdWVWYWx1ZXMoZGF0YS5yb3dzLCB4Q29sdW1uKTtcbiAgY29uc3QgY2F0ZWdvcmllcyA9IHJhd0NhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gU3RyaW5nKGNhdGVnb3J5ID8/ICfigJQnKSk7XG4gIGNvbnN0IHNlcmllczogRXh0cmFjdGVkQ2hhcnRTZXJpZXNbJ3NlcmllcyddID0gW107XG5cbiAgaWYgKGdyb3VwQ29sdW1uKSB7XG4gICAgLy8gT25lIHNlcmllcyBwZXIgZ3JvdXAgdmFsdWUgKHNwbGl0QnkvY29sb3JCeSksIHBpdm90ZWQgb3ZlciB0aGUgZmlyc3QgbWVhc3VyZS5cbiAgICBjb25zdCBtZWFzdXJlID0gbWVhc3VyZXNbMF07XG4gICAgZm9yIChjb25zdCBncm91cFZhbHVlIG9mIHVuaXF1ZVZhbHVlcyhkYXRhLnJvd3MsIGdyb3VwQ29sdW1uKSkge1xuICAgICAgY29uc3QgYnlDYXRlZ29yeSA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEucm93cykge1xuICAgICAgICBpZiAocm93W2dyb3VwQ29sdW1uXSA9PT0gZ3JvdXBWYWx1ZSkge1xuICAgICAgICAgIGJ5Q2F0ZWdvcnkuc2V0KHJvd1t4Q29sdW1uXSwgcm93W21lYXN1cmUuY29sdW1uXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VyaWVzLnB1c2goe1xuICAgICAgICBuYW1lOiBTdHJpbmcoZ3JvdXBWYWx1ZSA/PyAn4oCUJyksXG4gICAgICAgIHZhbHVlczogcmF3Q2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBudW1lcmljKGJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5KSkpLFxuICAgICAgICB0eXBlOiBtZWFzdXJlLnR5cGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBtZWFzdXJlIG9mIG1lYXN1cmVzKSB7XG4gICAgICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDx1bmtub3duLCB1bmtub3duPigpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgZGF0YS5yb3dzKSB7XG4gICAgICAgIGJ5Q2F0ZWdvcnkuc2V0KHJvd1t4Q29sdW1uXSwgcm93W21lYXN1cmUuY29sdW1uXSk7XG4gICAgICB9XG5cbiAgICAgIHNlcmllcy5wdXNoKHtcbiAgICAgICAgbmFtZTogbWVhc3VyZS5sYWJlbCA/PyBtZWFzdXJlLmNvbHVtbixcbiAgICAgICAgdmFsdWVzOiByYXdDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IG51bWVyaWMoYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpKSksXG4gICAgICAgIHR5cGU6IG1lYXN1cmUudHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGNhdGVnb3JpZXMsIHNlcmllcyB9O1xufVxuXG4vLyBUaGUgdHlwZSBlYWNoIGV4dHJhY3RlZCBzZXJpZXMgaXMgZHJhd24gYXM6IGl0cyBtZWFzdXJlJ3Mgb3duIHR5cGUgd2hlbiBpdFxuLy8gbmFtZXMgb25lLCB0aGUgY2hhcnQncyBjaGFydFR5cGUgb3RoZXJ3aXNlLiBNb3JlIHRoYW4gb25lIGRpc3RpbmN0IHR5cGUgaXMgYVxuLy8gY29tYm8gY2hhcnQuIFNoYXJlZCB3aXRoIHRoZSBQb3dlclBvaW50IGV4cG9ydCBzbyBib3RoIG1lZGlhIGRyYXcgZWFjaCBzZXJpZXNcbi8vIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpZXNUeXBlcyhleHRyYWN0ZWQ6IEV4dHJhY3RlZENoYXJ0U2VyaWVzLCBjaGFydFR5cGU6IEF4aXNDaGFydFR5cGUpOiBBeGlzQ2hhcnRUeXBlW10ge1xuICByZXR1cm4gZXh0cmFjdGVkLnNlcmllcy5tYXAoKHNlcmllcykgPT4gc2VyaWVzLnR5cGUgPz8gY2hhcnRUeXBlKTtcbn1cblxuLy8gVGhlIG9uZSBwdXJlIG1hcHBpbmcgZnJvbSBvdXIgc3RhbmRhcmQgY2FtZWxDYXNlIGNoYXJ0IGNvbmZpZyArIHRoZSBkYXRhXG4vLyBlbmRwb2ludCdzIHJvd3MgdG8gYW4gRUNoYXJ0cyBvcHRpb24uIEV2ZXJ5dGhpbmcgdmlzdWFsIHRoYXQgaXNuJ3QgaW4gdGhlXG4vLyByZWdpc3RlcmVkICdyZXBvcnQnIHRoZW1lIGlzIGRlY2lkZWQgaGVyZSwgc28gcmVwb3J0IHN0YW5kYXJkcyBoYXZlIGV4YWN0bHlcbi8vIHR3byBob21lcy5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoYXJ0T3B0aW9uKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRUNoYXJ0c09wdGlvbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IGNoYXJ0VHlwZSA9IGNvbmZpZy5jaGFydFR5cGUgPz8gJ2Jhcic7XG5cbiAgaWYgKGNoYXJ0VHlwZSA9PT0gJ3BpZScgfHwgY2hhcnRUeXBlID09PSAnZG9udXQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkUGllT3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY2hhcnRUeXBlID09PSAnZG9udXQnKTtcbiAgfVxuXG4gIHJldHVybiBidWlsZEF4aXNPcHRpb24oY29tcG9uZW50LCBkYXRhLCBjaGFydFR5cGUpO1xufVxuXG5mdW5jdGlvbiBidWlsZEF4aXNPcHRpb24oXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBjaGFydFR5cGU6IEF4aXNDaGFydFR5cGUsXG4pOiBFQ2hhcnRzT3B0aW9uIHtcbiAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZyBhcyBDaGFydENvbmZpZztcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdENoYXJ0U2VyaWVzKGNvbXBvbmVudCwgZGF0YSk7XG4gIGNvbnN0IGhvcml6b250YWwgPSBjb25maWcub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgY29uc3QgY29sb3JCeSA9IGlzQ29sb3JCeShjb25maWcpO1xuICBjb25zdCB0eXBlcyA9IHNlcmllc1R5cGVzKGV4dHJhY3RlZCwgY2hhcnRUeXBlKTtcbiAgY29uc3QgY29tYm8gPSBuZXcgU2V0KHR5cGVzKS5zaXplID4gMTtcblxuICAvLyBjb2xvckJ5IGVtaXRzIG9uZSBzZXJpZXMgcGVyIGNhdGVnb3J5OyBvdmVybGFwcGluZyB0aGVtIChiYXJHYXAgLTEwMCUpIG1ha2VzXG4gIC8vIGVhY2ggcmVuZGVyIGF0IHRoZSBmdWxsIGNhdGVnb3J5LWJhbmQgd2lkdGgg4oCUIG9uZSBmdWxsLXdpZHRoLCBkaXN0aW5jdGx5XG4gIC8vIGNvbG9yZWQgYmFyIHBlciBjYXRlZ29yeSDigJQgaW5zdGVhZCBvZiBzaWRlLWJ5LXNpZGUgc2xpdmVycy4gVGhlIGxheW91dCBwcm9wc1xuICAvLyBhcmUgcmVhZCBmcm9tIHRoZSBmaXJzdCBzZXJpZXMgb2YgdGhlIGNvb3JkaW5hdGUgc3lzdGVtLlxuICAvL1xuICAvLyBTdGFja2luZyBzdW1zIGV2ZXJ5IHNlcmllcyB0aGF0IHNoYXJlcyBhIHN0YWNrIG5hbWUsIHdoYXRldmVyIGl0cyB0eXBlLiBJblxuICAvLyBhIGNvbWJvIGVhY2ggdHlwZSBzdGFja3Mgb25seSB3aXRoIGl0cyBvd24ga2luZCwgc28gYSBsaW5lIG9mIGEgcmF0ZSBuZXZlclxuICAvLyBzaXRzIG9uIHRvcCBvZiB0aGUgYmFycycgdG90YWwuXG4gIGNvbnN0IHNlcmllczogU2VyaWVzT3B0aW9uW10gPSBleHRyYWN0ZWQuc2VyaWVzLm1hcCgoZXh0cmFjdGVkU2VyaWVzLCBpbmRleCkgPT4gYnVpbGRTZXJpZXMoXG4gICAgZXh0cmFjdGVkU2VyaWVzLm5hbWUsXG4gICAgZXh0cmFjdGVkU2VyaWVzLnZhbHVlcyxcbiAgICB0eXBlc1tpbmRleF0sXG4gICAgY29uZmlnLnN0YWNrZWQgPyAoY29tYm8gPyBgdG90YWwtJHt0eXBlc1tpbmRleF19YCA6ICd0b3RhbCcpIDogdW5kZWZpbmVkLFxuICAgIGNvbG9yQnkgJiYgaW5kZXggPT09IDAsXG4gICAgY29tYm8sXG4gICkpO1xuXG4gIGNvbnN0IGdyYW51bGFyaXR5ID0gYnVja2V0R3JhbnVsYXJpdHkoZGF0YSk7XG4gIGNvbnN0IGNhdGVnb3J5QXhpcyA9IHtcbiAgICB0eXBlOiAnY2F0ZWdvcnknIGFzIGNvbnN0LFxuICAgIGRhdGE6IGV4dHJhY3RlZC5jYXRlZ29yaWVzLFxuICAgIG5hbWU6IGNvbmZpZy54QXhpcz8ubGFiZWwsXG4gICAgbmFtZUxvY2F0aW9uOiAnbWlkZGxlJyBhcyBjb25zdCxcbiAgICBuYW1lR2FwOiBncmFudWxhcml0eSAmJiBzcGFuc011bHRpcGxlWWVhcnMoZXh0cmFjdGVkLmNhdGVnb3JpZXMpID8gNDAgOiAyOCxcbiAgICAuLi5wZXJpb2RBeGlzTGFiZWwoZ3JhbnVsYXJpdHksIGV4dHJhY3RlZC5jYXRlZ29yaWVzKSxcbiAgfTtcbiAgY29uc3QgdmFsdWVBeGlzID0geyB0eXBlOiAndmFsdWUnIGFzIGNvbnN0IH07XG5cbiAgY29uc3QgbGVnZW5kUG9zaXRpb24gPSByZXNvbHZlTGVnZW5kUG9zaXRpb24oY29uZmlnLCBzZXJpZXMubGVuZ3RoLCBjb2xvckJ5KTtcblxuICByZXR1cm4ge1xuICAgIGdyaWQ6IGF4aXNHcmlkKGxlZ2VuZFBvc2l0aW9uKSxcbiAgICBsZWdlbmQ6IGxlZ2VuZE9wdGlvbihsZWdlbmRQb3NpdGlvbiksXG4gICAgLy8gY29sb3JCeSBjaGFydHMgb3ZlcmxhcCBOIG1vc3RseS1udWxsIHNlcmllcywgc28gYW4gYXhpcyB0b29sdGlwIHdvdWxkIGxpc3RcbiAgICAvLyBldmVyeSBjYXRlZ29yeTsgYW4gaXRlbSB0b29sdGlwIHNob3dzIGp1c3QgdGhlIGhvdmVyZWQgYmFyLlxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogY29sb3JCeSA/ICdpdGVtJyA6ICdheGlzJyB9LFxuICAgIHhBeGlzOiBob3Jpem9udGFsID8gdmFsdWVBeGlzIDogY2F0ZWdvcnlBeGlzLFxuICAgIHlBeGlzOiBob3Jpem9udGFsID8gY2F0ZWdvcnlBeGlzIDogdmFsdWVBeGlzLFxuICAgIHNlcmllcyxcbiAgfTtcbn1cblxuLy8gRGVmYXVsdCBsZWdlbmQgcGxhY2VtZW50IHdoZW4gdGhlIGNvbmZpZyBkb2Vzbid0IHBpbiBvbmU6IHBpZSBjaGFydHMgcmVhZFxuLy8gYmVzdCB3aXRoIHRoZSBzbGljZSBrZXkgYmVzaWRlIHRoZW0gKHJpZ2h0KTsgYXhpcyBjaGFydHMgb25seSBuZWVkIGEgbGVnZW5kXG4vLyB0byB0ZWxsIG11bHRpcGxlIHNlcmllcyBhcGFydCwgc28gYSBzaW5nbGUtc2VyaWVzIGNoYXJ0IGhpZGVzIGl0LiBBbiBleHBsaWNpdFxuLy8gY29uZmlnLmxlZ2VuZCAoaW5jbHVkaW5nICdoaWRkZW4nKSBhbHdheXMgd2lucy4gU2hhcmVkIHdpdGggdGhlIFBvd2VyUG9pbnRcbi8vIGV4cG9ydCBzbyBib3RoIG1lZGlhIHBsYWNlIHRoZSBsZWdlbmQgaWRlbnRpY2FsbHkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxlZ2VuZFBvc2l0aW9uKGNvbmZpZzogQ2hhcnRDb25maWcsIHNlcmllc0NvdW50OiBudW1iZXIsIGNvbG9yQnkgPSBmYWxzZSk6IExlZ2VuZFBvc2l0aW9uIHtcbiAgaWYgKGNvbmZpZy5sZWdlbmQpIHtcbiAgICByZXR1cm4gY29uZmlnLmxlZ2VuZDtcbiAgfVxuXG4gIGNvbnN0IHBpZSA9IGNvbmZpZy5jaGFydFR5cGUgPT09ICdwaWUnIHx8IGNvbmZpZy5jaGFydFR5cGUgPT09ICdkb251dCc7XG5cbiAgLy8gY29sb3JCeSBtYXBzIGVhY2ggYmFyJ3MgY29sb3IgdG8gaXRzIGNhdGVnb3J5LCBzbyBpdCBuZWVkcyBhIGxlZ2VuZCBldmVuXG4gIC8vIHRob3VnaCBpdCdzIGEgc2luZ2xlIG1lYXN1cmUuXG4gIHJldHVybiBwaWUgfHwgY29sb3JCeSB8fCBzZXJpZXNDb3VudCA+IDEgPyAocGllID8gJ3JpZ2h0JyA6ICd0b3AnKSA6ICdoaWRkZW4nO1xufVxuXG5mdW5jdGlvbiBsZWdlbmRPcHRpb24ocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogTGVnZW5kQ29tcG9uZW50T3B0aW9uIHtcbiAgaWYgKHBvc2l0aW9uID09PSAnaGlkZGVuJykge1xuICAgIHJldHVybiB7IHNob3c6IGZhbHNlIH07XG4gIH1cblxuICBjb25zdCBiYXNlOiBMZWdlbmRDb21wb25lbnRPcHRpb24gPSB7IHR5cGU6ICdzY3JvbGwnIH07XG5cbiAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCBib3R0b206IDAgfTtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG9yaWVudDogJ3ZlcnRpY2FsJywgbGVmdDogMCwgdG9wOiAnbWlkZGxlJyB9O1xuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG9yaWVudDogJ3ZlcnRpY2FsJywgcmlnaHQ6IDAsIHRvcDogJ21pZGRsZScgfTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgdG9wOiAwIH07XG4gIH1cbn1cblxuLy8gUmVzZXJ2ZSBwbG90LWVkZ2Ugcm9vbSBvbiB3aGljaGV2ZXIgc2lkZSB0aGUgbGVnZW5kIG9jY3VwaWVzIHNvIGl0IG5ldmVyXG4vLyBvdmVybGFwcyB0aGUgYmFycy9saW5lczsgY29udGFpbkxhYmVsIGFscmVhZHkgYWNjb3VudHMgZm9yIHRoZSBheGlzIGxhYmVscy5cbmZ1bmN0aW9uIGF4aXNHcmlkKHBvc2l0aW9uOiBMZWdlbmRQb3NpdGlvbik6IEVDaGFydHNPcHRpb25bJ2dyaWQnXSB7XG4gIGNvbnN0IGJhc2UgPSB7IGxlZnQ6IDgsIHJpZ2h0OiAxNiwgdG9wOiA4LCBib3R0b206IDgsIGNvbnRhaW5MYWJlbDogdHJ1ZSB9O1xuXG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYm90dG9tOiAzMiB9O1xuICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbGVmdDogOTYgfTtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4geyAuLi5iYXNlLCByaWdodDogOTYgfTtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIHRvcDogMzIgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFNlcmllcyhcbiAgbmFtZTogc3RyaW5nLFxuICB2YWx1ZXM6IChudW1iZXIgfCBudWxsKVtdLFxuICB0eXBlOiBBeGlzQ2hhcnRUeXBlLFxuICBzdGFjazogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvdmVybGFwOiBib29sZWFuLFxuICBjb21ibzogYm9vbGVhbixcbik6IFNlcmllc09wdGlvbiB7XG4gIGlmICh0eXBlID09PSAnYmFyJykge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBkYXRhOiB2YWx1ZXMsXG4gICAgICBzdGFjayxcbiAgICAgIGJhck1heFdpZHRoOiA0OCxcbiAgICAgIC8vIGNvbG9yQnk6IG92ZXJsYXAgdGhlIHBlci1jYXRlZ29yeSBzZXJpZXMgc28gZWFjaCBiYXIgcmVuZGVycyBmdWxsLXdpZHRoLlxuICAgICAgLi4uKG92ZXJsYXAgPyB7IGJhckdhcDogJy0xMDAlJywgYmFyQ2F0ZWdvcnlHYXA6ICcyMCUnIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiAnbGluZScsXG4gICAgZGF0YTogdmFsdWVzLFxuICAgIHN0YWNrLFxuICAgIHNtb290aDogdHJ1ZSxcbiAgICBzeW1ib2xTaXplOiA2LFxuICAgIGFyZWFTdHlsZTogdHlwZSA9PT0gJ2FyZWEnID8geyBvcGFjaXR5OiAwLjI1IH0gOiB1bmRlZmluZWQsXG4gICAgLy8gSW4gYSBjb21ibyB0aGUgbGluZSBpcyBkcmF3biBvdmVyIHRoZSBiYXJzIHdoYXRldmVyIG9yZGVyIHRoZSBtZWFzdXJlc1xuICAgIC8vIGNvbWUgaW47IGF0IHRoZSBzYW1lIHogYSBsYXRlciBiYXIgc2VyaWVzIHdvdWxkIHBhaW50IGFjcm9zcyBpdC5cbiAgICAuLi4oY29tYm8gPyB7IHo6IDMgfSA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQaWVPcHRpb24oY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGRhdGE6IENvbXBvbmVudERhdGEsIGRvbnV0OiBib29sZWFuKTogRUNoYXJ0c09wdGlvbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgQ2hhcnRDb25maWc7XG4gIGNvbnN0IGV4dHJhY3RlZCA9IGV4dHJhY3RDaGFydFNlcmllcyhjb21wb25lbnQsIGRhdGEpO1xuICBjb25zdCB2YWx1ZXMgPSBleHRyYWN0ZWQuc2VyaWVzWzBdPy52YWx1ZXMgPz8gW107XG4gIGNvbnN0IGxlZ2VuZFBvc2l0aW9uID0gcmVzb2x2ZUxlZ2VuZFBvc2l0aW9uKGNvbmZpZywgZXh0cmFjdGVkLnNlcmllcy5sZW5ndGgpO1xuXG4gIHJldHVybiB7XG4gICAgdG9vbHRpcDogeyB0cmlnZ2VyOiAnaXRlbScgfSxcbiAgICBsZWdlbmQ6IGxlZ2VuZE9wdGlvbihsZWdlbmRQb3NpdGlvbiksXG4gICAgc2VyaWVzOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdwaWUnLFxuICAgICAgICByYWRpdXM6IGRvbnV0ID8gWyc0NSUnLCAnNzIlJ10gOiAnNzIlJyxcbiAgICAgICAgY2VudGVyOiBwaWVDZW50ZXIobGVnZW5kUG9zaXRpb24pLFxuICAgICAgICBsYWJlbDogeyBzaG93OiBmYWxzZSB9LFxuICAgICAgICBkYXRhOiBleHRyYWN0ZWQuY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBjYXRlZ29yeSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVzW2luZGV4XSA/PyAwLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbi8vIE51ZGdlIHRoZSBwaWUgb2ZmLWNlbnRlciB0b3dhcmQgdGhlIG9wcG9zaXRlIGVkZ2UgZnJvbSBpdHMgbGVnZW5kIHNvIHRoZSB0d29cbi8vIGRvbid0IGNvbGxpZGU7IGNlbnRlcmVkIHdoZW4gdGhlIGxlZ2VuZCBpcyBoaWRkZW4uXG5mdW5jdGlvbiBwaWVDZW50ZXIocG9zaXRpb246IExlZ2VuZFBvc2l0aW9uKTogW3N0cmluZywgc3RyaW5nXSB7XG4gIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIHJldHVybiBbJzYwJScsICc1MCUnXTtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgICByZXR1cm4gWyc0MCUnLCAnNTAlJ107XG4gICAgY2FzZSAndG9wJzpcbiAgICAgIHJldHVybiBbJzUwJScsICc1OCUnXTtcbiAgICBjYXNlICdib3R0b20nOlxuICAgICAgcmV0dXJuIFsnNTAlJywgJzQ2JSddO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gWyc1MCUnLCAnNTAlJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5pcXVlVmFsdWVzKHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sIGNvbHVtbjogc3RyaW5nKTogdW5rbm93bltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgY29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbl07XG4gICAgaWYgKCFzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBudW1lcmljKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBudWxsO1xufVxuXG4vLyBUaGUgZWZmZWN0aXZlIHRpbWUgYnVja2V0IHRoZSByb3dzIHdlcmUgZ3JvdXBlZCBpbnRvIChmcm9tIHRoZSBkYXRhIGVuZHBvaW50KSxcbi8vIG9yIG51bGwgd2hlbiB0aGUgeC1heGlzIGlzbid0IGEgdGltZSBheGlzIOKAlCBnYXRlcyB0aGUgY29tcGFjdCBwZXJpb2QgbGFiZWxzLlxuZnVuY3Rpb24gYnVja2V0R3JhbnVsYXJpdHkoZGF0YTogQ29tcG9uZW50RGF0YSk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgcmV0dXJuIGRhdGEuZ3JhbnVsYXJpdHkgJiYgR1JBTlVMQVJJVFlfT1BUSU9OUy5zb21lKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gZGF0YS5ncmFudWxhcml0eSlcbiAgICA/IGRhdGEuZ3JhbnVsYXJpdHlcbiAgICA6IG51bGw7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHBlcmlvZC1zdGFydCBjYXRlZ29yaWVzIGNyb3NzIGEgeWVhciBib3VuZGFyeS4gV2hlbiB0aGV5IGRvbid0LFxuLy8gdGhlIHllYXIgaXMgcHVyZSBub2lzZSBvbiBldmVyeSBsYWJlbCwgc28gaXQncyBkcm9wcGVkIGVudGlyZWx5LlxuZXhwb3J0IGZ1bmN0aW9uIHNwYW5zTXVsdGlwbGVZZWFycyhjYXRlZ29yaWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB5ZWFycyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXMpIHtcbiAgICBjb25zdCBkYXRlID0gcGFyc2VJU08oY2F0ZWdvcnkpO1xuICAgIGlmIChpc1ZhbGlkKGRhdGUpKSB7XG4gICAgICB5ZWFycy5hZGQoZGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geWVhcnMuc2l6ZSA+IDE7XG59XG5cbi8vIEEgYnVja2V0J3MgcGVyaW9kLXN0YXJ0IHNwbGl0IGludG8gaXRzIHByaW1hcnkgbGFiZWwgYW5kIGl0cyB5ZWFyLiBEYXkvd2Vla1xuLy8gcmVhZCBhcyBcIk1heSAxXCIsIG1vbnRoIGFzIFwiTWF5XCIsIHF1YXJ0ZXIgYXMgXCJRMlwiLCB5ZWFyIGFzIFwiMjAyNVwiLiBSZXR1cm5zIG51bGxcbi8vIGZvciBhIHZhbHVlIHRoYXQgaXNuJ3QgYSBwYXJzZWFibGUgZGF0ZSAobGVmdCBhcy1pcyBieSBjYWxsZXJzKS5cbmZ1bmN0aW9uIHBlcmlvZExhYmVsUGFydHModmFsdWU6IHN0cmluZywgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkpOiB7IHByaW1hcnk6IHN0cmluZzsgeWVhcjogc3RyaW5nIH0gfCBudWxsIHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlKTtcbiAgaWYgKCFpc1ZhbGlkKGRhdGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB5ZWFyID0gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gIHN3aXRjaCAoZ3JhbnVsYXJpdHkpIHtcbiAgICBjYXNlICd5ZWFyJzpcbiAgICAgIHJldHVybiB7IHByaW1hcnk6IHllYXIsIHllYXIgfTtcbiAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgIHJldHVybiB7IHByaW1hcnk6IGBRJHtNYXRoLmZsb29yKGRhdGUuZ2V0TW9udGgoKSAvIDMpICsgMX1gLCB5ZWFyIH07XG4gICAgY2FzZSAnbW9udGgnOlxuICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm9ybWF0KGRhdGUsICdNTU1NJyksIHllYXIgfTtcbiAgICBkZWZhdWx0OiAvLyBkYXksIHdlZWsg4oCUIHRoZSBidWNrZXQgc3RhcnQgYXMgYSBjb21wYWN0IFwiTU1NIGRcIlxuICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm9ybWF0KGRhdGUsICdNTU0gZCcpLCB5ZWFyIH07XG4gIH1cbn1cblxuLy8gQSBjb21wYWN0IHNpbmdsZS1saW5lIHBlcmlvZCBsYWJlbCAoeWVhciBhcHBlbmRlZCBvbmx5IHdoZW4gdGhlIGRhdGEgc3BhbnNcbi8vIHllYXJzKSDigJQgZm9yIG1lZGlhIHRoYXQgY2FuJ3QgZG8gYSBzdHlsZWQgc2Vjb25kIGxpbmUsIGUuZy4gUG93ZXJQb2ludC5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQZXJpb2RMYWJlbCh2YWx1ZTogc3RyaW5nLCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSwgbXVsdGlZZWFyOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHMgPSBwZXJpb2RMYWJlbFBhcnRzKHZhbHVlLCBncmFudWxhcml0eSk7XG4gIGlmICghcGFydHMpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbXVsdGlZZWFyICYmIGdyYW51bGFyaXR5ICE9PSAneWVhcicgPyBgJHtwYXJ0cy5wcmltYXJ5fSAke3BhcnRzLnllYXJ9YCA6IHBhcnRzLnByaW1hcnk7XG59XG5cbi8vIEVDaGFydHMgY2F0ZWdvcnktYXhpcyBsYWJlbCBjb25maWcgZm9yIGEgdGltZSBidWNrZXQ6IHRoZSBwcmltYXJ5IGxhYmVsIG9uXG4vLyBsaW5lIG9uZSwgYW5kIOKAlCBvbmx5IHdoZW4gdGhlIGRhdGEgc3BhbnMgbXVsdGlwbGUgeWVhcnMg4oCUIHRoZSB5ZWFyIG9uIGEgc21hbGxcbi8vIGdyYXkgc2Vjb25kIGxpbmUsIGNlbnRlcmVkIHVuZGVyIHRoZSB0aWNrICh5ZWFyIGdyYW51bGFyaXR5IG5lZWRzIG5vIHNlY29uZFxuLy8gbGluZSwgaXQgYWxyZWFkeSBpcyB0aGUgeWVhcikuIEVtcHR5IGZvciBhIG5vbi10aW1lIGF4aXMgKGxhYmVscyBhcy1pcykuXG5mdW5jdGlvbiBwZXJpb2RBeGlzTGFiZWwoZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLCBjYXRlZ29yaWVzOiBzdHJpbmdbXSk6IHsgYXhpc0xhYmVsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB7XG4gIGlmICghZ3JhbnVsYXJpdHkpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBtdWx0aVllYXIgPSBzcGFuc011bHRpcGxlWWVhcnMoY2F0ZWdvcmllcyk7XG5cbiAgcmV0dXJuIHtcbiAgICBheGlzTGFiZWw6IHtcbiAgICAgIGZvcm1hdHRlcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwZXJpb2RMYWJlbFBhcnRzKHZhbHVlLCBncmFudWxhcml0eSk7XG4gICAgICAgIGlmICghcGFydHMpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbXVsdGlZZWFyICYmIGdyYW51bGFyaXR5ICE9PSAneWVhcidcbiAgICAgICAgICA/IGAke3BhcnRzLnByaW1hcnl9XFxue3lyfCR7cGFydHMueWVhcn19YFxuICAgICAgICAgIDogcGFydHMucHJpbWFyeTtcbiAgICAgIH0sXG4gICAgICByaWNoOiB7IHlyOiB7IGZvbnRTaXplOiAxMCwgY29sb3I6ICcjOWFhMGE2JywgbGluZUhlaWdodDogMTQgfSB9LFxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
package/fesm2022/{firestitch-report-echarts-D4xJt3zs.mjs → firestitch-report-echarts-CFkoNvo_.mjs}
RENAMED
|
@@ -3,7 +3,7 @@ import { GridComponent, TooltipComponent, LegendComponent, DatasetComponent } fr
|
|
|
3
3
|
import * as echarts from 'echarts/core';
|
|
4
4
|
export { echarts as default };
|
|
5
5
|
import { CanvasRenderer } from 'echarts/renderers';
|
|
6
|
-
import { R as REPORT_CHART_COLORS_CSS } from './firestitch-report-firestitch-report-
|
|
6
|
+
import { R as REPORT_CHART_COLORS_CSS } from './firestitch-report-firestitch-report-PZzkYYTD.mjs';
|
|
7
7
|
|
|
8
8
|
// Tree-shaken ECharts build for the reports renderer: only the chart types and
|
|
9
9
|
// components the option-builder emits are registered, keeping the lazy chunk
|
|
@@ -57,4 +57,4 @@ echarts.registerTheme('report', {
|
|
|
57
57
|
axisLabel: { color: '#52606d', fontSize: 11 },
|
|
58
58
|
},
|
|
59
59
|
});
|
|
60
|
-
//# sourceMappingURL=firestitch-report-echarts-
|
|
60
|
+
//# sourceMappingURL=firestitch-report-echarts-CFkoNvo_.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestitch-report-echarts-
|
|
1
|
+
{"version":3,"file":"firestitch-report-echarts-CFkoNvo_.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: 'Roboto, \"Helvetica Neue\", sans-serif',\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: 11 },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: 11 },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: 11 },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAcA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,sCAAsC;AACnD,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC7C,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACF,CAAA,CAAC"}
|
|
@@ -996,8 +996,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
996
996
|
// unrelated groups. Explicitly opting out — colorBy: {column: ''} or a
|
|
997
997
|
// config.legend of 'hidden' — still wins, so a caller that wants one flat color
|
|
998
998
|
// can say so.
|
|
999
|
+
//
|
|
1000
|
+
// "Bar chart" is the type the lone measure is actually DRAWN as: its own type
|
|
1001
|
+
// when it names one, which can turn a line chart's single series into bars or
|
|
1002
|
+
// a bar chart's into a line.
|
|
999
1003
|
function isColorBy(config) {
|
|
1000
|
-
if (config.splitBy?.column || (config.chartType ?? 'bar') !== 'bar') {
|
|
1004
|
+
if (config.splitBy?.column || (config.measures?.[0]?.type ?? config.chartType ?? 'bar') !== 'bar') {
|
|
1001
1005
|
return false;
|
|
1002
1006
|
}
|
|
1003
1007
|
if (config.colorBy) {
|
|
@@ -1041,6 +1045,7 @@ function extractChartSeries(component, data) {
|
|
|
1041
1045
|
series.push({
|
|
1042
1046
|
name: String(groupValue ?? '—'),
|
|
1043
1047
|
values: rawCategories.map((category) => numeric(byCategory.get(category))),
|
|
1048
|
+
type: measure.type,
|
|
1044
1049
|
});
|
|
1045
1050
|
}
|
|
1046
1051
|
}
|
|
@@ -1053,11 +1058,19 @@ function extractChartSeries(component, data) {
|
|
|
1053
1058
|
series.push({
|
|
1054
1059
|
name: measure.label ?? measure.column,
|
|
1055
1060
|
values: rawCategories.map((category) => numeric(byCategory.get(category))),
|
|
1061
|
+
type: measure.type,
|
|
1056
1062
|
});
|
|
1057
1063
|
}
|
|
1058
1064
|
}
|
|
1059
1065
|
return { categories, series };
|
|
1060
1066
|
}
|
|
1067
|
+
// The type each extracted series is drawn as: its measure's own type when it
|
|
1068
|
+
// names one, the chart's chartType otherwise. More than one distinct type is a
|
|
1069
|
+
// combo chart. Shared with the PowerPoint export so both media draw each series
|
|
1070
|
+
// the same way.
|
|
1071
|
+
function seriesTypes(extracted, chartType) {
|
|
1072
|
+
return extracted.series.map((series) => series.type ?? chartType);
|
|
1073
|
+
}
|
|
1061
1074
|
// The one pure mapping from our standard camelCase chart config + the data
|
|
1062
1075
|
// endpoint's rows to an ECharts option. Everything visual that isn't in the
|
|
1063
1076
|
// registered 'report' theme is decided here, so report standards have exactly
|
|
@@ -1075,11 +1088,17 @@ function buildAxisOption(component, data, chartType) {
|
|
|
1075
1088
|
const extracted = extractChartSeries(component, data);
|
|
1076
1089
|
const horizontal = config.orientation === 'horizontal';
|
|
1077
1090
|
const colorBy = isColorBy(config);
|
|
1091
|
+
const types = seriesTypes(extracted, chartType);
|
|
1092
|
+
const combo = new Set(types).size > 1;
|
|
1078
1093
|
// colorBy emits one series per category; overlapping them (barGap -100%) makes
|
|
1079
1094
|
// each render at the full category-band width — one full-width, distinctly
|
|
1080
1095
|
// colored bar per category — instead of side-by-side slivers. The layout props
|
|
1081
1096
|
// are read from the first series of the coordinate system.
|
|
1082
|
-
|
|
1097
|
+
//
|
|
1098
|
+
// Stacking sums every series that shares a stack name, whatever its type. In
|
|
1099
|
+
// a combo each type stacks only with its own kind, so a line of a rate never
|
|
1100
|
+
// sits on top of the bars' total.
|
|
1101
|
+
const series = extracted.series.map((extractedSeries, index) => buildSeries(extractedSeries.name, extractedSeries.values, types[index], config.stacked ? (combo ? `total-${types[index]}` : 'total') : undefined, colorBy && index === 0, combo));
|
|
1083
1102
|
const granularity = bucketGranularity(data);
|
|
1084
1103
|
const categoryAxis = {
|
|
1085
1104
|
type: 'category',
|
|
@@ -1149,13 +1168,13 @@ function axisGrid(position) {
|
|
|
1149
1168
|
return { ...base, top: 32 };
|
|
1150
1169
|
}
|
|
1151
1170
|
}
|
|
1152
|
-
function buildSeries(name, values,
|
|
1153
|
-
if (
|
|
1171
|
+
function buildSeries(name, values, type, stack, overlap, combo) {
|
|
1172
|
+
if (type === 'bar') {
|
|
1154
1173
|
return {
|
|
1155
1174
|
name,
|
|
1156
1175
|
type: 'bar',
|
|
1157
1176
|
data: values,
|
|
1158
|
-
stack
|
|
1177
|
+
stack,
|
|
1159
1178
|
barMaxWidth: 48,
|
|
1160
1179
|
// colorBy: overlap the per-category series so each bar renders full-width.
|
|
1161
1180
|
...(overlap ? { barGap: '-100%', barCategoryGap: '20%' } : {}),
|
|
@@ -1165,10 +1184,13 @@ function buildSeries(name, values, chartType, stacked, overlap) {
|
|
|
1165
1184
|
name,
|
|
1166
1185
|
type: 'line',
|
|
1167
1186
|
data: values,
|
|
1168
|
-
stack
|
|
1187
|
+
stack,
|
|
1169
1188
|
smooth: true,
|
|
1170
1189
|
symbolSize: 6,
|
|
1171
|
-
areaStyle:
|
|
1190
|
+
areaStyle: type === 'area' ? { opacity: 0.25 } : undefined,
|
|
1191
|
+
// In a combo the line is drawn over the bars whatever order the measures
|
|
1192
|
+
// come in; at the same z a later bar series would paint across it.
|
|
1193
|
+
...(combo ? { z: 3 } : {}),
|
|
1172
1194
|
};
|
|
1173
1195
|
}
|
|
1174
1196
|
function buildPieOption(component, data, donut) {
|
|
@@ -3888,7 +3910,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
3888
3910
|
// complete synchronously after setOption.
|
|
3889
3911
|
async function renderChartImage(component, data, width, height, pixelRatio = 3) {
|
|
3890
3912
|
// The same tree-shaken echarts build + 'report' theme the live canvas uses.
|
|
3891
|
-
const echarts = (await import('./firestitch-report-echarts-
|
|
3913
|
+
const echarts = (await import('./firestitch-report-echarts-CFkoNvo_.mjs')).default;
|
|
3892
3914
|
const host = document.createElement('div');
|
|
3893
3915
|
host.style.width = `${width}px`;
|
|
3894
3916
|
host.style.height = `${height}px`;
|
|
@@ -4422,7 +4444,7 @@ class ReportPptxService {
|
|
|
4422
4444
|
const legendPosition = colorBy
|
|
4423
4445
|
? 'hidden'
|
|
4424
4446
|
: resolveLegendPosition(config, extracted.series.length);
|
|
4425
|
-
|
|
4447
|
+
const options = {
|
|
4426
4448
|
x, y, w, h,
|
|
4427
4449
|
chartColors: REPORT_CHART_COLORS,
|
|
4428
4450
|
showLegend: legendPosition !== 'hidden',
|
|
@@ -4440,7 +4462,36 @@ class ReportPptxService {
|
|
|
4440
4462
|
valAxisTitle: config.measures?.[0]?.label,
|
|
4441
4463
|
valAxisTitleFontSize: 10,
|
|
4442
4464
|
dataBorder: { pt: 0, color: 'FFFFFF' },
|
|
4443
|
-
}
|
|
4465
|
+
};
|
|
4466
|
+
// The type each chartData entry is drawn as. A pie is one entry of its own
|
|
4467
|
+
// type; colorBy collapsed its series into one, drawn as the lone measure's.
|
|
4468
|
+
const dataTypes = pie
|
|
4469
|
+
? [chartType]
|
|
4470
|
+
: seriesTypes(extracted, chartType).slice(0, colorBy ? 1 : undefined);
|
|
4471
|
+
this._addChart(slide, typeMap, dataTypes.length ? dataTypes : [chartType], chartData, options);
|
|
4472
|
+
}
|
|
4473
|
+
// One native chart when every entry is drawn as the same type. A combo is
|
|
4474
|
+
// pptxgenjs's multi-type chart: one entry per type, all on the same category
|
|
4475
|
+
// and value axes. It restarts the palette for every type, so each type is
|
|
4476
|
+
// handed the colors its series have on screen.
|
|
4477
|
+
_addChart(slide, typeMap, dataTypes, chartData, options) {
|
|
4478
|
+
const distinct = [...new Set(dataTypes)];
|
|
4479
|
+
if (distinct.length === 1) {
|
|
4480
|
+
slide.addChart(typeMap[distinct[0]], chartData, options);
|
|
4481
|
+
return;
|
|
4482
|
+
}
|
|
4483
|
+
slide.addChart(distinct.map((type) => {
|
|
4484
|
+
const indexes = dataTypes
|
|
4485
|
+
.map((dataType, index) => (dataType === type ? index : -1))
|
|
4486
|
+
.filter((index) => index >= 0);
|
|
4487
|
+
return {
|
|
4488
|
+
type: typeMap[type],
|
|
4489
|
+
data: indexes.map((index) => chartData[index]),
|
|
4490
|
+
options: {
|
|
4491
|
+
chartColors: indexes.map((index) => REPORT_CHART_COLORS[index % REPORT_CHART_COLORS.length]),
|
|
4492
|
+
},
|
|
4493
|
+
};
|
|
4494
|
+
}), options);
|
|
4444
4495
|
}
|
|
4445
4496
|
_renderTable(slide, component, data, x, y, w, h) {
|
|
4446
4497
|
const config = component.config;
|
|
@@ -4976,7 +5027,7 @@ class ReportComponent {
|
|
|
4976
5027
|
ReportExportService,
|
|
4977
5028
|
// Tree-shaken ECharts core + the 'report' house theme, loaded lazily with
|
|
4978
5029
|
// this route's chunk.
|
|
4979
|
-
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-
|
|
5030
|
+
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-CFkoNvo_.mjs').then((module) => module.default) }),
|
|
4980
5031
|
], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div\n #split\n class=\"report fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n style=\"min-height: 500px;\"\n basePath=\"reports\"\n [requestData]=\"{ reportId: selected?.id ?? null }\"\n [introMessage]=\"introMessage\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n <div class=\"viewer fs-flex fs-column\">\n <div class=\"fs-row.align-center.gap-sm\">\n <fs-autocomplete-chips\n class=\"fs-flex\"\n [fetch]=\"fetchReports\"\n [(ngModel)]=\"selected\"\n [disabled]=\"loadingReports\"\n [padless]=\"true\"\n [multiple]=\"false\"\n [fetchOnFocus]=\"true\"\n (ngModelChange)=\"reportChange($event)\"\n placeholder=\"Report\"\n name=\"report\">\n <ng-template\n fsAutocompleteChipsTemplate\n let-object=\"object\">\n {{ object.name }}\n </ng-template>\n <ng-template\n fsAutocompleteChipsStatic\n (click)=\"createReport()\">\n Create Report\n </ng-template>\n </fs-autocomplete-chips>\n @if (report && editMode) {\n <!-- What layout editing can add or switch to, and the way out of it \u2014\n the same outlined buttons as the fs-ai-report toolbar. -->\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"master-toggle\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n }\n @if (report) {\n <fs-menu>\n <ng-template\n fs-menu-item\n (click)=\"reportSettings()\">\n <mat-icon>\n tune\n </mat-icon>\n Report settings\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"toggleEditMode()\"\n [disabled]=\"editMode\">\n <mat-icon>\n dashboard_customize\n </mat-icon>\n {{ editMode ? 'Done editing layout' : 'Edit layout' }}\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n <mat-icon>\n slideshow\n </mat-icon>\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n <mat-icon>\n picture_as_pdf\n </mat-icon>\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data\n </ng-template>\n @if ((report?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n <mat-icon>\n table_view\n </mat-icon>\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n }\n </div>\n @if (report) {\n <!-- Report-level filters only (the report's actions live in the menu\n above). fs-filter reads its config once at init, so it's keyed on the\n filter signature: when the report-level filter set changes the block\n is recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter [config]=\"reportFilterConfig\"></fs-filter>\n }\n }\n <app-report-canvas\n [report]=\"report\"\n [editMode]=\"editMode\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\">\n </app-report-canvas>\n }\n </div>\n</div>", styles: [".report{height:100%;min-height:500px}.report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:500px;min-width:0;border:none}.report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.report .viewer fs-filter{flex:0 0 auto;margin-top:10px;margin-bottom:0}.report .viewer ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.report .resizer:before{content:\"\";width:0px;background:#0000001f;transition:width .12s ease,background-color .12s ease}.report .resizer:hover:before{width:3px;background:var(--brand-primary-color)}.report.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.report.resizing .resizer:before{width:3px;background:var(--brand-primary-color)}.report.resizing .chat,.report.resizing .viewer{pointer-events:none}::ng-deep body.body-report-reports .mat-mdc-card-content{display:flex;flex-direction:column;box-sizing:border-box}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel{flex:1;min-height:0}::ng-deep body.body-report-reports .mat-mdc-card-content mat-tab-nav-panel router-outlet+ng-component{height:100%}.master-toggle.active{background:#eceff3}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsAutocompleteChipsModule }, { kind: "component", type: i2$3.FsAutocompleteChipsComponent, selector: "fs-autocomplete-chips", inputs: ["fetch", "appearance", "floatLabel", "readonly", "size", "label", "placeholder", "chipImage", "chipBackground", "chipColor", "chipIcon", "chipIconColor", "chipClass", "chipPadding", "shape", "hint", "allowText", "allowObject", "delay", "minPanelWidth", "maxPanelHeight", "validateText", "removable", "allowClear", "color", "background", "orderable", "padless", "initOnClick", "fetchOnFocus", "multiple", "multipleAdd", "confirm", "disabled", "groupBy", "panelWidth", "panelClass", "compareWith"], outputs: ["selected", "removed", "reordered", "clear", "panelOpened", "panelClosed"] }, { kind: "directive", type: i2$3.FsAutocompleteObjectDirective, selector: "[fsAutocompleteObject],[fsAutocompleteChipsTemplate]" }, { kind: "directive", type: i2$3.FsAutocompleteChipsStaticDirective, selector: "[fsAutocompleteChipsStatic]", inputs: ["show", "disable"], outputs: ["click", "selected"] }, { kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2$1.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2$1.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
4981
5032
|
}
|
|
4982
5033
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportComponent, decorators: [{
|
|
@@ -4991,7 +5042,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
4991
5042
|
ReportExportService,
|
|
4992
5043
|
// Tree-shaken ECharts core + the 'report' house theme, loaded lazily with
|
|
4993
5044
|
// this route's chunk.
|
|
4994
|
-
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-
|
|
5045
|
+
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-CFkoNvo_.mjs').then((module) => module.default) }),
|
|
4995
5046
|
], imports: [
|
|
4996
5047
|
FormsModule,
|
|
4997
5048
|
FsAutocompleteChipsModule,
|
|
@@ -6543,7 +6594,7 @@ class FsAiReportComponent {
|
|
|
6543
6594
|
ReportPdfService,
|
|
6544
6595
|
ReportExportService,
|
|
6545
6596
|
// Tree-shaken ECharts core + the 'report' house theme, loaded lazily.
|
|
6546
|
-
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-
|
|
6597
|
+
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-CFkoNvo_.mjs').then((module) => module.default) }),
|
|
6547
6598
|
], viewQueries: [{ propertyName: "_split", first: true, predicate: ["split"], descendants: true, static: true }, { propertyName: "_chatPanel", first: true, predicate: ["chatPanel"], descendants: true, read: ElementRef, static: true }, { propertyName: "_canvas", first: true, predicate: ReportCanvasComponent, descendants: true }], ngImport: i0, template: "<div class=\"fs-ai-report fs-column\">\n\n <div class=\"fs-ai-report__header fs-row.align-center\">\n <h2 class=\"fs-ai-report__title fs-flex\">{{ report?.name }}</h2>\n\n @if (report) {\n <!-- Report-level filters, inline with the toolbar actions. fs-filter\n reads its config once at init, so it's keyed on the filter\n signature: when the report-level filter set changes the block is\n recreated and re-reads the rebuilt config. -->\n @if (reportHasFilters) {\n @for (key of [reportFilterKey]; track key) {\n <fs-filter\n class=\"fs-ai-report__filters\"\n [config]=\"reportFilterConfig\">\n </fs-filter>\n }\n }\n\n <!-- What layout editing can add or switch to, and the way out of it.\n One style for all three \u2014 outlined, icon and text. \"Header & footer\"\n is a toggle: it keeps its label and turns gray while it is on. -->\n @if (editMode) {\n <div class=\"fs-ai-report__edit-tools fs-row.align-center.gap-xs\">\n <button\n mat-stroked-button\n type=\"button\"\n matTooltip=\"Add a block of text\"\n (click)=\"addText()\">\n <mat-icon>title</mat-icon>\n Add text\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n class=\"fs-ai-report__master\"\n [class.active]=\"isMasterMode\"\n [matTooltip]=\"isMasterMode ? 'Back to editing this page' : 'Edit the header and footer shown on every page'\"\n (click)=\"toggleMasterMode()\">\n <mat-icon>web_asset</mat-icon>\n Header & footer\n </button>\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleEditMode()\">\n <mat-icon>check</mat-icon>\n Done editing\n </button>\n </div>\n }\n\n <!-- One icon for both states: it reads as pressed while editing rather\n than swapping to something else. -->\n <button\n mat-icon-button\n type=\"button\"\n class=\"fs-ai-report__toggle\"\n [class.active]=\"editMode\"\n [matTooltip]=\"editMode ? 'Done editing' : 'Edit layout'\"\n (click)=\"toggleEditMode()\">\n <mat-icon>dashboard_customize</mat-icon>\n </button>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Export\"\n [fsMenuTriggerFor]=\"exportMenu\">\n <mat-icon>download</mat-icon>\n </button>\n <fs-menu #exportMenu>\n <ng-template\n fs-menu-item\n (click)=\"exportPowerpoint()\">\n Export PowerPoint\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportPdf()\">\n Export PDF\n </ng-template>\n <ng-template\n fs-menu-item\n (click)=\"exportData()\">\n Export Raw Data\n </ng-template>\n @if ((report?.pages?.length ?? 0) > 1) {\n <ng-template\n fs-menu-item\n (click)=\"exportData(true)\">\n Export Raw Data (This Page)\n </ng-template>\n }\n </fs-menu>\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Report settings\"\n (click)=\"reportSettings()\">\n <mat-icon>settings</mat-icon>\n </button>\n }\n </div>\n\n <div\n #split\n class=\"fs-ai-report__split fs-row.align-start\">\n <fs-ai-chat\n #chatPanel\n class=\"chat\"\n [basePath]=\"basePath()\"\n [requestData]=\"chatRequestData()\"\n [ready]=\"chatPageId() !== null\"\n (response)=\"onChatResponse($event)\">\n </fs-ai-chat>\n\n <div\n class=\"resizer\"\n (pointerdown)=\"onResizeStart($event)\">\n </div>\n\n <div class=\"viewer fs-flex fs-column\">\n @if (report) {\n <app-report-canvas\n [report]=\"report\"\n [editMode]=\"editMode\"\n [pageId]=\"pageId\"\n (componentSettings)=\"componentSettings($event)\"\n (reportChanged)=\"onCanvasReportChanged()\"\n (pageChanged)=\"onCanvasPageChanged($event)\">\n </app-report-canvas>\n }\n </div>\n </div>\n</div>\n", styles: [".fs-ai-report{height:100%;min-height:500px;display:flex;flex-direction:column}.fs-ai-report__header{flex:0 0 auto;margin-bottom:10px}.fs-ai-report__title{margin:0;min-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fs-ai-report__filters{flex:0 1 auto;min-width:0;display:block;margin:0 5px 0 0}.fs-ai-report__filters ::ng-deep .filter-bar-container{align-items:center!important}.fs-ai-report__filters ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.fs-ai-report__toggle.active{background:#e3ecf7;color:var(--brand-primary-color, #2196f3)}.fs-ai-report__master.active{background:#eceff3}.fs-ai-report__edit-tools{margin:0 5px}.fs-ai-report__split{flex:1 1 auto;min-height:0}.fs-ai-report .chat{display:block;flex:0 0 25%;width:100%;height:100%;min-height:400px;min-width:0;border:none}.fs-ai-report .viewer{display:flex;flex-direction:column;min-width:0;height:100%;overflow:hidden}.fs-ai-report .resizer{flex:0 0 11px;align-self:stretch;display:flex;justify-content:center;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none}.fs-ai-report .resizer:before{content:\"\";width:3px;border-radius:3px;background:transparent;transition:background-color .12s ease}.fs-ai-report .resizer:hover:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.fs-ai-report__split.resizing .resizer:before{background:var(--brand-primary-color)}.fs-ai-report__split.resizing .chat,.fs-ai-report__split.resizing .viewer{pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: FsFilterModule }, { kind: "component", type: i2.FilterComponent, selector: "fs-filter", inputs: ["config"], outputs: ["closed", "opened", "ready"] }, { kind: "ngmodule", type: FsMenuModule }, { kind: "component", type: i2$1.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i2$1.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "directive", type: i2$1.FsMenuTriggerDirective, selector: "[fsMenuTriggerFor]", inputs: ["fsMenuTriggerFor"] }, { kind: "component", type: FsAiChatComponent, selector: "fs-ai-chat", inputs: ["basePath", "requestData", "ready", "introMessage", "showThinking"], outputs: ["response", "showThinkingChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3$3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: ReportCanvasComponent, selector: "app-report-canvas", inputs: ["report", "editMode", "pageId"], outputs: ["componentSettings", "reportChanged", "pageChanged"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
6548
6599
|
}
|
|
6549
6600
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FsAiReportComponent, decorators: [{
|
|
@@ -6557,7 +6608,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
6557
6608
|
ReportPdfService,
|
|
6558
6609
|
ReportExportService,
|
|
6559
6610
|
// Tree-shaken ECharts core + the 'report' house theme, loaded lazily.
|
|
6560
|
-
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-
|
|
6611
|
+
provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-CFkoNvo_.mjs').then((module) => module.default) }),
|
|
6561
6612
|
], imports: [
|
|
6562
6613
|
FsFilterModule,
|
|
6563
6614
|
FsMenuModule,
|
|
@@ -6591,4 +6642,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
6591
6642
|
*/
|
|
6592
6643
|
|
|
6593
6644
|
export { FsAiReportsComponent as F, GRANULARITY_OPTIONS as G, REPORT_CHART_COLORS_CSS as R, ReportComponent as a, FsAiReportComponent as b, ReportData as c, ReportService as d, ReportFilterStateService as e, ReportNodeType as f, ReportState as g };
|
|
6594
|
-
//# sourceMappingURL=firestitch-report-firestitch-report-
|
|
6645
|
+
//# sourceMappingURL=firestitch-report-firestitch-report-PZzkYYTD.mjs.map
|