@firestitch/report 18.4.0 → 18.6.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/components/component-list/component-list.component.d.ts +3 -6
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +4 -4
- package/app/reports/components/report-component/report-component.component.d.ts +5 -5
- package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
- package/app/reports/consts/report-week.const.d.ts +2 -0
- package/app/reports/data/report-ai-chat.data.d.ts +12 -0
- package/app/reports/data/report.data.d.ts +3 -3
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
- package/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.d.ts +3 -0
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +14 -2
- package/app/reports/export/report-pdf.service.d.ts +14 -1
- package/app/reports/export/report-pptx.service.d.ts +6 -1
- package/app/reports/format.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
- package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
- package/app/reports/interfaces/report.interface.d.ts +19 -3
- package/app/reports/option-builder.d.ts +13 -1
- package/app/reports/pipes/report-date.pipe.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +5 -0
- package/app/reports/report-url-state.d.ts +14 -0
- package/app/reports/services/report-filter-state.service.d.ts +24 -2
- package/app/reports/text.d.ts +1 -0
- package/app/reports/theme/palette.d.ts +2 -0
- package/app/reports/theme/typography.d.ts +2 -0
- package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
- package/app/reports/views/report/report.component.d.ts +6 -6
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +29 -104
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +52 -44
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +55 -35
- package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
- package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
- package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
- package/esm2022/app/reports/data/report.data.mjs +22 -9
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
- package/esm2022/app/reports/dialogs/global-settings/components/semantic-database/semantic-database.component.mjs +28 -14
- package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +3 -3
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
- package/esm2022/app/reports/export/report-export-collector.service.mjs +92 -28
- package/esm2022/app/reports/export/report-export.service.mjs +11 -8
- package/esm2022/app/reports/export/report-pdf.service.mjs +241 -81
- package/esm2022/app/reports/export/report-pptx.service.mjs +143 -60
- package/esm2022/app/reports/format.mjs +119 -8
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/option-builder.mjs +230 -17
- package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
- package/esm2022/app/reports/report-filter-items.mjs +42 -10
- package/esm2022/app/reports/report-url-state.mjs +144 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +308 -64
- package/esm2022/app/reports/text.mjs +2 -2
- package/esm2022/app/reports/theme/echarts.mjs +6 -5
- package/esm2022/app/reports/theme/palette.mjs +9 -1
- package/esm2022/app/reports/theme/typography.mjs +6 -0
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +191 -90
- package/esm2022/app/reports/views/report/report.component.mjs +64 -62
- package/fesm2022/{firestitch-report-echarts-CFkoNvo_.mjs → firestitch-report-echarts-B9nl9XKM.mjs} +6 -6
- package/fesm2022/firestitch-report-echarts-B9nl9XKM.mjs.map +1 -0
- package/fesm2022/{firestitch-report-firestitch-report-PZzkYYTD.mjs → firestitch-report-firestitch-report-Bb65HEYB.mjs} +2348 -1161
- package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
- package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
- package/fesm2022/firestitch-report-echarts-CFkoNvo_.mjs.map +0 -1
- package/fesm2022/firestitch-report-firestitch-report-PZzkYYTD.mjs.map +0 -1
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import { formatMeasureValue } from '../format';
|
|
2
|
+
import { formatMeasureValue, resolveReportTimezone } from '../format';
|
|
4
3
|
import { DEFAULT_COMPONENT_PADDING, pageGeometry } from '../layout';
|
|
5
4
|
import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, textParagraphs, } from '../text';
|
|
6
5
|
import { renderChartImage } from './offscreen-chart';
|
|
7
|
-
import { emptyLabel } from './report-export-collector.service';
|
|
6
|
+
import { coverLines, emptyLabel, exportCell, listColumns, listHeadings, moreRowsNotice, } from './report-export-collector.service';
|
|
8
7
|
import * as i0 from "@angular/core";
|
|
9
8
|
// Inches → points (the PDF unit).
|
|
10
9
|
const PT = 72;
|
|
11
10
|
// Component title strip height, points.
|
|
12
11
|
const TITLE_H = 18;
|
|
13
|
-
//
|
|
14
|
-
|
|
12
|
+
// Rows fetched for a list's PDF table. A table that outgrows its box
|
|
13
|
+
// continues onto pages of its own, so this is how far it may run: about 12-15
|
|
14
|
+
// continuation pages on a letter page, and a tenth of the server's 5000-row
|
|
15
|
+
// ceiling. A longer result ends in a moreRowsNotice() row.
|
|
16
|
+
export const PDF_LIST_ROWS = 500;
|
|
17
|
+
// How far a continuation table sits inside the header and footer bands,
|
|
18
|
+
// points. A page with no band (or with the master hidden) keeps
|
|
19
|
+
// NO_BAND_MARGIN from that edge instead.
|
|
20
|
+
const CONTINUATION_GAP = 0.25 * PT;
|
|
21
|
+
const NO_BAND_MARGIN = 0.5 * PT;
|
|
22
|
+
const NO_BANDS = { headerHeight: 0, footerHeight: 0 };
|
|
23
|
+
// The last row of a list box whose rows carry on past it.
|
|
24
|
+
const CONTINUED_NOTICE = 'Continued on the following pages';
|
|
15
25
|
// A text line's height as a multiple of its largest font size — the canvas
|
|
16
26
|
// stylesheet's line-height, so a block wraps and stacks the same way.
|
|
17
27
|
const TEXT_LINE_HEIGHT = 1.25;
|
|
@@ -24,40 +34,74 @@ const LIST_INDENT = 16;
|
|
|
24
34
|
// Charts are rendered through an offscreen ECharts instance at 3× pixel
|
|
25
35
|
// ratio — pixel-identical to the screen, crisp at print size — and tables are
|
|
26
36
|
// drawn with jspdf-autotable. Both libraries load lazily into their own chunks.
|
|
37
|
+
//
|
|
38
|
+
// A list table is fitted to its box by laying it out first, never by a
|
|
39
|
+
// row-height estimate, so it cannot spill past the box. The rows that do not
|
|
40
|
+
// fit continue on pages of their own after the report page, under the same
|
|
41
|
+
// header/footer and with the same column widths, up to PDF_LIST_ROWS; a
|
|
42
|
+
// longer result ends in a row pointing to the component's CSV export.
|
|
27
43
|
export class ReportPdfService {
|
|
28
44
|
async export(collected) {
|
|
45
|
+
const context = await this._context(collected.report);
|
|
46
|
+
this._titlePage(context.doc, collected, context.pageW, context.pageH);
|
|
47
|
+
// The physical page number {{page.number}} prints: report pages and
|
|
48
|
+
// their continuation pages alike, the title page not counted.
|
|
49
|
+
let pageNumber = 0;
|
|
50
|
+
for (const [index, collectedPage] of collected.pages.entries()) {
|
|
51
|
+
const overflows = [];
|
|
52
|
+
pageNumber += 1;
|
|
53
|
+
await this._renderPage(context, collectedPage, index, pageNumber, overflows);
|
|
54
|
+
// Each continuation appends its pages at the end of the document, so
|
|
55
|
+
// two lists that overflowed on one page follow it back to back.
|
|
56
|
+
for (const overflow of overflows) {
|
|
57
|
+
pageNumber = this._renderContinuation(context, collectedPage.page, index, pageNumber, overflow);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
context.doc.save(`${this._slug(collected.report.name)}.pdf`);
|
|
61
|
+
}
|
|
62
|
+
async _context(report) {
|
|
29
63
|
const { jsPDF } = await import('jspdf');
|
|
30
64
|
const autoTable = (await import('jspdf-autotable')).default;
|
|
31
|
-
const report = collected.report;
|
|
32
65
|
const pageW = report.pageWidth * PT;
|
|
33
66
|
const pageH = report.pageHeight * PT;
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
unit: 'pt',
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
67
|
+
const orientation = pageW >= pageH ? 'landscape' : 'portrait';
|
|
68
|
+
return {
|
|
69
|
+
doc: new jsPDF({ orientation, unit: 'pt', format: [pageW, pageH] }),
|
|
70
|
+
autoTable,
|
|
71
|
+
jsPDF,
|
|
72
|
+
report,
|
|
73
|
+
timezone: resolveReportTimezone(report),
|
|
74
|
+
pageW,
|
|
75
|
+
pageH,
|
|
76
|
+
orientation,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// One report page: the header and footer first, under the page's own
|
|
80
|
+
// components. A list that outgrows its box leaves its remaining rows in
|
|
81
|
+
// overflows.
|
|
82
|
+
async _renderPage(context, collectedPage, index, pageNumber, overflows) {
|
|
83
|
+
const { doc, report } = context;
|
|
84
|
+
const geometry = pageGeometry(report, collectedPage.page);
|
|
85
|
+
const tokens = this._tokens(report, collectedPage.page, index, pageNumber);
|
|
86
|
+
doc.addPage([context.pageW, context.pageH], context.orientation);
|
|
87
|
+
this._renderMaster(context, collectedPage.page, tokens);
|
|
88
|
+
for (const item of collectedPage.components) {
|
|
89
|
+
const box = geometry.get(item.component.id);
|
|
90
|
+
if (item.component.type === 'text') {
|
|
91
|
+
this._renderText(doc, item.component, box ?? item.component, tokens);
|
|
49
92
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (item.component.type === 'text') {
|
|
53
|
-
this._renderText(doc, item.component, box ?? item.component, tokens);
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
await this._renderComponent(doc, autoTable, item, box);
|
|
57
|
-
}
|
|
93
|
+
else {
|
|
94
|
+
await this._renderComponent(context, item, overflows, box);
|
|
58
95
|
}
|
|
59
96
|
}
|
|
60
|
-
|
|
97
|
+
}
|
|
98
|
+
_renderMaster(context, page, tokens) {
|
|
99
|
+
if (page.masterHidden) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
for (const component of context.report.master?.components ?? []) {
|
|
103
|
+
this._renderText(context.doc, component, component, tokens);
|
|
104
|
+
}
|
|
61
105
|
}
|
|
62
106
|
_titlePage(doc, collected, pageW, pageH) {
|
|
63
107
|
doc.setFont('helvetica', 'bold');
|
|
@@ -67,11 +111,7 @@ export class ReportPdfService {
|
|
|
67
111
|
doc.setFont('helvetica', 'normal');
|
|
68
112
|
doc.setFontSize(11);
|
|
69
113
|
doc.setTextColor('#52606d');
|
|
70
|
-
|
|
71
|
-
format(new Date(), 'MMMM d, yyyy'),
|
|
72
|
-
...collected.filterSummary,
|
|
73
|
-
];
|
|
74
|
-
doc.text(lines, 40, pageH * 0.35 + 26);
|
|
114
|
+
doc.text(coverLines(collected), 40, pageH * 0.35 + 26);
|
|
75
115
|
}
|
|
76
116
|
// A text block, laid out by hand: jsPDF draws strings, not rich text, so each
|
|
77
117
|
// paragraph's runs are broken into words, wrapped to the block's width and
|
|
@@ -196,16 +236,19 @@ export class ReportPdfService {
|
|
|
196
236
|
return 0;
|
|
197
237
|
}
|
|
198
238
|
}
|
|
199
|
-
// What a text block's tokens fill with on this page
|
|
200
|
-
// among the report's pages
|
|
201
|
-
|
|
239
|
+
// What a text block's tokens fill with on this page. The number is the
|
|
240
|
+
// physical page among the report's pages, continuation pages included — the
|
|
241
|
+
// title page is not a report page. The name stays the report page's, so a
|
|
242
|
+
// continuation page is named for the page its table started on.
|
|
243
|
+
_tokens(report, page, index, pageNumber) {
|
|
202
244
|
return {
|
|
203
|
-
pageNumber
|
|
245
|
+
pageNumber,
|
|
204
246
|
pageName: page.name || `Page ${index + 1}`,
|
|
205
247
|
reportName: report.name,
|
|
206
248
|
};
|
|
207
249
|
}
|
|
208
|
-
async _renderComponent(
|
|
250
|
+
async _renderComponent(context, item, overflows, geometry) {
|
|
251
|
+
const { doc } = context;
|
|
209
252
|
const component = item.component;
|
|
210
253
|
// Geometry arrives in inches (flow layout pre-resolved); the PDF draws in
|
|
211
254
|
// points.
|
|
@@ -215,18 +258,12 @@ export class ReportPdfService {
|
|
|
215
258
|
const w = inches.w * PT;
|
|
216
259
|
const h = inches.h * PT;
|
|
217
260
|
if (component.title) {
|
|
218
|
-
|
|
219
|
-
doc.setFontSize(9);
|
|
220
|
-
doc.setTextColor('#1f2933');
|
|
221
|
-
doc.text(component.title, x, y + 10, { maxWidth: w });
|
|
261
|
+
this._componentTitle(doc, component.title, x, y, w);
|
|
222
262
|
}
|
|
223
263
|
const bodyY = y + TITLE_H;
|
|
224
264
|
const bodyH = Math.max(20, h - TITLE_H);
|
|
225
265
|
if (!item.data || !item.data.rows?.length) {
|
|
226
|
-
|
|
227
|
-
doc.setFontSize(9);
|
|
228
|
-
doc.setTextColor('#7b8794');
|
|
229
|
-
doc.text(emptyLabel(item), x + w / 2, bodyY + bodyH / 2, { align: 'center' });
|
|
266
|
+
this._boxNote(doc, emptyLabel(item), x, bodyY, w, bodyH);
|
|
230
267
|
return;
|
|
231
268
|
}
|
|
232
269
|
switch (component.type) {
|
|
@@ -236,36 +273,173 @@ export class ReportPdfService {
|
|
|
236
273
|
break;
|
|
237
274
|
}
|
|
238
275
|
case 'list':
|
|
239
|
-
this._renderTable(
|
|
276
|
+
this._renderTable(context, component, item.data, x, bodyY, w, bodyH, overflows);
|
|
240
277
|
break;
|
|
241
278
|
case 'kpi':
|
|
242
279
|
this._renderKpi(doc, component, item.data, x, bodyY, w, bodyH);
|
|
243
280
|
break;
|
|
244
281
|
}
|
|
245
282
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
283
|
+
// The bold strip over a component, and over each of its continuation pages.
|
|
284
|
+
_componentTitle(doc, title, x, y, w) {
|
|
285
|
+
doc.setFont('helvetica', 'bold');
|
|
286
|
+
doc.setFontSize(9);
|
|
287
|
+
doc.setTextColor('#1f2933');
|
|
288
|
+
doc.text(title, x, y + 10, { maxWidth: w });
|
|
289
|
+
}
|
|
290
|
+
// An italic grey line centered in a component's body, for a body that holds
|
|
291
|
+
// something other than its content.
|
|
292
|
+
_boxNote(doc, text, x, y, w, h) {
|
|
293
|
+
doc.setFont('helvetica', 'italic');
|
|
294
|
+
doc.setFontSize(9);
|
|
295
|
+
doc.setTextColor('#7b8794');
|
|
296
|
+
doc.text(text, x + w / 2, y + h / 2, { align: 'center' });
|
|
297
|
+
}
|
|
298
|
+
// A list's on-page table. All of its fetched rows are laid out once to learn
|
|
299
|
+
// how many the box holds; when they do not all fit, the box's last row says
|
|
300
|
+
// the table continues and the rest go to overflows for continuation pages.
|
|
301
|
+
// A box too short for even the head carries the notice as a line instead.
|
|
302
|
+
// Points throughout.
|
|
303
|
+
_renderTable(context, component, data, x, y, w, h, overflows) {
|
|
304
|
+
const head = listHeadings(component, data);
|
|
305
|
+
const cells = this._tableCells(component, data, context.timezone);
|
|
306
|
+
const omitted = Math.max(0, (data.paging?.total ?? cells.length) - cells.length);
|
|
307
|
+
const bottom = context.pageH - (y + h);
|
|
308
|
+
const { fit, columnStyles } = this._measure(context, head, cells, x, y, w, bottom);
|
|
309
|
+
if (fit === cells.length && omitted === 0) {
|
|
310
|
+
this._drawTable(context, this._tableOptions(context, head, cells, x, y, w, bottom, columnStyles));
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
// The notice takes the place of the last row that fit, so that row moves
|
|
314
|
+
// to the continuation. omitted > 0 means a full PDF_LIST_ROWS fetch, which
|
|
315
|
+
// never fits one box, so the CSV notice always lands on a continuation
|
|
316
|
+
// page.
|
|
317
|
+
const kept = Math.max(0, fit - 1);
|
|
318
|
+
overflows.push({ component, head, rows: cells.slice(kept), omitted, x, w, columnStyles });
|
|
319
|
+
if (fit >= 1) {
|
|
320
|
+
const body = [...cells.slice(0, kept), this._noticeRow(CONTINUED_NOTICE, head.length, true)];
|
|
321
|
+
this._drawTable(context, this._tableOptions(context, head, body, x, y, w, bottom, columnStyles));
|
|
257
322
|
}
|
|
258
|
-
|
|
259
|
-
|
|
323
|
+
else {
|
|
324
|
+
this._boxNote(context.doc, CONTINUED_NOTICE, x, y, w, h);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Each fetched row as the strings its table cells print.
|
|
328
|
+
_tableCells(component, data, timezone) {
|
|
329
|
+
const columns = listColumns(component, data);
|
|
330
|
+
return data.rows.map((row) => columns.map((column) => exportCell(row[column.column], column.format, timezone)));
|
|
331
|
+
}
|
|
332
|
+
// The autoTable options every list table shares: the dry run, the on-page
|
|
333
|
+
// draw and the continuation pages, so the three lay a table out alike. The
|
|
334
|
+
// font is named rather than inherited, since the doc carries whatever the
|
|
335
|
+
// last text drawn left set. bottom is the margin under the table, points.
|
|
336
|
+
_tableOptions(context, head, body, x, startY, w, bottom, columnStyles) {
|
|
337
|
+
return {
|
|
338
|
+
theme: 'grid',
|
|
339
|
+
head: [head],
|
|
260
340
|
body,
|
|
261
|
-
startY
|
|
262
|
-
margin: { left: x },
|
|
341
|
+
startY,
|
|
342
|
+
margin: { left: x, right: context.pageW - x - w, bottom },
|
|
263
343
|
tableWidth: w,
|
|
264
|
-
|
|
344
|
+
rowPageBreak: 'avoid',
|
|
345
|
+
styles: { font: 'helvetica', fontStyle: 'normal', fontSize: 8, cellPadding: 3, textColor: '#1f2933' },
|
|
265
346
|
headStyles: { fillColor: '#4e79a7', textColor: '#ffffff', fontStyle: 'bold' },
|
|
266
347
|
alternateRowStyles: { fillColor: '#f5f7fa' },
|
|
267
|
-
|
|
348
|
+
...(columnStyles ? { columnStyles } : {}),
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// A notice as a table row: one italic grey cell spanning every column. A
|
|
352
|
+
// single-line notice is ellipsized at the box's width and keeps the data
|
|
353
|
+
// cells' font size and padding, so it is never taller than the data row
|
|
354
|
+
// whose place it takes.
|
|
355
|
+
_noticeRow(text, span, singleLine) {
|
|
356
|
+
return [{
|
|
357
|
+
content: text,
|
|
358
|
+
colSpan: span,
|
|
359
|
+
styles: { fontStyle: 'italic', textColor: '#7b8794', ...(singleLine ? { overflow: 'ellipsize' } : {}) },
|
|
360
|
+
}];
|
|
361
|
+
}
|
|
362
|
+
// Lays every fetched row out once on a scratch document of the same page
|
|
363
|
+
// size, with the options the real draw uses, and reads back how many body
|
|
364
|
+
// rows the box's page holds (fit) and the column widths autoTable chose.
|
|
365
|
+
// fit 0 means even the head did not fit: autoTable moved to a new page
|
|
366
|
+
// before drawing. The real document is untouched.
|
|
367
|
+
_measure(context, head, cells, x, y, w, bottom) {
|
|
368
|
+
const scratch = new context.jsPDF({
|
|
369
|
+
unit: 'pt',
|
|
370
|
+
format: [context.pageW, context.pageH],
|
|
371
|
+
orientation: context.orientation,
|
|
268
372
|
});
|
|
373
|
+
let fit = 0;
|
|
374
|
+
context.autoTable(scratch, {
|
|
375
|
+
...this._tableOptions(context, head, cells, x, y, w, bottom),
|
|
376
|
+
didDrawCell: (hook) => {
|
|
377
|
+
if (hook.section === 'body' && scratch.getCurrentPageInfo().pageNumber === 1) {
|
|
378
|
+
fit = Math.max(fit, hook.row.index + 1);
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
const columns = scratch.lastAutoTable.columns;
|
|
383
|
+
const columnStyles = {};
|
|
384
|
+
columns.forEach((column, index) => {
|
|
385
|
+
columnStyles[index] = { cellWidth: column.width };
|
|
386
|
+
});
|
|
387
|
+
// A row taller than a whole page is split rather than moved, so a last
|
|
388
|
+
// row that started on the first page can still have run past it.
|
|
389
|
+
if (fit === cells.length && scratch.getNumberOfPages() > 1) {
|
|
390
|
+
fit -= 1;
|
|
391
|
+
}
|
|
392
|
+
return { fit, columnStyles };
|
|
393
|
+
}
|
|
394
|
+
// Draws an on-page table, then removes any page the draw added. That should
|
|
395
|
+
// never happen: the measured fit, the identical column widths and a
|
|
396
|
+
// single-line notice keep the table inside its box. The check exists so a
|
|
397
|
+
// stray page can never catch the report page's remaining components.
|
|
398
|
+
_drawTable(context, options) {
|
|
399
|
+
const { doc } = context;
|
|
400
|
+
const page = doc.getCurrentPageInfo().pageNumber;
|
|
401
|
+
const pages = doc.getNumberOfPages();
|
|
402
|
+
context.autoTable(doc, options);
|
|
403
|
+
while (doc.getNumberOfPages() > pages) {
|
|
404
|
+
doc.deletePage(doc.getNumberOfPages());
|
|
405
|
+
}
|
|
406
|
+
doc.setPage(page);
|
|
407
|
+
}
|
|
408
|
+
// The rows of one list that did not fit its box, on pages appended after
|
|
409
|
+
// the report page, each with the page's header and footer, the table's
|
|
410
|
+
// title and its head again. The table sits CONTINUATION_GAP inside the
|
|
411
|
+
// bands. Returns the physical page counter after these pages.
|
|
412
|
+
_renderContinuation(context, page, index, pageNumber, overflow) {
|
|
413
|
+
const { doc, report } = context;
|
|
414
|
+
const bands = page.masterHidden ? NO_BANDS : report.config?.headerFooter ?? NO_BANDS;
|
|
415
|
+
const top = this._continuationMargin(bands.headerHeight);
|
|
416
|
+
const bottom = this._continuationMargin(bands.footerHeight);
|
|
417
|
+
const { x, w } = overflow;
|
|
418
|
+
const body = overflow.omitted > 0
|
|
419
|
+
? [...overflow.rows, this._noticeRow(moreRowsNotice(overflow.omitted), overflow.head.length, false)]
|
|
420
|
+
: overflow.rows;
|
|
421
|
+
let counter = pageNumber;
|
|
422
|
+
doc.addPage([context.pageW, context.pageH], context.orientation);
|
|
423
|
+
context.autoTable(doc, {
|
|
424
|
+
...this._tableOptions(context, overflow.head, body, x, top + TITLE_H, w, bottom, overflow.columnStyles),
|
|
425
|
+
margin: { top: top + TITLE_H, bottom, left: x, right: context.pageW - x - w },
|
|
426
|
+
showHead: 'everyPage',
|
|
427
|
+
// Fires on every page the table draws on, the first included.
|
|
428
|
+
willDrawPage: () => {
|
|
429
|
+
counter += 1;
|
|
430
|
+
this._renderMaster(context, page, this._tokens(report, page, index, counter));
|
|
431
|
+
this._componentTitle(doc, this._continuedTitle(overflow.component), x, top, w);
|
|
432
|
+
},
|
|
433
|
+
});
|
|
434
|
+
return counter;
|
|
435
|
+
}
|
|
436
|
+
// The margin a continuation table keeps from one edge: inside the band when
|
|
437
|
+
// the page has one.
|
|
438
|
+
_continuationMargin(band) {
|
|
439
|
+
return band ? band * PT + CONTINUATION_GAP : NO_BAND_MARGIN;
|
|
440
|
+
}
|
|
441
|
+
_continuedTitle(component) {
|
|
442
|
+
return component.title ? `${component.title} (continued)` : 'Continued';
|
|
269
443
|
}
|
|
270
444
|
_renderKpi(doc, component, data, x, y, w, h) {
|
|
271
445
|
const config = component.config;
|
|
@@ -283,20 +457,6 @@ export class ReportPdfService {
|
|
|
283
457
|
doc.text(config.measure.label, x + w / 2, y + h / 2 + 16, { align: 'center' });
|
|
284
458
|
}
|
|
285
459
|
}
|
|
286
|
-
// The exported cell must read like the on-screen cell: the SQL already
|
|
287
|
-
// carries the formatting, so the value goes out verbatim. A raw date is the
|
|
288
|
-
// one value the client renders (the column stays a RAW timestamp for the
|
|
289
|
-
// report timezone), and it is rendered here too.
|
|
290
|
-
_cell(value, columnFormat) {
|
|
291
|
-
if (value === null || value === undefined) {
|
|
292
|
-
return '';
|
|
293
|
-
}
|
|
294
|
-
if (columnFormat === 'date') {
|
|
295
|
-
const date = new Date(String(value));
|
|
296
|
-
return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');
|
|
297
|
-
}
|
|
298
|
-
return String(value);
|
|
299
|
-
}
|
|
300
460
|
_slug(name) {
|
|
301
461
|
return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') || 'report';
|
|
302
462
|
}
|
|
@@ -306,4 +466,4 @@ export class ReportPdfService {
|
|
|
306
466
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
|
|
307
467
|
type: Injectable
|
|
308
468
|
}] });
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVMvQyxPQUFPLEVBQXFCLHlCQUF5QixFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RixPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQTRDLGNBQWMsR0FDaEcsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUF1QyxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFHcEcsa0NBQWtDO0FBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVkLHdDQUF3QztBQUN4QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDbkIsdUVBQXVFO0FBQ3ZFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUV2QiwyRUFBMkU7QUFDM0Usc0VBQXNFO0FBQ3RFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBRTlCLDRFQUE0RTtBQUM1RSx1QkFBdUI7QUFDdkIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLHdFQUF3RTtBQUN4RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBRWhGLE1BQU0sT0FBTyxnQkFBZ0I7SUFFcEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUEwQjtRQUM1QyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdB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QUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLHlFQUF5RTtJQUN6RSxpREFBaUQ7SUFDekMsS0FBSyxDQUFDLEtBQWMsRUFBRSxZQUFxQjtRQUNqRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUksWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBRXJDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQTFWVSxnQkFBZ0I7NEdBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBmb3JtYXRNZWFzdXJlVmFsdWUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgS3BpQ29uZmlnLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJzsgLy8gQ29tcG9uZW50RGF0YSB1c2VkIGluIG1ldGhvZCBzaWduYXR1cmVzIGJlbG93XG5pbXBvcnQgeyBDb21wb25lbnRHZW9tZXRyeSwgREVGQVVMVF9DT01QT05FTlRfUEFERElORywgcGFnZUdlb21ldHJ5IH0gZnJvbSAnLi4vbGF5b3V0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfVEVYVF9DT0xPUiwgREVGQVVMVF9URVhUX1NJWkUsIFRleHRQYXJhZ3JhcGgsIFRleHRSdW4sIFRleHRUb2tlbkNvbnRleHQsIHRleHRQYXJhZ3JhcGhzLFxufSBmcm9tICcuLi90ZXh0JztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQgeyBDb2xsZWN0ZWRDb21wb25lbnQsIENvbGxlY3RlZFJlcG9ydCwgZW1wdHlMYWJlbCB9IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5cblxuLy8gSW5jaGVzIOKGkiBwb2ludHMgKHRoZSBQREYgdW5pdCkuXG5jb25zdCBQVCA9IDcyO1xuXG4vLyBDb21wb25lbnQgdGl0bGUgc3RyaXAgaGVpZ2h0LCBwb2ludHMuXG5jb25zdCBUSVRMRV9IID0gMTg7XG4vLyBBcHByb3hpbWF0ZSB0YWJsZSByb3cgaGVpZ2h0LCBwb2ludHMg4oCUIGRyaXZlcyB0aGUgcm93cy10aGF0LWZpdCBjYXAuXG5jb25zdCBUQUJMRV9ST1dfSCA9IDE2O1xuXG4vLyBBIHRleHQgbGluZSdzIGhlaWdodCBhcyBhIG11bHRpcGxlIG9mIGl0cyBsYXJnZXN0IGZvbnQgc2l6ZSDigJQgdGhlIGNhbnZhc1xuLy8gc3R5bGVzaGVldCdzIGxpbmUtaGVpZ2h0LCBzbyBhIGJsb2NrIHdyYXBzIGFuZCBzdGFja3MgdGhlIHNhbWUgd2F5LlxuY29uc3QgVEVYVF9MSU5FX0hFSUdIVCA9IDEuMjU7XG5cbi8vIEhvdyBmYXIgYSBsaXN0IGl0ZW0ncyB0ZXh0IHNpdHMgZnJvbSB0aGUgYmxvY2sncyBlZGdlLCBwb2ludHM7IHRoZSBtYXJrZXJcbi8vIGhhbmdzIGluIHRoYXQgc3BhY2UuXG5jb25zdCBMSVNUX0lOREVOVCA9IDE2O1xuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwdWJsaWMgYXN5bmMgZXhwb3J0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBqc1BERiB9ID0gYXdhaXQgaW1wb3J0KCdqc3BkZicpO1xuICAgIGNvbnN0IGF1dG9UYWJsZSA9IChhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpKS5kZWZhdWx0O1xuXG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG5cbiAgICBjb25zdCBkb2MgPSBuZXcganNQREYoe1xuICAgICAgb3JpZW50YXRpb246IHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnLFxuICAgICAgdW5pdDogJ3B0JyxcbiAgICAgIGZvcm1hdDogW3BhZ2VXLCBwYWdlSF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLl90aXRsZVBhZ2UoZG9jLCBjb2xsZWN0ZWQsIHBhZ2VXLCBwYWdlSCk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgZG9jLmFkZFBhZ2UoW3BhZ2VXLCBwYWdlSF0sIHBhZ2VXID49IHBhZ2VIID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnKTtcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gcGFnZUdlb21ldHJ5KHJlcG9ydCwgY29sbGVjdGVkUGFnZS5wYWdlKTtcbiAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX3Rva2VucyhyZXBvcnQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgpO1xuXG4gICAgICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgZmlyc3QsIHVuZGVyIHRoZSBwYWdlJ3Mgb3duIGNvbXBvbmVudHMuXG4gICAgICBpZiAoIWNvbGxlY3RlZFBhZ2UucGFnZS5tYXN0ZXJIaWRkZW4pIHtcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgcmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkge1xuICAgICAgICAgIHRoaXMuX3JlbmRlclRleHQoZG9jLCBjb21wb25lbnQsIGNvbXBvbmVudCwgdG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGVkUGFnZS5jb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnN0IGJveCA9IGdlb21ldHJ5LmdldChpdGVtLmNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIHRoaXMuX3JlbmRlclRleHQoZG9jLCBpdGVtLmNvbXBvbmVudCwgYm94ID8/IGl0ZW0uY29tcG9uZW50LCB0b2tlbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbmRlckNvbXBvbmVudChkb2MsIGF1dG9UYWJsZSwgaXRlbSwgYm94KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGRvYy5zYXZlKGAke3RoaXMuX3NsdWcocmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RpdGxlUGFnZShkb2M6IGFueSwgY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQsIHBhZ2VXOiBudW1iZXIsIHBhZ2VIOiBudW1iZXIpOiB2b2lkIHtcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMjgpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dChjb2xsZWN0ZWQucmVwb3J0Lm5hbWUsIDQwLCBwYWdlSCAqIDAuMzUpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM1MjYwNmQnKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgZm9ybWF0KG5ldyBEYXRlKCksICdNTU1NIGQsIHl5eXknKSxcbiAgICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIF07XG4gICAgZG9jLnRleHQobGluZXMsIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIGVhY2hcbiAgLy8gcGFyYWdyYXBoJ3MgcnVucyBhcmUgYnJva2VuIGludG8gd29yZHMsIHdyYXBwZWQgdG8gdGhlIGJsb2NrJ3Mgd2lkdGggYW5kXG4gIC8vIGRyYXduIHdvcmQgYnkgd29yZCBpbiB0aGVpciBvd24gZm9udCwgc2l6ZSBhbmQgY29sb3IuIExpbmVzIHBhc3QgdGhlXG4gIC8vIGJsb2NrJ3MgaGVpZ2h0IGFyZSBkcm9wcGVkIOKAlCB0aGUgY2FudmFzIGNsaXBzIHRoZSBibG9jayB0aGVyZSB0b28uXG4gIHByaXZhdGUgX3JlbmRlclRleHQoZG9jOiBhbnksIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBib3g6IENvbXBvbmVudEdlb21ldHJ5LCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIGNvbnN0IGxlZnQgPSBib3gueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCk7XG4gICAgY29uc3QgdG9wID0gYm94LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCk7XG4gICAgY29uc3Qgd2lkdGggPSBib3gudyAqIFBUIC0gaW5zZXQocGFkZGluZz8ubGVmdCkgLSBpbnNldChwYWRkaW5nPy5yaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gKGJveC55ICsgYm94LmgpICogUFQgLSBpbnNldChwYWRkaW5nPy5ib3R0b20pO1xuXG4gICAgbGV0IGN1cnNvclkgPSB0b3A7XG4gICAgbGV0IGxpc3ROdW1iZXIgPSAwO1xuXG4gICAgZm9yIChjb25zdCBwYXJhZ3JhcGggb2YgdGV4dFBhcmFncmFwaHMoY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJywgdG9rZW5zKSkge1xuICAgICAgbGlzdE51bWJlciA9IHBhcmFncmFwaC5idWxsZXQgPT09ICdudW1iZXInID8gbGlzdE51bWJlciArIDEgOiAwO1xuICAgICAgY29uc3QgaW5kZW50ID0gcGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMDtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBsaW5lSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgubWF4KC4uLmxpbmUubWFwKCh3b3JkKSA9PiB3b3JkLnNpemUpLCBwYXJhZ3JhcGgucnVuc1swXT8uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkUpO1xuICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICAgIGlmIChjdXJzb3JZICsgbGluZUhlaWdodCA+IGJvdHRvbSArIDAuNSkge1xuICAgICAgICAgIGN1cnNvclkgPSBJbmZpbml0eTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lID0gY3Vyc29yWSArIHNpemU7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGxpbmUucmVkdWNlKChzdW0sIHdvcmQpID0+IHN1bSArIHdvcmQud2lkdGgsIDApO1xuICAgICAgICBsZXQgeCA9IGxlZnQgKyBpbmRlbnQgKyB0aGlzLl9hbGlnbk9mZnNldChwYXJhZ3JhcGguYWxpZ24sIHdpZHRoIC0gaW5kZW50LCBsaW5lV2lkdGgpO1xuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgbGVmdCwgYmFzZWxpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgICAgICB0aGlzLl9kcmF3V29yZChkb2MsIHdvcmQsIHgsIGJhc2VsaW5lKTtcbiAgICAgICAgICB4ICs9IHdvcmQud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJzb3JZICs9IGxpbmVIZWlnaHQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnNvclkgPT09IEluZmluaXR5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBBbiBlbXB0eSBwYXJhZ3JhcGggaXMgc3RpbGwgYSBsaW5lLlxuICAgICAgaWYgKCFsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgY3Vyc29yWSArPSBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQnJlYWsgYSBwYXJhZ3JhcGgncyBydW5zIGludG8gbGluZXMgb2YgbWVhc3VyZWQgd29yZHMgdGhhdCBmaXQgdGhlIHdpZHRoLlxuICAvLyBBIHdvcmQga2VlcHMgaXRzIHRyYWlsaW5nIHNwYWNlIHNvIHNwYWNpbmcgc3Vydml2ZXMgcnVuIGJvdW5kYXJpZXMuXG4gIHByaXZhdGUgX3dyYXAoZG9jOiBhbnksIHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgd2lkdGg6IG51bWJlcik6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSB7XG4gICAgY29uc3QgbGluZXM6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IGxpbmVXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHJ1biBvZiBwYXJhZ3JhcGgucnVucykge1xuICAgICAgY29uc3Qgc2l6ZSA9IHJ1bi5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRTtcbiAgICAgIHRoaXMuX2ZvbnQoZG9jLCBydW4sIHNpemUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHRleHQgb2YgcnVuLnRleHQubWF0Y2goL1xcUytcXHMqfFxccysvZykgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgd29yZFdpZHRoID0gZG9jLmdldFRleHRXaWR0aCh0ZXh0KTtcblxuICAgICAgICBpZiAobGluZS5sZW5ndGggJiYgbGluZVdpZHRoICsgd29yZFdpZHRoIC0gdGhpcy5fdHJhaWxpbmdTcGFjZShkb2MsIHRleHQpID4gd2lkdGgpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICBsaW5lV2lkdGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZS5wdXNoKHsgcnVuLCB0ZXh0LCBzaXplLCB3aWR0aDogd29yZFdpZHRoIH0pO1xuICAgICAgICBsaW5lV2lkdGggKz0gd29yZFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCkge1xuICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3V29yZChkb2M6IGFueSwgd29yZDogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0sIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCBhIHRleHQgYmxvY2sncyB0b2tlbnMgZmlsbCB3aXRoIG9uIHRoaXMgcGFnZTogdGhlIHBhZ2UncyBwb3NpdGlvblxuICAvLyBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMg4oCUIHRoZSB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLlxuICBwcml2YXRlIF90b2tlbnMocmVwb3J0OiBSZXBvcnQsIHBhZ2U6IFJlcG9ydFBhZ2UsIGluZGV4OiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcjogaW5kZXggKyAxLFxuICAgICAgcGFnZU5hbWU6IHBhZ2UubmFtZSB8fCBgUGFnZSAke2luZGV4ICsgMX1gLFxuICAgICAgcmVwb3J0TmFtZTogcmVwb3J0Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbXBvbmVudChkb2M6IGFueSwgYXV0b1RhYmxlOiBhbnksIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCwgZ2VvbWV0cnk/OiBDb21wb25lbnRHZW9tZXRyeSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGFycml2ZXMgaW4gaW5jaGVzIChmbG93IGxheW91dCBwcmUtcmVzb2x2ZWQpOyB0aGUgUERGIGRyYXdzIGluXG4gICAgLy8gcG9pbnRzLlxuICAgIGNvbnN0IGluY2hlcyA9IGdlb21ldHJ5ID8/IGNvbXBvbmVudDtcbiAgICBjb25zdCB4ID0gaW5jaGVzLnggKiBQVDtcbiAgICBjb25zdCB5ID0gaW5jaGVzLnkgKiBQVDtcbiAgICBjb25zdCB3ID0gaW5jaGVzLncgKiBQVDtcbiAgICBjb25zdCBoID0gaW5jaGVzLmggKiBQVDtcblxuICAgIGlmIChjb21wb25lbnQudGl0bGUpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgICAgZG9jLnRleHQoY29tcG9uZW50LnRpdGxlLCB4LCB5ICsgMTAsIHsgbWF4V2lkdGg6IHcgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keVkgPSB5ICsgVElUTEVfSDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCBoIC0gVElUTEVfSCk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCAhaXRlbS5kYXRhLnJvd3M/Lmxlbmd0aCkge1xuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoJyM3Yjg3OTQnKTtcbiAgICAgIGRvYy50ZXh0KGVtcHR5TGFiZWwoaXRlbSksIHggKyB3IC8gMiwgYm9keVkgKyBib2R5SCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xuICAgICAgY2FzZSAnY2hhcnQnOiB7XG4gICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgcmVuZGVyQ2hhcnRJbWFnZShjb21wb25lbnQsIGl0ZW0uZGF0YSwgdywgYm9keUgpO1xuICAgICAgICBkb2MuYWRkSW1hZ2UoaW1hZ2UsICdQTkcnLCB4LCBib2R5WSwgdywgYm9keUgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShkb2MsIGF1dG9UYWJsZSwgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGRvYywgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGRvYzogYW55LFxuICAgIGF1dG9UYWJsZTogYW55LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIExpc3RDb25maWc7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbmZpZy5jb2x1bW5zPy5sZW5ndGhcbiAgICAgID8gY29uZmlnLmNvbHVtbnNcbiAgICAgIDogZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIGxhYmVsOiBjb2x1bW4gfSkpO1xuXG4gICAgY29uc3QgY2FwID0gTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihoIC8gVEFCTEVfUk9XX0gpIC0gMSk7XG4gICAgY29uc3Qgcm93cyA9IGRhdGEucm93cy5zbGljZSgwLCBjYXApO1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IChkYXRhLnBhZ2luZz8udG90YWwgPz8gZGF0YS5yb3dzLmxlbmd0aCkgLSByb3dzLmxlbmd0aDtcblxuICAgIGNvbnN0IGJvZHkgPSByb3dzLm1hcCgocm93KSA9PiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB0aGlzLl9jZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLmZvcm1hdCkpKTtcblxuICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICBib2R5LnB1c2goW2DigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgXSk7XG4gICAgfVxuXG4gICAgYXV0b1RhYmxlKGRvYywge1xuICAgICAgaGVhZDogW2NvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uKV0sXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZOiB5LFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHggfSxcbiAgICAgIHRhYmxlV2lkdGg6IHcsXG4gICAgICBzdHlsZXM6IHsgZm9udFNpemU6IDgsIGNlbGxQYWRkaW5nOiAzLCB0ZXh0Q29sb3I6ICcjMWYyOTMzJyB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIHRoZW1lOiAnZ3JpZCcsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJLcGkoXG4gICAgZG9jOiBhbnksXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNvbXBvbmVudC5jb25maWcgYXMgS3BpQ29uZmlnO1xuICAgIGNvbnN0IHJvdyA9IGRhdGEucm93c1swXSA/PyB7fTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb25maWcubWVhc3VyZT8uY29sdW1uID8/IE9iamVjdC5rZXlzKHJvdylbMF07XG4gICAgY29uc3QgdmFsdWUgPSBmb3JtYXRNZWFzdXJlVmFsdWUocm93W2NvbHVtbl0sIGNvbmZpZy5tZWFzdXJlPy5mb3JtYXQsIGNvbmZpZy5tZWFzdXJlPy5wcmVjaXNpb24pO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI2KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcblxuICAgIGlmIChjb25maWcubWVhc3VyZT8ubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjN2I4Nzk0Jyk7XG4gICAgICBkb2MudGV4dChjb25maWcubWVhc3VyZS5sYWJlbCwgeCArIHcgLyAyLCB5ICsgaCAvIDIgKyAxNiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGV4cG9ydGVkIGNlbGwgbXVzdCByZWFkIGxpa2UgdGhlIG9uLXNjcmVlbiBjZWxsOiB0aGUgU1FMIGFscmVhZHlcbiAgLy8gY2FycmllcyB0aGUgZm9ybWF0dGluZywgc28gdGhlIHZhbHVlIGdvZXMgb3V0IHZlcmJhdGltLiBBIHJhdyBkYXRlIGlzIHRoZVxuICAvLyBvbmUgdmFsdWUgdGhlIGNsaWVudCByZW5kZXJzICh0aGUgY29sdW1uIHN0YXlzIGEgUkFXIHRpbWVzdGFtcCBmb3IgdGhlXG4gIC8vIHJlcG9ydCB0aW1lem9uZSksIGFuZCBpdCBpcyByZW5kZXJlZCBoZXJlIHRvby5cbiAgcHJpdmF0ZSBfY2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IFN0cmluZyh2YWx1ZSkgOiBmb3JtYXQoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9zbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJykucmVwbGFjZSgvXi0rfC0rJC9nLCAnJykgfHwgJ3JlcG9ydCc7XG4gIH1cbn1cbiJdfQ==
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFTdEUsT0FBTyxFQUFxQix5QkFBeUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkYsT0FBTyxFQUNMLGtCQUFrQixFQUFFLGlCQUFpQixFQUE0QyxjQUFjLEdBQ2hHLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFDK0MsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDakgsY0FBYyxHQUNmLE1BQU0sbUNBQW1DLENBQUM7O0FBRzNDLGtDQUFrQztBQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFZCx3Q0FBd0M7QUFDeEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBRW5CLHFFQUFxRTtBQUNyRSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRWpDLHdFQUF3RTtBQUN4RSxnRUFBZ0U7QUFDaEUseUNBQXlDO0FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sUUFBUSxHQUF1QixFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBRTFFLDBEQUEw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LEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFM0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQztJQUM1RixDQUFDO3dHQTVoQlUsZ0JBQWdCOzRHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcm1hdE1lYXN1cmVWYWx1ZSwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIEtwaUNvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEhlYWRlckZvb3RlcixcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbXBvbmVudEdlb21ldHJ5LCBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HLCBwYWdlR2VvbWV0cnkgfSBmcm9tICcuLi9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9URVhUX0NPTE9SLCBERUZBVUxUX1RFWFRfU0laRSwgVGV4dFBhcmFncmFwaCwgVGV4dFJ1biwgVGV4dFRva2VuQ29udGV4dCwgdGV4dFBhcmFncmFwaHMsXG59IGZyb20gJy4uL3RleHQnO1xuaW1wb3J0IHsgcmVuZGVyQ2hhcnRJbWFnZSB9IGZyb20gJy4vb2Zmc2NyZWVuLWNoYXJ0JztcbmltcG9ydCB7XG4gIENvbGxlY3RlZENvbXBvbmVudCwgQ29sbGVjdGVkUGFnZSwgQ29sbGVjdGVkUmVwb3J0LCBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLCBsaXN0Q29sdW1ucywgbGlzdEhlYWRpbmdzLFxuICBtb3JlUm93c05vdGljZSxcbn0gZnJvbSAnLi9yZXBvcnQtZXhwb3J0LWNvbGxlY3Rvci5zZXJ2aWNlJztcblxuXG4vLyBJbmNoZXMg4oaSIHBvaW50cyAodGhlIFBERiB1bml0KS5cbmNvbnN0IFBUID0gNzI7XG5cbi8vIENvbXBvbmVudCB0aXRsZSBzdHJpcCBoZWlnaHQsIHBvaW50cy5cbmNvbnN0IFRJVExFX0ggPSAxODtcblxuLy8gUm93cyBmZXRjaGVkIGZvciBhIGxpc3QncyBQREYgdGFibGUuIEEgdGFibGUgdGhhdCBvdXRncm93cyBpdHMgYm94XG4vLyBjb250aW51ZXMgb250byBwYWdlcyBvZiBpdHMgb3duLCBzbyB0aGlzIGlzIGhvdyBmYXIgaXQgbWF5IHJ1bjogYWJvdXQgMTItMTVcbi8vIGNvbnRpbnVhdGlvbiBwYWdlcyBvbiBhIGxldHRlciBwYWdlLCBhbmQgYSB0ZW50aCBvZiB0aGUgc2VydmVyJ3MgNTAwMC1yb3dcbi8vIGNlaWxpbmcuIEEgbG9uZ2VyIHJlc3VsdCBlbmRzIGluIGEgbW9yZVJvd3NOb3RpY2UoKSByb3cuXG5leHBvcnQgY29uc3QgUERGX0xJU1RfUk9XUyA9IDUwMDtcblxuLy8gSG93IGZhciBhIGNvbnRpbnVhdGlvbiB0YWJsZSBzaXRzIGluc2lkZSB0aGUgaGVhZGVyIGFuZCBmb290ZXIgYmFuZHMsXG4vLyBwb2ludHMuIEEgcGFnZSB3aXRoIG5vIGJhbmQgKG9yIHdpdGggdGhlIG1hc3RlciBoaWRkZW4pIGtlZXBzXG4vLyBOT19CQU5EX01BUkdJTiBmcm9tIHRoYXQgZWRnZSBpbnN0ZWFkLlxuY29uc3QgQ09OVElOVUFUSU9OX0dBUCA9IDAuMjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRfTUFSR0lOID0gMC41ICogUFQ7XG5jb25zdCBOT19CQU5EUzogUmVwb3J0SGVhZGVyRm9vdGVyID0geyBoZWFkZXJIZWlnaHQ6IDAsIGZvb3RlckhlaWdodDogMCB9O1xuXG4vLyBUaGUgbGFzdCByb3cgb2YgYSBsaXN0IGJveCB3aG9zZSByb3dzIGNhcnJ5IG9uIHBhc3QgaXQuXG5jb25zdCBDT05USU5VRURfTk9USUNFID0gJ0NvbnRpbnVlZCBvbiB0aGUgZm9sbG93aW5nIHBhZ2VzJztcblxuLy8gQSB0ZXh0IGxpbmUncyBoZWlnaHQgYXMgYSBtdWx0aXBsZSBvZiBpdHMgbGFyZ2VzdCBmb250IHNpemUg4oCUIHRoZSBjYW52YXNcbi8vIHN0eWxlc2hlZXQncyBsaW5lLWhlaWdodCwgc28gYSBibG9jayB3cmFwcyBhbmQgc3RhY2tzIHRoZSBzYW1lIHdheS5cbmNvbnN0IFRFWFRfTElORV9IRUlHSFQgPSAxLjI1O1xuXG4vLyBIb3cgZmFyIGEgbGlzdCBpdGVtJ3MgdGV4dCBzaXRzIGZyb20gdGhlIGJsb2NrJ3MgZWRnZSwgcG9pbnRzOyB0aGUgbWFya2VyXG4vLyBoYW5ncyBpbiB0aGF0IHNwYWNlLlxuY29uc3QgTElTVF9JTkRFTlQgPSAxNjtcblxuLy8gV2hhdCBldmVyeSBkcmF3aW5nIHN0ZXAgb2Ygb25lIGV4cG9ydCBzaGFyZXMsIGJ1aWx0IG9uY2UgaW4gZXhwb3J0KCkuXG4vLyBTaXplcyBhcmUgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZkV4cG9ydENvbnRleHQge1xuICBkb2M6IGFueTtcbiAgYXV0b1RhYmxlOiBhbnk7XG4gIGpzUERGOiBhbnk7XG4gIHJlcG9ydDogUmVwb3J0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICBwYWdlVzogbnVtYmVyO1xuICBwYWdlSDogbnVtYmVyO1xuICBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScgfCAncG9ydHJhaXQnO1xufVxuXG4vLyBGaXhlZCBjb2x1bW4gd2lkdGhzLCBieSBjb2x1bW4gaW5kZXgsIGluIHBvaW50cy5cbnR5cGUgUGRmQ29sdW1uU3R5bGVzID0gUmVjb3JkPG51bWJlciwgeyBjZWxsV2lkdGg6IG51bWJlciB9PjtcblxuLy8gQSB0YWJsZSBib2R5IGNlbGw6IHBsYWluIHRleHQsIG9yIGEgbm90aWNlIHJvdydzIG9uZSBjZWxsIHNwYW5uaW5nIGV2ZXJ5XG4vLyBjb2x1bW4uXG50eXBlIFBkZlRhYmxlQ2VsbCA9IHN0cmluZyB8IHsgY29udGVudDogc3RyaW5nOyBjb2xTcGFuOiBudW1iZXI7IHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuLy8gVGhlIHJvd3Mgb2YgYSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgY2FycmllZCBvbnRvIGNvbnRpbnVhdGlvblxuLy8gcGFnZXMgYWZ0ZXIgaXRzIHJlcG9ydCBwYWdlLiB4IGFuZCB3IGFyZSB0aGUgYm94J3MsIGluIHBvaW50cywgYW5kIHRoZVxuLy8gY29sdW1uIHdpZHRocyBhcmUgdGhlIG9uZXMgdGhlIG9uLXBhZ2UgdGFibGUgd2FzIGRyYXduIHdpdGgsIHNvIHRoZSB0YWJsZVxuLy8gcmVhZHMgYXMgb25lIGFjcm9zcyBwYWdlcy5cbmludGVyZmFjZSBQZGZUYWJsZU92ZXJmbG93IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIGhlYWQ6IHN0cmluZ1tdO1xuICByb3dzOiBzdHJpbmdbXVtdO1xuICBvbWl0dGVkOiBudW1iZXI7XG4gIHg6IG51bWJlcjtcbiAgdzogbnVtYmVyO1xuICBjb2x1bW5TdHlsZXM6IFBkZkNvbHVtblN0eWxlcztcbn1cblxuLy8gQnVpbGRzIHRoZSBQREYgY2xpZW50LXNpZGUgd2l0aCBqc3BkZi4gVGhlIHJlcG9ydCdzIHVuaXQgaXMgaW5jaGVzIGFuZCBQREZzXG4vLyBhcmUgcG9pbnRzIGF0IGV4YWN0bHkgNzIvaW5jaCwgc28gZWFjaCByZXBvcnQgcGFnZSBiZWNvbWVzIG9uZSBQREYgcGFnZSBvZlxuLy8gdGhlIGV4YWN0IHBoeXNpY2FsIHNpemUgYW5kIGNvbXBvbmVudHMgbGFuZCBhdCB0aGVpciBwcmVjaXNlIHBvc2l0aW9ucy5cbi8vIENoYXJ0cyBhcmUgcmVuZGVyZWQgdGhyb3VnaCBhbiBvZmZzY3JlZW4gRUNoYXJ0cyBpbnN0YW5jZSBhdCAzw5cgcGl4ZWxcbi8vIHJhdGlvIOKAlCBwaXhlbC1pZGVudGljYWwgdG8gdGhlIHNjcmVlbiwgY3Jpc3AgYXQgcHJpbnQgc2l6ZSDigJQgYW5kIHRhYmxlcyBhcmVcbi8vIGRyYXduIHdpdGgganNwZGYtYXV0b3RhYmxlLiBCb3RoIGxpYnJhcmllcyBsb2FkIGxhemlseSBpbnRvIHRoZWlyIG93biBjaHVua3MuXG4vL1xuLy8gQSBsaXN0IHRhYmxlIGlzIGZpdHRlZCB0byBpdHMgYm94IGJ5IGxheWluZyBpdCBvdXQgZmlyc3QsIG5ldmVyIGJ5IGFcbi8vIHJvdy1oZWlnaHQgZXN0aW1hdGUsIHNvIGl0IGNhbm5vdCBzcGlsbCBwYXN0IHRoZSBib3guIFRoZSByb3dzIHRoYXQgZG8gbm90XG4vLyBmaXQgY29udGludWUgb24gcGFnZXMgb2YgdGhlaXIgb3duIGFmdGVyIHRoZSByZXBvcnQgcGFnZSwgdW5kZXIgdGhlIHNhbWVcbi8vIGhlYWRlci9mb290ZXIgYW5kIHdpdGggdGhlIHNhbWUgY29sdW1uIHdpZHRocywgdXAgdG8gUERGX0xJU1RfUk9XUzsgYVxuLy8gbG9uZ2VyIHJlc3VsdCBlbmRzIGluIGEgcm93IHBvaW50aW5nIHRvIHRoZSBjb21wb25lbnQncyBDU1YgZXhwb3J0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydFBkZlNlcnZpY2Uge1xuXG4gIHB1YmxpYyBhc3luYyBleHBvcnQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5fY29udGV4dChjb2xsZWN0ZWQucmVwb3J0KTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBwYWdlTnVtYmVyID0gdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KHJlcG9ydDogUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgeyBqc1BERiB9ID0gYXdhaXQgaW1wb3J0KCdqc3BkZicpO1xuICAgIGNvbnN0IGF1dG9UYWJsZSA9IChhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpKS5kZWZhdWx0O1xuXG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcGFnZVcgPj0gcGFnZUggPyAnbGFuZHNjYXBlJyA6ICdwb3J0cmFpdCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jOiBuZXcganNQREYoeyBvcmllbnRhdGlvbiwgdW5pdDogJ3B0JywgZm9ybWF0OiBbcGFnZVcsIHBhZ2VIXSB9KSxcbiAgICAgIGF1dG9UYWJsZSxcbiAgICAgIGpzUERGLFxuICAgICAgcmVwb3J0LFxuICAgICAgdGltZXpvbmU6IHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQpLFxuICAgICAgcGFnZVcsXG4gICAgICBwYWdlSCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgIH07XG4gIH1cblxuICAvLyBPbmUgcmVwb3J0IHBhZ2U6IHRoZSBoZWFkZXIgYW5kIGZvb3RlciBmaXJzdCwgdW5kZXIgdGhlIHBhZ2UncyBvd25cbiAgLy8gY29tcG9uZW50cy4gQSBsaXN0IHRoYXQgb3V0Z3Jvd3MgaXRzIGJveCBsZWF2ZXMgaXRzIHJlbWFpbmluZyByb3dzIGluXG4gIC8vIG92ZXJmbG93cy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyUGFnZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbGxlY3RlZFBhZ2U6IENvbGxlY3RlZFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jLCByZXBvcnQgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBwYWdlR2VvbWV0cnkocmVwb3J0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UpO1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMuX3Rva2VucyhyZXBvcnQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIpO1xuXG4gICAgZG9jLmFkZFBhZ2UoW2NvbnRleHQucGFnZVcsIGNvbnRleHQucGFnZUhdLCBjb250ZXh0Lm9yaWVudGF0aW9uKTtcbiAgICB0aGlzLl9yZW5kZXJNYXN0ZXIoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCB0b2tlbnMpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGNvbGxlY3RlZFBhZ2UuY29tcG9uZW50cykge1xuICAgICAgY29uc3QgYm94ID0gZ2VvbWV0cnkuZ2V0KGl0ZW0uY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICB0aGlzLl9yZW5kZXJUZXh0KGRvYywgaXRlbS5jb21wb25lbnQsIGJveCA/PyBpdGVtLmNvbXBvbmVudCwgdG9rZW5zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlbmRlckNvbXBvbmVudChjb250ZXh0LCBpdGVtLCBvdmVyZmxvd3MsIGJveCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyTWFzdGVyKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIHRva2VuczogVGV4dFRva2VuQ29udGV4dCk6IHZvaWQge1xuICAgIGlmIChwYWdlLm1hc3RlckhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbnRleHQucmVwb3J0Lm1hc3Rlcj8uY29tcG9uZW50cyA/PyBbXSkge1xuICAgICAgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LmRvYywgY29tcG9uZW50LCBjb21wb25lbnQsIHRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLCA0MCwgcGFnZUggKiAwLjM1ICsgMjYpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IGJsb2NrLCBsYWlkIG91dCBieSBoYW5kOiBqc1BERiBkcmF3cyBzdHJpbmdzLCBub3QgcmljaCB0ZXh0LCBzbyBlYWNoXG4gIC8vIHBhcmFncmFwaCdzIHJ1bnMgYXJlIGJyb2tlbiBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBibG9jaydzIHdpZHRoIGFuZFxuICAvLyBkcmF3biB3b3JkIGJ5IHdvcmQgaW4gdGhlaXIgb3duIGZvbnQsIHNpemUgYW5kIGNvbG9yLiBMaW5lcyBwYXN0IHRoZVxuICAvLyBibG9jaydzIGhlaWdodCBhcmUgZHJvcHBlZCDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICBwcml2YXRlIF9yZW5kZXJUZXh0KGRvYzogYW55LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgYm94OiBDb21wb25lbnRHZW9tZXRyeSwgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0KTogdm9pZCB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbXBvbmVudC5jb25maWc/LnBhZGRpbmc7XG4gICAgY29uc3QgaW5zZXQgPSAodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4gKHZhbHVlID8/IERFRkFVTFRfQ09NUE9ORU5UX1BBRERJTkcpICogUFQ7XG5cbiAgICBjb25zdCBsZWZ0ID0gYm94LnggKiBQVCArIGluc2V0KHBhZGRpbmc/LmxlZnQpO1xuICAgIGNvbnN0IHRvcCA9IGJveC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApO1xuICAgIGNvbnN0IHdpZHRoID0gYm94LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbSA9IChib3gueSArIGJveC5oKSAqIFBUIC0gaW5zZXQocGFkZGluZz8uYm90dG9tKTtcblxuICAgIGxldCBjdXJzb3JZID0gdG9wO1xuICAgIGxldCBsaXN0TnVtYmVyID0gMDtcblxuICAgIGZvciAoY29uc3QgcGFyYWdyYXBoIG9mIHRleHRQYXJhZ3JhcGhzKGNvbXBvbmVudC5jb25maWc/Lmh0bWwgPz8gJycsIHRva2VucykpIHtcbiAgICAgIGxpc3ROdW1iZXIgPSBwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGxpc3ROdW1iZXIgKyAxIDogMDtcbiAgICAgIGNvbnN0IGluZGVudCA9IHBhcmFncmFwaC5idWxsZXQgPyBMSVNUX0lOREVOVCA6IDA7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuX3dyYXAoZG9jLCBwYXJhZ3JhcGgsIHdpZHRoIC0gaW5kZW50KTtcblxuICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgbGluZUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBNYXRoLm1heCguLi5saW5lLm1hcCgod29yZCkgPT4gd29yZC5zaXplKSwgcGFyYWdyYXBoLnJ1bnNbMF0/LmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFKTtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IHNpemUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgICBpZiAoY3Vyc29yWSArIGxpbmVIZWlnaHQgPiBib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICBjdXJzb3JZID0gSW5maW5pdHk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlbGluZSA9IGN1cnNvclkgKyBzaXplO1xuICAgICAgICBjb25zdCBsaW5lV2lkdGggPSBsaW5lLnJlZHVjZSgoc3VtLCB3b3JkKSA9PiBzdW0gKyB3b3JkLndpZHRoLCAwKTtcbiAgICAgICAgbGV0IHggPSBsZWZ0ICsgaW5kZW50ICsgdGhpcy5fYWxpZ25PZmZzZXQocGFyYWdyYXBoLmFsaWduLCB3aWR0aCAtIGluZGVudCwgbGluZVdpZHRoKTtcblxuICAgICAgICBpZiAobGluZUluZGV4ID09PSAwICYmIHBhcmFncmFwaC5idWxsZXQpIHtcbiAgICAgICAgICB0aGlzLl9mb250KGRvYywgbGluZVswXT8ucnVuID8/IHsgdGV4dDogJycgfSwgc2l6ZSk7XG4gICAgICAgICAgZG9jLnRleHQocGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBgJHtsaXN0TnVtYmVyfS5gIDogJ+KAoicsIGxlZnQsIGJhc2VsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgd29yZCBvZiBsaW5lKSB7XG4gICAgICAgICAgdGhpcy5fZHJhd1dvcmQoZG9jLCB3b3JkLCB4LCBiYXNlbGluZSk7XG4gICAgICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgY3Vyc29yWSArPSBsaW5lSGVpZ2h0O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJzb3JZID09PSBJbmZpbml0eSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gQW4gZW1wdHkgcGFyYWdyYXBoIGlzIHN0aWxsIGEgbGluZS5cbiAgICAgIGlmICghbGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGN1cnNvclkgKz0gREVGQVVMVF9URVhUX1NJWkUgKiBURVhUX0xJTkVfSEVJR0hUO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEJyZWFrIGEgcGFyYWdyYXBoJ3MgcnVucyBpbnRvIGxpbmVzIG9mIG1lYXN1cmVkIHdvcmRzIHRoYXQgZml0IHRoZSB3aWR0aC5cbiAgLy8gQSB3b3JkIGtlZXBzIGl0cyB0cmFpbGluZyBzcGFjZSBzbyBzcGFjaW5nIHN1cnZpdmVzIHJ1biBib3VuZGFyaWVzLlxuICBwcml2YXRlIF93cmFwKGRvYzogYW55LCBwYXJhZ3JhcGg6IFRleHRQYXJhZ3JhcGgsIHdpZHRoOiBudW1iZXIpOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiB7IHJ1bjogVGV4dFJ1bjsgdGV4dDogc3RyaW5nOyBzaXplOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfVtdW10gPSBbXTtcbiAgICBsZXQgbGluZTogeyBydW46IFRleHRSdW47IHRleHQ6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBsaW5lV2lkdGggPSAwO1xuXG4gICAgZm9yIChjb25zdCBydW4gb2YgcGFyYWdyYXBoLnJ1bnMpIHtcbiAgICAgIGNvbnN0IHNpemUgPSBydW4uZm9udFNpemUgPz8gREVGQVVMVF9URVhUX1NJWkU7XG4gICAgICB0aGlzLl9mb250KGRvYywgcnVuLCBzaXplKTtcblxuICAgICAgZm9yIChjb25zdCB0ZXh0IG9mIHJ1bi50ZXh0Lm1hdGNoKC9cXFMrXFxzKnxcXHMrL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IHsgcnVuOiBUZXh0UnVuOyB0ZXh0OiBzdHJpbmc7IHNpemU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9LCB4OiBudW1iZXIsIGJhc2VsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBydW4gPSB3b3JkLnJ1bjtcblxuICAgIGlmIChydW4uaGlnaGxpZ2h0KSB7XG4gICAgICBkb2Muc2V0RmlsbENvbG9yKHJ1bi5oaWdobGlnaHQpO1xuICAgICAgZG9jLnJlY3QoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjksIHdvcmQud2lkdGgsIHdvcmQuc2l6ZSAqIDEuMTUsICdGJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZm9udChkb2MsIHJ1biwgd29yZC5zaXplKTtcbiAgICBkb2MudGV4dCh3b3JkLnRleHQsIHgsIGJhc2VsaW5lKTtcblxuICAgIGNvbnN0IGNvbG9yID0gcnVuLmNvbG9yID8/IERFRkFVTFRfVEVYVF9DT0xPUjtcbiAgICBjb25zdCBpbmtXaWR0aCA9IHdvcmQud2lkdGggLSB0aGlzLl90cmFpbGluZ1NwYWNlKGRvYywgd29yZC50ZXh0KTtcbiAgICBpZiAocnVuLnVuZGVybGluZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMiwgeCArIGlua1dpZHRoLCBiYXNlbGluZSArIHdvcmQuc2l6ZSAqIDAuMTIpO1xuICAgIH1cbiAgICBpZiAocnVuLnN0cmlrZSkge1xuICAgICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgICBkb2Muc2V0TGluZVdpZHRoKHdvcmQuc2l6ZSAvIDE2KTtcbiAgICAgIGRvYy5saW5lKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lIC0gd29yZC5zaXplICogMC4zKTtcbiAgICB9XG5cbiAgICBpZiAocnVuLmxpbmspIHtcbiAgICAgIGRvYy5saW5rKHgsIGJhc2VsaW5lIC0gd29yZC5zaXplLCBpbmtXaWR0aCwgd29yZC5zaXplICogMS4yLCB7IHVybDogcnVuLmxpbmsgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8ganNQREYncyBzdGFuZGFyZCBmb250cyBhcmUgSGVsdmV0aWNhLCBUaW1lcyBhbmQgQ291cmllcjsgYSBibG9jaydzIGZhY2UgaXNcbiAgLy8gbWFwcGVkIG9udG8gd2hpY2hldmVyIG9mIHRoZSB0aHJlZSBpdCByZXNlbWJsZXMuXG4gIHByaXZhdGUgX2ZvbnQoZG9jOiBhbnksIHJ1bjogVGV4dFJ1biwgc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmFjZSA9IChydW4uZm9udEZhY2UgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmFtaWx5ID0gL2NvdXJpZXJ8bW9uby8udGVzdChmYWNlKVxuICAgICAgPyAnY291cmllcidcbiAgICAgIDogKC90aW1lc3xnZW9yZ2lhfHNlcmlmLy50ZXN0KGZhY2UpICYmICFmYWNlLmluY2x1ZGVzKCdzYW5zJykgPyAndGltZXMnIDogJ2hlbHZldGljYScpO1xuICAgIGNvbnN0IHN0eWxlID0gcnVuLmJvbGQgJiYgcnVuLml0YWxpY1xuICAgICAgPyAnYm9sZGl0YWxpYydcbiAgICAgIDogKHJ1bi5ib2xkID8gJ2JvbGQnIDogKHJ1bi5pdGFsaWMgPyAnaXRhbGljJyA6ICdub3JtYWwnKSk7XG5cbiAgICBkb2Muc2V0Rm9udChmYW1pbHksIHN0eWxlKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoc2l6ZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYWlsaW5nU3BhY2UoZG9jOiBhbnksIHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgdHJhaWxpbmcgPSB0ZXh0Lmxlbmd0aCAtIHRleHQudHJpbUVuZCgpLmxlbmd0aDtcblxuICAgIHJldHVybiB0cmFpbGluZyA/IGRvYy5nZXRUZXh0V2lkdGgoJyAnKSAqIHRyYWlsaW5nIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX2FsaWduT2Zmc2V0KGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLCB3aWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsICh3aWR0aCAtIGxpbmVXaWR0aCkgLyAyKTtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHdpZHRoIC0gbGluZVdpZHRoKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdoYXQgYSB0ZXh0IGJsb2NrJ3MgdG9rZW5zIGZpbGwgd2l0aCBvbiB0aGlzIHBhZ2UuIFRoZSBudW1iZXIgaXMgdGhlXG4gIC8vIHBoeXNpY2FsIHBhZ2UgYW1vbmcgdGhlIHJlcG9ydCdzIHBhZ2VzLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQg4oCUIHRoZVxuICAvLyB0aXRsZSBwYWdlIGlzIG5vdCBhIHJlcG9ydCBwYWdlLiBUaGUgbmFtZSBzdGF5cyB0aGUgcmVwb3J0IHBhZ2Uncywgc28gYVxuICAvLyBjb250aW51YXRpb24gcGFnZSBpcyBuYW1lZCBmb3IgdGhlIHBhZ2UgaXRzIHRhYmxlIHN0YXJ0ZWQgb24uXG4gIHByaXZhdGUgX3Rva2VucyhyZXBvcnQ6IFJlcG9ydCwgcGFnZTogUmVwb3J0UGFnZSwgaW5kZXg6IG51bWJlciwgcGFnZU51bWJlcjogbnVtYmVyKTogVGV4dFRva2VuQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICBwYWdlTmFtZTogcGFnZS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWAsXG4gICAgICByZXBvcnROYW1lOiByZXBvcnQubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29tcG9uZW50KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaXRlbTogQ29sbGVjdGVkQ29tcG9uZW50LFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICAgIGdlb21ldHJ5PzogQ29tcG9uZW50R2VvbWV0cnksXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGFycml2ZXMgaW4gaW5jaGVzIChmbG93IGxheW91dCBwcmUtcmVzb2x2ZWQpOyB0aGUgUERGIGRyYXdzIGluXG4gICAgLy8gcG9pbnRzLlxuICAgIGNvbnN0IGluY2hlcyA9IGdlb21ldHJ5ID8/IGNvbXBvbmVudDtcbiAgICBjb25zdCB4ID0gaW5jaGVzLnggKiBQVDtcbiAgICBjb25zdCB5ID0gaW5jaGVzLnkgKiBQVDtcbiAgICBjb25zdCB3ID0gaW5jaGVzLncgKiBQVDtcbiAgICBjb25zdCBoID0gaW5jaGVzLmggKiBQVDtcblxuICAgIGlmIChjb21wb25lbnQudGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgY29tcG9uZW50LnRpdGxlLCB4LCB5LCB3KTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHkgKyBUSVRMRV9IO1xuICAgIGNvbnN0IGJvZHlIID0gTWF0aC5tYXgoMjAsIGggLSBUSVRMRV9IKTtcblxuICAgIGlmICghaXRlbS5kYXRhIHx8ICFpdGVtLmRhdGEucm93cz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGRvYywgZW1wdHlMYWJlbChpdGVtKSwgeCwgYm9keVksIHcsIGJvZHlIKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY29tcG9uZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NoYXJ0Jzoge1xuICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHJlbmRlckNoYXJ0SW1hZ2UoY29tcG9uZW50LCBpdGVtLmRhdGEsIHcsIGJvZHlIKTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFibGUoY29udGV4dCwgY29tcG9uZW50LCBpdGVtLmRhdGEsIHgsIGJvZHlZLCB3LCBib2R5SCwgb3ZlcmZsb3dzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdrcGknOlxuICAgICAgICB0aGlzLl9yZW5kZXJLcGkoZG9jLCBjb21wb25lbnQsIGl0ZW0uZGF0YSwgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGJvbGQgc3RyaXAgb3ZlciBhIGNvbXBvbmVudCwgYW5kIG92ZXIgZWFjaCBvZiBpdHMgY29udGludWF0aW9uIHBhZ2VzLlxuICBwcml2YXRlIF9jb21wb25lbnRUaXRsZShkb2M6IGFueSwgdGl0bGU6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSg5KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodGl0bGUsIHgsIHkgKyAxMCwgeyBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEFuIGl0YWxpYyBncmV5IGxpbmUgY2VudGVyZWQgaW4gYSBjb21wb25lbnQncyBib2R5LCBmb3IgYSBib2R5IHRoYXQgaG9sZHNcbiAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gaXRzIGNvbnRlbnQuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzdiODc5NCcpO1xuICAgIGRvYy50ZXh0KHRleHQsIHggKyB3IC8gMiwgeSArIGggLyAyLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIG9uLXBhZ2UgdGFibGUuIEFsbCBvZiBpdHMgZmV0Y2hlZCByb3dzIGFyZSBsYWlkIG91dCBvbmNlIHRvIGxlYXJuXG4gIC8vIGhvdyBtYW55IHRoZSBib3ggaG9sZHM7IHdoZW4gdGhleSBkbyBub3QgYWxsIGZpdCwgdGhlIGJveCdzIGxhc3Qgcm93IHNheXNcbiAgLy8gdGhlIHRhYmxlIGNvbnRpbnVlcyBhbmQgdGhlIHJlc3QgZ28gdG8gb3ZlcmZsb3dzIGZvciBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgYm94IHRvbyBzaG9ydCBmb3IgZXZlbiB0aGUgaGVhZCBjYXJyaWVzIHRoZSBub3RpY2UgYXMgYSBsaW5lIGluc3RlYWQuXG4gIC8vIFBvaW50cyB0aHJvdWdob3V0LlxuICBwcml2YXRlIF9yZW5kZXJUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoZWFkID0gbGlzdEhlYWRpbmdzKGNvbXBvbmVudCwgZGF0YSk7XG4gICAgY29uc3QgY2VsbHMgPSB0aGlzLl90YWJsZUNlbGxzKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC50aW1lem9uZSk7XG4gICAgY29uc3Qgb21pdHRlZCA9IE1hdGgubWF4KDAsIChkYXRhLnBhZ2luZz8udG90YWwgPz8gY2VsbHMubGVuZ3RoKSAtIGNlbGxzLmxlbmd0aCk7XG4gICAgY29uc3QgYm90dG9tID0gY29udGV4dC5wYWdlSCAtICh5ICsgaCk7XG4gICAgY29uc3QgeyBmaXQsIGNvbHVtblN0eWxlcyB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIGNlbGxzLCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIG5vdGljZSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIGxhc3Qgcm93IHRoYXQgZml0LCBzbyB0aGF0IHJvdyBtb3Zlc1xuICAgIC8vIHRvIHRoZSBjb250aW51YXRpb24uIG9taXR0ZWQgPiAwIG1lYW5zIGEgZnVsbCBQREZfTElTVF9ST1dTIGZldGNoLCB3aGljaFxuICAgIC8vIG5ldmVyIGZpdHMgb25lIGJveCwgc28gdGhlIENTViBub3RpY2UgYWx3YXlzIGxhbmRzIG9uIGEgY29udGludWF0aW9uXG4gICAgLy8gcGFnZS5cbiAgICBjb25zdCBrZXB0ID0gTWF0aC5tYXgoMCwgZml0IC0gMSk7XG4gICAgb3ZlcmZsb3dzLnB1c2goeyBjb21wb25lbnQsIGhlYWQsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCB4LCB3LCBjb2x1bW5TdHlsZXMgfSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhDT05USU5VRURfTk9USUNFLCBoZWFkLmxlbmd0aCwgdHJ1ZSldO1xuICAgICAgdGhpcy5fZHJhd1RhYmxlKGNvbnRleHQsIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBib2R5LCB4LCB5LCB3LCBib3R0b20sIGNvbHVtblN0eWxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib3hOb3RlKGNvbnRleHQuZG9jLCBDT05USU5VRURfTk9USUNFLCB4LCB5LCB3LCBoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludC5cbiAgcHJpdmF0ZSBfdGFibGVDZWxscyhjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgZGF0YTogQ29tcG9uZW50RGF0YSwgdGltZXpvbmU6IHN0cmluZyk6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBsaXN0Q29sdW1ucyhjb21wb25lbnQsIGRhdGEpO1xuXG4gICAgcmV0dXJuIGRhdGEucm93cy5tYXAoKHJvdykgPT4gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gZXhwb3J0Q2VsbChyb3dbY29sdW1uLmNvbHVtbl0sIGNvbHVtbi5mb3JtYXQsIHRpbWV6b25lKSkpO1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIHByaXZhdGUgX3RhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGhlYWQ6IHN0cmluZ1tdLFxuICAgIGJvZHk6IFBkZlRhYmxlQ2VsbFtdW10sXG4gICAgeDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdzogbnVtYmVyLCBib3R0b206IG51bWJlcixcbiAgICBjb2x1bW5TdHlsZXM/OiBQZGZDb2x1bW5TdHlsZXMsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQ6IFtoZWFkXSxcbiAgICAgIGJvZHksXG4gICAgICBzdGFydFksXG4gICAgICBtYXJnaW46IHsgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdywgYm90dG9tIH0sXG4gICAgICB0YWJsZVdpZHRoOiB3LFxuICAgICAgcm93UGFnZUJyZWFrOiAnYXZvaWQnLFxuICAgICAgc3R5bGVzOiB7IGZvbnQ6ICdoZWx2ZXRpY2EnLCBmb250U3R5bGU6ICdub3JtYWwnLCBmb250U2l6ZTogOCwgY2VsbFBhZGRpbmc6IDMsIHRleHRDb2xvcjogJyMxZjI5MzMnIH0sXG4gICAgICBoZWFkU3R5bGVzOiB7IGZpbGxDb2xvcjogJyM0ZTc5YTcnLCB0ZXh0Q29sb3I6ICcjZmZmZmZmJywgZm9udFN0eWxlOiAnYm9sZCcgfSxcbiAgICAgIGFsdGVybmF0ZVJvd1N0eWxlczogeyBmaWxsQ29sb3I6ICcjZjVmN2ZhJyB9LFxuICAgICAgLi4uKGNvbHVtblN0eWxlcyA/IHsgY29sdW1uU3R5bGVzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgbm90aWNlIGFzIGEgdGFibGUgcm93OiBvbmUgaXRhbGljIGdyZXkgY2VsbCBzcGFubmluZyBldmVyeSBjb2x1bW4uIEFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGlzIGVsbGlwc2l6ZWQgYXQgdGhlIGJveCdzIHdpZHRoIGFuZCBrZWVwcyB0aGUgZGF0YVxuICAvLyBjZWxscycgZm9udCBzaXplIGFuZCBwYWRkaW5nLCBzbyBpdCBpcyBuZXZlciB0YWxsZXIgdGhhbiB0aGUgZGF0YSByb3dcbiAgLy8gd2hvc2UgcGxhY2UgaXQgdGFrZXMuXG4gIHByaXZhdGUgX25vdGljZVJvdyh0ZXh0OiBzdHJpbmcsIHNwYW46IG51bWJlciwgc2luZ2xlTGluZTogYm9vbGVhbik6IFBkZlRhYmxlQ2VsbFtdIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICBjb2xTcGFuOiBzcGFuLFxuICAgICAgc3R5bGVzOiB7IGZvbnRTdHlsZTogJ2l0YWxpYycsIHRleHRDb2xvcjogJyM3Yjg3OTQnLCAuLi4oc2luZ2xlTGluZSA/IHsgb3ZlcmZsb3c6ICdlbGxpcHNpemUnIH0gOiB7fSkgfSxcbiAgICB9XTtcbiAgfVxuXG4gIC8vIExheXMgZXZlcnkgZmV0Y2hlZCByb3cgb3V0IG9uY2Ugb24gYSBzY3JhdGNoIGRvY3VtZW50IG9mIHRoZSBzYW1lIHBhZ2VcbiAgLy8gc2l6ZSwgd2l0aCB0aGUgb3B0aW9ucyB0aGUgcmVhbCBkcmF3IHVzZXMsIGFuZCByZWFkcyBiYWNrIGhvdyBtYW55IGJvZHlcbiAgLy8gcm93cyB0aGUgYm94J3MgcGFnZSBob2xkcyAoZml0KSBhbmQgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLlxuICAvLyBmaXQgMCBtZWFucyBldmVuIHRoZSBoZWFkIGRpZCBub3QgZml0OiBhdXRvVGFibGUgbW92ZWQgdG8gYSBuZXcgcGFnZVxuICAvLyBiZWZvcmUgZHJhd2luZy4gVGhlIHJlYWwgZG9jdW1lbnQgaXMgdW50b3VjaGVkLlxuICBwcml2YXRlIF9tZWFzdXJlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogc3RyaW5nW10sXG4gICAgY2VsbHM6IHN0cmluZ1tdW10sXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IHsgZml0OiBudW1iZXI7IGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzIH0ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgICBsZXQgZml0ID0gMDtcblxuICAgIGNvbnRleHQuYXV0b1RhYmxlKHNjcmF0Y2gsIHtcbiAgICAgIC4uLnRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBjZWxscywgeCwgeSwgdywgYm90dG9tKSxcbiAgICAgIGRpZERyYXdDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmIChob29rLnNlY3Rpb24gPT09ICdib2R5JyAmJiBzY3JhdGNoLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXIgPT09IDEpIHtcbiAgICAgICAgICBmaXQgPSBNYXRoLm1heChmaXQsIGhvb2sucm93LmluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiB7IHdpZHRoOiBudW1iZXIgfVtdID0gc2NyYXRjaC5sYXN0QXV0b1RhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSB7IGNlbGxXaWR0aDogY29sdW1uLndpZHRoIH07XG4gICAgfSk7XG5cbiAgICAvLyBBIHJvdyB0YWxsZXIgdGhhbiBhIHdob2xlIHBhZ2UgaXMgc3BsaXQgcmF0aGVyIHRoYW4gbW92ZWQsIHNvIGEgbGFzdFxuICAgIC8vIHJvdyB0aGF0IHN0YXJ0ZWQgb24gdGhlIGZpcnN0IHBhZ2UgY2FuIHN0aWxsIGhhdmUgcnVuIHBhc3QgaXQuXG4gICAgaWYgKGZpdCA9PT0gY2VsbHMubGVuZ3RoICYmIHNjcmF0Y2guZ2V0TnVtYmVyT2ZQYWdlcygpID4gMSkge1xuICAgICAgZml0IC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZml0LCBjb2x1bW5TdHlsZXMgfTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUsIHRoZW4gcmVtb3ZlcyBhbnkgcGFnZSB0aGUgZHJhdyBhZGRlZC4gVGhhdCBzaG91bGRcbiAgLy8gbmV2ZXIgaGFwcGVuOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHMgYW5kIGFcbiAgLy8gc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBUaGUgY2hlY2sgZXhpc3RzIHNvIGFcbiAgLy8gc3RyYXkgcGFnZSBjYW4gbmV2ZXIgY2F0Y2ggdGhlIHJlcG9ydCBwYWdlJ3MgcmVtYWluaW5nIGNvbXBvbmVudHMuXG4gIHByaXZhdGUgX2RyYXdUYWJsZShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHBhZ2UgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICBjb250ZXh0LmF1dG9UYWJsZShkb2MsIG9wdGlvbnMpO1xuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2Fpbi4gVGhlIHRhYmxlIHNpdHMgQ09OVElOVUFUSU9OX0dBUCBpbnNpZGUgdGhlXG4gIC8vIGJhbmRzLiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBwYWdlIGNvdW50ZXIgYWZ0ZXIgdGhlc2UgcGFnZXMuXG4gIHByaXZhdGUgX3JlbmRlckNvbnRpbnVhdGlvbihcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHBhZ2U6IFJlcG9ydFBhZ2UsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXG4gICAgb3ZlcmZsb3c6IFBkZlRhYmxlT3ZlcmZsb3csXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgeyBkb2MsIHJlcG9ydCB9ID0gY29udGV4dDtcbiAgICBjb25zdCBiYW5kcyA9IHBhZ2UubWFzdGVySGlkZGVuID8gTk9fQkFORFMgOiByZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG4gICAgY29uc3QgdG9wID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmhlYWRlckhlaWdodCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCk7XG4gICAgY29uc3QgeyB4LCB3IH0gPSBvdmVyZmxvdztcbiAgICBjb25zdCBib2R5OiBQZGZUYWJsZUNlbGxbXVtdID0gb3ZlcmZsb3cub21pdHRlZCA+IDBcbiAgICAgID8gWy4uLm92ZXJmbG93LnJvd3MsIHRoaXMuX25vdGljZVJvdyhtb3JlUm93c05vdGljZShvdmVyZmxvdy5vbWl0dGVkKSwgb3ZlcmZsb3cuaGVhZC5sZW5ndGgsIGZhbHNlKV1cbiAgICAgIDogb3ZlcmZsb3cucm93cztcbiAgICBsZXQgY291bnRlciA9IHBhZ2VOdW1iZXI7XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGNvbnRleHQuYXV0b1RhYmxlKGRvYywge1xuICAgICAgLi4udGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIG92ZXJmbG93LmhlYWQsIGJvZHksIHgsIHRvcCArIFRJVExFX0gsIHcsIGJvdHRvbSwgb3ZlcmZsb3cuY29sdW1uU3R5bGVzKSxcbiAgICAgIG1hcmdpbjogeyB0b3A6IHRvcCArIFRJVExFX0gsIGJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdyB9LFxuICAgICAgc2hvd0hlYWQ6ICdldmVyeVBhZ2UnLFxuICAgICAgLy8gRmlyZXMgb24gZXZlcnkgcGFnZSB0aGUgdGFibGUgZHJhd3Mgb24sIHRoZSBmaXJzdCBpbmNsdWRlZC5cbiAgICAgIHdpbGxEcmF3UGFnZTogKCkgPT4ge1xuICAgICAgICBjb3VudGVyICs9IDE7XG4gICAgICAgIHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBwYWdlLCB0aGlzLl90b2tlbnMocmVwb3J0LCBwYWdlLCBpbmRleCwgY291bnRlcikpO1xuICAgICAgICB0aGlzLl9jb21wb25lbnRUaXRsZShkb2MsIHRoaXMuX2NvbnRpbnVlZFRpdGxlKG92ZXJmbG93LmNvbXBvbmVudCksIHgsIHRvcCwgdyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cblxuICAvLyBUaGUgbWFyZ2luIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gb25lIGVkZ2U6IGluc2lkZSB0aGUgYmFuZCB3aGVuXG4gIC8vIHRoZSBwYWdlIGhhcyBvbmUuXG4gIHByaXZhdGUgX2NvbnRpbnVhdGlvbk1hcmdpbihiYW5kOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBiYW5kID8gYmFuZCAqIFBUICsgQ09OVElOVUFUSU9OX0dBUCA6IE5PX0JBTkRfTUFSR0lOO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGludWVkVGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb21wb25lbnQudGl0bGUgPyBgJHtjb21wb25lbnQudGl0bGV9IChjb250aW51ZWQpYCA6ICdDb250aW51ZWQnO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyS3BpKFxuICAgIGRvYzogYW55LFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIGRhdGE6IENvbXBvbmVudERhdGEsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBjb21wb25lbnQuY29uZmlnIGFzIEtwaUNvbmZpZztcbiAgICBjb25zdCByb3cgPSBkYXRhLnJvd3NbMF0gPz8ge307XG4gICAgY29uc3QgY29sdW1uID0gY29uZmlnLm1lYXN1cmU/LmNvbHVtbiA/PyBPYmplY3Qua2V5cyhyb3cpWzBdO1xuICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0TWVhc3VyZVZhbHVlKHJvd1tjb2x1bW5dLCBjb25maWcubWVhc3VyZT8uZm9ybWF0LCBjb25maWcubWVhc3VyZT8ucHJlY2lzaW9uKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KHZhbHVlLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiwgeyBhbGlnbjogJ2NlbnRlcicgfSk7XG5cbiAgICBpZiAoY29uZmlnLm1lYXN1cmU/LmxhYmVsKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcignIzdiODc5NCcpO1xuICAgICAgZG9jLnRleHQoY29uZmlnLm1lYXN1cmUubGFiZWwsIHggKyB3IC8gMiwgeSArIGggLyAyICsgMTYsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NsdWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAncmVwb3J0JztcbiAgfVxufVxuIl19
|