@firestitch/report 18.7.0 → 18.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
- package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
- package/app/reports/components/component-list/component-list.component.d.ts +7 -1
- package/app/reports/components/component-note/component-note.component.d.ts +12 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
- package/app/reports/components/report-component/report-component.component.d.ts +2 -11
- package/app/reports/data/report.data.d.ts +0 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
- package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
- package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +29 -1
- package/app/reports/export/report-pdf.service.d.ts +5 -0
- package/app/reports/export/report-pptx.service.d.ts +7 -0
- package/app/reports/format.d.ts +29 -1
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +124 -4
- package/app/reports/kpi-card.d.ts +48 -0
- package/app/reports/layout.d.ts +0 -9
- package/app/reports/list-config.d.ts +8 -1
- package/app/reports/option-builder.d.ts +7 -0
- package/app/reports/output-notes.d.ts +14 -0
- package/app/reports/pipes/report-output.pipe.d.ts +10 -0
- package/app/reports/services/report-filter-state.service.d.ts +1 -0
- package/app/reports/theme/palette.d.ts +5 -0
- package/app/reports/theme/typography.d.ts +1 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
- package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
- package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
- package/esm2022/app/reports/data/report.data.mjs +5 -5
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
- package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
- package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +123 -10
- package/esm2022/app/reports/export/report-pdf.service.mjs +257 -44
- package/esm2022/app/reports/export/report-pptx.service.mjs +324 -51
- package/esm2022/app/reports/format.mjs +452 -3
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/kpi-card.mjs +187 -0
- package/esm2022/app/reports/layout.mjs +1 -46
- package/esm2022/app/reports/list-config.mjs +33 -1
- package/esm2022/app/reports/option-builder.mjs +637 -54
- package/esm2022/app/reports/output-notes.mjs +204 -0
- package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
- package/esm2022/app/reports/theme/palette.mjs +22 -1
- package/esm2022/app/reports/theme/typography.mjs +5 -1
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +3 -4
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-CFnbJx44.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-CFnbJx44.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-CSylkyko.mjs} +2735 -507
- package/fesm2022/firestitch-report-firestitch-report-CSylkyko.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isValid, parseISO } from 'date-fns';
|
|
1
|
+
import { addDays, isValid, parseISO } from 'date-fns';
|
|
2
2
|
import { formatInTimeZone, toZonedTime } from 'date-fns-tz';
|
|
3
3
|
import { ReportListColumnFormat } from './enums/report-list-column-format.enum';
|
|
4
4
|
import { ReportNumberUnits } from './enums/report-number-units.enum';
|
|
@@ -119,6 +119,8 @@ const CURRENCY_AXIS_DECIMALS = 2;
|
|
|
119
119
|
const EMPTY_VALUE = '—';
|
|
120
120
|
// The tick count a value axis aims for, as ECharts' splitNumber default.
|
|
121
121
|
const AXIS_TICKS = 5;
|
|
122
|
+
// A change's sign: a plus on a positive value, nothing on zero.
|
|
123
|
+
const SIGNED = { signDisplay: 'exceptZero' };
|
|
122
124
|
const NUMERIC_PATTERN = /^\s*[-+]?(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?\s*$/;
|
|
123
125
|
// The formatToParts types that carry a number's digits and separators.
|
|
124
126
|
const NUMBER_PARTS = new Set(['integer', 'group', 'decimal', 'fraction']);
|
|
@@ -202,7 +204,10 @@ export function formatNumber(value, spec, context, options = {}) {
|
|
|
202
204
|
: options.units ?? resolveUnits(spec?.units, numeric, precision ?? SCALED_DECIMALS);
|
|
203
205
|
const scale = UNIT_SCALES.get(units);
|
|
204
206
|
const decimals = clampDecimals(options.decimals) ?? precision;
|
|
205
|
-
const formatter = numberFormat(context.locale,
|
|
207
|
+
const formatter = numberFormat(context.locale, {
|
|
208
|
+
...styleOptions(style, context, decimals, !!scale),
|
|
209
|
+
...(options.signed ? SIGNED : {}),
|
|
210
|
+
});
|
|
206
211
|
const text = writeNumber(formatter, (numeric === 0 ? 0 : numeric) / (scale?.divisor ?? 1), scale?.suffix);
|
|
207
212
|
return style === ReportValueFormat.Percent && !context.ratioPercent ? `${text}%` : text;
|
|
208
213
|
}
|
|
@@ -291,6 +296,188 @@ function hasNonZeroDigit(formatter, parts) {
|
|
|
291
296
|
return parts.some((part) => DIGIT_PARTS.has(part.type)
|
|
292
297
|
&& Array.from(part.value).some((character) => character !== zero));
|
|
293
298
|
}
|
|
299
|
+
// Output values: a column the server marks in ComponentData.outputs (a
|
|
300
|
+
// compared value, a rank, a share) written by what it is. The data stays raw;
|
|
301
|
+
// every number still goes through formatNumber. The rules:
|
|
302
|
+
// - The format: a slot's own explicit format always wins. Otherwise a current,
|
|
303
|
+
// prior or change column takes its source measure's format; a percent change
|
|
304
|
+
// is a percent; a rank is a whole number; a share is a percent to 1 decimal.
|
|
305
|
+
// An own precision or units still applies over those defaults.
|
|
306
|
+
// - Signs: a change and a percent change are signed ('+579', '-31.1%').
|
|
307
|
+
// - Points: a change of a percent-format value, and any share change, is a
|
|
308
|
+
// difference of two rates, so it prints in percentage points, signed and to
|
|
309
|
+
// 1 decimal unless a precision pins others: 0.1 reads '+10.0 pp'.
|
|
310
|
+
// - Missing: a missing prior, or a change or percent change left empty by
|
|
311
|
+
// one, prints '—' titled with the floor ('No baseline: no data before
|
|
312
|
+
// Mar 3, 2026'), or for a rank or a share with the period the row was
|
|
313
|
+
// absent from ('No rank in the prior period'); a percent change over a prior of 0 prints 'n/a' titled
|
|
314
|
+
// 'Prior was 0'. Any other missing value prints '—' (or the caller's empty).
|
|
315
|
+
// - Rank change: prior minus current, so a rise is positive: '▲ 2', '▼ 1',
|
|
316
|
+
// '–' for none, and 'new' for an empty change whose prior rank is missing
|
|
317
|
+
// or not passed (a row always has a current rank, so only the prior lacks).
|
|
318
|
+
// A percent change and a share are 0-1 fractions whatever the report's
|
|
319
|
+
// percentFormat: the server computes them, never a stored value.
|
|
320
|
+
// A missing comparison value prints EMPTY_VALUE whatever the caller's empty.
|
|
321
|
+
const NOT_APPLICABLE_VALUE = 'n/a';
|
|
322
|
+
const NEW_RANK_VALUE = 'new';
|
|
323
|
+
const RANK_UNCHANGED_VALUE = '–';
|
|
324
|
+
const RANK_UP_MARK = '▲';
|
|
325
|
+
const RANK_DOWN_MARK = '▼';
|
|
326
|
+
const POINTS_SUFFIX = 'pp';
|
|
327
|
+
const NO_PRIOR_RANK_TITLE = 'No rank in the prior period';
|
|
328
|
+
const NO_PRIOR_SHARE_TITLE = 'No share in the prior period';
|
|
329
|
+
// Percentage points and a share are written to one decimal unless pinned.
|
|
330
|
+
const POINTS_DECIMALS = 1;
|
|
331
|
+
const SHARE_DECIMALS = 1;
|
|
332
|
+
const RANK_DEFAULT_SPEC = Object.freeze({ format: ReportValueFormat.Number, precision: 0 });
|
|
333
|
+
const SHARE_DEFAULT_SPEC = Object.freeze({
|
|
334
|
+
format: ReportValueFormat.Percent,
|
|
335
|
+
precision: SHARE_DECIMALS,
|
|
336
|
+
});
|
|
337
|
+
const PERCENT_CHANGE_DEFAULT_SPEC = Object.freeze({ format: ReportValueFormat.Percent });
|
|
338
|
+
// One output value, written by the rules above. Without output metadata (a
|
|
339
|
+
// plain measure column, an older server) it is formatNumber with the slot's
|
|
340
|
+
// own format.
|
|
341
|
+
export function formatOutputValue(value, output, spec, context, options = {}) {
|
|
342
|
+
if (!output) {
|
|
343
|
+
return plainOutput(formatNumber(value, spec, context, { empty: options.empty }));
|
|
344
|
+
}
|
|
345
|
+
if (output.kind === 'rank' && output.role === 'change') {
|
|
346
|
+
return formatRankChange(value, spec, context, options);
|
|
347
|
+
}
|
|
348
|
+
const role = output.role;
|
|
349
|
+
const effective = outputFormatSpec(output, spec, options.measureSpec);
|
|
350
|
+
if (isEmptyValue(value)) {
|
|
351
|
+
return missingOutput(output, context, options);
|
|
352
|
+
}
|
|
353
|
+
if (role === 'change' && isPointsChange(output, effective)) {
|
|
354
|
+
return plainOutput(formatPoints(value, output, effective, context));
|
|
355
|
+
}
|
|
356
|
+
const signed = role === 'change' || role === 'percent_change';
|
|
357
|
+
const ratioContext = role === 'percent_change' || output.kind === 'share'
|
|
358
|
+
? { ...context, ratioPercent: true }
|
|
359
|
+
: context;
|
|
360
|
+
return plainOutput(formatNumber(value, effective, ratioContext, { signed }));
|
|
361
|
+
}
|
|
362
|
+
// The alias of the output that plays `role` in the same lane as `alias`: the
|
|
363
|
+
// same measure and kind, and (for a prior, change or percent change) the same
|
|
364
|
+
// prior lane. A measure compares against one lane only (two compares on one
|
|
365
|
+
// value are two measures), so a current value's lane is whichever one its
|
|
366
|
+
// measure's prior columns carry, lane 2 as readily as lane 1. A change column
|
|
367
|
+
// finds its prior this way to pass as OutputValueOptions.prior. null when the
|
|
368
|
+
// server sends no such column.
|
|
369
|
+
export function laneOutputAlias(outputs, alias, role) {
|
|
370
|
+
const source = outputs?.[alias];
|
|
371
|
+
if (!source) {
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
const anyLane = source.role === 'current' || source.offset === null;
|
|
375
|
+
const found = Object.entries(outputs ?? {}).find(([, meta]) => meta.measure === source.measure
|
|
376
|
+
&& meta.kind === source.kind
|
|
377
|
+
&& meta.role === role
|
|
378
|
+
&& (role === 'current' || (anyLane ? meta.offset !== null : meta.offset === source.offset)));
|
|
379
|
+
return found ? found[0] : null;
|
|
380
|
+
}
|
|
381
|
+
function plainOutput(text) {
|
|
382
|
+
return { text, title: null };
|
|
383
|
+
}
|
|
384
|
+
// The format an output is written in: the slot's own explicit format, else
|
|
385
|
+
// the default for what it holds, with any own precision or units over it.
|
|
386
|
+
function outputFormatSpec(output, own, measureSpec) {
|
|
387
|
+
if (valueFormat(own) !== null) {
|
|
388
|
+
return own;
|
|
389
|
+
}
|
|
390
|
+
if (output.kind === 'rank') {
|
|
391
|
+
return withOwnDigits(RANK_DEFAULT_SPEC, own);
|
|
392
|
+
}
|
|
393
|
+
if (output.kind === 'share') {
|
|
394
|
+
return withOwnDigits(SHARE_DEFAULT_SPEC, own);
|
|
395
|
+
}
|
|
396
|
+
if (output.role === 'percent_change') {
|
|
397
|
+
return withOwnDigits(PERCENT_CHANGE_DEFAULT_SPEC, own);
|
|
398
|
+
}
|
|
399
|
+
return measureSpec ? withOwnDigits(measureSpec, own) : own ?? null;
|
|
400
|
+
}
|
|
401
|
+
// The base format with the slot's own precision and units over it.
|
|
402
|
+
function withOwnDigits(base, own) {
|
|
403
|
+
return {
|
|
404
|
+
...base,
|
|
405
|
+
...((own?.precision ?? null) !== null ? { precision: own.precision } : {}),
|
|
406
|
+
...((own?.units ?? null) !== null ? { units: own.units } : {}),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
// A change between two rates: a share's, or a percent-format value's.
|
|
410
|
+
function isPointsChange(output, spec) {
|
|
411
|
+
return output.kind === 'share' || resolveStyle(spec) === ReportValueFormat.Percent;
|
|
412
|
+
}
|
|
413
|
+
// A rate change in percentage points. A share and a 0-1 percent are scaled
|
|
414
|
+
// x100; an older server's percent values already are.
|
|
415
|
+
function formatPoints(value, output, spec, context) {
|
|
416
|
+
const numeric = toFiniteNumber(value);
|
|
417
|
+
if (numeric === null) {
|
|
418
|
+
return String(value);
|
|
419
|
+
}
|
|
420
|
+
const points = output.kind === 'share' || context.ratioPercent ? numeric * 100 : numeric;
|
|
421
|
+
const decimals = clampDecimals(spec?.precision) ?? POINTS_DECIMALS;
|
|
422
|
+
const text = formatNumber(points, { format: ReportValueFormat.Number }, context, { decimals, signed: true });
|
|
423
|
+
return `${text} ${POINTS_SUFFIX}`;
|
|
424
|
+
}
|
|
425
|
+
// A missing output value. A missing prior, or a delta a missing prior left
|
|
426
|
+
// empty, has no baseline; a percent change over a zero prior has none to
|
|
427
|
+
// divide by.
|
|
428
|
+
function missingOutput(output, context, options) {
|
|
429
|
+
const role = output.role;
|
|
430
|
+
if (role === 'prior') {
|
|
431
|
+
return { text: EMPTY_VALUE, title: missingPriorTitle(output, options.floor, context.locale) };
|
|
432
|
+
}
|
|
433
|
+
if (role === 'change' || role === 'percent_change') {
|
|
434
|
+
const prior = options.prior;
|
|
435
|
+
if (role === 'percent_change' && toFiniteNumber(prior) === 0) {
|
|
436
|
+
return { text: NOT_APPLICABLE_VALUE, title: 'Prior was 0' };
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
text: EMPTY_VALUE,
|
|
440
|
+
title: prior !== undefined && isEmptyValue(prior)
|
|
441
|
+
? missingPriorTitle(output, options.floor, context.locale)
|
|
442
|
+
: null,
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
return plainOutput(options.empty ?? EMPTY_VALUE);
|
|
446
|
+
}
|
|
447
|
+
// Why a prior is missing. A value's prior is missing when its window ends
|
|
448
|
+
// before the data starts. A rank's or a share's is missing when the row had
|
|
449
|
+
// no rank or share in the prior period, whatever the floor.
|
|
450
|
+
function missingPriorTitle(output, floor, locale) {
|
|
451
|
+
if (output.kind === 'rank') {
|
|
452
|
+
return NO_PRIOR_RANK_TITLE;
|
|
453
|
+
}
|
|
454
|
+
if (output.kind === 'share') {
|
|
455
|
+
return NO_PRIOR_SHARE_TITLE;
|
|
456
|
+
}
|
|
457
|
+
return noBaselineTitle(floor, locale);
|
|
458
|
+
}
|
|
459
|
+
function noBaselineTitle(floor, locale) {
|
|
460
|
+
const day = floor ? formatDay(floor, locale) : '';
|
|
461
|
+
return day ? `No baseline: no data before ${day}` : 'No baseline';
|
|
462
|
+
}
|
|
463
|
+
// A rank change: prior rank minus current, so moving up is positive.
|
|
464
|
+
function formatRankChange(value, spec, context, options) {
|
|
465
|
+
if (isEmptyValue(value)) {
|
|
466
|
+
return isEmptyValue(options.prior)
|
|
467
|
+
? { text: NEW_RANK_VALUE, title: NO_PRIOR_RANK_TITLE }
|
|
468
|
+
: plainOutput(EMPTY_VALUE);
|
|
469
|
+
}
|
|
470
|
+
const numeric = toFiniteNumber(value);
|
|
471
|
+
if (numeric === null) {
|
|
472
|
+
return plainOutput(String(value));
|
|
473
|
+
}
|
|
474
|
+
const rankSpec = valueFormat(spec) !== null ? spec : withOwnDigits(RANK_DEFAULT_SPEC, spec);
|
|
475
|
+
const places = formatNumber(Math.abs(numeric), rankSpec, context);
|
|
476
|
+
if (places === formatNumber(0, rankSpec, context)) {
|
|
477
|
+
return plainOutput(RANK_UNCHANGED_VALUE);
|
|
478
|
+
}
|
|
479
|
+
return plainOutput(`${numeric > 0 ? RANK_UP_MARK : RANK_DOWN_MARK} ${places}`);
|
|
480
|
+
}
|
|
294
481
|
// A chart's value axis takes a format only when every measure on it agrees on
|
|
295
482
|
// the style (each measure's format, number when it names none) and at least
|
|
296
483
|
// one of them names a format. The first measure that does gives the axis its
|
|
@@ -541,6 +728,98 @@ export function formatReportDate(value, timezone, locale) {
|
|
|
541
728
|
const instant = parseISO(`${dateTime[1]}T${dateTime[2]}Z`);
|
|
542
729
|
return isValid(instant) ? formatLocalDate(instant, locale, DAY_SHORT, timezone) : text;
|
|
543
730
|
}
|
|
731
|
+
// The time of day an instant falls at in the report's zone: '2:23 PM' in
|
|
732
|
+
// en-US, '14 h 23' in fr-CA.
|
|
733
|
+
export const TIME_SHORT = { hour: 'numeric', minute: '2-digit' };
|
|
734
|
+
// A window's inclusive days, as the server sends them: 'yyyy-MM-dd' calendar
|
|
735
|
+
// days already in the report's zone. Like a date cell they are read as local
|
|
736
|
+
// midnight and written with NO zone, so a viewer in any zone sees the days
|
|
737
|
+
// sent. Both days: Intl's range in the locale ('Sep 1 – 30, 2026' in en-US,
|
|
738
|
+
// '1–30 sept. 2026' in fr-CA, one date when they are the same day). One day:
|
|
739
|
+
// an open window ('Since Sep 1, 2026', 'Through Sep 30, 2026'). Neither, or
|
|
740
|
+
// days that are not real ones: ''.
|
|
741
|
+
export function formatDayRange(start, end, locale, options = DAY_SHORT) {
|
|
742
|
+
const first = parseDay(start);
|
|
743
|
+
const last = parseDay(end);
|
|
744
|
+
if (first && last) {
|
|
745
|
+
return writeDayRange(first, last, locale, options);
|
|
746
|
+
}
|
|
747
|
+
if (first) {
|
|
748
|
+
return `Since ${formatLocalDate(first, locale, options)}`;
|
|
749
|
+
}
|
|
750
|
+
return last ? `Through ${formatLocalDate(last, locale, options)}` : '';
|
|
751
|
+
}
|
|
752
|
+
// The time a window ending today is cut at: the server's UTC
|
|
753
|
+
// 'yyyy-MM-dd HH:mm:ss' instant, as a time of day in the report's zone. ''
|
|
754
|
+
// for none, or for a value of another shape.
|
|
755
|
+
export function formatThroughTime(through, timezone, locale) {
|
|
756
|
+
const dateTime = through ? DATE_TIME_PATTERN.exec(through) : null;
|
|
757
|
+
const instant = dateTime ? parseISO(`${dateTime[1]}T${dateTime[2]}Z`) : null;
|
|
758
|
+
return instant && isValid(instant) ? formatLocalDate(instant, locale, TIME_SHORT, timezone) : '';
|
|
759
|
+
}
|
|
760
|
+
// A comparison or timeframe window in one line: its days, and the time it is
|
|
761
|
+
// cut at when it ends today on a date-and-time column ('Oct 1 – 2, 2026,
|
|
762
|
+
// until 2:23 PM').
|
|
763
|
+
export function formatDayWindow(meta, timezone, locale) {
|
|
764
|
+
const days = formatDayRange(meta.start, meta.end, locale);
|
|
765
|
+
const time = formatThroughTime(meta.through, timezone, locale);
|
|
766
|
+
return days && time ? `${days}, until ${time}` : days;
|
|
767
|
+
}
|
|
768
|
+
// Whether a comparison is read on one day: a comparison of values read at
|
|
769
|
+
// the end of each period, with no time axis of its own (a KPI, a one-row
|
|
770
|
+
// list), whose value is read today and whose prior is read at the end of
|
|
771
|
+
// the period before. Its two windows are those periods, back to back, and
|
|
772
|
+
// each value is read on its window's last day, so the windows are written as
|
|
773
|
+
// those days (formatReadingDay). A spine of several periods sets each period
|
|
774
|
+
// against an earlier one, and its windows are spans like any other
|
|
775
|
+
// comparison's.
|
|
776
|
+
export function isReadOnOneDay(comparison) {
|
|
777
|
+
const current = comparison?.current;
|
|
778
|
+
const prior = comparison?.priors?.[0];
|
|
779
|
+
if (comparison?.mode !== 'period_end' || !current || !prior) {
|
|
780
|
+
return false;
|
|
781
|
+
}
|
|
782
|
+
const priorEnd = parseDay(prior.end);
|
|
783
|
+
const currentStart = parseDay(current.start);
|
|
784
|
+
return !!priorEnd && !!currentStart && addDays(priorEnd, 1).getTime() === currentStart.getTime();
|
|
785
|
+
}
|
|
786
|
+
// The day a value is read on: 'on Sep 15, 2026' ('On …' to open a line), as
|
|
787
|
+
// a chart's tooltip names a prior point read at the end of its period. ''
|
|
788
|
+
// for a day that is not a real one.
|
|
789
|
+
export function formatReadingDay(window, locale, lead = false) {
|
|
790
|
+
const day = formatDay(window.end, locale);
|
|
791
|
+
if (!day) {
|
|
792
|
+
return '';
|
|
793
|
+
}
|
|
794
|
+
return lead ? `On ${day}` : `on ${day}`;
|
|
795
|
+
}
|
|
796
|
+
// One 'yyyy-MM-dd' day in the locale, written with no zone: 'Sep 1, 2026'.
|
|
797
|
+
function formatDay(day, locale) {
|
|
798
|
+
const date = parseDay(day);
|
|
799
|
+
return date ? formatLocalDate(date, locale, DAY_SHORT) : '';
|
|
800
|
+
}
|
|
801
|
+
// A 'yyyy-MM-dd' day as local midnight, or null when it is not a real day.
|
|
802
|
+
function parseDay(day) {
|
|
803
|
+
if (!day || !DATE_ONLY_PATTERN.test(day)) {
|
|
804
|
+
return null;
|
|
805
|
+
}
|
|
806
|
+
const date = parseISO(day);
|
|
807
|
+
return isValid(date) ? date : null;
|
|
808
|
+
}
|
|
809
|
+
// Intl's range writes the shared month and year once. A malformed locale
|
|
810
|
+
// reads the fallback; a runtime that cannot write ranges joins two dates.
|
|
811
|
+
function writeDayRange(first, last, locale, options) {
|
|
812
|
+
const [from, to] = first <= last ? [first, last] : [last, first];
|
|
813
|
+
for (const tag of [locale, resolveReportLocale(locale)]) {
|
|
814
|
+
try {
|
|
815
|
+
return dateFormat(tag, options).formatRange(from, to);
|
|
816
|
+
}
|
|
817
|
+
catch {
|
|
818
|
+
// The next locale, then the joined dates.
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
return `${formatLocalDate(from, locale, options)} – ${formatLocalDate(to, locale, options)}`;
|
|
822
|
+
}
|
|
544
823
|
// English names for a locale and a currency, for the settings selects. The
|
|
545
824
|
// interface stays English whatever the report's locale: 'fr-CA' reads
|
|
546
825
|
// 'Canadian French', 'CAD' reads 'Canadian Dollar'. A runtime without the
|
|
@@ -559,6 +838,176 @@ function displayName(type, code) {
|
|
|
559
838
|
return code;
|
|
560
839
|
}
|
|
561
840
|
}
|
|
841
|
+
// Comparison, window and KPI wording. The server sends codes and fields,
|
|
842
|
+
// never sentences (a window's description is for the agent and the exports'
|
|
843
|
+
// notes, not the screen); the interface words them here, in English like
|
|
844
|
+
// every other label, with any day written in the report's locale.
|
|
845
|
+
const GRANULARITY_UNITS = {
|
|
846
|
+
day: { one: 'day', many: 'days' },
|
|
847
|
+
week: { one: 'week', many: 'weeks' },
|
|
848
|
+
month: { one: 'month', many: 'months' },
|
|
849
|
+
quarter: { one: 'quarter', many: 'quarters' },
|
|
850
|
+
year: { one: 'year', many: 'years' },
|
|
851
|
+
};
|
|
852
|
+
// What a prior lane is called: always so for a named period, and for the
|
|
853
|
+
// previous period when the server names no unit for it.
|
|
854
|
+
const AGAINST_PHRASES = {
|
|
855
|
+
previous_period: 'previous period',
|
|
856
|
+
previous_week: 'previous week',
|
|
857
|
+
previous_month: 'previous month',
|
|
858
|
+
previous_quarter: 'previous quarter',
|
|
859
|
+
previous_year: 'previous year',
|
|
860
|
+
range: 'custom range',
|
|
861
|
+
};
|
|
862
|
+
// A prior lane's label, from its offset rather than from the measure, so a
|
|
863
|
+
// chart regrouped by the viewer says what it now compares. A named period
|
|
864
|
+
// reads by its name whatever shift carries it ('vs previous quarter' for 3
|
|
865
|
+
// months, 'vs previous year' for 364 days or 52 weeks, 'vs custom range').
|
|
866
|
+
// Only the previous period is worded from its unit and count: 'vs previous
|
|
867
|
+
// week', 'vs previous 3 months', 'vs previous 8 days' (a day-length shift).
|
|
868
|
+
export function comparisonOffsetLabel(offset) {
|
|
869
|
+
return `vs ${offsetPhrase(offset)}`;
|
|
870
|
+
}
|
|
871
|
+
function offsetPhrase(offset) {
|
|
872
|
+
if (offset.against !== 'previous_period' || !offset.unit || !offset.count) {
|
|
873
|
+
return AGAINST_PHRASES[offset.against] ?? AGAINST_PHRASES.previous_period;
|
|
874
|
+
}
|
|
875
|
+
return offset.count === 1
|
|
876
|
+
? `previous ${GRANULARITY_UNITS[offset.unit].one}`
|
|
877
|
+
: `previous ${offset.count} ${GRANULARITY_UNITS[offset.unit].many}`;
|
|
878
|
+
}
|
|
879
|
+
// One comparison note as a sentence. The comparison, when given, names the
|
|
880
|
+
// period compared with (its first prior lane).
|
|
881
|
+
export function comparisonNoteText(code, comparison) {
|
|
882
|
+
const offset = comparison?.offsets?.[0] ?? null;
|
|
883
|
+
const compared = offset ? `Compared with the ${offsetPhrase(offset)}` : null;
|
|
884
|
+
switch (code) {
|
|
885
|
+
case 'no_window':
|
|
886
|
+
return 'Pick a date range to see the comparison.';
|
|
887
|
+
case 'unit_inferred':
|
|
888
|
+
return compared
|
|
889
|
+
? `${compared}, judged from the dates picked.`
|
|
890
|
+
: 'The period compared with was judged from the dates picked.';
|
|
891
|
+
case 'window_in_future':
|
|
892
|
+
return 'The date range starts after today, so there is nothing to compare yet.';
|
|
893
|
+
case 'other_date_filter':
|
|
894
|
+
return 'A date filter on another column also applies to both periods.';
|
|
895
|
+
case 'grain_followed':
|
|
896
|
+
return compared
|
|
897
|
+
? `${compared}, following the grouping picked.`
|
|
898
|
+
: 'The comparison follows the grouping picked.';
|
|
899
|
+
default:
|
|
900
|
+
return '';
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
// What a windowed value is: 'Rolling 3-month total', 'Month-to-date total',
|
|
904
|
+
// 'Running total since the start of the data', then its days when the server
|
|
905
|
+
// sends them ('Rolling 7-day average, Sep 24 – 30, 2026'). granularity is the
|
|
906
|
+
// grouping the rows are drawn at (ComponentData.granularity), which names a
|
|
907
|
+
// rolling window authored in periods of the axis.
|
|
908
|
+
export function windowText(meta, locale, granularity) {
|
|
909
|
+
const days = formatDayRange(meta.start, meta.end, locale);
|
|
910
|
+
const phrase = windowPhrase(meta, granularity ?? null);
|
|
911
|
+
return days ? `${phrase}, ${days}` : phrase;
|
|
912
|
+
}
|
|
913
|
+
function windowPhrase(meta, granularity) {
|
|
914
|
+
const value = meta.average ? 'average' : 'total';
|
|
915
|
+
switch (meta.kind) {
|
|
916
|
+
case 'running':
|
|
917
|
+
return meta.fromBeginning ? `Running ${value} since the start of the data` : `Running ${value}`;
|
|
918
|
+
case 'to_date': {
|
|
919
|
+
const reset = meta.resetEvery ? GRANULARITY_UNITS[meta.resetEvery].one : null;
|
|
920
|
+
return reset ? `${capitalize(reset)}-to-date ${value}` : `To-date ${value}`;
|
|
921
|
+
}
|
|
922
|
+
case 'rolling': {
|
|
923
|
+
const unit = meta.unit ?? granularity;
|
|
924
|
+
const span = meta.periods ? `${meta.periods}-${unit ? GRANULARITY_UNITS[unit].one : 'period'} ` : '';
|
|
925
|
+
return `Rolling ${span}${value}`;
|
|
926
|
+
}
|
|
927
|
+
default:
|
|
928
|
+
return capitalize(value);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
// One window note as a sentence.
|
|
932
|
+
export function windowNoteText(code, meta, locale, granularity) {
|
|
933
|
+
switch (code) {
|
|
934
|
+
case 'snapped_start': {
|
|
935
|
+
const start = meta.start ? formatDay(meta.start, locale) : '';
|
|
936
|
+
return start
|
|
937
|
+
? `The start was moved to ${start}, the start of its period, so the first period is whole.`
|
|
938
|
+
: 'The start was moved to the start of its period, so the first period is whole.';
|
|
939
|
+
}
|
|
940
|
+
case 'span_converted':
|
|
941
|
+
return spanConvertedText(meta, granularity ?? null);
|
|
942
|
+
case 'grain_too_coarse':
|
|
943
|
+
return 'The grouping is coarser than the window, so it has no values at this grouping.';
|
|
944
|
+
case 'equal_grain_plain':
|
|
945
|
+
return 'At this grouping each window is a single period, so the values are the plain ones.';
|
|
946
|
+
case 'own_filter_caps_lead_in':
|
|
947
|
+
return 'The query\'s own date condition starts the window, so earlier rows are not counted.';
|
|
948
|
+
case 'week_by_monday':
|
|
949
|
+
return 'A week that spans two periods counts toward the period its Monday falls in.';
|
|
950
|
+
case 'incomplete_head':
|
|
951
|
+
return 'The first periods are blank because there are not enough earlier rows to fill a whole window.';
|
|
952
|
+
default:
|
|
953
|
+
return '';
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
// '3 months are shown as 13 weeks at this grouping.'
|
|
957
|
+
function spanConvertedText(meta, granularity) {
|
|
958
|
+
if (!meta.periods || !meta.unit || !meta.drawnPeriods) {
|
|
959
|
+
return 'The window\'s span was converted to the grouping shown.';
|
|
960
|
+
}
|
|
961
|
+
const authored = unitCount(meta.periods, meta.unit);
|
|
962
|
+
const drawn = granularity
|
|
963
|
+
? unitCount(meta.drawnPeriods, granularity)
|
|
964
|
+
: `${meta.drawnPeriods} ${meta.drawnPeriods === 1 ? 'period' : 'periods'}`;
|
|
965
|
+
return `${authored} ${meta.periods === 1 ? 'is' : 'are'} shown as ${drawn} at this grouping.`;
|
|
966
|
+
}
|
|
967
|
+
function unitCount(count, unit) {
|
|
968
|
+
return `${count} ${count === 1 ? GRANULARITY_UNITS[unit].one : GRANULARITY_UNITS[unit].many}`;
|
|
969
|
+
}
|
|
970
|
+
// Why a KPI's delta reads as it does, as a sentence. The baseline is named
|
|
971
|
+
// by what the value is compared against: the same period last year for a
|
|
972
|
+
// year-on-year comparison, else the period before.
|
|
973
|
+
export function kpiNoteText(code, against) {
|
|
974
|
+
const baseline = kpiBaselineText(against);
|
|
975
|
+
switch (code) {
|
|
976
|
+
case 'no_prior_data':
|
|
977
|
+
return `No baseline: ${baseline} has no data.`;
|
|
978
|
+
case 'up_from_zero':
|
|
979
|
+
return `New: ${baseline} was 0.`;
|
|
980
|
+
case 'no_change':
|
|
981
|
+
return `No change from ${baseline}.`;
|
|
982
|
+
case 'no_data_either':
|
|
983
|
+
return 'No data in either period.';
|
|
984
|
+
case 'sign_change':
|
|
985
|
+
return 'The value crossed zero, so there is no percent change.';
|
|
986
|
+
default:
|
|
987
|
+
return '';
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
// The window a KPI's value is compared with, as a noun phrase. An unknown or
|
|
991
|
+
// missing comparison reads as neutral wording rather than a wrong period.
|
|
992
|
+
function kpiBaselineText(against) {
|
|
993
|
+
switch (against) {
|
|
994
|
+
case 'previous_period':
|
|
995
|
+
return 'the previous period';
|
|
996
|
+
case 'previous_week':
|
|
997
|
+
return 'the previous week';
|
|
998
|
+
case 'previous_month':
|
|
999
|
+
return 'the previous month';
|
|
1000
|
+
case 'previous_quarter':
|
|
1001
|
+
return 'the previous quarter';
|
|
1002
|
+
case 'previous_year':
|
|
1003
|
+
return 'the same period last year';
|
|
1004
|
+
default:
|
|
1005
|
+
return 'the comparison period';
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
function capitalize(text) {
|
|
1009
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
1010
|
+
}
|
|
562
1011
|
// A short, human label for a zone: its city plus the current abbreviation,
|
|
563
1012
|
// e.g. 'America/New_York' reads 'New York (EDT)'. UTC stays 'UTC', and an
|
|
564
1013
|
// unknown zone is shown as its id. An 'Etc/' zone names no city, and its POSIX
|
|
@@ -593,4 +1042,4 @@ export function getZonedNow(timezone) {
|
|
|
593
1042
|
return now;
|
|
594
1043
|
}
|
|
595
1044
|
}
|
|
596
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBV3JFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFvQixPQUFPLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXVCLEtBQUssQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBa0MsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqRixNQUFNLEVBQUUsc0JBQXNCO0lBQzlCLFFBQVEsRUFBRSx3QkFBd0I7SUFDbEMsWUFBWSxFQUFFLElBQUk7Q0FDbkIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFHdEMsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQThCO0lBQ2hFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUM7SUFDbEYsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUsd0RBQXdEO0FBQ3hELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUErQjtJQUNuRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsWUFBWSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7QUFDSCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSx5REFBeUQ7QUFDekQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUErRTtJQUUvRSxPQUFPO1FBQ0wsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDbkQsUUFBUSxFQUFFLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN6RCxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsS0FBSyxPQUFPO0tBQy9DLENBQUM7QUFDSixDQUFDO0FBR0QsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSx5QkFBeUI7QUFDekIsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7QUFDNUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7QUFFNUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFjLEVBQUUsT0FBaUM7SUFDNUUsTUFBTSxHQUFHLEdBQUcsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ25ELElBQUksU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxVQUFVLENBQ3hCLE1BQWMsRUFDZCxPQUFtQyxFQUNuQyxRQUFpQjtJQUVqQixNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztJQUNyRSxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN0RSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUdELHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLDhDQUE4QztBQUM5QywrRUFBK0U7QUFDL0UsMkNBQTJDO0FBQzNDLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsNERBQTREO0FBQzVELHlFQUF5RTtBQUN6RSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsNkVBQTZFO0FBQzdFLGtCQUFrQjtBQUNsQiwyRUFBMkU7QUFDM0UsOEVBQThFO0FBQzlFLDZEQUE2RDtBQUM3RCw4RUFBOEU7QUFDOUUsZ0NBQWdDO0FBQ2hDLDJFQUEyRTtBQUMzRSwyQ0FBMkM7QUFFM0MsaUVBQWlFO0FBQ2pFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN4QiwwRUFBMEU7QUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7QUFDM0IsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLGdFQUFnRTtBQUNoRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixxRUFBcUU7QUFDckUsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFDakMsK0RBQStEO0FBQy9ELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztBQUN4Qix5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sZUFBZSxHQUFHLCtDQUErQyxDQUFDO0FBQ3hFLHVFQUF1RTtBQUN2RSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBNkIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUE2QixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBWWpGLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUEyQjtJQUNwRCxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDekUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0NBQzFFLENBQUMsQ0FBQztBQW1CSCwwRUFBMEU7QUFDMUUsUUFBUTtBQUNSLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYztJQUMzQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25ELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLGdEQUFnRDtBQUNoRCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQThCO0lBQzVELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJO1dBQzVCLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJO1dBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixLQUEyQyxFQUMzQyxTQUFpQixFQUNqQixRQUFnQjtJQUVoQixRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7UUFDakMsS0FBSyxpQkFBaUIsQ0FBQyxRQUFRO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3pCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEQ7WUFDRSxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQztJQUNsQyxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLFNBQWlCLEVBQUUsUUFBZ0I7SUFDcEQsSUFBSSxTQUFTLElBQUksR0FBRyxFQUFFLENBQUM7UUFDckIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUk7UUFDL0MsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFFBQVE7UUFDNUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLHlDQUF5QztBQUN6QyxTQUFTLE9BQU8sQ0FBQyxLQUFhLEVBQUUsUUFBZ0I7SUFDOUMsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1QyxxRUFBcUU7SUFDckUsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFO1FBQ2pELFdBQVcsRUFBRSxLQUFLO1FBQ2xCLHFCQUFxQixFQUFFLENBQUM7UUFDeEIscUJBQXFCLEVBQUUsTUFBTTtLQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUVELHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsWUFBWSxDQUMxQixLQUFjLEVBQ2QsSUFBeUMsRUFDekMsT0FBNEIsRUFDNUIsVUFBK0IsRUFBRTtJQUVqQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakQsTUFBTSxLQUFLLEdBQUcsS0FBSyxLQUFLLGlCQUFpQixDQUFDLE9BQU87UUFDL0MsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUk7UUFDeEIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsSUFBSSxlQUFlLENBQUMsQ0FBQztJQUN0RixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNoRyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTFHLE9BQU8sS0FBSyxLQUFLLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMxRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztJQUNsQyxPQUFPLEtBQUssS0FBSyxJQUFJO1dBQ2hCLEtBQUssS0FBSyxTQUFTO1dBQ25CLEtBQUssS0FBSyxFQUFFO1dBQ1osS0FBSyxLQUFLLEdBQUc7V0FDYixDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLFNBQVMsV0FBVyxDQUFDLElBQXlDO0lBQzVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDNUYsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLElBQXlDO0lBQzdELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztBQUN2RCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLHdEQUF3RDtBQUN4RCxTQUFTLGFBQWEsQ0FBQyxRQUFtQztJQUN4RCxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUM5RCxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDWCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLEtBQXdCLEVBQ3hCLE9BQTRCLEVBQzVCLFFBQXVCLEVBQ3ZCLE1BQWU7SUFFZixNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXRGLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLGlCQUFpQixDQUFDLFFBQVE7WUFDN0IsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ3JFLEtBQUssaUJBQWlCLENBQUMsT0FBTztZQUM1QixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDekY7WUFDRSxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFFBQTRCO0lBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDcEUsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxlQUFlO0FBQ2YsU0FBUyxlQUFlLENBQUMsS0FBd0IsRUFBRSxNQUFlO0lBQ2hFLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsUUFBUSxLQUFLLEVBQUUsQ0FBQztRQUNkLEtBQUssaUJBQWlCLENBQUMsT0FBTztZQUM1QixPQUFPLGdCQUFnQixDQUFDO1FBQzFCLEtBQUssaUJBQWlCLENBQUMsUUFBUTtZQUM3QixPQUFPLGlCQUFpQixDQUFDO1FBQzNCO1lBQ0UsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztBQUNILENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLFNBQVMsb0JBQW9CLENBQUMsTUFBcUIsRUFBRSxPQUFzQjtJQUN6RSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNwQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzFFLENBQUM7SUFFRCxPQUFPLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUYsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsU0FBUyxXQUFXLENBQUMsU0FBNEIsRUFBRSxLQUFhLEVBQUUsTUFBZTtJQUMvRSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFN0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRyxPQUFPO1FBQ0wsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU07UUFDTixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUNuRCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUseUJBQXlCO0FBQ3pCLFNBQVMsZUFBZSxDQUFDLFNBQTRCLEVBQUUsS0FBOEI7SUFDbkYsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztJQUU5RixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztXQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUF3QjtJQUN2RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVqRSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDeEQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsSUFBc0I7SUFDOUMsT0FBTztRQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsSUFBc0IsRUFDdEIsSUFBWSxFQUNaLE9BQTRCO0lBRTVCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sS0FBSyxHQUFHLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxPQUFPO1FBQy9DLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJO1FBQ3hCLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxDQUFDO0lBRWpFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNyRixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSx3RUFBd0U7QUFDeEUsb0NBQW9DO0FBQ3BDLFNBQVMsWUFBWSxDQUNuQixLQUF3QixFQUN4QixLQUFvQixFQUNwQixJQUFZLEVBQ1osT0FBNEI7SUFFNUIsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVyQyxJQUFJLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssaUJBQWlCLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZO1FBQzNFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUc7UUFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRixPQUFPLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxRQUFRLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUM1RyxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLDRCQUE0QjtBQUM1QixTQUFTLFFBQVEsQ0FBQyxLQUFhO0lBQzdCLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQy9CLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNkLElBQUksUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksR0FBRyxDQUFDLENBQUM7SUFDWCxDQUFDO1NBQU0sSUFBSSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNYLENBQUM7U0FBTSxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztTQUFNLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsT0FBTyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsK0RBQStEO0FBQy9ELDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDRCQUE0QjtBQUM1QixNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLElBQXNCLEVBQ3RCLE9BQTRCLEVBQzVCLEtBQXdCLEVBQ3hCLE1BQTJCLEVBQzNCLE9BQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLEtBQUssaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdGLElBQUksS0FBSyxLQUFLLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzVFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztJQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUV4RSxJQUFJLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFFakMsSUFBSSxLQUFLLEtBQUssaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2QyxPQUFPLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3ZELENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3pDLENBQUM7QUFVRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUEwQixDQUFDO0FBRTNELFNBQVMsY0FBYyxDQUFDLE9BQTRCO0lBQ2xELE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEQsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXZDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkcsTUFBTSxNQUFNLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDdEYsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ3pCLElBQUksQ0FBQyxFQUFFLENBQUM7YUFDUixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXJCLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBR0QsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsbUJBQW1CO0FBQ25CLE1BQU0sWUFBWSxHQUE2QixFQUFFLHFCQUFxQixFQUFFLEVBQUUsRUFBRSxDQUFDO0FBRTdFLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsTUFBdUI7SUFDdkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN2QyxDQUFDLENBQUMsS0FBSztRQUNQLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFFM0UsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzlCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUdELHFFQUFxRTtBQUNyRSw2RUFBNkU7QUFDN0UsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUU3QyxnRkFBZ0Y7QUFDaEYsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsa0VBQWtFO0FBQ2xFLEVBQUU7QUFDRixnQ0FBZ0M7QUFDaEMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQTJCLEVBQUUsT0FBZ0I7SUFDL0UsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSxpREFBaUQ7QUFDakQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUEyQixFQUFFLE9BQWdCO0lBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2RixPQUFPLE9BQU87UUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVO2FBQ2hFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFHRCwwRUFBMEU7QUFDMUUsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLCtDQUErQztBQUMvQyxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBc0Q7SUFDMUYsT0FBTyxNQUFNLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO0FBQ3pHLENBQUM7QUFHRCxnRUFBZ0U7QUFDaEUsK0RBQStEO0FBQy9ELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBK0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ3pHLHFFQUFxRTtBQUNyRSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQStCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUN2RywyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUErQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN4RSwyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUErQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3pGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQStCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFFeEYsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw4RUFBOEU7QUFDOUUseUVBQXlFO0FBQ3pFLHVFQUF1RTtBQUN2RSxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFVLEVBQ1YsTUFBdUIsRUFDdkIsT0FBbUMsRUFDbkMsUUFBaUI7SUFFakIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQ3pCLElBQVUsRUFDVixNQUF1QixFQUN2QixPQUFtQyxFQUNuQyxRQUFpQjtJQUVqQixJQUFJLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztBQUNILENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLGtFQUFrRTtBQUNsRSxTQUFTLFNBQVMsQ0FBQyxTQUE4QixFQUFFLElBQVU7SUFDM0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDakMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1NBQ2pDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUM5RSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxDQUFDO0FBR0QsTUFBTSxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztBQUNoRCxNQUFNLGlCQUFpQixHQUFHLHNEQUFzRCxDQUFDO0FBRWpGLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLG9FQUFvRTtBQUNwRSwyRUFBMkU7QUFDM0UsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSwwREFBMEQ7QUFDMUQsK0VBQStFO0FBQy9FLGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLDhEQUE4RDtBQUM5RCw4RUFBOEU7QUFDOUUsa0JBQWtCO0FBQ2xCLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsS0FBYyxFQUNkLFFBQWdCLEVBQ2hCLE1BQXVCO0lBRXZCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMxRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFM0IsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDekYsQ0FBQztBQUdELDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsMEVBQTBFO0FBQzFFLHdCQUF3QjtBQUN4QixNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQW9CO0lBQzdDLE9BQU8sV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUF3QjtJQUNuRCxPQUFPLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQTZCLEVBQUUsSUFBWTtJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2xFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBR0QsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDdkIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkUsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSztZQUMxQixDQUFDLENBQUMsWUFBWTtZQUNkLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssWUFBWSxHQUFHLENBQUM7SUFDOUUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBR0QsK0VBQStFO0FBQy9FLG9FQUFvRTtBQUNwRSwrRUFBK0U7QUFDL0UscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxXQUFXLENBQUMsUUFBZ0I7SUFDMUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV2QixJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1ZhbGlkLCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGZvcm1hdEluVGltZVpvbmUsIHRvWm9uZWRUaW1lIH0gZnJvbSAnZGF0ZS1mbnMtdHonO1xuXG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0TnVtYmVyVW5pdHMgfSBmcm9tICcuL2VudW1zL3JlcG9ydC1udW1iZXItdW5pdHMuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRWYWx1ZUZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7XG4gIENoYXJ0TWVhc3VyZSxcbiAgTnVtYmVyRm9ybWF0U3BlYyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDdXJyZW5jeUNvZGUsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydExvY2FsZVRhZyxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoYXQgYSByZXBvcnQgcmVhZHMgd2hlbiB0aGUgc2VydmVyIG5hbWVzIG5vIHVzYWJsZSBsb2NhbGUgb3IgY3VycmVuY3k6IGFuXG4vLyBvbGRlciBzZXJ2ZXIgdGhhdCBzZW5kcyBuZWl0aGVyLCBvciBhIHZhbHVlIHRoaXMgYnJvd3NlcidzIEludGwgY2Fubm90IHVzZS5cbi8vIE5ldmVyIHRoZSBicm93c2VyJ3Mgb3duIGxvY2FsZSwgc28gZXZlcnkgdmlld2VyIG9mIGEgcmVwb3J0IHNlZXMgdGhlIHNhbWUgdGV4dC5cbmV4cG9ydCBjb25zdCBSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFOiBSZXBvcnRMb2NhbGVUYWcgPSAnZW4tVVMnO1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWTogUmVwb3J0Q3VycmVuY3lDb2RlID0gJ1VTRCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1BVF9DT05URVhUOiBSZWFkb25seTxSZXBvcnRGb3JtYXRDb250ZXh0PiA9IE9iamVjdC5mcmVlemUoe1xuICBsb2NhbGU6IFJFUE9SVF9GQUxMQkFDS19MT0NBTEUsXG4gIGN1cnJlbmN5OiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1ksXG4gIHJhdGlvUGVyY2VudDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBDVVJSRU5DWV9QQVRURVJOID0gL15bQS1aXXszfSQvO1xuXG5cbi8vIFRoZSBzZXJ2ZXIncyByZXNvbHZlZCBsb2NhbGUgYXMgb25lIHRoaXMgYnJvd3NlciBjYW4gZm9ybWF0IGluLiBBIG1hbGZvcm1lZFxuLy8gdGFnICgnZW5fQ0EnKSBtYWtlcyBzdXBwb3J0ZWRMb2NhbGVzT2YgdGhyb3csIGFuZCBvbmUgSW50bCBoYXMgbm8gZGF0YSBmb3Jcbi8vICgneHgtWVknKSBjb21lcyBiYWNrIGVtcHR5OyBib3RoIHJlYWQgdGhlIGZhbGxiYWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZXBvcnRMb2NhbGUodGFnOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0TG9jYWxlVGFnIHtcbiAgaWYgKCF0YWcpIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdGFnXSlbMF0gPz8gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFJFUE9SVF9GQUxMQkFDS19MT0NBTEU7XG4gIH1cbn1cblxuLy8gVGhlIHNlcnZlcidzIHJlc29sdmVkIGN1cnJlbmN5IGFzIG9uZSBJbnRsIGNhbiBsYWJlbC4gVGhlIHNlcnZlciBkZWNpZGVzXG4vLyB3aGljaCBjb2RlcyBuYW1lIG1vbmV5OyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYSBjb2RlIEludGwgY2Fubm90IHRha2UgYXRcbi8vIGFsbC4gSXQgaXMgbmV2ZXIgY2hlY2tlZCBhZ2FpbnN0IHRoZSBydW50aW1lJ3Mgb3duIGN1cnJlbmN5IGxpc3QsIHdoaWNoXG4vLyBkaWZmZXJzIGJldHdlZW4gYnJvd3NlcnMgYW5kIGxlYXZlcyBvdXQgY29kZXMgdGhlIHNlcnZlciBvZmZlcnMgKFZFRiwgTVJPKSxcbi8vIHNvIGV2ZXJ5IHZpZXdlciBsYWJlbHMgYSByZXBvcnQncyBtb25leSB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRDdXJyZW5jeUNvZGUge1xuICBpZiAoIWNvZGUgfHwgIUNVUlJFTkNZX1BBVFRFUk4udGVzdChjb2RlKSkge1xuICAgIHJldHVybiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH1cblxuICB0cnkge1xuICAgIG51bWJlckZvcm1hdChSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogY29kZSB9KTtcblxuICAgIHJldHVybiBjb2RlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9XG59XG5cbi8vIFRoZSBvbmUgcGxhY2UgYSByZXBvcnQncyBmb3JtYXQgY29udGV4dCBpcyBidWlsdDogdGhlIHNlcnZlcidzIGVmZmVjdGl2ZVxuLy8gbG9jYWxlIGFuZCBjdXJyZW5jeSAoYWJzZW50IG9uIGFuIG9sZGVyIHNlcnZlciwgd2hpY2ggdGhlbiByZWFkcyBlbi1VUy9VU0QpXG4vLyBhbmQgd2hldGhlciBpdHMgcGVyY2VudCBtZWFzdXJlcyBhcnJpdmUgYXMgMC0xIHJhdGlvcy5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm9ybWF0Q29udGV4dChcbiAgcmVwb3J0OiBQaWNrPFJlcG9ydCwgJ2VmZmVjdGl2ZUxvY2FsZScgfCAnZWZmZWN0aXZlQ3VycmVuY3knIHwgJ3BlcmNlbnRGb3JtYXQnPixcbik6IFJlcG9ydEZvcm1hdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGxvY2FsZTogcmVzb2x2ZVJlcG9ydExvY2FsZShyZXBvcnQuZWZmZWN0aXZlTG9jYWxlKSxcbiAgICBjdXJyZW5jeTogcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSksXG4gICAgcmF0aW9QZXJjZW50OiByZXBvcnQucGVyY2VudEZvcm1hdCA9PT0gJ3JhdGlvJyxcbiAgfTtcbn1cblxuXG4vLyBCdWlsZGluZyBhbiBJbnRsIGZvcm1hdHRlciBpcyBmYXIgc2xvd2VyIHRoYW4gdXNpbmcgb25lLCBhbmQgYSBjaGFydCBmb3JtYXRzXG4vLyBldmVyeSB0aWNrIGFuZCB0b29sdGlwIHZhbHVlLCBzbyBlYWNoIGRpc3RpbmN0IGxvY2FsZSArIG9wdGlvbnMgKCsgem9uZSkgaXNcbi8vIGJ1aWx0IG9uY2UgYW5kIHJldXNlZC5cbmNvbnN0IE5VTUJFUl9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuY29uc3QgREFURV9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuRGF0ZVRpbWVGb3JtYXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyk6IEludGwuTnVtYmVyRm9ybWF0IHtcbiAgY29uc3Qga2V5ID0gYCR7bG9jYWxlfXwke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWA7XG4gIGxldCBmb3JtYXR0ZXIgPSBOVU1CRVJfRk9STUFUUy5nZXQoa2V5KTtcblxuICBpZiAoIWZvcm1hdHRlcikge1xuICAgIGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIG9wdGlvbnMpO1xuICAgIE5VTUJFUl9GT1JNQVRTLnNldChrZXksIGZvcm1hdHRlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyO1xufVxuXG4vLyBObyB6b25lIGZvcm1hdHMgaW4gdGhlIGJyb3dzZXIncyBvd24gem9uZSwgd2hpY2ggaXMgcmlnaHQgZm9yIGEgY2FsZW5kYXIgZGF5XG4vLyBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHQ6IHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRm9ybWF0KFxuICBsb2NhbGU6IHN0cmluZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogSW50bC5EYXRlVGltZUZvcm1hdCB7XG4gIGNvbnN0IGtleSA9IGAke2xvY2FsZX18JHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX18JHt0aW1lWm9uZSA/PyAnJ31gO1xuICBsZXQgZm9ybWF0dGVyID0gREFURV9GT1JNQVRTLmdldChrZXkpO1xuXG4gIGlmICghZm9ybWF0dGVyKSB7XG4gICAgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IC4uLm9wdGlvbnMsIHRpbWVab25lIH0pO1xuICAgIERBVEVfRk9STUFUUy5zZXQoa2V5LCBmb3JtYXR0ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlcjtcbn1cblxuXG4vLyBOdW1iZXIgZm9ybWF0dGluZzogdGhlIG9uZSBlbmdpbmUgYmVoaW5kIGV2ZXJ5IG51bWVyaWMgc2xvdCAoYSBjaGFydFxuLy8gbWVhc3VyZSwgYSBLUEkgbWVhc3VyZSwgYSBsaXN0IGNvbHVtbiwgYSBjcm9zcy10YWIncyBjZWxscyksIHNvIGEgZm9ybWF0XG4vLyBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiBzY3JlZW4sIGluIHRoZSBQREYgYW5kIGluIFBvd2VyUG9pbnQuIFRoZSBkYXRhIHN0YXlzXG4vLyByYXc7IG9ubHkgd2hhdCBpcyBzaG93biBjaGFuZ2VzLiBUaGUgcnVsZXM6XG4vLyAtIEVtcHR5OiBudWxsLCB1bmRlZmluZWQsICcnLCAnLScgYW5kIGEgbm9uLWZpbml0ZSBudW1iZXIgcHJpbnQgdGhlIGNhbGxlcidzXG4vLyAgIGBlbXB0eWAgKCfigJQnIHVubGVzcyBpdCBuYW1lcyBhbm90aGVyKS5cbi8vIC0gTnVtZXJpYzogYSBmaW5pdGUgbnVtYmVyLCBvciBhIHN0cmluZyB0aGF0IHNwZWxscyBvbmUgcGxhaW5seSAoJzEyMzQuNTAnLFxuLy8gICAnLTNlMicpLiBBbnl0aGluZyBlbHNlICgnJDEsMjM0JywgYW4gaWQgd2l0aCBsZXR0ZXJzLCAnICcpIHByaW50cyBhcyBpdFxuLy8gICBjYW1lLCBzaW5jZSBhIGNvbHVtbiB0aGUgU1FMIGFscmVhZHkgZm9ybWF0dGVkIGlzIHRleHQuXG4vLyAtIFN0eWxlczogbnVtYmVyIGlzIGEgcGxhaW4gZGVjaW1hbDsgY3VycmVuY3kgaXMgdGhlIHJlcG9ydCdzIGN1cnJlbmN5XG4vLyAgIHdyaXR0ZW4gaW4gaXRzIGxvY2FsZSB3aXRoIGl0cyBzeW1ib2wgKFVTRCByZWFkcyAnJDEsMjM1JyBpbiBlbi1VUyBhbmRcbi8vICAgJ1VTJDEsMjM1JyBpbiBlbi1DQTsgRVVSIHJlYWRzICcxIDIzNSDigqwnIGluIGZyLUZSKTsgcGVyY2VudCB0YWtlcyBhIDAtMVxuLy8gICByYXRpbyAoMC4zIHJlYWRzIDMwJSksIG9yLCBmcm9tIGFuIG9sZGVyIHNlcnZlciB0aGF0IHNlbmRzIHBlcmNlbnQgdmFsdWVzXG4vLyAgIGFscmVhZHkgeDEwMCwgYSBkZWNpbWFsIHdpdGggYSAlIHNpZ24uIFByZWNpc2lvbiBvciB1bml0cyB3aXRob3V0IGEgZm9ybWF0XG4vLyAgIG1lYW4gbnVtYmVyLlxuLy8gLSBEZWNpbWFsczogYSBwcmVjaXNpb24gcGlucyBib3RoIHRoZSBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bSwgc28gYSBjb2x1bW5cbi8vICAgb2YgcmF0ZXMgbGluZXMgdXAuIFdpdGhvdXQgb25lOiBhdCBtb3N0IG9uZSBmb3IgYSBwZXJjZW50IGFuZCBmb3IgYW5cbi8vICAgYWJicmV2aWF0ZWQgdmFsdWUgKDEuMkspLCB3aG9sZSB1bml0cyBmb3IgY3VycmVuY3ksIHRoZSBsb2NhbGUncyBkZWZhdWx0XG4vLyAgIGZvciBhIG51bWJlci5cbi8vIC0gVW5pdHM6IHRob3VzYW5kcyBhbmQgbWlsbGlvbnMgZGl2aWRlIGFuZCBhZGQgYSBLIG9yIE0gYWZ0ZXIgdGhlIGRpZ2l0c1xuLy8gICAoJyQxLjJLJywgJzEsMksgJCcpOyBhdXRvIHBpY2tzIHBlciB2YWx1ZSBieSBzaXplLCBhbmQgYSB2YWx1ZSB0aGF0IHdvdWxkXG4vLyAgIHJvdW5kIHRvIDEwMDBLIHJlYWRzIDFNLiBVbml0cyBuZXZlciBhcHBseSB0byBhIHBlcmNlbnQuXG4vLyAtIE5lZ2F0aXZlcyBrZWVwIHRoZSBsb2NhbGUncyBsZWFkaW5nIG1pbnVzLiBBIG5lZ2F0aXZlIHRoYXQgcm91bmRzIHRvIHplcm9cbi8vICAgcHJpbnRzIGFzIHplcm8sIG5ldmVyICctMCcuXG4vLyAtIFJvdW5kaW5nIGlzIEludGwncywgb24gdGhlIGRpZ2l0cyBzaG93bi4gRXZlcnkgdmFsdWUgaXMgd3JpdHRlbiBpbiB0aGVcbi8vICAgY29udGV4dCdzIGxvY2FsZSwgbmV2ZXIgdGhlIGJyb3dzZXIncy5cblxuLy8gVGhlIG1vc3QgZGVjaW1hbHMgYSBwcmVjaXNpb24gcGluczogdGhlIHNlcnZlcidzIHNjaGVtYSBib3VuZC5cbmNvbnN0IE1BWF9QUkVDSVNJT04gPSA2O1xuLy8gQXQgbW9zdCBvbmUgZGVjaW1hbCBmb3IgYSBwZXJjZW50LCBhbmQgZm9yIGFuIGFiYnJldmlhdGVkIHZhbHVlICgxLjJLKS5cbmNvbnN0IFBFUkNFTlRfREVDSU1BTFMgPSAxO1xuY29uc3QgU0NBTEVEX0RFQ0lNQUxTID0gMTtcbi8vIE1vbmV5IHNob3dzIHdob2xlIHVuaXRzIHVubGVzcyBhIHByZWNpc2lvbiBhc2tzIGZvciBkZWNpbWFscy5cbmNvbnN0IENVUlJFTkNZX0RFQ0lNQUxTID0gMDtcbi8vIEEgY3VycmVuY3kgYXhpcyB3aG9zZSB0aWNrcyBuZWVkIGRlY2ltYWxzIHNob3dzIGNlbnRzLCBub3QgdGVudGhzLlxuY29uc3QgQ1VSUkVOQ1lfQVhJU19ERUNJTUFMUyA9IDI7XG4vLyBXaGF0IGEgbWlzc2luZyB2YWx1ZSBwcmludHMgdW5sZXNzIHRoZSBjYWxsZXIgbmFtZXMgaXRzIG93bi5cbmNvbnN0IEVNUFRZX1ZBTFVFID0gJ+KAlCc7XG4vLyBUaGUgdGljayBjb3VudCBhIHZhbHVlIGF4aXMgYWltcyBmb3IsIGFzIEVDaGFydHMnIHNwbGl0TnVtYmVyIGRlZmF1bHQuXG5jb25zdCBBWElTX1RJQ0tTID0gNTtcblxuY29uc3QgTlVNRVJJQ19QQVRURVJOID0gL15cXHMqWy0rXT8oXFxkK1xcLj9cXGQqfFxcLlxcZCspKFtlRV1bLStdP1xcZCspP1xccyokLztcbi8vIFRoZSBmb3JtYXRUb1BhcnRzIHR5cGVzIHRoYXQgY2FycnkgYSBudW1iZXIncyBkaWdpdHMgYW5kIHNlcGFyYXRvcnMuXG5jb25zdCBOVU1CRVJfUEFSVFMgPSBuZXcgU2V0PEludGwuTnVtYmVyRm9ybWF0UGFydFR5cGVzPihbJ2ludGVnZXInLCAnZ3JvdXAnLCAnZGVjaW1hbCcsICdmcmFjdGlvbiddKTtcbmNvbnN0IERJR0lUX1BBUlRTID0gbmV3IFNldDxJbnRsLk51bWJlckZvcm1hdFBhcnRUeXBlcz4oWydpbnRlZ2VyJywgJ2ZyYWN0aW9uJ10pO1xuXG4vLyBBIG51bWVyaWMgZm9ybWF0J3MgdW5pdHMgb25jZSBkZWNpZGVkOiBhdXRvIGlzIHJlc29sdmVkIHRvIG9uZSBvZiB0aGVzZS5cbmV4cG9ydCB0eXBlIFJlc29sdmVkVW5pdHMgPSBSZXBvcnROdW1iZXJVbml0cy5Ob25lIHwgUmVwb3J0TnVtYmVyVW5pdHMuVGhvdXNhbmRzIHwgUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnM7XG5cbmludGVyZmFjZSBVbml0U2NhbGUge1xuICBkaXZpc29yOiBudW1iZXI7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICAvLyBUaGUgUG93ZXJQb2ludC9FeGNlbCBzY2FsaW5nIGNvbW1hczogZWFjaCBvbmUgZGl2aWRlcyBieSAxLDAwMC5cbiAgY29tbWFzOiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOSVRfU0NBTEVTID0gbmV3IE1hcDxSZXNvbHZlZFVuaXRzLCBVbml0U2NhbGU+KFtcbiAgW1JlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcywgeyBkaXZpc29yOiAxZTMsIHN1ZmZpeDogJ0snLCBjb21tYXM6ICcsJyB9XSxcbiAgW1JlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLCB7IGRpdmlzb3I6IDFlNiwgc3VmZml4OiAnTScsIGNvbW1hczogJywsJyB9XSxcbl0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE51bWJlck9wdGlvbnMge1xuICAvLyBXaGF0IGFuIGVtcHR5IHZhbHVlIHByaW50czogJ+KAlCcgZm9yIGEgS1BJIG9yIGEgdG9vbHRpcCwgJycgZm9yIGEgY2VsbC5cbiAgZW1wdHk/OiBzdHJpbmc7XG4gIC8vIFVuaXRzIGFscmVhZHkgZGVjaWRlZCBmb3IgdGhlIHdob2xlIGNoYXJ0LCBpbiBwbGFjZSBvZiB0aGUgc3BlYydzIG93bi5cbiAgdW5pdHM/OiBSZXNvbHZlZFVuaXRzO1xuICAvLyBEZWNpbWFscyBhbHJlYWR5IGRlY2lkZWQgZm9yIHRoZSB3aG9sZSBjaGFydCwgcGlubmVkIGFzIG1pbiBhbmQgbWF4LiBudWxsXG4gIC8vIGxlYXZlcyB0aGUgc3BlYydzIG93bi5cbiAgZGVjaW1hbHM/OiBudW1iZXIgfCBudWxsO1xufVxuXG4vLyBIb3cgYSBjaGFydCdzIHZhbHVlIGF4aXMgd3JpdGVzIGl0cyB0aWNrcywgZGVjaWRlZCBvbmNlIHBlciBjaGFydC5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnROdW1iZXJGb3JtYXQge1xuICB1bml0czogUmVzb2x2ZWRVbml0cztcbiAgLy8gUGlubmVkIGRlY2ltYWxzLCBvciBudWxsIGZvciBhIHBsYWluIG51bWJlciB3aG9zZSB0aWNrcyBrZWVwIHRoZWlyIG93bi5cbiAgZGVjaW1hbHM6IG51bWJlciB8IG51bGw7XG59XG5cbi8vIFRoZSB2YWx1ZSBhcyBhIGZpbml0ZSBudW1iZXIgd2hlbiBpdCBpcyBvbmUgb3IgcGxhaW5seSBzcGVsbHMgb25lLCBlbHNlXG4vLyBudWxsLlxuZXhwb3J0IGZ1bmN0aW9uIHRvRmluaXRlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCAhTlVNRVJJQ19QQVRURVJOLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyKHZhbHVlKTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpID8gbnVtZXJpYyA6IG51bGw7XG59XG5cbi8vIFdoZXRoZXIgYSBzbG90IGFza3MgdG8gYmUgZm9ybWF0dGVkIGF0IGFsbC4gQSBzbG90IHdpdGhvdXQgdGhlc2Uga2V5cywgb3IgYVxuLy8gbGlzdCBjb2x1bW4gd2hvc2UgZm9ybWF0IGlzIGRhdGUsIGtlZXBzIGl0cyBvd24gcmVuZGVyaW5nLiBVbml0cyBub25lIGlzIHRoZVxuLy8gc2FtZSBhcyBubyB1bml0cyBrZXksIGFzIGl0IGlzIG9uIHRoZSBzZXJ2ZXIuXG5leHBvcnQgZnVuY3Rpb24gaGFzTnVtYmVyRm9ybWF0KHNwZWM/OiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCk6IGJvb2xlYW4ge1xuICBpZiAoIXNwZWMgfHwgc3BlYy5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZUZvcm1hdChzcGVjKSAhPT0gbnVsbFxuICAgIHx8IChzcGVjLnByZWNpc2lvbiA/PyBudWxsKSAhPT0gbnVsbFxuICAgIHx8ICgoc3BlYy51bml0cyA/PyBSZXBvcnROdW1iZXJVbml0cy5Ob25lKSAhPT0gUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSk7XG59XG5cbi8vIFRoZSB1bml0cyBhIHZhbHVlIGlzIHdyaXR0ZW4gaW4uIGF1dG8gZGVjaWRlcyBieSB0aGUgbWFnbml0dWRlOiBhIG1pbGxpb25cbi8vIGFuZCB1cCByZWFkcyBNLCBhIHRob3VzYW5kIGFuZCB1cCBLLCB1bmxlc3MgdGhlIHZhbHVlIHdvdWxkIHRoZW4gcm91bmQgdG9cbi8vIDEwMDBLIGF0IHRoZXNlIGRlY2ltYWxzLCB3aGljaCByZWFkcyAxTSBpbnN0ZWFkLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVVbml0cyhcbiAgdW5pdHM6IFJlcG9ydE51bWJlclVuaXRzIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbWFnbml0dWRlOiBudW1iZXIsXG4gIGRlY2ltYWxzOiBudW1iZXIsXG4pOiBSZXNvbHZlZFVuaXRzIHtcbiAgc3dpdGNoICh1bml0cykge1xuICAgIGNhc2UgUmVwb3J0TnVtYmVyVW5pdHMuVGhvdXNhbmRzOlxuICAgIGNhc2UgUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnM6XG4gICAgICByZXR1cm4gdW5pdHM7XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5BdXRvOlxuICAgICAgcmV0dXJuIGF1dG9Vbml0cyhNYXRoLmFicyhtYWduaXR1ZGUpLCBkZWNpbWFscyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBSZXBvcnROdW1iZXJVbml0cy5Ob25lO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF1dG9Vbml0cyhtYWduaXR1ZGU6IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IFJlc29sdmVkVW5pdHMge1xuICBpZiAobWFnbml0dWRlID49IDFlNikge1xuICAgIHJldHVybiBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9ucztcbiAgfVxuXG4gIGlmIChtYWduaXR1ZGUgPCAxZTMpIHtcbiAgICByZXR1cm4gUmVwb3J0TnVtYmVyVW5pdHMuTm9uZTtcbiAgfVxuXG4gIHJldHVybiByb3VuZFRvKG1hZ25pdHVkZSAvIDFlMywgZGVjaW1hbHMpID49IDEwMDBcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zXG4gICAgOiBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHM7XG59XG5cbi8vIFRoZSB2YWx1ZSByb3VuZGVkIGFzIEludGwgcm91bmRzIGl0IGZvciBkaXNwbGF5LCBzbyB0aGUgSy10by1NIHByb21vdGlvblxuLy8gYWdyZWVzIHdpdGggdGhlIGRpZ2l0cyBhY3R1YWxseSBzaG93bi5cbmZ1bmN0aW9uIHJvdW5kVG8odmFsdWU6IG51bWJlciwgZGVjaW1hbHM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGRpZ2l0cyA9IGNsYW1wRGVjaW1hbHMoZGVjaW1hbHMpID8/IDA7XG5cbiAgLy8gQSBmaXhlZCBsb2NhbGUgb25seSBzbyBOdW1iZXIoKSBjYW4gcGFyc2UgdGhlIHJvdW5kZWQgZGlnaXRzIGJhY2suXG4gIHJldHVybiBOdW1iZXIobnVtYmVyRm9ybWF0KFJFUE9SVF9GQUxMQkFDS19MT0NBTEUsIHtcbiAgICB1c2VHcm91cGluZzogZmFsc2UsXG4gICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwLFxuICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogZGlnaXRzLFxuICB9KS5mb3JtYXQodmFsdWUpKTtcbn1cblxuLy8gT25lIHZhbHVlLCB3cml0dGVuIGJ5IHRoZSBydWxlcyBhYm92ZS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIoXG4gIHZhbHVlOiB1bmtub3duLFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgb3B0aW9uczogRm9ybWF0TnVtYmVyT3B0aW9ucyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5lbXB0eSA/PyBFTVBUWV9WQUxVRTtcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSB0b0Zpbml0ZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW1lcmljID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZShzcGVjKTtcbiAgY29uc3QgcHJlY2lzaW9uID0gY2xhbXBEZWNpbWFscyhzcGVjPy5wcmVjaXNpb24pO1xuICBjb25zdCB1bml0cyA9IHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50XG4gICAgPyBSZXBvcnROdW1iZXJVbml0cy5Ob25lXG4gICAgOiBvcHRpb25zLnVuaXRzID8/IHJlc29sdmVVbml0cyhzcGVjPy51bml0cywgbnVtZXJpYywgcHJlY2lzaW9uID8/IFNDQUxFRF9ERUNJTUFMUyk7XG4gIGNvbnN0IHNjYWxlID0gVU5JVF9TQ0FMRVMuZ2V0KHVuaXRzKTtcbiAgY29uc3QgZGVjaW1hbHMgPSBjbGFtcERlY2ltYWxzKG9wdGlvbnMuZGVjaW1hbHMpID8/IHByZWNpc2lvbjtcbiAgY29uc3QgZm9ybWF0dGVyID0gbnVtYmVyRm9ybWF0KGNvbnRleHQubG9jYWxlLCBzdHlsZU9wdGlvbnMoc3R5bGUsIGNvbnRleHQsIGRlY2ltYWxzLCAhIXNjYWxlKSk7XG4gIGNvbnN0IHRleHQgPSB3cml0ZU51bWJlcihmb3JtYXR0ZXIsIChudW1lcmljID09PSAwID8gMCA6IG51bWVyaWMpIC8gKHNjYWxlPy5kaXZpc29yID8/IDEpLCBzY2FsZT8uc3VmZml4KTtcblxuICByZXR1cm4gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQgJiYgIWNvbnRleHQucmF0aW9QZXJjZW50ID8gYCR7dGV4dH0lYCA6IHRleHQ7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlWYWx1ZSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGxcbiAgICB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgfHwgdmFsdWUgPT09ICcnXG4gICAgfHwgdmFsdWUgPT09ICctJ1xuICAgIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKTtcbn1cblxuLy8gVGhlIHZhbHVlIGZvcm1hdCBhIHNsb3QgbmFtZXMsIG9yIG51bGwgd2hlbiBpdCBuYW1lcyBub25lIChvciBvbmx5IGRhdGUpLlxuZnVuY3Rpb24gdmFsdWVGb3JtYXQoc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRWYWx1ZUZvcm1hdCB8IG51bGwge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhSZXBvcnRWYWx1ZUZvcm1hdCkuZmluZCgoZm9ybWF0KSA9PiBmb3JtYXQgPT09IHNwZWM/LmZvcm1hdCkgPz8gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlKHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0VmFsdWVGb3JtYXQge1xuICByZXR1cm4gdmFsdWVGb3JtYXQoc3BlYykgPz8gUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyO1xufVxuXG4vLyBBIHVzYWJsZSBkZWNpbWFsIGNvdW50LCBvciBudWxsLiBBIHN0b3JlZCB2YWx1ZSBvdXRzaWRlIHRoZSBzY2hlbWEncyBib3VuZHNcbi8vIGlzIGJyb3VnaHQgaW5zaWRlIHRoZW0gcmF0aGVyIHRoYW4gdGhyb3duIG9uIGJ5IEludGwuXG5mdW5jdGlvbiBjbGFtcERlY2ltYWxzKGRlY2ltYWxzOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgZGVjaW1hbHMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShkZWNpbWFscylcbiAgICA/IE1hdGgubWluKE1BWF9QUkVDSVNJT04sIE1hdGgubWF4KDAsIE1hdGgucm91bmQoZGVjaW1hbHMpKSlcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHN0eWxlT3B0aW9ucyhcbiAgc3R5bGU6IFJlcG9ydFZhbHVlRm9ybWF0LFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBkZWNpbWFsczogbnVtYmVyIHwgbnVsbCxcbiAgc2NhbGVkOiBib29sZWFuLFxuKTogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zIHtcbiAgY29uc3QgZnJhY3Rpb25EaWdpdHMgPSBmcmFjdGlvbkRpZ2l0T3B0aW9ucyhkZWNpbWFscywgZGVmYXVsdERlY2ltYWxzKHN0eWxlLCBzY2FsZWQpKTtcblxuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeTpcbiAgICAgIHJldHVybiB7IC4uLmN1cnJlbmN5T3B0aW9ucyhjb250ZXh0LmN1cnJlbmN5KSwgLi4uZnJhY3Rpb25EaWdpdHMgfTtcbiAgICBjYXNlIFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQ6XG4gICAgICByZXR1cm4gY29udGV4dC5yYXRpb1BlcmNlbnQgPyB7IHN0eWxlOiAncGVyY2VudCcsIC4uLmZyYWN0aW9uRGlnaXRzIH0gOiBmcmFjdGlvbkRpZ2l0cztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZyYWN0aW9uRGlnaXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGN1cnJlbmN5T3B0aW9ucyhjdXJyZW5jeTogUmVwb3J0Q3VycmVuY3lDb2RlKTogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zIHtcbiAgcmV0dXJuIHsgc3R5bGU6ICdjdXJyZW5jeScsIGN1cnJlbmN5LCBjdXJyZW5jeURpc3BsYXk6ICdzeW1ib2wnIH07XG59XG5cbi8vIFRoZSBtb3N0IGRlY2ltYWxzIGEgc3R5bGUgc2hvd3Mgd2hlbiBub3RoaW5nIHBpbnMgdGhlbTsgbnVsbCBsZWF2ZXMgSW50bCdzXG4vLyBvd24gZGVmYXVsdC5cbmZ1bmN0aW9uIGRlZmF1bHREZWNpbWFscyhzdHlsZTogUmVwb3J0VmFsdWVGb3JtYXQsIHNjYWxlZDogYm9vbGVhbik6IG51bWJlciB8IG51bGwge1xuICBpZiAoc2NhbGVkKSB7XG4gICAgcmV0dXJuIFNDQUxFRF9ERUNJTUFMUztcbiAgfVxuXG4gIHN3aXRjaCAoc3R5bGUpIHtcbiAgICBjYXNlIFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQ6XG4gICAgICByZXR1cm4gUEVSQ0VOVF9ERUNJTUFMUztcbiAgICBjYXNlIFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5OlxuICAgICAgcmV0dXJuIENVUlJFTkNZX0RFQ0lNQUxTO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBQaW5uZWQgZGVjaW1hbHMgc2V0IGJvdGggYm91bmRzLiBPdGhlcndpc2UgYSBtYXhpbXVtIGFsc28gc2V0cyB0aGUgbWluaW11bVxuLy8gdG8gemVybywgc28gbm8gZW5naW5lIHRocm93cyBvbiBhIG1heGltdW0gYmVsb3cgYSBjdXJyZW5jeSdzIG93biBtaW5pbXVtLlxuZnVuY3Rpb24gZnJhY3Rpb25EaWdpdE9wdGlvbnMocGlubmVkOiBudW1iZXIgfCBudWxsLCBtYXhpbXVtOiBudW1iZXIgfCBudWxsKTogSW50bC5OdW1iZXJGb3JtYXRPcHRpb25zIHtcbiAgaWYgKHBpbm5lZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogcGlubmVkLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IHBpbm5lZCB9O1xuICB9XG5cbiAgcmV0dXJuIG1heGltdW0gPT09IG51bGwgPyB7fSA6IHsgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG1heGltdW0gfTtcbn1cblxuLy8gVGhlIGZvcm1hdHRlZCB2YWx1ZSwgd2l0aCB0aGUgdW5pdHMgbGV0dGVyIGFmdGVyIGl0cyBkaWdpdHMuIEEgbmVnYXRpdmVcbi8vIHdob3NlIHNob3duIGRpZ2l0cyBhcmUgYWxsIHplcm8gaXMgd3JpdHRlbiBhcyB6ZXJvLCBzbyBubyAnLTAnIGFwcGVhcnMuXG5mdW5jdGlvbiB3cml0ZU51bWJlcihmb3JtYXR0ZXI6IEludGwuTnVtYmVyRm9ybWF0LCB2YWx1ZTogbnVtYmVyLCBzdWZmaXg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPj0gMCAmJiAhc3VmZml4KSB7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodmFsdWUpO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cyh2YWx1ZSk7XG5cbiAgaWYgKHZhbHVlIDwgMCAmJiAhaGFzTm9uWmVyb0RpZ2l0KGZvcm1hdHRlciwgcGFydHMpKSB7XG4gICAgcmV0dXJuIHdyaXRlTnVtYmVyKGZvcm1hdHRlciwgMCwgc3VmZml4KTtcbiAgfVxuXG4gIGlmICghc3VmZml4KSB7XG4gICAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSkuam9pbignJyk7XG4gIH1cblxuICBjb25zdCBsYXN0ID0gcGFydHMucmVkdWNlKChmb3VuZCwgcGFydCwgaW5kZXgpID0+IE5VTUJFUl9QQVJUUy5oYXMocGFydC50eXBlKSA/IGluZGV4IDogZm91bmQsIC0xKTtcblxuICByZXR1cm4gW1xuICAgIC4uLnBhcnRzLnNsaWNlKDAsIGxhc3QgKyAxKS5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLFxuICAgIHN1ZmZpeCxcbiAgICAuLi5wYXJ0cy5zbGljZShsYXN0ICsgMSkubWFwKChwYXJ0KSA9PiBwYXJ0LnZhbHVlKSxcbiAgXS5qb2luKCcnKTtcbn1cblxuLy8gQ29tcGFyZWQgd2l0aCB0aGUgbG9jYWxlJ3Mgb3duIHplcm8sIHNvIGEgbnVtYmVyaW5nIHN5c3RlbSBvdGhlciB0aGFuXG4vLyAwLTkgaXMgcmVhZCBjb3JyZWN0bHkuXG5mdW5jdGlvbiBoYXNOb25aZXJvRGlnaXQoZm9ybWF0dGVyOiBJbnRsLk51bWJlckZvcm1hdCwgcGFydHM6IEludGwuTnVtYmVyRm9ybWF0UGFydFtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHplcm8gPSBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cygwKS5maW5kKChwYXJ0KSA9PiBwYXJ0LnR5cGUgPT09ICdpbnRlZ2VyJyk/LnZhbHVlID8/ICcwJztcblxuICByZXR1cm4gcGFydHMuc29tZSgocGFydCkgPT4gRElHSVRfUEFSVFMuaGFzKHBhcnQudHlwZSlcbiAgICAmJiBBcnJheS5mcm9tKHBhcnQudmFsdWUpLnNvbWUoKGNoYXJhY3RlcikgPT4gY2hhcmFjdGVyICE9PSB6ZXJvKSk7XG59XG5cblxuLy8gQSBjaGFydCdzIHZhbHVlIGF4aXMgdGFrZXMgYSBmb3JtYXQgb25seSB3aGVuIGV2ZXJ5IG1lYXN1cmUgb24gaXQgYWdyZWVzIG9uXG4vLyB0aGUgc3R5bGUgKGVhY2ggbWVhc3VyZSdzIGZvcm1hdCwgbnVtYmVyIHdoZW4gaXQgbmFtZXMgbm9uZSkgYW5kIGF0IGxlYXN0XG4vLyBvbmUgb2YgdGhlbSBuYW1lcyBhIGZvcm1hdC4gVGhlIGZpcnN0IG1lYXN1cmUgdGhhdCBkb2VzIGdpdmVzIHRoZSBheGlzIGl0c1xuLy8gcHJlY2lzaW9uIGFuZCB1bml0cy4gT3RoZXJ3aXNlIG51bGw6IHRoZSBheGlzIGtlZXBzIGl0cyBkZWZhdWx0IHRpY2tzIG9uXG4vLyBzY3JlZW4gYW5kIGluIFBvd2VyUG9pbnQsIGFuZCBlYWNoIHNlcmllcyBzdGlsbCBmb3JtYXRzIGl0cyBvd24gdG9vbHRpcHMuXG5leHBvcnQgZnVuY3Rpb24gYXhpc051bWJlckZvcm1hdChtZWFzdXJlczogQ2hhcnRNZWFzdXJlW10pOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB7XG4gIGNvbnN0IHN0eWxlID0gbWVhc3VyZXMubGVuZ3RoID8gcmVzb2x2ZVN0eWxlKG1lYXN1cmVzWzBdKSA6IG51bGw7XG5cbiAgaWYgKHN0eWxlID09PSBudWxsIHx8IG1lYXN1cmVzLnNvbWUoKG1lYXN1cmUpID0+IHJlc29sdmVTdHlsZShtZWFzdXJlKSAhPT0gc3R5bGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZWQgPSBtZWFzdXJlcy5maW5kKChtZWFzdXJlKSA9PiBoYXNOdW1iZXJGb3JtYXQobWVhc3VyZSkpO1xuXG4gIHJldHVybiBmb3JtYXR0ZWQgPyBudW1iZXJGb3JtYXRTcGVjKGZvcm1hdHRlZCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBudW1iZXJGb3JtYXRTcGVjKHNwZWM6IE51bWJlckZvcm1hdFNwZWMpOiBOdW1iZXJGb3JtYXRTcGVjIHtcbiAgcmV0dXJuIHtcbiAgICAuLi4oc3BlYy5mb3JtYXQgIT09IHVuZGVmaW5lZCA/IHsgZm9ybWF0OiBzcGVjLmZvcm1hdCB9IDoge30pLFxuICAgIC4uLihzcGVjLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkID8geyBwcmVjaXNpb246IHNwZWMucHJlY2lzaW9uIH0gOiB7fSksXG4gICAgLi4uKHNwZWMudW5pdHMgIT09IHVuZGVmaW5lZCA/IHsgdW5pdHM6IHNwZWMudW5pdHMgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gSG93IGEgY2hhcnQncyB2YWx1ZSBheGlzIHdyaXRlcyBpdHMgdGlja3M6IHRoZSB1bml0cyBkZWNpZGVkIG9uY2UgZnJvbSB0aGVcbi8vIGF4aXMgcGVhaywgYW5kIHRoZSBkZWNpbWFscyB0aGUgcHJlY2lzaW9uIHBpbnMsIGVsc2UgYXMgbWFueSBhcyB0aGUgYXhpcydzXG4vLyB0aWNrIHN0ZXAgbmVlZHMgKGEgcGVyY2VudCBheGlzIHVwIHRvIDAuMTIlIHN0ZXBzIGJ5IDAuMDIlLCB0d28gZGVjaW1hbHMpLlxuLy8gUGlubmVkIGRlY2ltYWxzIGtlZXAgdGhlIHRpY2tzIGRpc3RpbmN0LCBhbmQgUG93ZXJQb2ludCBjYW4gb25seSBwaW4gdGhlbS5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ2hhcnROdW1iZXJGb3JtYXQoXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMsXG4gIHBlYWs6IG51bWJlcixcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbik6IENoYXJ0TnVtYmVyRm9ybWF0IHtcbiAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGUoc3BlYyk7XG4gIGNvbnN0IHByZWNpc2lvbiA9IGNsYW1wRGVjaW1hbHMoc3BlYy5wcmVjaXNpb24pO1xuICBjb25zdCB1bml0cyA9IHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50XG4gICAgPyBSZXBvcnROdW1iZXJVbml0cy5Ob25lXG4gICAgOiByZXNvbHZlVW5pdHMoc3BlYy51bml0cywgcGVhaywgcHJlY2lzaW9uID8/IFNDQUxFRF9ERUNJTUFMUyk7XG5cbiAgcmV0dXJuIHsgdW5pdHMsIGRlY2ltYWxzOiBwcmVjaXNpb24gPz8gYXhpc0RlY2ltYWxzKHN0eWxlLCB1bml0cywgcGVhaywgY29udGV4dCkgfTtcbn1cblxuLy8gVGhlIGRlY2ltYWxzIHRoZSBheGlzJ3MgbmljZSB0aWNrIHN0ZXAgbmVlZHMuIEEgcGxhaW4sIHVuYWJicmV2aWF0ZWQgbnVtYmVyXG4vLyBwaW5zIG5vbmUgKG51bGwpOiBpdHMgdGlja3Mga2VlcCB0aGVpciBvd24gZGVjaW1hbHMuIEFuIHVuc2NhbGVkIGN1cnJlbmN5XG4vLyBheGlzIHRoYXQgbmVlZHMgZGVjaW1hbHMgc2hvd3MgY2VudHMsIGFuZCBhIEsvTSBheGlzIGtlZXBzIGl0cyBzdGVwJ3Ncbi8vIGRlY2ltYWxzICgnJDAuNU0nLCBub3QgJyQwLjUwTScpLlxuZnVuY3Rpb24gYXhpc0RlY2ltYWxzKFxuICBzdHlsZTogUmVwb3J0VmFsdWVGb3JtYXQsXG4gIHVuaXRzOiBSZXNvbHZlZFVuaXRzLFxuICBwZWFrOiBudW1iZXIsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3Qgc2NhbGUgPSBVTklUX1NDQUxFUy5nZXQodW5pdHMpO1xuXG4gIGlmIChzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyICYmICFzY2FsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2hvd25QZWFrID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQgJiYgY29udGV4dC5yYXRpb1BlcmNlbnRcbiAgICA/IE1hdGguYWJzKHBlYWspICogMTAwXG4gICAgOiBNYXRoLmFicyhwZWFrKSAvIChzY2FsZT8uZGl2aXNvciA/PyAxKTtcbiAgY29uc3Qgc3RlcCA9IG5pY2VTdGVwKHNob3duUGVhayAvIEFYSVNfVElDS1MpO1xuICBjb25zdCBkZWNpbWFscyA9IHN0ZXAgPiAwID8gY2xhbXBEZWNpbWFscygtTWF0aC5mbG9vcihNYXRoLmxvZzEwKHN0ZXApKSkgPz8gMCA6IDA7XG5cbiAgcmV0dXJuIHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSAmJiBkZWNpbWFscyA+IDAgJiYgIXNjYWxlID8gQ1VSUkVOQ1lfQVhJU19ERUNJTUFMUyA6IGRlY2ltYWxzO1xufVxuXG4vLyBFQ2hhcnRzJyBuaWNlKCk6IHRoZSByb3VuZCBudW1iZXIgKDEsIDIsIDMsIDUgb3IgMTAgdGltZXMgYSBwb3dlciBvZiB0ZW4pIGFcbi8vIHJvdWdoIHRpY2sgc3RlcCBzbmFwcyB0by5cbmZ1bmN0aW9uIG5pY2VTdGVwKHJvdWdoOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoIShyb3VnaCA+IDApIHx8ICFOdW1iZXIuaXNGaW5pdGUocm91Z2gpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBleHBvbmVudCA9IE1hdGguZmxvb3IoTWF0aC5sb2cxMChyb3VnaCkpO1xuICBjb25zdCBwb3dlciA9IE1hdGgucG93KDEwLCBleHBvbmVudCk7XG4gIGNvbnN0IGZyYWN0aW9uID0gcm91Z2ggLyBwb3dlcjtcbiAgbGV0IG5pY2UgPSAxMDtcbiAgaWYgKGZyYWN0aW9uIDwgMS41KSB7XG4gICAgbmljZSA9IDE7XG4gIH0gZWxzZSBpZiAoZnJhY3Rpb24gPCAyLjUpIHtcbiAgICBuaWNlID0gMjtcbiAgfSBlbHNlIGlmIChmcmFjdGlvbiA8IDQpIHtcbiAgICBuaWNlID0gMztcbiAgfSBlbHNlIGlmIChmcmFjdGlvbiA8IDcpIHtcbiAgICBuaWNlID0gNTtcbiAgfVxuXG4gIHJldHVybiBuaWNlICogcG93ZXI7XG59XG5cbi8vIFBvd2VyUG9pbnQncyBudW1iZXIgZm9ybWF0IGNvZGUgZm9yIGEgZm9ybWF0dGVkIHZhbHVlIGF4aXMsIG1hdGNoaW5nIHRoZVxuLy8gc2NyZWVuJ3MgdGlja3M6ICcjLCMjMC4wJScgKHBlcmNlbnQpLCAnXCIkXCIjLCMjMCcgKGN1cnJlbmN5KSxcbi8vICcjLCMjMC4wLFwiS1wiJyAodGhvdXNhbmRzKSwgJyMsIyMwXCIgJFwiJyAoZnItQ0EgY3VycmVuY3kpLiBBIHBsYWluIG51bWJlclxuLy8gd2hvc2UgZGVjaW1hbHMgYXJlIG5vdCBwaW5uZWQga2VlcHMgY2hhcnRBeGlzRm9ybWF0Q29kZSdzIGNvZGUuIFRoZSBjb2RlJ3Ncbi8vIHNlcGFyYXRvcnMgZm9sbG93IHRoZSBvcGVuaW5nIG1hY2hpbmUncyBsb2NhbGU7IHRoZSBjdXJyZW5jeSBzeW1ib2wgYW5kIGl0c1xuLy8gc2lkZSBmb2xsb3cgdGhlIHJlcG9ydCdzLlxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZvcm1hdENvZGUoXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIGNoYXJ0OiBDaGFydE51bWJlckZvcm1hdCxcbiAgc2VyaWVzOiAobnVtYmVyIHwgbnVsbClbXVtdLFxuICBzdGFja2VkOiBib29sZWFuLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGUoc3BlYyk7XG4gIGNvbnN0IHNjYWxlID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQgPyB1bmRlZmluZWQgOiBVTklUX1NDQUxFUy5nZXQoY2hhcnQudW5pdHMpO1xuXG4gIGlmIChzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyICYmICFzY2FsZSAmJiBjaGFydC5kZWNpbWFscyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjaGFydEF4aXNGb3JtYXRDb2RlKHNlcmllcywgc3RhY2tlZCk7XG4gIH1cblxuICBjb25zdCBkZWNpbWFscyA9IGNoYXJ0LmRlY2ltYWxzID8/IDA7XG4gIGNvbnN0IGRpZ2l0cyA9IGAjLCMjMCR7ZGVjaW1hbHMgPiAwID8gYC4keycwJy5yZXBlYXQoZGVjaW1hbHMpfWAgOiAnJ31gO1xuXG4gIGlmIChzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCkge1xuICAgIHJldHVybiBgJHtkaWdpdHN9JHtjb250ZXh0LnJhdGlvUGVyY2VudCA/ICclJyA6ICdcIiVcIid9YDtcbiAgfVxuXG4gIGNvbnN0IHNjYWxlZCA9IGAke2RpZ2l0c30ke3NjYWxlPy5jb21tYXMgPz8gJyd9YDtcbiAgY29uc3QgdW5pdCA9IHNjYWxlPy5zdWZmaXggPz8gJyc7XG5cbiAgaWYgKHN0eWxlICE9PSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSkge1xuICAgIHJldHVybiB1bml0ID8gYCR7c2NhbGVkfVwiJHt1bml0fVwiYCA6IHNjYWxlZDtcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sKGNvbnRleHQpO1xuXG4gIHJldHVybiBzeW1ib2wucHJlZml4XG4gICAgPyBgXCIke3N5bWJvbC50ZXh0fVwiJHtzY2FsZWR9JHt1bml0ID8gYFwiJHt1bml0fVwiYCA6ICcnfWBcbiAgICA6IGAke3NjYWxlZH1cIiR7dW5pdH0ke3N5bWJvbC50ZXh0fVwiYDtcbn1cblxuLy8gVGhlIGN1cnJlbmN5IHN5bWJvbCBhcyB0aGUgbG9jYWxlIHdyaXRlcyBpdCBiZXNpZGUgYSBudW1iZXIsIHdpdGggdGhlIHNwYWNlXG4vLyBiZXR3ZWVuIHRoZW0sIGFuZCB3aGljaCBzaWRlIGl0IHNpdHMgb246ICckJyBiZWZvcmUgaW4gZW4tVVMsICcgJCcgYWZ0ZXIgaW5cbi8vIGZyLUNBLiBRdW90ZXMgYXJlIGRyb3BwZWQsIGFzIGEgZm9ybWF0IGNvZGUgY2Fubm90IGhvbGQgdGhlbS5cbmludGVyZmFjZSBDdXJyZW5jeVN5bWJvbCB7XG4gIHByZWZpeDogYm9vbGVhbjtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5jb25zdCBDVVJSRU5DWV9TWU1CT0xTID0gbmV3IE1hcDxzdHJpbmcsIEN1cnJlbmN5U3ltYm9sPigpO1xuXG5mdW5jdGlvbiBjdXJyZW5jeVN5bWJvbChjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0KTogQ3VycmVuY3lTeW1ib2wge1xuICBjb25zdCBrZXkgPSBgJHtjb250ZXh0LmxvY2FsZX18JHtjb250ZXh0LmN1cnJlbmN5fWA7XG4gIGxldCBzeW1ib2wgPSBDVVJSRU5DWV9TWU1CT0xTLmdldChrZXkpO1xuXG4gIGlmICghc3ltYm9sKSB7XG4gICAgY29uc3QgcGFydHMgPSBudW1iZXJGb3JtYXQoY29udGV4dC5sb2NhbGUsIGN1cnJlbmN5T3B0aW9ucyhjb250ZXh0LmN1cnJlbmN5KSkuZm9ybWF0VG9QYXJ0cygxKTtcbiAgICBjb25zdCBjdXJyZW5jeSA9IHBhcnRzLmZpbmRJbmRleCgocGFydCkgPT4gcGFydC50eXBlID09PSAnY3VycmVuY3knKTtcbiAgICBjb25zdCBmaXJzdCA9IHBhcnRzLmZpbmRJbmRleCgocGFydCkgPT4gTlVNQkVSX1BBUlRTLmhhcyhwYXJ0LnR5cGUpKTtcbiAgICBjb25zdCBsYXN0ID0gcGFydHMucmVkdWNlKChmb3VuZCwgcGFydCwgaW5kZXgpID0+IE5VTUJFUl9QQVJUUy5oYXMocGFydC50eXBlKSA/IGluZGV4IDogZm91bmQsIC0xKTtcbiAgICBjb25zdCBwcmVmaXggPSBjdXJyZW5jeSA8IGZpcnN0O1xuICAgIGNvbnN0IHRleHQgPSAocHJlZml4ID8gcGFydHMuc2xpY2UoTWF0aC5tYXgoY3VycmVuY3ksIDApLCBmaXJzdCkgOiBwYXJ0cy5zbGljZShsYXN0ICsgMSkpXG4gICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnZhbHVlKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAucmVwbGFjZSgvXCIvZywgJycpO1xuXG4gICAgc3ltYm9sID0geyBwcmVmaXgsIHRleHQgfTtcbiAgICBDVVJSRU5DWV9TWU1CT0xTLnNldChrZXksIHN5bWJvbCk7XG4gIH1cblxuICByZXR1cm4gc3ltYm9sO1xufVxuXG5cbi8vIEV2ZXJ5IGRlY2ltYWwgYSBudW1iZXIgaGFzLCBncm91cGVkLCBpbiB0aGUgbG9jYWxlOiB3aGF0IEVDaGFydHMgcHJpbnRzIGJ5XG4vLyBkZWZhdWx0IChpdHMgYWRkQ29tbWFzKSwgYnV0IGluIHRoZSByZXBvcnQncyBsb2NhbGUsIHNvIGEgY2hhcnQncyBheGlzIGFuZFxuLy8gdG9vbHRpcCByZWFkIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHJlcG9ydC4gMTIzNC41IHJlYWRzIDEsMjM0LjUgaW4gZW4tVVMgYW5kXG4vLyAxIDIzNCw1IGluIGZyLUNBLiBBIG5vbi1udW1lcmljIHN0cmluZyBpcyBzaG93biBhcyBpdCBjYW1lLCBhbmQgYW55dGhpbmdcbi8vIGVsc2Ugbm9uLW51bWVyaWMgYXMgJy0nLCBhcyBFQ2hhcnRzIHNob3dzIGl0LiBBcyB0aGVyZSwgYW4gaW5maW5pdGUgdmFsdWVcbi8vIHJlYWRzICdJbmZpbml0eScgYW5kIG5lZ2F0aXZlIHplcm8gKGEgdGljayBhIGZsb2F0IGVycm9yIGxlYXZlcyBqdXN0IGJlbG93XG4vLyB6ZXJvKSByZWFkcyAnMCcuXG5jb25zdCBQTEFJTl9OVU1CRVI6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyMCB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGxhaW5OdW1iZXIodmFsdWU6IHVua25vd24sIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgY29uc3QgbnVtZXJpYyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcbiAgICA/IHZhbHVlXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSAhPT0gJycgPyBOdW1iZXIodmFsdWUpIDogTmFOO1xuXG4gIGlmIChOdW1iZXIuaXNOYU4obnVtZXJpYykpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJy0nO1xuICB9XG5cbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gU3RyaW5nKG51bWVyaWMpO1xuICB9XG5cbiAgcmV0dXJuIG51bWJlckZvcm1hdChsb2NhbGUsIFBMQUlOX05VTUJFUikuZm9ybWF0KG51bWVyaWMgPT09IDAgPyAwIDogbnVtZXJpYyk7XG59XG5cblxuLy8gVGhlIGF4aXMgcGVhayBhdCB3aGljaCBhIG5hdGl2ZSBjaGFydCdzIHZhbHVlIGF4aXMgZ2FpbnMgdGhvdXNhbmRzXG4vLyBzZXBhcmF0b3JzLiBGcm9tIGhlcmUgdXAgdGhlIHRpY2tzIGFyZSB3aG9sZSBudW1iZXJzIGluIHByYWN0aWNlOyBiZWxvdyBpdFxuLy8gbmVpdGhlciB0aGUgc2NyZWVuIG5vciBQb3dlclBvaW50J3MgJ0dlbmVyYWwnIHNob3dzIGEgc2VwYXJhdG9yLlxuZXhwb3J0IGNvbnN0IEFYSVNfU0VQQVJBVE9SX1RIUkVTSE9MRCA9IDEwMDA7XG5cbi8vIFBvd2VyUG9pbnQncyBudW1iZXIgZm9ybWF0IGZvciBhIG5hdGl2ZSBjaGFydCdzIHZhbHVlIGF4aXMsIG1hdGNoaW5nIHdoYXQgdGhlXG4vLyBvbi1zY3JlZW4gYXhpcyBwcmludHMgYnkgZGVmYXVsdDogdGhvdXNhbmRzIHNlcGFyYXRvcnMgd2l0aCBlYWNoIHRpY2sncyBvd25cbi8vIGRlY2ltYWxzLiBFeGNlbCBoYXMgbm8gXCJHZW5lcmFsIHdpdGggc2VwYXJhdG9yc1wiLCBzbyBhbiBheGlzIHJlYWNoaW5nIDEsMDAwXG4vLyAod2hlcmUgdGlja3MgYXJlIHdob2xlIG51bWJlcnMpIGdldHMgJyMsIyMwJywgYW5kIGEgc21hbGxlciByYW5nZSBrZWVwc1xuLy8gJ0dlbmVyYWwnIHNvIGZyYWN0aW9uYWwgdGlja3MgKDAuMjUsIDAuNSkgYXJlIG5vdCByb3VuZGVkIGF3YXkuXG4vL1xuLy8gVGhlIHBlYWsgaXMgY2hhcnRWYWx1ZVBlYWsncy5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydEF4aXNGb3JtYXRDb2RlKHNlcmllczogKG51bWJlciB8IG51bGwpW11bXSwgc3RhY2tlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIHJldHVybiBjaGFydFZhbHVlUGVhayhzZXJpZXMsIHN0YWNrZWQpID49IEFYSVNfU0VQQVJBVE9SX1RIUkVTSE9MRCA/ICcjLCMjMCcgOiAnR2VuZXJhbCc7XG59XG5cbi8vIFRoZSBsYXJnZXN0IG1hZ25pdHVkZSBhIGNoYXJ0J3MgdmFsdWUgYXhpcyBoYXMgdG8gcmVhY2guIEEgbWlzc2luZyB2YWx1ZVxuLy8gY291bnRzIGFzIDAuIEEgc3RhY2tlZCBjaGFydCdzIHBlYWsgaXMgaXRzIHRhbGxlc3Qgc3RhY2s6IHRoZSBsYXJnZXN0IHN1bSxcbi8vIHBlciBjYXRlZ29yeSwgb2YgZXZlcnkgc2VyaWVzJyBhYnNvbHV0ZSB2YWx1ZS5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydFZhbHVlUGVhayhzZXJpZXM6IChudW1iZXIgfCBudWxsKVtdW10sIHN0YWNrZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICBjb25zdCBtYWduaXR1ZGVzID0gc2VyaWVzLm1hcCgodmFsdWVzKSA9PiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gTWF0aC5hYnModmFsdWUgPz8gMCkpKTtcblxuICByZXR1cm4gc3RhY2tlZFxuICAgID8gTWF0aC5tYXgoMCwgLi4uKG1hZ25pdHVkZXNbMF0gPz8gW10pLm1hcCgoXywgaW5kZXgpID0+IG1hZ25pdHVkZXNcbiAgICAgIC5yZWR1Y2UoKHN1bSwgdmFsdWVzKSA9PiBzdW0gKyAodmFsdWVzW2luZGV4XSA/PyAwKSwgMCkpKVxuICAgIDogTWF0aC5tYXgoMCwgLi4ubWFnbml0dWRlcy5mbGF0KCkpO1xufVxuXG5cbi8vIFRoZSB6b25lIGV2ZXJ5IGRhdGUgaW4gYSByZXBvcnQgaXMgcmVhZCBpbi4gVGhlIHNlcnZlciByZXNvbHZlcyBpdCAodGhlXG4vLyByZXBvcnQncyBvd24gem9uZSwgZWxzZSB0aGUgYXBwbGljYXRpb24ncyBkZWZhdWx0IHJlcG9ydGluZyB6b25lKSBhbmQgc2VuZHNcbi8vIGl0IGFzIGBlZmZlY3RpdmVUaW1lem9uZWAuIEEgc2VydmVyIHRvbyBvbGQgdG8gc2VuZCB0aGUgZmllbGQgc3RpbGwgdXNlZCBhXG4vLyByZXBvcnQncyBwaW5uZWQgYHRpbWV6b25lYCwgc28gdGhhdCBjb21lcyBuZXh0OyB0aGUgYnJvd3NlcidzIHpvbmUgaXMgdGhlIGxhc3Rcbi8vIGZhbGxiYWNrLiBUaGlzIGlzIHRoZSBvbmUgcGxhY2UgdGhhdCBjaGFpbiBsaXZlcywgc28gZXZlcnkgZGF0ZSB0aGUgdmlld2VyXG4vLyByZW5kZXJzIG9yIHJlc29sdmVzIGFncmVlcyB3aXRoIGV2ZXJ5IG90aGVyLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZXBvcnRUaW1lem9uZShyZXBvcnQ6IFBpY2s8UmVwb3J0LCAnZWZmZWN0aXZlVGltZXpvbmUnIHwgJ3RpbWV6b25lJz4pOiBzdHJpbmcge1xuICByZXR1cm4gcmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8/IHJlcG9ydC50aW1lem9uZSA/PyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG59XG5cblxuLy8gVGhlIGRhdGUgc2hhcGVzIGEgcmVwb3J0IHdyaXRlcywgZWFjaCBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLlxuLy8gJ0phbiA1LCAyMDI2JyAvICc1IGphbnYuIDIwMjYnOiBhIGRhdGUgY2VsbCwgYSBmaWx0ZXIgYm91bmQuXG5leHBvcnQgY29uc3QgREFZX1NIT1JUOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfTtcbi8vICdKYW51YXJ5IDUsIDIwMjYnIC8gJzUgamFudmllciAyMDI2JzogYW4gZXhwb3J0IGNvdmVyJ3MgZGF0ZSBsaW5lLlxuZXhwb3J0IGNvbnN0IERBWV9MT05HOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9O1xuLy8gJ0phbnVhcnknIC8gJ2phbnZpZXInOiBhIG1vbnRobHkgcGVyaW9kIGxhYmVsIChpdHMgeWVhciBpcyBhZGRlZCBhcGFydCkuXG5leHBvcnQgY29uc3QgTU9OVEhfTE9ORzogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IG1vbnRoOiAnbG9uZycgfTtcbi8vICdKYW51YXJ5IDIwMjYnIC8gJ2phbnZpZXIgMjAyNic6IGEgbW9udGhseSBwZXJpb2QgbGFiZWwgd3JpdHRlbiBpbiBmdWxsLlxuZXhwb3J0IGNvbnN0IE1PTlRIX1lFQVI6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfTtcbi8vICdKYW4gNScgLyAnNSBqYW52Lic6IGEgZGFpbHkgb3Igd2Vla2x5IHBlcmlvZCBsYWJlbC5cbmV4cG9ydCBjb25zdCBNT05USF9EQVk6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfTtcblxuLy8gQSBkYXRlIGluIHRoZSBsb2NhbGUuIFdpdGggYSB6b25lLCB0aGUgZGF5IGl0IGZhbGxzIG9uIHRoZXJlOyB3aXRob3V0IG9uZSxcbi8vIHRoZSBicm93c2VyJ3Mgem9uZSwgd2hpY2gga2VlcHMgYSBjYWxlbmRhciBkYXkgcGFyc2VkIGFzIGxvY2FsIG1pZG5pZ2h0XG4vLyB1bnNoaWZ0ZWQuIEl0IG5ldmVyIHRocm93cywgc2luY2UgYSBwaXBlIG9yIGFuIGV4cG9ydCBjYWxscyBpdCBwZXIgY2VsbDogYW5cbi8vIGludmFsaWQgRGF0ZSByZWFkcyAnJywgYSBtYWxmb3JtZWQgbG9jYWxlICgnZW5fQ0EnKSByZWFkcyB0aGUgZmFsbGJhY2tcbi8vIGxvY2FsZSwgYW5kIGFuIHVua25vd24gem9uZSByZWFkcyBVVEMsIHdoaWNoIHN0aWxsIG5hbWVzIGEgcmVhbCBkYXkuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TG9jYWxEYXRlKFxuICBkYXRlOiBEYXRlLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiB3cml0ZURhdGUoZGF0ZUZvcm1hdChsb2NhbGUsIG9wdGlvbnMsIHRpbWVab25lKSwgZGF0ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmb3JtYXRGYWxsYmFja0RhdGUoZGF0ZSwgcmVzb2x2ZVJlcG9ydExvY2FsZShsb2NhbGUpLCBvcHRpb25zLCB0aW1lWm9uZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RmFsbGJhY2tEYXRlKFxuICBkYXRlOiBEYXRlLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd3JpdGVEYXRlKGRhdGVGb3JtYXQobG9jYWxlLCBvcHRpb25zLCB0aW1lWm9uZSksIGRhdGUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gd3JpdGVEYXRlKGRhdGVGb3JtYXQobG9jYWxlLCBvcHRpb25zLCAnVVRDJyksIGRhdGUpO1xuICB9XG59XG5cbi8vIEludGwgd3JpdGVzIGEgeWVhciBiZWxvdyAxMDAwIHdpdGggb25seSB0aGUgZGlnaXRzIGl0IGhhcyAoJ0phbiAxLCAxJyk7IGFcbi8vIGRhdGUncyB5ZWFyIGlzIGFsd2F5cyB3cml0dGVuIHdpdGggZm91ciAoJ0phbiAxLCAwMDAxJyksIHNvIGEgc2VudGluZWwgZGF5XG4vLyBzdGlsbCByZWFkcyBhcyBhIGRhdGUuIE9ubHkgc3VjaCBhIHllYXIgcGF5cyBmb3IgZm9ybWF0VG9QYXJ0cy5cbmZ1bmN0aW9uIHdyaXRlRGF0ZShmb3JtYXR0ZXI6IEludGwuRGF0ZVRpbWVGb3JtYXQsIGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICBpZiAoZGF0ZS5nZXRVVENGdWxsWWVhcigpID4gMTAwMCkge1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRUb1BhcnRzKGRhdGUpXG4gICAgLm1hcCgocGFydCkgPT4gcGFydC50eXBlID09PSAneWVhcicgPyBwYXJ0LnZhbHVlLnBhZFN0YXJ0KDQsICcwJykgOiBwYXJ0LnZhbHVlKVxuICAgIC5qb2luKCcnKTtcbn1cblxuXG5jb25zdCBEQVRFX09OTFlfUEFUVEVSTiA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLztcbmNvbnN0IERBVEVfVElNRV9QQVRURVJOID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn0pWyBUXShcXGR7Mn06XFxkezJ9OlxcZHsyfSkoXFwuXFxkKyk/JC87XG5cbi8vIEEgcmVwb3J0IHJvdydzIGRhdGUgY2VsbCBhcyBhIGNhbGVuZGFyIGRheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS5cbi8vXG4vLyBSZXBvcnQgcm93cyBhcmUgcmF3IGRhdGFiYXNlIHN0cmluZ3MsIG5vdCBzZXJpYWxpemVkIG1vZGVscywgc28gdGhlaXIgc2hhcGVcbi8vIGlzIHRoZSB3aXJlIGNvbnRyYWN0OiBhIERBVEUgY29sdW1uIGFycml2ZXMgYXMgJ1lZWVktTU0tREQnIGFuZCBhXG4vLyBkYXRlLWFuZC10aW1lIGNvbHVtbiBhcyAnWVlZWS1NTS1ERCBISDpNTTpTUycgaW4gVVRDLiBSZWFkaW5nIHRoYXQgc2hhcGVcbi8vIGhlcmUgZG9lcyBub3QgcmUtZGVyaXZlIGEgc2VydmVyIHJ1bGU7IGl0IG9ubHkgc3RvcHMgdGhlIGJyb3dzZXIgZ3Vlc3NpbmcuXG4vLyAtIEEgY2FsZW5kYXIgZGF5IGlzIG5ldmVyIHNoaWZ0ZWQ6IHBhcnNlSVNPIHJlYWRzIGl0IGFzIGxvY2FsIG1pZG5pZ2h0LCBzb1xuLy8gICB0aGUgZGF5IHByaW50ZWQgaXMgdGhlIGRheSBzdG9yZWQsIHdoYXRldmVyIHRoZSB6b25lLlxuLy8gLSBBbiBpbnN0YW50IGlzIHBpbm5lZCB0byBVVEMgd2l0aCBhbiBleHBsaWNpdCAnWicsIHRoZW4gc2hvd24gYXMgdGhlIGRheSBpdFxuLy8gICBmZWxsIG9uIGluIHRoZSByZXBvcnQncyB6b25lLCB0aGUgc2FtZSBkYXkgdGhlIGZpbHRlcnMgYW5kIHRpbWUgYnVja2V0cyB1c2UuXG4vLyAtIEFueXRoaW5nIGVsc2UgaXMgc2hvd24gYXMgaXQgY2FtZSwgYW5kIHNvIGlzIGEgdmFsdWUgdGhhdCBoYXMgdGhlIHNoYXBlXG4vLyAgIGJ1dCBuYW1lcyBubyByZWFsIGRheSAoYSB6ZXJvIGRhdGUgJzAwMDAtMDAtMDAnLCBvciAnMjAyNi0wMi0zMCcpOiBvbmVcbi8vICAgYmFkIGNlbGwgbXVzdCBub3QgdGhyb3cgb3V0IG9mIGEgcGlwZSBvciBhYm9ydCBhbiBleHBvcnQuXG4vLyBUaGUgZGF5IGlzIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTogJ0phbiA1LCAyMDI2JyBpbiBlbi1VUywgJzUgamFudi5cbi8vIDIwMjYnIGluIGZyLUNBLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlcG9ydERhdGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBTdHJpbmcodmFsdWUpO1xuXG4gIGlmIChEQVRFX09OTFlfUEFUVEVSTi50ZXN0KHRleHQpKSB7XG4gICAgY29uc3QgZGF5ID0gcGFyc2VJU08odGV4dCk7XG5cbiAgICByZXR1cm4gaXNWYWxpZChkYXkpID8gZm9ybWF0TG9jYWxEYXRlKGRheSwgbG9jYWxlLCBEQVlfU0hPUlQpIDogdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGRhdGVUaW1lID0gREFURV9USU1FX1BBVFRFUk4uZXhlYyh0ZXh0KTtcbiAgaWYgKCFkYXRlVGltZSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgaW5zdGFudCA9IHBhcnNlSVNPKGAke2RhdGVUaW1lWzFdfVQke2RhdGVUaW1lWzJdfVpgKTtcblxuICByZXR1cm4gaXNWYWxpZChpbnN0YW50KSA/IGZvcm1hdExvY2FsRGF0ZShpbnN0YW50LCBsb2NhbGUsIERBWV9TSE9SVCwgdGltZXpvbmUpIDogdGV4dDtcbn1cblxuXG4vLyBFbmdsaXNoIG5hbWVzIGZvciBhIGxvY2FsZSBhbmQgYSBjdXJyZW5jeSwgZm9yIHRoZSBzZXR0aW5ncyBzZWxlY3RzLiBUaGVcbi8vIGludGVyZmFjZSBzdGF5cyBFbmdsaXNoIHdoYXRldmVyIHRoZSByZXBvcnQncyBsb2NhbGU6ICdmci1DQScgcmVhZHNcbi8vICdDYW5hZGlhbiBGcmVuY2gnLCAnQ0FEJyByZWFkcyAnQ2FuYWRpYW4gRG9sbGFyJy4gQSBydW50aW1lIHdpdGhvdXQgdGhlXG4vLyBuYW1lcyBzaG93cyB0aGUgY29kZS5cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbGVOYW1lKHRhZzogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRpc3BsYXlOYW1lKCdsYW5ndWFnZScsIHRhZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW5jeU5hbWUoY29kZTogUmVwb3J0Q3VycmVuY3lDb2RlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRpc3BsYXlOYW1lKCdjdXJyZW5jeScsIGNvZGUpO1xufVxuXG5mdW5jdGlvbiBkaXNwbGF5TmFtZSh0eXBlOiAnbGFuZ3VhZ2UnIHwgJ2N1cnJlbmN5JywgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEludGwuRGlzcGxheU5hbWVzKFsnZW4nXSwgeyB0eXBlIH0pLm9mKGNvZGUpID8/IGNvZGU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG59XG5cblxuLy8gQSBzaG9ydCwgaHVtYW4gbGFiZWwgZm9yIGEgem9uZTogaXRzIGNpdHkgcGx1cyB0aGUgY3VycmVudCBhYmJyZXZpYXRpb24sXG4vLyBlLmcuICdBbWVyaWNhL05ld19Zb3JrJyByZWFkcyAnTmV3IFlvcmsgKEVEVCknLiBVVEMgc3RheXMgJ1VUQycsIGFuZCBhblxuLy8gdW5rbm93biB6b25lIGlzIHNob3duIGFzIGl0cyBpZC4gQW4gJ0V0Yy8nIHpvbmUgbmFtZXMgbm8gY2l0eSwgYW5kIGl0cyBQT1NJWFxuLy8gc2lnbiBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgb2Zmc2V0ICgnRXRjL0dNVCs1JyBpcyBHTVQtNSksIHNvIGl0IHJlYWRzIGFzIHRoZVxuLy8gYWJicmV2aWF0aW9uIGFsb25lOiAnRXRjL1VUQycgaXMgJ1VUQycsICdFdGMvR01UKzUnIGlzICdHTVQtNScuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVMYWJlbCh0aW1lem9uZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRpbWV6b25lID09PSAnVVRDJykge1xuICAgIHJldHVybiB0aW1lem9uZTtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gdGltZXpvbmUuc3BsaXQoJy8nKTtcblxuICB0cnkge1xuICAgIGNvbnN0IGFiYnJldmlhdGlvbiA9IGZvcm1hdEluVGltZVpvbmUobmV3IERhdGUoKSwgdGltZXpvbmUsICd6enonKTtcblxuICAgIHJldHVybiBzZWdtZW50c1swXSA9PT0gJ0V0YydcbiAgICAgID8gYWJicmV2aWF0aW9uXG4gICAgICA6IGAke3NlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdLnJlcGxhY2UoL18vZywgJyAnKX0gKCR7YWJicmV2aWF0aW9ufSlgO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdGltZXpvbmU7XG4gIH1cbn1cblxuXG4vLyBcIk5vd1wiIGFzIGEgRGF0ZSB3aG9zZSBsb2NhbCBmaWVsZHMgcmVhZCB0aGUgd2FsbCBjbG9jayBpbiB0aGUgZ2l2ZW4gem9uZSwgc29cbi8vIGRhdGUtZm5zIGNhbGVuZGFyIGFyaXRobWV0aWMgKHN0YXJ0T2ZXZWVrLCBzdGFydE9mTW9udGgsIC4uLikgYW5kXG4vLyBkYXRlQm91bmRTdHJpbmcoKSBsYW5kIG9uIHRoZSB6b25lJ3MgY2FsZW5kYXIgZGF5IHJhdGhlciB0aGFuIHRoZSBicm93c2VyJ3MuXG4vLyBBbiB1bmtub3duIHpvbmUgZmFsbHMgYmFjayB0byB0aGUgYnJvd3NlcidzIGNsb2NrLlxuZXhwb3J0IGZ1bmN0aW9uIGdldFpvbmVkTm93KHRpbWV6b25lOiBzdHJpbmcpOiBEYXRlIHtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHpvbmVkID0gdG9ab25lZFRpbWUobm93LCB0aW1lem9uZSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHpvbmVkLmdldFRpbWUoKSkgPyBub3cgOiB6b25lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5vdztcbiAgfVxufVxuIl19
|
|
1045
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQXNCckUsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxrRkFBa0Y7QUFDbEYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQW9CLE9BQU8sQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBdUIsS0FBSyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFrQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pGLE1BQU0sRUFBRSxzQkFBc0I7SUFDOUIsUUFBUSxFQUFFLHdCQUF3QjtJQUNsQyxZQUFZLEVBQUUsSUFBSTtDQUNuQixDQUFDLENBQUM7QUFFSCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQztBQUd0Qyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBOEI7SUFDaEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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LENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxDQUFDO0lBQzlFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUdELCtFQUErRTtBQUMvRSxvRUFBb0U7QUFDcEUsK0VBQStFO0FBQy9FLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsV0FBVyxDQUFDLFFBQWdCO0lBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkRGF5cywgaXNWYWxpZCwgcGFyc2VJU08gfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBmb3JtYXRJblRpbWVab25lLCB0b1pvbmVkVGltZSB9IGZyb20gJ2RhdGUtZm5zLXR6JztcblxuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBDaGFydE1lYXN1cmUsXG4gIENvbXBhcmlzb25BZ2FpbnN0LFxuICBDb21wYXJpc29uTm90ZUNvZGUsXG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIEtwaU5vdGVDb2RlLFxuICBOdW1iZXJGb3JtYXRTcGVjLFxuICBPdXRwdXRNZXRhLFxuICBPdXRwdXRSb2xlLFxuICBSZXBvcnQsXG4gIFJlcG9ydEN1cnJlbmN5Q29kZSxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxuICBXaW5kb3dOb3RlQ29kZSxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFdoYXQgYSByZXBvcnQgcmVhZHMgd2hlbiB0aGUgc2VydmVyIG5hbWVzIG5vIHVzYWJsZSBsb2NhbGUgb3IgY3VycmVuY3k6IGFuXG4vLyBvbGRlciBzZXJ2ZXIgdGhhdCBzZW5kcyBuZWl0aGVyLCBvciBhIHZhbHVlIHRoaXMgYnJvd3NlcidzIEludGwgY2Fubm90IHVzZS5cbi8vIE5ldmVyIHRoZSBicm93c2VyJ3Mgb3duIGxvY2FsZSwgc28gZXZlcnkgdmlld2VyIG9mIGEgcmVwb3J0IHNlZXMgdGhlIHNhbWUgdGV4dC5cbmV4cG9ydCBjb25zdCBSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFOiBSZXBvcnRMb2NhbGVUYWcgPSAnZW4tVVMnO1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9GQUxMQkFDS19DVVJSRU5DWTogUmVwb3J0Q3VycmVuY3lDb2RlID0gJ1VTRCc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZPUk1BVF9DT05URVhUOiBSZWFkb25seTxSZXBvcnRGb3JtYXRDb250ZXh0PiA9IE9iamVjdC5mcmVlemUoe1xuICBsb2NhbGU6IFJFUE9SVF9GQUxMQkFDS19MT0NBTEUsXG4gIGN1cnJlbmN5OiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1ksXG4gIHJhdGlvUGVyY2VudDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBDVVJSRU5DWV9QQVRURVJOID0gL15bQS1aXXszfSQvO1xuXG5cbi8vIFRoZSBzZXJ2ZXIncyByZXNvbHZlZCBsb2NhbGUgYXMgb25lIHRoaXMgYnJvd3NlciBjYW4gZm9ybWF0IGluLiBBIG1hbGZvcm1lZFxuLy8gdGFnICgnZW5fQ0EnKSBtYWtlcyBzdXBwb3J0ZWRMb2NhbGVzT2YgdGhyb3csIGFuZCBvbmUgSW50bCBoYXMgbm8gZGF0YSBmb3Jcbi8vICgneHgtWVknKSBjb21lcyBiYWNrIGVtcHR5OyBib3RoIHJlYWQgdGhlIGZhbGxiYWNrLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZXBvcnRMb2NhbGUodGFnOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0TG9jYWxlVGFnIHtcbiAgaWYgKCF0YWcpIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihbdGFnXSlbMF0gPz8gUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFJFUE9SVF9GQUxMQkFDS19MT0NBTEU7XG4gIH1cbn1cblxuLy8gVGhlIHNlcnZlcidzIHJlc29sdmVkIGN1cnJlbmN5IGFzIG9uZSBJbnRsIGNhbiBsYWJlbC4gVGhlIHNlcnZlciBkZWNpZGVzXG4vLyB3aGljaCBjb2RlcyBuYW1lIG1vbmV5OyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYSBjb2RlIEludGwgY2Fubm90IHRha2UgYXRcbi8vIGFsbC4gSXQgaXMgbmV2ZXIgY2hlY2tlZCBhZ2FpbnN0IHRoZSBydW50aW1lJ3Mgb3duIGN1cnJlbmN5IGxpc3QsIHdoaWNoXG4vLyBkaWZmZXJzIGJldHdlZW4gYnJvd3NlcnMgYW5kIGxlYXZlcyBvdXQgY29kZXMgdGhlIHNlcnZlciBvZmZlcnMgKFZFRiwgTVJPKSxcbi8vIHNvIGV2ZXJ5IHZpZXdlciBsYWJlbHMgYSByZXBvcnQncyBtb25leSB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBSZXBvcnRDdXJyZW5jeUNvZGUge1xuICBpZiAoIWNvZGUgfHwgIUNVUlJFTkNZX1BBVFRFUk4udGVzdChjb2RlKSkge1xuICAgIHJldHVybiBSRVBPUlRfRkFMTEJBQ0tfQ1VSUkVOQ1k7XG4gIH1cblxuICB0cnkge1xuICAgIG51bWJlckZvcm1hdChSRVBPUlRfRkFMTEJBQ0tfTE9DQUxFLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogY29kZSB9KTtcblxuICAgIHJldHVybiBjb2RlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gUkVQT1JUX0ZBTExCQUNLX0NVUlJFTkNZO1xuICB9XG59XG5cbi8vIFRoZSBvbmUgcGxhY2UgYSByZXBvcnQncyBmb3JtYXQgY29udGV4dCBpcyBidWlsdDogdGhlIHNlcnZlcidzIGVmZmVjdGl2ZVxuLy8gbG9jYWxlIGFuZCBjdXJyZW5jeSAoYWJzZW50IG9uIGFuIG9sZGVyIHNlcnZlciwgd2hpY2ggdGhlbiByZWFkcyBlbi1VUy9VU0QpXG4vLyBhbmQgd2hldGhlciBpdHMgcGVyY2VudCBtZWFzdXJlcyBhcnJpdmUgYXMgMC0xIHJhdGlvcy5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRm9ybWF0Q29udGV4dChcbiAgcmVwb3J0OiBQaWNrPFJlcG9ydCwgJ2VmZmVjdGl2ZUxvY2FsZScgfCAnZWZmZWN0aXZlQ3VycmVuY3knIHwgJ3BlcmNlbnRGb3JtYXQnPixcbik6IFJlcG9ydEZvcm1hdENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIGxvY2FsZTogcmVzb2x2ZVJlcG9ydExvY2FsZShyZXBvcnQuZWZmZWN0aXZlTG9jYWxlKSxcbiAgICBjdXJyZW5jeTogcmVzb2x2ZVJlcG9ydEN1cnJlbmN5KHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSksXG4gICAgcmF0aW9QZXJjZW50OiByZXBvcnQucGVyY2VudEZvcm1hdCA9PT0gJ3JhdGlvJyxcbiAgfTtcbn1cblxuXG4vLyBCdWlsZGluZyBhbiBJbnRsIGZvcm1hdHRlciBpcyBmYXIgc2xvd2VyIHRoYW4gdXNpbmcgb25lLCBhbmQgYSBjaGFydCBmb3JtYXRzXG4vLyBldmVyeSB0aWNrIGFuZCB0b29sdGlwIHZhbHVlLCBzbyBlYWNoIGRpc3RpbmN0IGxvY2FsZSArIG9wdGlvbnMgKCsgem9uZSkgaXNcbi8vIGJ1aWx0IG9uY2UgYW5kIHJldXNlZC5cbmNvbnN0IE5VTUJFUl9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuTnVtYmVyRm9ybWF0PigpO1xuY29uc3QgREFURV9GT1JNQVRTID0gbmV3IE1hcDxzdHJpbmcsIEludGwuRGF0ZVRpbWVGb3JtYXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXQobG9jYWxlOiBzdHJpbmcsIG9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyk6IEludGwuTnVtYmVyRm9ybWF0IHtcbiAgY29uc3Qga2V5ID0gYCR7bG9jYWxlfXwke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMpfWA7XG4gIGxldCBmb3JtYXR0ZXIgPSBOVU1CRVJfRk9STUFUUy5nZXQoa2V5KTtcblxuICBpZiAoIWZvcm1hdHRlcikge1xuICAgIGZvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGUsIG9wdGlvbnMpO1xuICAgIE5VTUJFUl9GT1JNQVRTLnNldChrZXksIGZvcm1hdHRlcik7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVyO1xufVxuXG4vLyBObyB6b25lIGZvcm1hdHMgaW4gdGhlIGJyb3dzZXIncyBvd24gem9uZSwgd2hpY2ggaXMgcmlnaHQgZm9yIGEgY2FsZW5kYXIgZGF5XG4vLyBwYXJzZWQgYXMgbG9jYWwgbWlkbmlnaHQ6IHRoZSBkYXkgcHJpbnRlZCBpcyB0aGUgZGF5IHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlRm9ybWF0KFxuICBsb2NhbGU6IHN0cmluZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMsXG4gIHRpbWVab25lPzogc3RyaW5nLFxuKTogSW50bC5EYXRlVGltZUZvcm1hdCB7XG4gIGNvbnN0IGtleSA9IGAke2xvY2FsZX18JHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX18JHt0aW1lWm9uZSA/PyAnJ31gO1xuICBsZXQgZm9ybWF0dGVyID0gREFURV9GT1JNQVRTLmdldChrZXkpO1xuXG4gIGlmICghZm9ybWF0dGVyKSB7XG4gICAgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IC4uLm9wdGlvbnMsIHRpbWVab25lIH0pO1xuICAgIERBVEVfRk9STUFUUy5zZXQoa2V5LCBmb3JtYXR0ZXIpO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlcjtcbn1cblxuXG4vLyBOdW1iZXIgZm9ybWF0dGluZzogdGhlIG9uZSBlbmdpbmUgYmVoaW5kIGV2ZXJ5IG51bWVyaWMgc2xvdCAoYSBjaGFydFxuLy8gbWVhc3VyZSwgYSBLUEkgbWVhc3VyZSwgYSBsaXN0IGNvbHVtbiwgYSBjcm9zcy10YWIncyBjZWxscyksIHNvIGEgZm9ybWF0XG4vLyBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiBzY3JlZW4sIGluIHRoZSBQREYgYW5kIGluIFBvd2VyUG9pbnQuIFRoZSBkYXRhIHN0YXlzXG4vLyByYXc7IG9ubHkgd2hhdCBpcyBzaG93biBjaGFuZ2VzLiBUaGUgcnVsZXM6XG4vLyAtIEVtcHR5OiBudWxsLCB1bmRlZmluZWQsICcnLCAnLScgYW5kIGEgbm9uLWZpbml0ZSBudW1iZXIgcHJpbnQgdGhlIGNhbGxlcidzXG4vLyAgIGBlbXB0eWAgKCfigJQnIHVubGVzcyBpdCBuYW1lcyBhbm90aGVyKS5cbi8vIC0gTnVtZXJpYzogYSBmaW5pdGUgbnVtYmVyLCBvciBhIHN0cmluZyB0aGF0IHNwZWxscyBvbmUgcGxhaW5seSAoJzEyMzQuNTAnLFxuLy8gICAnLTNlMicpLiBBbnl0aGluZyBlbHNlICgnJDEsMjM0JywgYW4gaWQgd2l0aCBsZXR0ZXJzLCAnICcpIHByaW50cyBhcyBpdFxuLy8gICBjYW1lLCBzaW5jZSBhIGNvbHVtbiB0aGUgU1FMIGFscmVhZHkgZm9ybWF0dGVkIGlzIHRleHQuXG4vLyAtIFN0eWxlczogbnVtYmVyIGlzIGEgcGxhaW4gZGVjaW1hbDsgY3VycmVuY3kgaXMgdGhlIHJlcG9ydCdzIGN1cnJlbmN5XG4vLyAgIHdyaXR0ZW4gaW4gaXRzIGxvY2FsZSB3aXRoIGl0cyBzeW1ib2wgKFVTRCByZWFkcyAnJDEsMjM1JyBpbiBlbi1VUyBhbmRcbi8vICAgJ1VTJDEsMjM1JyBpbiBlbi1DQTsgRVVSIHJlYWRzICcxIDIzNSDigqwnIGluIGZyLUZSKTsgcGVyY2VudCB0YWtlcyBhIDAtMVxuLy8gICByYXRpbyAoMC4zIHJlYWRzIDMwJSksIG9yLCBmcm9tIGFuIG9sZGVyIHNlcnZlciB0aGF0IHNlbmRzIHBlcmNlbnQgdmFsdWVzXG4vLyAgIGFscmVhZHkgeDEwMCwgYSBkZWNpbWFsIHdpdGggYSAlIHNpZ24uIFByZWNpc2lvbiBvciB1bml0cyB3aXRob3V0IGEgZm9ybWF0XG4vLyAgIG1lYW4gbnVtYmVyLlxuLy8gLSBEZWNpbWFsczogYSBwcmVjaXNpb24gcGlucyBib3RoIHRoZSBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bSwgc28gYSBjb2x1bW5cbi8vICAgb2YgcmF0ZXMgbGluZXMgdXAuIFdpdGhvdXQgb25lOiBhdCBtb3N0IG9uZSBmb3IgYSBwZXJjZW50IGFuZCBmb3IgYW5cbi8vICAgYWJicmV2aWF0ZWQgdmFsdWUgKDEuMkspLCB3aG9sZSB1bml0cyBmb3IgY3VycmVuY3ksIHRoZSBsb2NhbGUncyBkZWZhdWx0XG4vLyAgIGZvciBhIG51bWJlci5cbi8vIC0gVW5pdHM6IHRob3VzYW5kcyBhbmQgbWlsbGlvbnMgZGl2aWRlIGFuZCBhZGQgYSBLIG9yIE0gYWZ0ZXIgdGhlIGRpZ2l0c1xuLy8gICAoJyQxLjJLJywgJzEsMksgJCcpOyBhdXRvIHBpY2tzIHBlciB2YWx1ZSBieSBzaXplLCBhbmQgYSB2YWx1ZSB0aGF0IHdvdWxkXG4vLyAgIHJvdW5kIHRvIDEwMDBLIHJlYWRzIDFNLiBVbml0cyBuZXZlciBhcHBseSB0byBhIHBlcmNlbnQuXG4vLyAtIE5lZ2F0aXZlcyBrZWVwIHRoZSBsb2NhbGUncyBsZWFkaW5nIG1pbnVzLiBBIG5lZ2F0aXZlIHRoYXQgcm91bmRzIHRvIHplcm9cbi8vICAgcHJpbnRzIGFzIHplcm8sIG5ldmVyICctMCcuXG4vLyAtIFJvdW5kaW5nIGlzIEludGwncywgb24gdGhlIGRpZ2l0cyBzaG93bi4gRXZlcnkgdmFsdWUgaXMgd3JpdHRlbiBpbiB0aGVcbi8vICAgY29udGV4dCdzIGxvY2FsZSwgbmV2ZXIgdGhlIGJyb3dzZXIncy5cblxuLy8gVGhlIG1vc3QgZGVjaW1hbHMgYSBwcmVjaXNpb24gcGluczogdGhlIHNlcnZlcidzIHNjaGVtYSBib3VuZC5cbmNvbnN0IE1BWF9QUkVDSVNJT04gPSA2O1xuLy8gQXQgbW9zdCBvbmUgZGVjaW1hbCBmb3IgYSBwZXJjZW50LCBhbmQgZm9yIGFuIGFiYnJldmlhdGVkIHZhbHVlICgxLjJLKS5cbmNvbnN0IFBFUkNFTlRfREVDSU1BTFMgPSAxO1xuY29uc3QgU0NBTEVEX0RFQ0lNQUxTID0gMTtcbi8vIE1vbmV5IHNob3dzIHdob2xlIHVuaXRzIHVubGVzcyBhIHByZWNpc2lvbiBhc2tzIGZvciBkZWNpbWFscy5cbmNvbnN0IENVUlJFTkNZX0RFQ0lNQUxTID0gMDtcbi8vIEEgY3VycmVuY3kgYXhpcyB3aG9zZSB0aWNrcyBuZWVkIGRlY2ltYWxzIHNob3dzIGNlbnRzLCBub3QgdGVudGhzLlxuY29uc3QgQ1VSUkVOQ1lfQVhJU19ERUNJTUFMUyA9IDI7XG4vLyBXaGF0IGEgbWlzc2luZyB2YWx1ZSBwcmludHMgdW5sZXNzIHRoZSBjYWxsZXIgbmFtZXMgaXRzIG93bi5cbmNvbnN0IEVNUFRZX1ZBTFVFID0gJ+KAlCc7XG4vLyBUaGUgdGljayBjb3VudCBhIHZhbHVlIGF4aXMgYWltcyBmb3IsIGFzIEVDaGFydHMnIHNwbGl0TnVtYmVyIGRlZmF1bHQuXG5jb25zdCBBWElTX1RJQ0tTID0gNTtcblxuLy8gQSBjaGFuZ2UncyBzaWduOiBhIHBsdXMgb24gYSBwb3NpdGl2ZSB2YWx1ZSwgbm90aGluZyBvbiB6ZXJvLlxuY29uc3QgU0lHTkVEOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7IHNpZ25EaXNwbGF5OiAnZXhjZXB0WmVybycgfTtcblxuY29uc3QgTlVNRVJJQ19QQVRURVJOID0gL15cXHMqWy0rXT8oXFxkK1xcLj9cXGQqfFxcLlxcZCspKFtlRV1bLStdP1xcZCspP1xccyokLztcbi8vIFRoZSBmb3JtYXRUb1BhcnRzIHR5cGVzIHRoYXQgY2FycnkgYSBudW1iZXIncyBkaWdpdHMgYW5kIHNlcGFyYXRvcnMuXG5jb25zdCBOVU1CRVJfUEFSVFMgPSBuZXcgU2V0PEludGwuTnVtYmVyRm9ybWF0UGFydFR5cGVzPihbJ2ludGVnZXInLCAnZ3JvdXAnLCAnZGVjaW1hbCcsICdmcmFjdGlvbiddKTtcbmNvbnN0IERJR0lUX1BBUlRTID0gbmV3IFNldDxJbnRsLk51bWJlckZvcm1hdFBhcnRUeXBlcz4oWydpbnRlZ2VyJywgJ2ZyYWN0aW9uJ10pO1xuXG4vLyBBIG51bWVyaWMgZm9ybWF0J3MgdW5pdHMgb25jZSBkZWNpZGVkOiBhdXRvIGlzIHJlc29sdmVkIHRvIG9uZSBvZiB0aGVzZS5cbmV4cG9ydCB0eXBlIFJlc29sdmVkVW5pdHMgPSBSZXBvcnROdW1iZXJVbml0cy5Ob25lIHwgUmVwb3J0TnVtYmVyVW5pdHMuVGhvdXNhbmRzIHwgUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnM7XG5cbmludGVyZmFjZSBVbml0U2NhbGUge1xuICBkaXZpc29yOiBudW1iZXI7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICAvLyBUaGUgUG93ZXJQb2ludC9FeGNlbCBzY2FsaW5nIGNvbW1hczogZWFjaCBvbmUgZGl2aWRlcyBieSAxLDAwMC5cbiAgY29tbWFzOiBzdHJpbmc7XG59XG5cbmNvbnN0IFVOSVRfU0NBTEVTID0gbmV3IE1hcDxSZXNvbHZlZFVuaXRzLCBVbml0U2NhbGU+KFtcbiAgW1JlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcywgeyBkaXZpc29yOiAxZTMsIHN1ZmZpeDogJ0snLCBjb21tYXM6ICcsJyB9XSxcbiAgW1JlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLCB7IGRpdmlzb3I6IDFlNiwgc3VmZml4OiAnTScsIGNvbW1hczogJywsJyB9XSxcbl0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE51bWJlck9wdGlvbnMge1xuICAvLyBXaGF0IGFuIGVtcHR5IHZhbHVlIHByaW50czogJ+KAlCcgZm9yIGEgS1BJIG9yIGEgdG9vbHRpcCwgJycgZm9yIGEgY2VsbC5cbiAgZW1wdHk/OiBzdHJpbmc7XG4gIC8vIFVuaXRzIGFscmVhZHkgZGVjaWRlZCBmb3IgdGhlIHdob2xlIGNoYXJ0LCBpbiBwbGFjZSBvZiB0aGUgc3BlYydzIG93bi5cbiAgdW5pdHM/OiBSZXNvbHZlZFVuaXRzO1xuICAvLyBEZWNpbWFscyBhbHJlYWR5IGRlY2lkZWQgZm9yIHRoZSB3aG9sZSBjaGFydCwgcGlubmVkIGFzIG1pbiBhbmQgbWF4LiBudWxsXG4gIC8vIGxlYXZlcyB0aGUgc3BlYydzIG93bi5cbiAgZGVjaW1hbHM/OiBudW1iZXIgfCBudWxsO1xuICAvLyBXcml0ZXMgYSBwbHVzIGJlZm9yZSBhIHBvc2l0aXZlIHZhbHVlLCBhcyBhIGNoYW5nZSByZWFkcyAoJysxMiUnKS4gWmVybyxcbiAgLy8gYW5kIGEgdmFsdWUgd2hvc2Ugc2hvd24gZGlnaXRzIGFyZSBhbGwgemVybywgc3RheXMgdW5zaWduZWQuXG4gIHNpZ25lZD86IGJvb2xlYW47XG59XG5cbi8vIEhvdyBhIGNoYXJ0J3MgdmFsdWUgYXhpcyB3cml0ZXMgaXRzIHRpY2tzLCBkZWNpZGVkIG9uY2UgcGVyIGNoYXJ0LlxuZXhwb3J0IGludGVyZmFjZSBDaGFydE51bWJlckZvcm1hdCB7XG4gIHVuaXRzOiBSZXNvbHZlZFVuaXRzO1xuICAvLyBQaW5uZWQgZGVjaW1hbHMsIG9yIG51bGwgZm9yIGEgcGxhaW4gbnVtYmVyIHdob3NlIHRpY2tzIGtlZXAgdGhlaXIgb3duLlxuICBkZWNpbWFsczogbnVtYmVyIHwgbnVsbDtcbn1cblxuLy8gVGhlIHZhbHVlIGFzIGEgZmluaXRlIG51bWJlciB3aGVuIGl0IGlzIG9uZSBvciBwbGFpbmx5IHNwZWxscyBvbmUsIGVsc2Vcbi8vIG51bGwuXG5leHBvcnQgZnVuY3Rpb24gdG9GaW5pdGVOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICFOVU1FUklDX1BBVFRFUk4udGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIodmFsdWUpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykgPyBudW1lcmljIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciBhIHNsb3QgYXNrcyB0byBiZSBmb3JtYXR0ZWQgYXQgYWxsLiBBIHNsb3Qgd2l0aG91dCB0aGVzZSBrZXlzLCBvciBhXG4vLyBsaXN0IGNvbHVtbiB3aG9zZSBmb3JtYXQgaXMgZGF0ZSwga2VlcHMgaXRzIG93biByZW5kZXJpbmcuIFVuaXRzIG5vbmUgaXMgdGhlXG4vLyBzYW1lIGFzIG5vIHVuaXRzIGtleSwgYXMgaXQgaXMgb24gdGhlIHNlcnZlci5cbmV4cG9ydCBmdW5jdGlvbiBoYXNOdW1iZXJGb3JtYXQoc3BlYz86IE51bWJlckZvcm1hdFNwZWMgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghc3BlYyB8fCBzcGVjLmZvcm1hdCA9PT0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdC5EYXRlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpICE9PSBudWxsXG4gICAgfHwgKHNwZWMucHJlY2lzaW9uID8/IG51bGwpICE9PSBudWxsXG4gICAgfHwgKChzcGVjLnVuaXRzID8/IFJlcG9ydE51bWJlclVuaXRzLk5vbmUpICE9PSBSZXBvcnROdW1iZXJVbml0cy5Ob25lKTtcbn1cblxuLy8gVGhlIHVuaXRzIGEgdmFsdWUgaXMgd3JpdHRlbiBpbi4gYXV0byBkZWNpZGVzIGJ5IHRoZSBtYWduaXR1ZGU6IGEgbWlsbGlvblxuLy8gYW5kIHVwIHJlYWRzIE0sIGEgdGhvdXNhbmQgYW5kIHVwIEssIHVubGVzcyB0aGUgdmFsdWUgd291bGQgdGhlbiByb3VuZCB0b1xuLy8gMTAwMEsgYXQgdGhlc2UgZGVjaW1hbHMsIHdoaWNoIHJlYWRzIDFNIGluc3RlYWQuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVuaXRzKFxuICB1bml0czogUmVwb3J0TnVtYmVyVW5pdHMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBtYWduaXR1ZGU6IG51bWJlcixcbiAgZGVjaW1hbHM6IG51bWJlcixcbik6IFJlc29sdmVkVW5pdHMge1xuICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHM6XG4gICAgY2FzZSBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9uczpcbiAgICAgIHJldHVybiB1bml0cztcbiAgICBjYXNlIFJlcG9ydE51bWJlclVuaXRzLkF1dG86XG4gICAgICByZXR1cm4gYXV0b1VuaXRzKE1hdGguYWJzKG1hZ25pdHVkZSksIGRlY2ltYWxzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk5vbmU7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXV0b1VuaXRzKG1hZ25pdHVkZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogUmVzb2x2ZWRVbml0cyB7XG4gIGlmIChtYWduaXR1ZGUgPj0gMWU2KSB7XG4gICAgcmV0dXJuIFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zO1xuICB9XG5cbiAgaWYgKG1hZ25pdHVkZSA8IDFlMykge1xuICAgIHJldHVybiBSZXBvcnROdW1iZXJVbml0cy5Ob25lO1xuICB9XG5cbiAgcmV0dXJuIHJvdW5kVG8obWFnbml0dWRlIC8gMWUzLCBkZWNpbWFscykgPj0gMTAwMFxuICAgID8gUmVwb3J0TnVtYmVyVW5pdHMuTWlsbGlvbnNcbiAgICA6IFJlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcztcbn1cblxuLy8gVGhlIHZhbHVlIHJvdW5kZWQgYXMgSW50bCByb3VuZHMgaXQgZm9yIGRpc3BsYXksIHNvIHRoZSBLLXRvLU0gcHJvbW90aW9uXG4vLyBhZ3JlZXMgd2l0aCB0aGUgZGlnaXRzIGFjdHVhbGx5IHNob3duLlxuZnVuY3Rpb24gcm91bmRUbyh2YWx1ZTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZGlnaXRzID0gY2xhbXBEZWNpbWFscyhkZWNpbWFscykgPz8gMDtcblxuICAvLyBBIGZpeGVkIGxvY2FsZSBvbmx5IHNvIE51bWJlcigpIGNhbiBwYXJzZSB0aGUgcm91bmRlZCBkaWdpdHMgYmFjay5cbiAgcmV0dXJuIE51bWJlcihudW1iZXJGb3JtYXQoUkVQT1JUX0ZBTExCQUNLX0xPQ0FMRSwge1xuICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IDAsXG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkaWdpdHMsXG4gIH0pLmZvcm1hdCh2YWx1ZSkpO1xufVxuXG4vLyBPbmUgdmFsdWUsIHdyaXR0ZW4gYnkgdGhlIHJ1bGVzIGFib3ZlLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihcbiAgdmFsdWU6IHVua25vd24sXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBvcHRpb25zOiBGb3JtYXROdW1iZXJPcHRpb25zID0ge30sXG4pOiBzdHJpbmcge1xuICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiBvcHRpb25zLmVtcHR5ID8/IEVNUFRZX1ZBTFVFO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNwZWMpO1xuICBjb25zdCBwcmVjaXNpb24gPSBjbGFtcERlY2ltYWxzKHNwZWM/LnByZWNpc2lvbik7XG4gIGNvbnN0IHVuaXRzID0gc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnRcbiAgICA/IFJlcG9ydE51bWJlclVuaXRzLk5vbmVcbiAgICA6IG9wdGlvbnMudW5pdHMgPz8gcmVzb2x2ZVVuaXRzKHNwZWM/LnVuaXRzLCBudW1lcmljLCBwcmVjaXNpb24gPz8gU0NBTEVEX0RFQ0lNQUxTKTtcbiAgY29uc3Qgc2NhbGUgPSBVTklUX1NDQUxFUy5nZXQodW5pdHMpO1xuICBjb25zdCBkZWNpbWFscyA9IGNsYW1wRGVjaW1hbHMob3B0aW9ucy5kZWNpbWFscykgPz8gcHJlY2lzaW9uO1xuICBjb25zdCBmb3JtYXR0ZXIgPSBudW1iZXJGb3JtYXQoY29udGV4dC5sb2NhbGUsIHtcbiAgICAuLi5zdHlsZU9wdGlvbnMoc3R5bGUsIGNvbnRleHQsIGRlY2ltYWxzLCAhIXNjYWxlKSxcbiAgICAuLi4ob3B0aW9ucy5zaWduZWQgPyBTSUdORUQgOiB7fSksXG4gIH0pO1xuICBjb25zdCB0ZXh0ID0gd3JpdGVOdW1iZXIoZm9ybWF0dGVyLCAobnVtZXJpYyA9PT0gMCA/IDAgOiBudW1lcmljKSAvIChzY2FsZT8uZGl2aXNvciA/PyAxKSwgc2NhbGU/LnN1ZmZpeCk7XG5cbiAgcmV0dXJuIHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50ICYmICFjb250ZXh0LnJhdGlvUGVyY2VudCA/IGAke3RleHR9JWAgOiB0ZXh0O1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5VmFsdWUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgIHx8IHZhbHVlID09PSAnJ1xuICAgIHx8IHZhbHVlID09PSAnLSdcbiAgICB8fCAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSk7XG59XG5cbi8vIFRoZSB2YWx1ZSBmb3JtYXQgYSBzbG90IG5hbWVzLCBvciBudWxsIHdoZW4gaXQgbmFtZXMgbm9uZSAob3Igb25seSBkYXRlKS5cbmZ1bmN0aW9uIHZhbHVlRm9ybWF0KHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0VmFsdWVGb3JtYXQgfCBudWxsIHtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoUmVwb3J0VmFsdWVGb3JtYXQpLmZpbmQoKGZvcm1hdCkgPT4gZm9ybWF0ID09PSBzcGVjPy5mb3JtYXQpID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZShzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFJlcG9ydFZhbHVlRm9ybWF0IHtcbiAgcmV0dXJuIHZhbHVlRm9ybWF0KHNwZWMpID8/IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlcjtcbn1cblxuLy8gQSB1c2FibGUgZGVjaW1hbCBjb3VudCwgb3IgbnVsbC4gQSBzdG9yZWQgdmFsdWUgb3V0c2lkZSB0aGUgc2NoZW1hJ3MgYm91bmRzXG4vLyBpcyBicm91Z2h0IGluc2lkZSB0aGVtIHJhdGhlciB0aGFuIHRocm93biBvbiBieSBJbnRsLlxuZnVuY3Rpb24gY2xhbXBEZWNpbWFscyhkZWNpbWFsczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIGRlY2ltYWxzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZGVjaW1hbHMpXG4gICAgPyBNYXRoLm1pbihNQVhfUFJFQ0lTSU9OLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGRlY2ltYWxzKSkpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBzdHlsZU9wdGlvbnMoXG4gIHN0eWxlOiBSZXBvcnRWYWx1ZUZvcm1hdCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgZGVjaW1hbHM6IG51bWJlciB8IG51bGwsXG4gIHNjYWxlZDogYm9vbGVhbixcbik6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGNvbnN0IGZyYWN0aW9uRGlnaXRzID0gZnJhY3Rpb25EaWdpdE9wdGlvbnMoZGVjaW1hbHMsIGRlZmF1bHREZWNpbWFscyhzdHlsZSwgc2NhbGVkKSk7XG5cbiAgc3dpdGNoIChzdHlsZSkge1xuICAgIGNhc2UgUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3k6XG4gICAgICByZXR1cm4geyAuLi5jdXJyZW5jeU9wdGlvbnMoY29udGV4dC5jdXJyZW5jeSksIC4uLmZyYWN0aW9uRGlnaXRzIH07XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIGNvbnRleHQucmF0aW9QZXJjZW50ID8geyBzdHlsZTogJ3BlcmNlbnQnLCAuLi5mcmFjdGlvbkRpZ2l0cyB9IDogZnJhY3Rpb25EaWdpdHM7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmcmFjdGlvbkRpZ2l0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBjdXJyZW5jeU9wdGlvbnMoY3VycmVuY3k6IFJlcG9ydEN1cnJlbmN5Q29kZSk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIHJldHVybiB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeSwgY3VycmVuY3lEaXNwbGF5OiAnc3ltYm9sJyB9O1xufVxuXG4vLyBUaGUgbW9zdCBkZWNpbWFscyBhIHN0eWxlIHNob3dzIHdoZW4gbm90aGluZyBwaW5zIHRoZW07IG51bGwgbGVhdmVzIEludGwnc1xuLy8gb3duIGRlZmF1bHQuXG5mdW5jdGlvbiBkZWZhdWx0RGVjaW1hbHMoc3R5bGU6IFJlcG9ydFZhbHVlRm9ybWF0LCBzY2FsZWQ6IGJvb2xlYW4pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHNjYWxlZCkge1xuICAgIHJldHVybiBTQ0FMRURfREVDSU1BTFM7XG4gIH1cblxuICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50OlxuICAgICAgcmV0dXJuIFBFUkNFTlRfREVDSU1BTFM7XG4gICAgY2FzZSBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeTpcbiAgICAgIHJldHVybiBDVVJSRU5DWV9ERUNJTUFMUztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8gUGlubmVkIGRlY2ltYWxzIHNldCBib3RoIGJvdW5kcy4gT3RoZXJ3aXNlIGEgbWF4aW11bSBhbHNvIHNldHMgdGhlIG1pbmltdW1cbi8vIHRvIHplcm8sIHNvIG5vIGVuZ2luZSB0aHJvd3Mgb24gYSBtYXhpbXVtIGJlbG93IGEgY3VycmVuY3kncyBvd24gbWluaW11bS5cbmZ1bmN0aW9uIGZyYWN0aW9uRGlnaXRPcHRpb25zKHBpbm5lZDogbnVtYmVyIHwgbnVsbCwgbWF4aW11bTogbnVtYmVyIHwgbnVsbCk6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyB7XG4gIGlmIChwaW5uZWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4geyBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHBpbm5lZCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBwaW5uZWQgfTtcbiAgfVxuXG4gIHJldHVybiBtYXhpbXVtID09PSBudWxsID8ge30gOiB7IG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCwgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtIH07XG59XG5cbi8vIFRoZSBmb3JtYXR0ZWQgdmFsdWUsIHdpdGggdGhlIHVuaXRzIGxldHRlciBhZnRlciBpdHMgZGlnaXRzLiBBIG5lZ2F0aXZlXG4vLyB3aG9zZSBzaG93biBkaWdpdHMgYXJlIGFsbCB6ZXJvIGlzIHdyaXR0ZW4gYXMgemVybywgc28gbm8gJy0wJyBhcHBlYXJzLlxuZnVuY3Rpb24gd3JpdGVOdW1iZXIoZm9ybWF0dGVyOiBJbnRsLk51bWJlckZvcm1hdCwgdmFsdWU6IG51bWJlciwgc3VmZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID49IDAgJiYgIXN1ZmZpeCkge1xuICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHModmFsdWUpO1xuXG4gIGlmICh2YWx1ZSA8IDAgJiYgIWhhc05vblplcm9EaWdpdChmb3JtYXR0ZXIsIHBhcnRzKSkge1xuICAgIHJldHVybiB3cml0ZU51bWJlcihmb3JtYXR0ZXIsIDAsIHN1ZmZpeCk7XG4gIH1cblxuICBpZiAoIXN1ZmZpeCkge1xuICAgIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudmFsdWUpLmpvaW4oJycpO1xuICB9XG5cbiAgY29uc3QgbGFzdCA9IHBhcnRzLnJlZHVjZSgoZm91bmQsIHBhcnQsIGluZGV4KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkgPyBpbmRleCA6IGZvdW5kLCAtMSk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi5wYXJ0cy5zbGljZSgwLCBsYXN0ICsgMSkubWFwKChwYXJ0KSA9PiBwYXJ0LnZhbHVlKSxcbiAgICBzdWZmaXgsXG4gICAgLi4ucGFydHMuc2xpY2UobGFzdCArIDEpLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSksXG4gIF0uam9pbignJyk7XG59XG5cbi8vIENvbXBhcmVkIHdpdGggdGhlIGxvY2FsZSdzIG93biB6ZXJvLCBzbyBhIG51bWJlcmluZyBzeXN0ZW0gb3RoZXIgdGhhblxuLy8gMC05IGlzIHJlYWQgY29ycmVjdGx5LlxuZnVuY3Rpb24gaGFzTm9uWmVyb0RpZ2l0KGZvcm1hdHRlcjogSW50bC5OdW1iZXJGb3JtYXQsIHBhcnRzOiBJbnRsLk51bWJlckZvcm1hdFBhcnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB6ZXJvID0gZm9ybWF0dGVyLmZvcm1hdFRvUGFydHMoMCkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnaW50ZWdlcicpPy52YWx1ZSA/PyAnMCc7XG5cbiAgcmV0dXJuIHBhcnRzLnNvbWUoKHBhcnQpID0+IERJR0lUX1BBUlRTLmhhcyhwYXJ0LnR5cGUpXG4gICAgJiYgQXJyYXkuZnJvbShwYXJ0LnZhbHVlKS5zb21lKChjaGFyYWN0ZXIpID0+IGNoYXJhY3RlciAhPT0gemVybykpO1xufVxuXG5cbi8vIE91dHB1dCB2YWx1ZXM6IGEgY29sdW1uIHRoZSBzZXJ2ZXIgbWFya3MgaW4gQ29tcG9uZW50RGF0YS5vdXRwdXRzIChhXG4vLyBjb21wYXJlZCB2YWx1ZSwgYSByYW5rLCBhIHNoYXJlKSB3cml0dGVuIGJ5IHdoYXQgaXQgaXMuIFRoZSBkYXRhIHN0YXlzIHJhdztcbi8vIGV2ZXJ5IG51bWJlciBzdGlsbCBnb2VzIHRocm91Z2ggZm9ybWF0TnVtYmVyLiBUaGUgcnVsZXM6XG4vLyAtIFRoZSBmb3JtYXQ6IGEgc2xvdCdzIG93biBleHBsaWNpdCBmb3JtYXQgYWx3YXlzIHdpbnMuIE90aGVyd2lzZSBhIGN1cnJlbnQsXG4vLyAgIHByaW9yIG9yIGNoYW5nZSBjb2x1bW4gdGFrZXMgaXRzIHNvdXJjZSBtZWFzdXJlJ3MgZm9ybWF0OyBhIHBlcmNlbnQgY2hhbmdlXG4vLyAgIGlzIGEgcGVyY2VudDsgYSByYW5rIGlzIGEgd2hvbGUgbnVtYmVyOyBhIHNoYXJlIGlzIGEgcGVyY2VudCB0byAxIGRlY2ltYWwuXG4vLyAgIEFuIG93biBwcmVjaXNpb24gb3IgdW5pdHMgc3RpbGwgYXBwbGllcyBvdmVyIHRob3NlIGRlZmF1bHRzLlxuLy8gLSBTaWduczogYSBjaGFuZ2UgYW5kIGEgcGVyY2VudCBjaGFuZ2UgYXJlIHNpZ25lZCAoJys1NzknLCAnLTMxLjElJykuXG4vLyAtIFBvaW50czogYSBjaGFuZ2Ugb2YgYSBwZXJjZW50LWZvcm1hdCB2YWx1ZSwgYW5kIGFueSBzaGFyZSBjaGFuZ2UsIGlzIGFcbi8vICAgZGlmZmVyZW5jZSBvZiB0d28gcmF0ZXMsIHNvIGl0IHByaW50cyBpbiBwZXJjZW50YWdlIHBvaW50cywgc2lnbmVkIGFuZCB0b1xuLy8gICAxIGRlY2ltYWwgdW5sZXNzIGEgcHJlY2lzaW9uIHBpbnMgb3RoZXJzOiAwLjEgcmVhZHMgJysxMC4wIHBwJy5cbi8vIC0gTWlzc2luZzogYSBtaXNzaW5nIHByaW9yLCBvciBhIGNoYW5nZSBvciBwZXJjZW50IGNoYW5nZSBsZWZ0IGVtcHR5IGJ5XG4vLyAgIG9uZSwgcHJpbnRzICfigJQnIHRpdGxlZCB3aXRoIHRoZSBmbG9vciAoJ05vIGJhc2VsaW5lOiBubyBkYXRhIGJlZm9yZVxuLy8gICBNYXIgMywgMjAyNicpLCBvciBmb3IgYSByYW5rIG9yIGEgc2hhcmUgd2l0aCB0aGUgcGVyaW9kIHRoZSByb3cgd2FzXG4vLyAgIGFic2VudCBmcm9tICgnTm8gcmFuayBpbiB0aGUgcHJpb3IgcGVyaW9kJyk7IGEgcGVyY2VudCBjaGFuZ2Ugb3ZlciBhIHByaW9yIG9mIDAgcHJpbnRzICduL2EnIHRpdGxlZFxuLy8gICAnUHJpb3Igd2FzIDAnLiBBbnkgb3RoZXIgbWlzc2luZyB2YWx1ZSBwcmludHMgJ+KAlCcgKG9yIHRoZSBjYWxsZXIncyBlbXB0eSkuXG4vLyAtIFJhbmsgY2hhbmdlOiBwcmlvciBtaW51cyBjdXJyZW50LCBzbyBhIHJpc2UgaXMgcG9zaXRpdmU6ICfilrIgMicsICfilrwgMScsXG4vLyAgICfigJMnIGZvciBub25lLCBhbmQgJ25ldycgZm9yIGFuIGVtcHR5IGNoYW5nZSB3aG9zZSBwcmlvciByYW5rIGlzIG1pc3Npbmdcbi8vICAgb3Igbm90IHBhc3NlZCAoYSByb3cgYWx3YXlzIGhhcyBhIGN1cnJlbnQgcmFuaywgc28gb25seSB0aGUgcHJpb3IgbGFja3MpLlxuLy8gQSBwZXJjZW50IGNoYW5nZSBhbmQgYSBzaGFyZSBhcmUgMC0xIGZyYWN0aW9ucyB3aGF0ZXZlciB0aGUgcmVwb3J0J3Ncbi8vIHBlcmNlbnRGb3JtYXQ6IHRoZSBzZXJ2ZXIgY29tcHV0ZXMgdGhlbSwgbmV2ZXIgYSBzdG9yZWQgdmFsdWUuXG5cbi8vIEEgbWlzc2luZyBjb21wYXJpc29uIHZhbHVlIHByaW50cyBFTVBUWV9WQUxVRSB3aGF0ZXZlciB0aGUgY2FsbGVyJ3MgZW1wdHkuXG5jb25zdCBOT1RfQVBQTElDQUJMRV9WQUxVRSA9ICduL2EnO1xuY29uc3QgTkVXX1JBTktfVkFMVUUgPSAnbmV3JztcbmNvbnN0IFJBTktfVU5DSEFOR0VEX1ZBTFVFID0gJ+KAkyc7XG5jb25zdCBSQU5LX1VQX01BUksgPSAn4payJztcbmNvbnN0IFJBTktfRE9XTl9NQVJLID0gJ+KWvCc7XG5jb25zdCBQT0lOVFNfU1VGRklYID0gJ3BwJztcbmNvbnN0IE5PX1BSSU9SX1JBTktfVElUTEUgPSAnTm8gcmFuayBpbiB0aGUgcHJpb3IgcGVyaW9kJztcbmNvbnN0IE5PX1BSSU9SX1NIQVJFX1RJVExFID0gJ05vIHNoYXJlIGluIHRoZSBwcmlvciBwZXJpb2QnO1xuLy8gUGVyY2VudGFnZSBwb2ludHMgYW5kIGEgc2hhcmUgYXJlIHdyaXR0ZW4gdG8gb25lIGRlY2ltYWwgdW5sZXNzIHBpbm5lZC5cbmNvbnN0IFBPSU5UU19ERUNJTUFMUyA9IDE7XG5jb25zdCBTSEFSRV9ERUNJTUFMUyA9IDE7XG5cbmNvbnN0IFJBTktfREVGQVVMVF9TUEVDOiBSZWFkb25seTxOdW1iZXJGb3JtYXRTcGVjPiA9IE9iamVjdC5mcmVlemUoeyBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlciwgcHJlY2lzaW9uOiAwIH0pO1xuY29uc3QgU0hBUkVfREVGQVVMVF9TUEVDOiBSZWFkb25seTxOdW1iZXJGb3JtYXRTcGVjPiA9IE9iamVjdC5mcmVlemUoe1xuICBmb3JtYXQ6IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQsXG4gIHByZWNpc2lvbjogU0hBUkVfREVDSU1BTFMsXG59KTtcbmNvbnN0IFBFUkNFTlRfQ0hBTkdFX0RFRkFVTFRfU1BFQzogUmVhZG9ubHk8TnVtYmVyRm9ybWF0U3BlYz4gPSBPYmplY3QuZnJlZXplKHsgZm9ybWF0OiBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50IH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dFZhbHVlT3B0aW9ucyB7XG4gIC8vIFRoZSBzb3VyY2UgbWVhc3VyZSdzIGZvcm1hdCAoT3V0cHV0TWV0YS5tZWFzdXJlJ3Mgc2xvdCksIHdoaWNoIGEgY3VycmVudCxcbiAgLy8gcHJpb3Igb3IgY2hhbmdlIGNvbHVtbiB0YWtlcyB3aGVuIGl0cyBvd24gc2xvdCBuYW1lcyBub25lLlxuICBtZWFzdXJlU3BlYz86IE51bWJlckZvcm1hdFNwZWMgfCBudWxsO1xuICAvLyBUaGUgcm93J3MgcHJpb3IgdmFsdWUgaW4gdGhlIHNhbWUgbGFuZSAoc2VlIGxhbmVPdXRwdXRBbGlhcyksIGZvciBhIGNoYW5nZVxuICAvLyBvciBhIHBlcmNlbnQgY2hhbmdlOiBpdCB0ZWxscyBhIG1pc3NpbmcgYmFzZWxpbmUgKCfigJQnKSBmcm9tIGEgemVybyBvbmVcbiAgLy8gKCduL2EnKSwgYW5kIGEgbmV3IHJhbmsgZnJvbSBhbiB1bnJhbmtlZCByb3cuIExlYXZlIGl0IG91dCB3aGVuIHVua25vd24uXG4gIHByaW9yPzogdW5rbm93bjtcbiAgLy8gQ29tcG9uZW50RGF0YS5jb21wYXJpc29uLmZsb29yOiB0aGUgZmlyc3QgZGF5IHdpdGggZGF0YSwgbmFtZWQgaW4gdGhlXG4gIC8vIG5vLWJhc2VsaW5lIHRpdGxlLlxuICBmbG9vcj86IHN0cmluZyB8IG51bGw7XG4gIC8vIFdoYXQgYSBtaXNzaW5nIGN1cnJlbnQgb3IgcGxhaW4gdmFsdWUgcHJpbnRzICgnJyBmb3IgYSBjZWxsKS4gQSBtaXNzaW5nXG4gIC8vIGNvbXBhcmlzb24gdmFsdWUgYWx3YXlzIHByaW50cyAn4oCUJy5cbiAgZW1wdHk/OiBzdHJpbmc7XG59XG5cbi8vIEFuIG91dHB1dCB2YWx1ZSBhcyBzaG93biwgYW5kIHdoeSBpdCByZWFkcyBzbyB3aGVuIHRoYXQgaXMgbm90IG9idmlvdXNcbi8vIChudWxsIG90aGVyd2lzZSk6IGZvciBhIHRvb2x0aXAgb3IgYSB0aXRsZSBhdHRyaWJ1dGUuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgdGV4dDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gT25lIG91dHB1dCB2YWx1ZSwgd3JpdHRlbiBieSB0aGUgcnVsZXMgYWJvdmUuIFdpdGhvdXQgb3V0cHV0IG1ldGFkYXRhIChhXG4vLyBwbGFpbiBtZWFzdXJlIGNvbHVtbiwgYW4gb2xkZXIgc2VydmVyKSBpdCBpcyBmb3JtYXROdW1iZXIgd2l0aCB0aGUgc2xvdCdzXG4vLyBvd24gZm9ybWF0LlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE91dHB1dFZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgb3V0cHV0OiBPdXRwdXRNZXRhIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3BlYzogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyA9IHt9LFxuKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICBpZiAoIW91dHB1dCkge1xuICAgIHJldHVybiBwbGFpbk91dHB1dChmb3JtYXROdW1iZXIodmFsdWUsIHNwZWMsIGNvbnRleHQsIHsgZW1wdHk6IG9wdGlvbnMuZW1wdHkgfSkpO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycgJiYgb3V0cHV0LnJvbGUgPT09ICdjaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGZvcm1hdFJhbmtDaGFuZ2UodmFsdWUsIHNwZWMsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3Qgcm9sZSA9IG91dHB1dC5yb2xlO1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdXRwdXRGb3JtYXRTcGVjKG91dHB1dCwgc3BlYywgb3B0aW9ucy5tZWFzdXJlU3BlYyk7XG5cbiAgaWYgKGlzRW1wdHlWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbWlzc2luZ091dHB1dChvdXRwdXQsIGNvbnRleHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgaWYgKHJvbGUgPT09ICdjaGFuZ2UnICYmIGlzUG9pbnRzQ2hhbmdlKG91dHB1dCwgZWZmZWN0aXZlKSkge1xuICAgIHJldHVybiBwbGFpbk91dHB1dChmb3JtYXRQb2ludHModmFsdWUsIG91dHB1dCwgZWZmZWN0aXZlLCBjb250ZXh0KSk7XG4gIH1cblxuICBjb25zdCBzaWduZWQgPSByb2xlID09PSAnY2hhbmdlJyB8fCByb2xlID09PSAncGVyY2VudF9jaGFuZ2UnO1xuICBjb25zdCByYXRpb0NvbnRleHQgPSByb2xlID09PSAncGVyY2VudF9jaGFuZ2UnIHx8IG91dHB1dC5raW5kID09PSAnc2hhcmUnXG4gICAgPyB7IC4uLmNvbnRleHQsIHJhdGlvUGVyY2VudDogdHJ1ZSB9XG4gICAgOiBjb250ZXh0O1xuXG4gIHJldHVybiBwbGFpbk91dHB1dChmb3JtYXROdW1iZXIodmFsdWUsIGVmZmVjdGl2ZSwgcmF0aW9Db250ZXh0LCB7IHNpZ25lZCB9KSk7XG59XG5cbi8vIFRoZSBhbGlhcyBvZiB0aGUgb3V0cHV0IHRoYXQgcGxheXMgYHJvbGVgIGluIHRoZSBzYW1lIGxhbmUgYXMgYGFsaWFzYDogdGhlXG4vLyBzYW1lIG1lYXN1cmUgYW5kIGtpbmQsIGFuZCAoZm9yIGEgcHJpb3IsIGNoYW5nZSBvciBwZXJjZW50IGNoYW5nZSkgdGhlIHNhbWVcbi8vIHByaW9yIGxhbmUuIEEgbWVhc3VyZSBjb21wYXJlcyBhZ2FpbnN0IG9uZSBsYW5lIG9ubHkgKHR3byBjb21wYXJlcyBvbiBvbmVcbi8vIHZhbHVlIGFyZSB0d28gbWVhc3VyZXMpLCBzbyBhIGN1cnJlbnQgdmFsdWUncyBsYW5lIGlzIHdoaWNoZXZlciBvbmUgaXRzXG4vLyBtZWFzdXJlJ3MgcHJpb3IgY29sdW1ucyBjYXJyeSwgbGFuZSAyIGFzIHJlYWRpbHkgYXMgbGFuZSAxLiBBIGNoYW5nZSBjb2x1bW5cbi8vIGZpbmRzIGl0cyBwcmlvciB0aGlzIHdheSB0byBwYXNzIGFzIE91dHB1dFZhbHVlT3B0aW9ucy5wcmlvci4gbnVsbCB3aGVuIHRoZVxuLy8gc2VydmVyIHNlbmRzIG5vIHN1Y2ggY29sdW1uLlxuZXhwb3J0IGZ1bmN0aW9uIGxhbmVPdXRwdXRBbGlhcyhcbiAgb3V0cHV0czogUmVjb3JkPHN0cmluZywgT3V0cHV0TWV0YT4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBhbGlhczogc3RyaW5nLFxuICByb2xlOiBPdXRwdXRSb2xlLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHNvdXJjZSA9IG91dHB1dHM/LlthbGlhc107XG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFueUxhbmUgPSBzb3VyY2Uucm9sZSA9PT0gJ2N1cnJlbnQnIHx8IHNvdXJjZS5vZmZzZXQgPT09IG51bGw7XG4gIGNvbnN0IGZvdW5kID0gT2JqZWN0LmVudHJpZXMob3V0cHV0cyA/PyB7fSkuZmluZCgoWywgbWV0YV0pID0+IG1ldGEubWVhc3VyZSA9PT0gc291cmNlLm1lYXN1cmVcbiAgICAmJiBtZXRhLmtpbmQgPT09IHNvdXJjZS5raW5kXG4gICAgJiYgbWV0YS5yb2xlID09PSByb2xlXG4gICAgJiYgKHJvbGUgPT09ICdjdXJyZW50JyB8fCAoYW55TGFuZSA/IG1ldGEub2Zmc2V0ICE9PSBudWxsIDogbWV0YS5vZmZzZXQgPT09IHNvdXJjZS5vZmZzZXQpKSk7XG5cbiAgcmV0dXJuIGZvdW5kID8gZm91bmRbMF0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBwbGFpbk91dHB1dCh0ZXh0OiBzdHJpbmcpOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gIHJldHVybiB7IHRleHQsIHRpdGxlOiBudWxsIH07XG59XG5cbi8vIFRoZSBmb3JtYXQgYW4gb3V0cHV0IGlzIHdyaXR0ZW4gaW46IHRoZSBzbG90J3Mgb3duIGV4cGxpY2l0IGZvcm1hdCwgZWxzZVxuLy8gdGhlIGRlZmF1bHQgZm9yIHdoYXQgaXQgaG9sZHMsIHdpdGggYW55IG93biBwcmVjaXNpb24gb3IgdW5pdHMgb3ZlciBpdC5cbmZ1bmN0aW9uIG91dHB1dEZvcm1hdFNwZWMoXG4gIG91dHB1dDogT3V0cHV0TWV0YSxcbiAgb3duOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbWVhc3VyZVNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwge1xuICBpZiAodmFsdWVGb3JtYXQob3duKSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBvd247XG4gIH1cblxuICBpZiAob3V0cHV0LmtpbmQgPT09ICdyYW5rJykge1xuICAgIHJldHVybiB3aXRoT3duRGlnaXRzKFJBTktfREVGQVVMVF9TUEVDLCBvd24pO1xuICB9XG5cbiAgaWYgKG91dHB1dC5raW5kID09PSAnc2hhcmUnKSB7XG4gICAgcmV0dXJuIHdpdGhPd25EaWdpdHMoU0hBUkVfREVGQVVMVF9TUEVDLCBvd24pO1xuICB9XG5cbiAgaWYgKG91dHB1dC5yb2xlID09PSAncGVyY2VudF9jaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHdpdGhPd25EaWdpdHMoUEVSQ0VOVF9DSEFOR0VfREVGQVVMVF9TUEVDLCBvd24pO1xuICB9XG5cbiAgcmV0dXJuIG1lYXN1cmVTcGVjID8gd2l0aE93bkRpZ2l0cyhtZWFzdXJlU3BlYywgb3duKSA6IG93biA/PyBudWxsO1xufVxuXG4vLyBUaGUgYmFzZSBmb3JtYXQgd2l0aCB0aGUgc2xvdCdzIG93biBwcmVjaXNpb24gYW5kIHVuaXRzIG92ZXIgaXQuXG5mdW5jdGlvbiB3aXRoT3duRGlnaXRzKGJhc2U6IE51bWJlckZvcm1hdFNwZWMsIG93bjogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwgfCB1bmRlZmluZWQpOiBOdW1iZXJGb3JtYXRTcGVjIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLigob3duPy5wcmVjaXNpb24gPz8gbnVsbCkgIT09IG51bGwgPyB7IHByZWNpc2lvbjogb3duLnByZWNpc2lvbiB9IDoge30pLFxuICAgIC4uLigob3duPy51bml0cyA/PyBudWxsKSAhPT0gbnVsbCA/IHsgdW5pdHM6IG93bi51bml0cyB9IDoge30pLFxuICB9O1xufVxuXG4vLyBBIGNoYW5nZSBiZXR3ZWVuIHR3byByYXRlczogYSBzaGFyZSdzLCBvciBhIHBlcmNlbnQtZm9ybWF0IHZhbHVlJ3MuXG5mdW5jdGlvbiBpc1BvaW50c0NoYW5nZShvdXRwdXQ6IE91dHB1dE1ldGEsIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXQua2luZCA9PT0gJ3NoYXJlJyB8fCByZXNvbHZlU3R5bGUoc3BlYykgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQ7XG59XG5cbi8vIEEgcmF0ZSBjaGFuZ2UgaW4gcGVyY2VudGFnZSBwb2ludHMuIEEgc2hhcmUgYW5kIGEgMC0xIHBlcmNlbnQgYXJlIHNjYWxlZFxuLy8geDEwMDsgYW4gb2xkZXIgc2VydmVyJ3MgcGVyY2VudCB2YWx1ZXMgYWxyZWFkeSBhcmUuXG5mdW5jdGlvbiBmb3JtYXRQb2ludHMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIHNwZWM6IE51bWJlckZvcm1hdFNwZWMgfCBudWxsLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbnVtZXJpYyA9IHRvRmluaXRlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50cyA9IG91dHB1dC5raW5kID09PSAnc2hhcmUnIHx8IGNvbnRleHQucmF0aW9QZXJjZW50ID8gbnVtZXJpYyAqIDEwMCA6IG51bWVyaWM7XG4gIGNvbnN0IGRlY2ltYWxzID0gY2xhbXBEZWNpbWFscyhzcGVjPy5wcmVjaXNpb24pID8/IFBPSU5UU19ERUNJTUFMUztcbiAgY29uc3QgdGV4dCA9IGZvcm1hdE51bWJlcihwb2ludHMsIHsgZm9ybWF0OiBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIgfSwgY29udGV4dCwgeyBkZWNpbWFscywgc2lnbmVkOiB0cnVlIH0pO1xuXG4gIHJldHVybiBgJHt0ZXh0fSAke1BPSU5UU19TVUZGSVh9YDtcbn1cblxuLy8gQSBtaXNzaW5nIG91dHB1dCB2YWx1ZS4gQSBtaXNzaW5nIHByaW9yLCBvciBhIGRlbHRhIGEgbWlzc2luZyBwcmlvciBsZWZ0XG4vLyBlbXB0eSwgaGFzIG5vIGJhc2VsaW5lOyBhIHBlcmNlbnQgY2hhbmdlIG92ZXIgYSB6ZXJvIHByaW9yIGhhcyBub25lIHRvXG4vLyBkaXZpZGUgYnkuXG5mdW5jdGlvbiBtaXNzaW5nT3V0cHV0KFxuICBvdXRwdXQ6IE91dHB1dE1ldGEsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIG9wdGlvbnM6IE91dHB1dFZhbHVlT3B0aW9ucyxcbik6IEZvcm1hdHRlZE91dHB1dFZhbHVlIHtcbiAgY29uc3Qgcm9sZSA9IG91dHB1dC5yb2xlO1xuXG4gIGlmIChyb2xlID09PSAncHJpb3InKSB7XG4gICAgcmV0dXJuIHsgdGV4dDogRU1QVFlfVkFMVUUsIHRpdGxlOiBtaXNzaW5nUHJpb3JUaXRsZShvdXRwdXQsIG9wdGlvbnMuZmxvb3IsIGNvbnRleHQubG9jYWxlKSB9O1xuICB9XG5cbiAgaWYgKHJvbGUgPT09ICdjaGFuZ2UnIHx8IHJvbGUgPT09ICdwZXJjZW50X2NoYW5nZScpIHtcbiAgICBjb25zdCBwcmlvciA9IG9wdGlvbnMucHJpb3I7XG5cbiAgICBpZiAocm9sZSA9PT0gJ3BlcmNlbnRfY2hhbmdlJyAmJiB0b0Zpbml0ZU51bWJlcihwcmlvcikgPT09IDApIHtcbiAgICAgIHJldHVybiB7IHRleHQ6IE5PVF9BUFBMSUNBQkxFX1ZBTFVFLCB0aXRsZTogJ1ByaW9yIHdhcyAwJyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiBFTVBUWV9WQUxVRSxcbiAgICAgIHRpdGxlOiBwcmlvciAhPT0gdW5kZWZpbmVkICYmIGlzRW1wdHlWYWx1ZShwcmlvcilcbiAgICAgICAgPyBtaXNzaW5nUHJpb3JUaXRsZShvdXRwdXQsIG9wdGlvbnMuZmxvb3IsIGNvbnRleHQubG9jYWxlKVxuICAgICAgICA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBwbGFpbk91dHB1dChvcHRpb25zLmVtcHR5ID8/IEVNUFRZX1ZBTFVFKTtcbn1cblxuLy8gV2h5IGEgcHJpb3IgaXMgbWlzc2luZy4gQSB2YWx1ZSdzIHByaW9yIGlzIG1pc3Npbmcgd2hlbiBpdHMgd2luZG93IGVuZHNcbi8vIGJlZm9yZSB0aGUgZGF0YSBzdGFydHMuIEEgcmFuaydzIG9yIGEgc2hhcmUncyBpcyBtaXNzaW5nIHdoZW4gdGhlIHJvdyBoYWRcbi8vIG5vIHJhbmsgb3Igc2hhcmUgaW4gdGhlIHByaW9yIHBlcmlvZCwgd2hhdGV2ZXIgdGhlIGZsb29yLlxuZnVuY3Rpb24gbWlzc2luZ1ByaW9yVGl0bGUoXG4gIG91dHB1dDogT3V0cHV0TWV0YSxcbiAgZmxvb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgaWYgKG91dHB1dC5raW5kID09PSAncmFuaycpIHtcbiAgICByZXR1cm4gTk9fUFJJT1JfUkFOS19USVRMRTtcbiAgfVxuXG4gIGlmIChvdXRwdXQua2luZCA9PT0gJ3NoYXJlJykge1xuICAgIHJldHVybiBOT19QUklPUl9TSEFSRV9USVRMRTtcbiAgfVxuXG4gIHJldHVybiBub0Jhc2VsaW5lVGl0bGUoZmxvb3IsIGxvY2FsZSk7XG59XG5cbmZ1bmN0aW9uIG5vQmFzZWxpbmVUaXRsZShmbG9vcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcpOiBzdHJpbmcge1xuICBjb25zdCBkYXkgPSBmbG9vciA/IGZvcm1hdERheShmbG9vciwgbG9jYWxlKSA6ICcnO1xuXG4gIHJldHVybiBkYXkgPyBgTm8gYmFzZWxpbmU6IG5vIGRhdGEgYmVmb3JlICR7ZGF5fWAgOiAnTm8gYmFzZWxpbmUnO1xufVxuXG4vLyBBIHJhbmsgY2hhbmdlOiBwcmlvciByYW5rIG1pbnVzIGN1cnJlbnQsIHNvIG1vdmluZyB1cCBpcyBwb3NpdGl2ZS5cbmZ1bmN0aW9uIGZvcm1hdFJhbmtDaGFuZ2UoXG4gIHZhbHVlOiB1bmtub3duLFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgb3B0aW9uczogT3V0cHV0VmFsdWVPcHRpb25zLFxuKTogRm9ybWF0dGVkT3V0cHV0VmFsdWUge1xuICBpZiAoaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiBpc0VtcHR5VmFsdWUob3B0aW9ucy5wcmlvcilcbiAgICAgID8geyB0ZXh0OiBORVdfUkFOS19WQUxVRSwgdGl0bGU6IE5PX1BSSU9SX1JBTktfVElUTEUgfVxuICAgICAgOiBwbGFpbk91dHB1dChFTVBUWV9WQUxVRSk7XG4gIH1cblxuICBjb25zdCBudW1lcmljID0gdG9GaW5pdGVOdW1iZXIodmFsdWUpO1xuICBpZiAobnVtZXJpYyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBwbGFpbk91dHB1dChTdHJpbmcodmFsdWUpKTtcbiAgfVxuXG4gIGNvbnN0IHJhbmtTcGVjID0gdmFsdWVGb3JtYXQoc3BlYykgIT09IG51bGwgPyBzcGVjIDogd2l0aE93bkRpZ2l0cyhSQU5LX0RFRkFVTFRfU1BFQywgc3BlYyk7XG4gIGNvbnN0IHBsYWNlcyA9IGZvcm1hdE51bWJlcihNYXRoLmFicyhudW1lcmljKSwgcmFua1NwZWMsIGNvbnRleHQpO1xuXG4gIGlmIChwbGFjZXMgPT09IGZvcm1hdE51bWJlcigwLCByYW5rU3BlYywgY29udGV4dCkpIHtcbiAgICByZXR1cm4gcGxhaW5PdXRwdXQoUkFOS19VTkNIQU5HRURfVkFMVUUpO1xuICB9XG5cbiAgcmV0dXJuIHBsYWluT3V0cHV0KGAke251bWVyaWMgPiAwID8gUkFOS19VUF9NQVJLIDogUkFOS19ET1dOX01BUkt9ICR7cGxhY2VzfWApO1xufVxuXG5cbi8vIEEgY2hhcnQncyB2YWx1ZSBheGlzIHRha2VzIGEgZm9ybWF0IG9ubHkgd2hlbiBldmVyeSBtZWFzdXJlIG9uIGl0IGFncmVlcyBvblxuLy8gdGhlIHN0eWxlIChlYWNoIG1lYXN1cmUncyBmb3JtYXQsIG51bWJlciB3aGVuIGl0IG5hbWVzIG5vbmUpIGFuZCBhdCBsZWFzdFxuLy8gb25lIG9mIHRoZW0gbmFtZXMgYSBmb3JtYXQuIFRoZSBmaXJzdCBtZWFzdXJlIHRoYXQgZG9lcyBnaXZlcyB0aGUgYXhpcyBpdHNcbi8vIHByZWNpc2lvbiBhbmQgdW5pdHMuIE90aGVyd2lzZSBudWxsOiB0aGUgYXhpcyBrZWVwcyBpdHMgZGVmYXVsdCB0aWNrcyBvblxuLy8gc2NyZWVuIGFuZCBpbiBQb3dlclBvaW50LCBhbmQgZWFjaCBzZXJpZXMgc3RpbGwgZm9ybWF0cyBpdHMgb3duIHRvb2x0aXBzLlxuZXhwb3J0IGZ1bmN0aW9uIGF4aXNOdW1iZXJGb3JtYXQobWVhc3VyZXM6IENoYXJ0TWVhc3VyZVtdKTogTnVtYmVyRm9ybWF0U3BlYyB8IG51bGwge1xuICBjb25zdCBzdHlsZSA9IG1lYXN1cmVzLmxlbmd0aCA/IHJlc29sdmVTdHlsZShtZWFzdXJlc1swXSkgOiBudWxsO1xuXG4gIGlmIChzdHlsZSA9PT0gbnVsbCB8fCBtZWFzdXJlcy5zb21lKChtZWFzdXJlKSA9PiByZXNvbHZlU3R5bGUobWVhc3VyZSkgIT09IHN0eWxlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gbWVhc3VyZXMuZmluZCgobWVhc3VyZSkgPT4gaGFzTnVtYmVyRm9ybWF0KG1lYXN1cmUpKTtcblxuICByZXR1cm4gZm9ybWF0dGVkID8gbnVtYmVyRm9ybWF0U3BlYyhmb3JtYXR0ZWQpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gbnVtYmVyRm9ybWF0U3BlYyhzcGVjOiBOdW1iZXJGb3JtYXRTcGVjKTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNwZWMuZm9ybWF0ICE9PSB1bmRlZmluZWQgPyB7IGZvcm1hdDogc3BlYy5mb3JtYXQgfSA6IHt9KSxcbiAgICAuLi4oc3BlYy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHsgcHJlY2lzaW9uOiBzcGVjLnByZWNpc2lvbiB9IDoge30pLFxuICAgIC4uLihzcGVjLnVuaXRzICE9PSB1bmRlZmluZWQgPyB7IHVuaXRzOiBzcGVjLnVuaXRzIH0gOiB7fSksXG4gIH07XG59XG5cbi8vIEhvdyBhIGNoYXJ0J3MgdmFsdWUgYXhpcyB3cml0ZXMgaXRzIHRpY2tzOiB0aGUgdW5pdHMgZGVjaWRlZCBvbmNlIGZyb20gdGhlXG4vLyBheGlzIHBlYWssIGFuZCB0aGUgZGVjaW1hbHMgdGhlIHByZWNpc2lvbiBwaW5zLCBlbHNlIGFzIG1hbnkgYXMgdGhlIGF4aXMnc1xuLy8gdGljayBzdGVwIG5lZWRzIChhIHBlcmNlbnQgYXhpcyB1cCB0byAwLjEyJSBzdGVwcyBieSAwLjAyJSwgdHdvIGRlY2ltYWxzKS5cbi8vIFBpbm5lZCBkZWNpbWFscyBrZWVwIHRoZSB0aWNrcyBkaXN0aW5jdCwgYW5kIFBvd2VyUG9pbnQgY2FuIG9ubHkgcGluIHRoZW0uXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNoYXJ0TnVtYmVyRm9ybWF0KFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjLFxuICBwZWFrOiBudW1iZXIsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBDaGFydE51bWJlckZvcm1hdCB7XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNwZWMpO1xuICBjb25zdCBwcmVjaXNpb24gPSBjbGFtcERlY2ltYWxzKHNwZWMucHJlY2lzaW9uKTtcbiAgY29uc3QgdW5pdHMgPSBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudFxuICAgID8gUmVwb3J0TnVtYmVyVW5pdHMuTm9uZVxuICAgIDogcmVzb2x2ZVVuaXRzKHNwZWMudW5pdHMsIHBlYWssIHByZWNpc2lvbiA/PyBTQ0FMRURfREVDSU1BTFMpO1xuXG4gIHJldHVybiB7IHVuaXRzLCBkZWNpbWFsczogcHJlY2lzaW9uID8/IGF4aXNEZWNpbWFscyhzdHlsZSwgdW5pdHMsIHBlYWssIGNvbnRleHQpIH07XG59XG5cbi8vIFRoZSBkZWNpbWFscyB0aGUgYXhpcydzIG5pY2UgdGljayBzdGVwIG5lZWRzLiBBIHBsYWluLCB1bmFiYnJldmlhdGVkIG51bWJlclxuLy8gcGlucyBub25lIChudWxsKTogaXRzIHRpY2tzIGtlZXAgdGhlaXIgb3duIGRlY2ltYWxzLiBBbiB1bnNjYWxlZCBjdXJyZW5jeVxuLy8gYXhpcyB0aGF0IG5lZWRzIGRlY2ltYWxzIHNob3dzIGNlbnRzLCBhbmQgYSBLL00gYXhpcyBrZWVwcyBpdHMgc3RlcCdzXG4vLyBkZWNpbWFscyAoJyQwLjVNJywgbm90ICckMC41ME0nKS5cbmZ1bmN0aW9uIGF4aXNEZWNpbWFscyhcbiAgc3R5bGU6IFJlcG9ydFZhbHVlRm9ybWF0LFxuICB1bml0czogUmVzb2x2ZWRVbml0cyxcbiAgcGVhazogbnVtYmVyLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHNjYWxlID0gVU5JVF9TQ0FMRVMuZ2V0KHVuaXRzKTtcblxuICBpZiAoc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlciAmJiAhc2NhbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNob3duUGVhayA9IHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50ICYmIGNvbnRleHQucmF0aW9QZXJjZW50XG4gICAgPyBNYXRoLmFicyhwZWFrKSAqIDEwMFxuICAgIDogTWF0aC5hYnMocGVhaykgLyAoc2NhbGU/LmRpdmlzb3IgPz8gMSk7XG4gIGNvbnN0IHN0ZXAgPSBuaWNlU3RlcChzaG93blBlYWsgLyBBWElTX1RJQ0tTKTtcbiAgY29uc3QgZGVjaW1hbHMgPSBzdGVwID4gMCA/IGNsYW1wRGVjaW1hbHMoLU1hdGguZmxvb3IoTWF0aC5sb2cxMChzdGVwKSkpID8/IDAgOiAwO1xuXG4gIHJldHVybiBzdHlsZSA9PT0gUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3kgJiYgZGVjaW1hbHMgPiAwICYmICFzY2FsZSA/IENVUlJFTkNZX0FYSVNfREVDSU1BTFMgOiBkZWNpbWFscztcbn1cblxuLy8gRUNoYXJ0cycgbmljZSgpOiB0aGUgcm91bmQgbnVtYmVyICgxLCAyLCAzLCA1IG9yIDEwIHRpbWVzIGEgcG93ZXIgb2YgdGVuKSBhXG4vLyByb3VnaCB0aWNrIHN0ZXAgc25hcHMgdG8uXG5mdW5jdGlvbiBuaWNlU3RlcChyb3VnaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKCEocm91Z2ggPiAwKSB8fCAhTnVtYmVyLmlzRmluaXRlKHJvdWdoKSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgZXhwb25lbnQgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAocm91Z2gpKTtcbiAgY29uc3QgcG93ZXIgPSBNYXRoLnBvdygxMCwgZXhwb25lbnQpO1xuICBjb25zdCBmcmFjdGlvbiA9IHJvdWdoIC8gcG93ZXI7XG4gIGxldCBuaWNlID0gMTA7XG4gIGlmIChmcmFjdGlvbiA8IDEuNSkge1xuICAgIG5pY2UgPSAxO1xuICB9IGVsc2UgaWYgKGZyYWN0aW9uIDwgMi41KSB7XG4gICAgbmljZSA9IDI7XG4gIH0gZWxzZSBpZiAoZnJhY3Rpb24gPCA0KSB7XG4gICAgbmljZSA9IDM7XG4gIH0gZWxzZSBpZiAoZnJhY3Rpb24gPCA3KSB7XG4gICAgbmljZSA9IDU7XG4gIH1cblxuICByZXR1cm4gbmljZSAqIHBvd2VyO1xufVxuXG4vLyBQb3dlclBvaW50J3MgbnVtYmVyIGZvcm1hdCBjb2RlIGZvciBhIGZvcm1hdHRlZCB2YWx1ZSBheGlzLCBtYXRjaGluZyB0aGVcbi8vIHNjcmVlbidzIHRpY2tzOiAnIywjIzAuMCUnIChwZXJjZW50KSwgJ1wiJFwiIywjIzAnIChjdXJyZW5jeSksXG4vLyAnIywjIzAuMCxcIktcIicgKHRob3VzYW5kcyksICcjLCMjMFwiICRcIicgKGZyLUNBIGN1cnJlbmN5KS4gQSBwbGFpbiBudW1iZXJcbi8vIHdob3NlIGRlY2ltYWxzIGFyZSBub3QgcGlubmVkIGtlZXBzIGNoYXJ0QXhpc0Zvcm1hdENvZGUncyBjb2RlLiBUaGUgY29kZSdzXG4vLyBzZXBhcmF0b3JzIGZvbGxvdyB0aGUgb3BlbmluZyBtYWNoaW5lJ3MgbG9jYWxlOyB0aGUgY3VycmVuY3kgc3ltYm9sIGFuZCBpdHNcbi8vIHNpZGUgZm9sbG93IHRoZSByZXBvcnQncy5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXRDb2RlKFxuICBzcGVjOiBOdW1iZXJGb3JtYXRTcGVjLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBjaGFydDogQ2hhcnROdW1iZXJGb3JtYXQsXG4gIHNlcmllczogKG51bWJlciB8IG51bGwpW11bXSxcbiAgc3RhY2tlZDogYm9vbGVhbixcbik6IHN0cmluZyB7XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlKHNwZWMpO1xuICBjb25zdCBzY2FsZSA9IHN0eWxlID09PSBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50ID8gdW5kZWZpbmVkIDogVU5JVF9TQ0FMRVMuZ2V0KGNoYXJ0LnVuaXRzKTtcblxuICBpZiAoc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0Lk51bWJlciAmJiAhc2NhbGUgJiYgY2hhcnQuZGVjaW1hbHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gY2hhcnRBeGlzRm9ybWF0Q29kZShzZXJpZXMsIHN0YWNrZWQpO1xuICB9XG5cbiAgY29uc3QgZGVjaW1hbHMgPSBjaGFydC5kZWNpbWFscyA/PyAwO1xuICBjb25zdCBkaWdpdHMgPSBgIywjIzAke2RlY2ltYWxzID4gMCA/IGAuJHsnMCcucmVwZWF0KGRlY2ltYWxzKX1gIDogJyd9YDtcblxuICBpZiAoc3R5bGUgPT09IFJlcG9ydFZhbHVlRm9ybWF0LlBlcmNlbnQpIHtcbiAgICByZXR1cm4gYCR7ZGlnaXRzfSR7Y29udGV4dC5yYXRpb1BlcmNlbnQgPyAnJScgOiAnXCIlXCInfWA7XG4gIH1cblxuICBjb25zdCBzY2FsZWQgPSBgJHtkaWdpdHN9JHtzY2FsZT8uY29tbWFzID8/ICcnfWA7XG4gIGNvbnN0IHVuaXQgPSBzY2FsZT8uc3VmZml4ID8/ICcnO1xuXG4gIGlmIChzdHlsZSAhPT0gUmVwb3J0VmFsdWVGb3JtYXQuQ3VycmVuY3kpIHtcbiAgICByZXR1cm4gdW5pdCA/IGAke3NjYWxlZH1cIiR7dW5pdH1cImAgOiBzY2FsZWQ7XG4gIH1cblxuICBjb25zdCBzeW1ib2wgPSBjdXJyZW5jeVN5bWJvbChjb250ZXh0KTtcblxuICByZXR1cm4gc3ltYm9sLnByZWZpeFxuICAgID8gYFwiJHtzeW1ib2wudGV4dH1cIiR7c2NhbGVkfSR7dW5pdCA/IGBcIiR7dW5pdH1cImAgOiAnJ31gXG4gICAgOiBgJHtzY2FsZWR9XCIke3VuaXR9JHtzeW1ib2wudGV4dH1cImA7XG59XG5cbi8vIFRoZSBjdXJyZW5jeSBzeW1ib2wgYXMgdGhlIGxvY2FsZSB3cml0ZXMgaXQgYmVzaWRlIGEgbnVtYmVyLCB3aXRoIHRoZSBzcGFjZVxuLy8gYmV0d2VlbiB0aGVtLCBhbmQgd2hpY2ggc2lkZSBpdCBzaXRzIG9uOiAnJCcgYmVmb3JlIGluIGVuLVVTLCAnICQnIGFmdGVyIGluXG4vLyBmci1DQS4gUXVvdGVzIGFyZSBkcm9wcGVkLCBhcyBhIGZvcm1hdCBjb2RlIGNhbm5vdCBob2xkIHRoZW0uXG5pbnRlcmZhY2UgQ3VycmVuY3lTeW1ib2wge1xuICBwcmVmaXg6IGJvb2xlYW47XG4gIHRleHQ6IHN0cmluZztcbn1cblxuY29uc3QgQ1VSUkVOQ1lfU1lNQk9MUyA9IG5ldyBNYXA8c3RyaW5nLCBDdXJyZW5jeVN5bWJvbD4oKTtcblxuZnVuY3Rpb24gY3VycmVuY3lTeW1ib2woY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCk6IEN1cnJlbmN5U3ltYm9sIHtcbiAgY29uc3Qga2V5ID0gYCR7Y29udGV4dC5sb2NhbGV9fCR7Y29udGV4dC5jdXJyZW5jeX1gO1xuICBsZXQgc3ltYm9sID0gQ1VSUkVOQ1lfU1lNQk9MUy5nZXQoa2V5KTtcblxuICBpZiAoIXN5bWJvbCkge1xuICAgIGNvbnN0IHBhcnRzID0gbnVtYmVyRm9ybWF0KGNvbnRleHQubG9jYWxlLCBjdXJyZW5jeU9wdGlvbnMoY29udGV4dC5jdXJyZW5jeSkpLmZvcm1hdFRvUGFydHMoMSk7XG4gICAgY29uc3QgY3VycmVuY3kgPSBwYXJ0cy5maW5kSW5kZXgoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ2N1cnJlbmN5Jyk7XG4gICAgY29uc3QgZmlyc3QgPSBwYXJ0cy5maW5kSW5kZXgoKHBhcnQpID0+IE5VTUJFUl9QQVJUUy5oYXMocGFydC50eXBlKSk7XG4gICAgY29uc3QgbGFzdCA9IHBhcnRzLnJlZHVjZSgoZm91bmQsIHBhcnQsIGluZGV4KSA9PiBOVU1CRVJfUEFSVFMuaGFzKHBhcnQudHlwZSkgPyBpbmRleCA6IGZvdW5kLCAtMSk7XG4gICAgY29uc3QgcHJlZml4ID0gY3VycmVuY3kgPCBmaXJzdDtcbiAgICBjb25zdCB0ZXh0ID0gKHByZWZpeCA/IHBhcnRzLnNsaWNlKE1hdGgubWF4KGN1cnJlbmN5LCAwKSwgZmlyc3QpIDogcGFydHMuc2xpY2UobGFzdCArIDEpKVxuICAgICAgLm1hcCgocGFydCkgPT4gcGFydC52YWx1ZSlcbiAgICAgIC5qb2luKCcnKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICcnKTtcblxuICAgIHN5bWJvbCA9IHsgcHJlZml4LCB0ZXh0IH07XG4gICAgQ1VSUkVOQ1lfU1lNQk9MUy5zZXQoa2V5LCBzeW1ib2wpO1xuICB9XG5cbiAgcmV0dXJuIHN5bWJvbDtcbn1cblxuXG4vLyBFdmVyeSBkZWNpbWFsIGEgbnVtYmVyIGhhcywgZ3JvdXBlZCwgaW4gdGhlIGxvY2FsZTogd2hhdCBFQ2hhcnRzIHByaW50cyBieVxuLy8gZGVmYXVsdCAoaXRzIGFkZENvbW1hcyksIGJ1dCBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBzbyBhIGNoYXJ0J3MgYXhpcyBhbmRcbi8vIHRvb2x0aXAgcmVhZCBsaWtlIHRoZSByZXN0IG9mIHRoZSByZXBvcnQuIDEyMzQuNSByZWFkcyAxLDIzNC41IGluIGVuLVVTIGFuZFxuLy8gMSAyMzQsNSBpbiBmci1DQS4gQSBub24tbnVtZXJpYyBzdHJpbmcgaXMgc2hvd24gYXMgaXQgY2FtZSwgYW5kIGFueXRoaW5nXG4vLyBlbHNlIG5vbi1udW1lcmljIGFzICctJywgYXMgRUNoYXJ0cyBzaG93cyBpdC4gQXMgdGhlcmUsIGFuIGluZmluaXRlIHZhbHVlXG4vLyByZWFkcyAnSW5maW5pdHknIGFuZCBuZWdhdGl2ZSB6ZXJvIChhIHRpY2sgYSBmbG9hdCBlcnJvciBsZWF2ZXMganVzdCBiZWxvd1xuLy8gemVybykgcmVhZHMgJzAnLlxuY29uc3QgUExBSU5fTlVNQkVSOiBJbnRsLk51bWJlckZvcm1hdE9wdGlvbnMgPSB7IG1heGltdW1GcmFjdGlvbkRpZ2l0czogMjAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFBsYWluTnVtYmVyKHZhbHVlOiB1bmtub3duLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyk6IHN0cmluZyB7XG4gIGNvbnN0IG51bWVyaWMgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInXG4gICAgPyB2YWx1ZVxuICAgIDogdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgIT09ICcnID8gTnVtYmVyKHZhbHVlKSA6IE5hTjtcblxuICBpZiAoTnVtYmVyLmlzTmFOKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICctJztcbiAgfVxuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIFN0cmluZyhudW1lcmljKTtcbiAgfVxuXG4gIHJldHVybiBudW1iZXJGb3JtYXQobG9jYWxlLCBQTEFJTl9OVU1CRVIpLmZvcm1hdChudW1lcmljID09PSAwID8gMCA6IG51bWVyaWMpO1xufVxuXG5cbi8vIFRoZSBheGlzIHBlYWsgYXQgd2hpY2ggYSBuYXRpdmUgY2hhcnQncyB2YWx1ZSBheGlzIGdhaW5zIHRob3VzYW5kc1xuLy8gc2VwYXJhdG9ycy4gRnJvbSBoZXJlIHVwIHRoZSB0aWNrcyBhcmUgd2hvbGUgbnVtYmVycyBpbiBwcmFjdGljZTsgYmVsb3cgaXRcbi8vIG5laXRoZXIgdGhlIHNjcmVlbiBub3IgUG93ZXJQb2ludCdzICdHZW5lcmFsJyBzaG93cyBhIHNlcGFyYXRvci5cbmV4cG9ydCBjb25zdCBBWElTX1NFUEFSQVRPUl9USFJFU0hPTEQgPSAxMDAwO1xuXG4vLyBQb3dlclBvaW50J3MgbnVtYmVyIGZvcm1hdCBmb3IgYSBuYXRpdmUgY2hhcnQncyB2YWx1ZSBheGlzLCBtYXRjaGluZyB3aGF0IHRoZVxuLy8gb24tc2NyZWVuIGF4aXMgcHJpbnRzIGJ5IGRlZmF1bHQ6IHRob3VzYW5kcyBzZXBhcmF0b3JzIHdpdGggZWFjaCB0aWNrJ3Mgb3duXG4vLyBkZWNpbWFscy4gRXhjZWwgaGFzIG5vIFwiR2VuZXJhbCB3aXRoIHNlcGFyYXRvcnNcIiwgc28gYW4gYXhpcyByZWFjaGluZyAxLDAwMFxuLy8gKHdoZXJlIHRpY2tzIGFyZSB3aG9sZSBudW1iZXJzKSBnZXRzICcjLCMjMCcsIGFuZCBhIHNtYWxsZXIgcmFuZ2Uga2VlcHNcbi8vICdHZW5lcmFsJyBzbyBmcmFjdGlvbmFsIHRpY2tzICgwLjI1LCAwLjUpIGFyZSBub3Qgcm91bmRlZCBhd2F5LlxuLy9cbi8vIFRoZSBwZWFrIGlzIGNoYXJ0VmFsdWVQZWFrJ3MuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnRBeGlzRm9ybWF0Q29kZShzZXJpZXM6IChudW1iZXIgfCBudWxsKVtdW10sIHN0YWNrZWQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICByZXR1cm4gY2hhcnRWYWx1ZVBlYWsoc2VyaWVzLCBzdGFja2VkKSA+PSBBWElTX1NFUEFSQVRPUl9USFJFU0hPTEQgPyAnIywjIzAnIDogJ0dlbmVyYWwnO1xufVxuXG4vLyBUaGUgbGFyZ2VzdCBtYWduaXR1ZGUgYSBjaGFydCdzIHZhbHVlIGF4aXMgaGFzIHRvIHJlYWNoLiBBIG1pc3NpbmcgdmFsdWVcbi8vIGNvdW50cyBhcyAwLiBBIHN0YWNrZWQgY2hhcnQncyBwZWFrIGlzIGl0cyB0YWxsZXN0IHN0YWNrOiB0aGUgbGFyZ2VzdCBzdW0sXG4vLyBwZXIgY2F0ZWdvcnksIG9mIGV2ZXJ5IHNlcmllcycgYWJzb2x1dGUgdmFsdWUuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnRWYWx1ZVBlYWsoc2VyaWVzOiAobnVtYmVyIHwgbnVsbClbXVtdLCBzdGFja2VkOiBib29sZWFuKTogbnVtYmVyIHtcbiAgY29uc3QgbWFnbml0dWRlcyA9IHNlcmllcy5tYXAoKHZhbHVlcykgPT4gdmFsdWVzLm1hcCgodmFsdWUpID0+IE1hdGguYWJzKHZhbHVlID8/IDApKSk7XG5cbiAgcmV0dXJuIHN0YWNrZWRcbiAgICA/IE1hdGgubWF4KDAsIC4uLihtYWduaXR1ZGVzWzBdID8/IFtdKS5tYXAoKF8sIGluZGV4KSA9PiBtYWduaXR1ZGVzXG4gICAgICAucmVkdWNlKChzdW0sIHZhbHVlcykgPT4gc3VtICsgKHZhbHVlc1tpbmRleF0gPz8gMCksIDApKSlcbiAgICA6IE1hdGgubWF4KDAsIC4uLm1hZ25pdHVkZXMuZmxhdCgpKTtcbn1cblxuXG4vLyBUaGUgem9uZSBldmVyeSBkYXRlIGluIGEgcmVwb3J0IGlzIHJlYWQgaW4uIFRoZSBzZXJ2ZXIgcmVzb2x2ZXMgaXQgKHRoZVxuLy8gcmVwb3J0J3Mgb3duIHpvbmUsIGVsc2UgdGhlIGFwcGxpY2F0aW9uJ3MgZGVmYXVsdCByZXBvcnRpbmcgem9uZSkgYW5kIHNlbmRzXG4vLyBpdCBhcyBgZWZmZWN0aXZlVGltZXpvbmVgLiBBIHNlcnZlciB0b28gb2xkIHRvIHNlbmQgdGhlIGZpZWxkIHN0aWxsIHVzZWQgYVxuLy8gcmVwb3J0J3MgcGlubmVkIGB0aW1lem9uZWAsIHNvIHRoYXQgY29tZXMgbmV4dDsgdGhlIGJyb3dzZXIncyB6b25lIGlzIHRoZSBsYXN0XG4vLyBmYWxsYmFjay4gVGhpcyBpcyB0aGUgb25lIHBsYWNlIHRoYXQgY2hhaW4gbGl2ZXMsIHNvIGV2ZXJ5IGRhdGUgdGhlIHZpZXdlclxuLy8gcmVuZGVycyBvciByZXNvbHZlcyBhZ3JlZXMgd2l0aCBldmVyeSBvdGhlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0OiBQaWNrPFJlcG9ydCwgJ2VmZmVjdGl2ZVRpbWV6b25lJyB8ICd0aW1lem9uZSc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/PyByZXBvcnQudGltZXpvbmUgPz8gSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xufVxuXG5cbi8vIFRoZSBkYXRlIHNoYXBlcyBhIHJlcG9ydCB3cml0ZXMsIGVhY2ggaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS5cbi8vICdKYW4gNSwgMjAyNicgLyAnNSBqYW52LiAyMDI2JzogYSBkYXRlIGNlbGwsIGEgZmlsdGVyIGJvdW5kLlxuZXhwb3J0IGNvbnN0IERBWV9TSE9SVDogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnIH07XG4vLyAnSmFudWFyeSA1LCAyMDI2JyAvICc1IGphbnZpZXIgMjAyNic6IGFuIGV4cG9ydCBjb3ZlcidzIGRhdGUgbGluZS5cbmV4cG9ydCBjb25zdCBEQVlfTE9ORzogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfTtcbi8vICdKYW51YXJ5JyAvICdqYW52aWVyJzogYSBtb250aGx5IHBlcmlvZCBsYWJlbCAoaXRzIHllYXIgaXMgYWRkZWQgYXBhcnQpLlxuZXhwb3J0IGNvbnN0IE1PTlRIX0xPTkc6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zID0geyBtb250aDogJ2xvbmcnIH07XG4vLyAnSmFudWFyeSAyMDI2JyAvICdqYW52aWVyIDIwMjYnOiBhIG1vbnRobHkgcGVyaW9kIGxhYmVsIHdyaXR0ZW4gaW4gZnVsbC5cbmV4cG9ydCBjb25zdCBNT05USF9ZRUFSOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnIH07XG4vLyAnSmFuIDUnIC8gJzUgamFudi4nOiBhIGRhaWx5IG9yIHdlZWtseSBwZXJpb2QgbGFiZWwuXG5leHBvcnQgY29uc3QgTU9OVEhfREFZOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnIH07XG5cbi8vIEEgZGF0ZSBpbiB0aGUgbG9jYWxlLiBXaXRoIGEgem9uZSwgdGhlIGRheSBpdCBmYWxscyBvbiB0aGVyZTsgd2l0aG91dCBvbmUsXG4vLyB0aGUgYnJvd3NlcidzIHpvbmUsIHdoaWNoIGtlZXBzIGEgY2FsZW5kYXIgZGF5IHBhcnNlZCBhcyBsb2NhbCBtaWRuaWdodFxuLy8gdW5zaGlmdGVkLiBJdCBuZXZlciB0aHJvd3MsIHNpbmNlIGEgcGlwZSBvciBhbiBleHBvcnQgY2FsbHMgaXQgcGVyIGNlbGw6IGFuXG4vLyBpbnZhbGlkIERhdGUgcmVhZHMgJycsIGEgbWFsZm9ybWVkIGxvY2FsZSAoJ2VuX0NBJykgcmVhZHMgdGhlIGZhbGxiYWNrXG4vLyBsb2NhbGUsIGFuZCBhbiB1bmtub3duIHpvbmUgcmVhZHMgVVRDLCB3aGljaCBzdGlsbCBuYW1lcyBhIHJlYWwgZGF5LlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdExvY2FsRGF0ZShcbiAgZGF0ZTogRGF0ZSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxuICB0aW1lWm9uZT86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gd3JpdGVEYXRlKGRhdGVGb3JtYXQobG9jYWxlLCBvcHRpb25zLCB0aW1lWm9uZSksIGRhdGUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZm9ybWF0RmFsbGJhY2tEYXRlKGRhdGUsIHJlc29sdmVSZXBvcnRMb2NhbGUobG9jYWxlKSwgb3B0aW9ucywgdGltZVpvbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZhbGxiYWNrRGF0ZShcbiAgZGF0ZTogRGF0ZSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIG9wdGlvbnM6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zLFxuICB0aW1lWm9uZT86IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdyaXRlRGF0ZShkYXRlRm9ybWF0KGxvY2FsZSwgb3B0aW9ucywgdGltZVpvbmUpLCBkYXRlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHdyaXRlRGF0ZShkYXRlRm9ybWF0KGxvY2FsZSwgb3B0aW9ucywgJ1VUQycpLCBkYXRlKTtcbiAgfVxufVxuXG4vLyBJbnRsIHdyaXRlcyBhIHllYXIgYmVsb3cgMTAwMCB3aXRoIG9ubHkgdGhlIGRpZ2l0cyBpdCBoYXMgKCdKYW4gMSwgMScpOyBhXG4vLyBkYXRlJ3MgeWVhciBpcyBhbHdheXMgd3JpdHRlbiB3aXRoIGZvdXIgKCdKYW4gMSwgMDAwMScpLCBzbyBhIHNlbnRpbmVsIGRheVxuLy8gc3RpbGwgcmVhZHMgYXMgYSBkYXRlLiBPbmx5IHN1Y2ggYSB5ZWFyIHBheXMgZm9yIGZvcm1hdFRvUGFydHMuXG5mdW5jdGlvbiB3cml0ZURhdGUoZm9ybWF0dGVyOiBJbnRsLkRhdGVUaW1lRm9ybWF0LCBkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgaWYgKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSA+IDEwMDApIHtcbiAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdChkYXRlKTtcbiAgfVxuXG4gIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0VG9QYXJ0cyhkYXRlKVxuICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ3llYXInID8gcGFydC52YWx1ZS5wYWRTdGFydCg0LCAnMCcpIDogcGFydC52YWx1ZSlcbiAgICAuam9pbignJyk7XG59XG5cblxuY29uc3QgREFURV9PTkxZX1BBVFRFUk4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC87XG5jb25zdCBEQVRFX1RJTUVfUEFUVEVSTiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9KVsgVF0oXFxkezJ9OlxcZHsyfTpcXGR7Mn0pKFxcLlxcZCspPyQvO1xuXG4vLyBBIHJlcG9ydCByb3cncyBkYXRlIGNlbGwgYXMgYSBjYWxlbmRhciBkYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUuXG4vL1xuLy8gUmVwb3J0IHJvd3MgYXJlIHJhdyBkYXRhYmFzZSBzdHJpbmdzLCBub3Qgc2VyaWFsaXplZCBtb2RlbHMsIHNvIHRoZWlyIHNoYXBlXG4vLyBpcyB0aGUgd2lyZSBjb250cmFjdDogYSBEQVRFIGNvbHVtbiBhcnJpdmVzIGFzICdZWVlZLU1NLUREJyBhbmQgYVxuLy8gZGF0ZS1hbmQtdGltZSBjb2x1bW4gYXMgJ1lZWVktTU0tREQgSEg6TU06U1MnIGluIFVUQy4gUmVhZGluZyB0aGF0IHNoYXBlXG4vLyBoZXJlIGRvZXMgbm90IHJlLWRlcml2ZSBhIHNlcnZlciBydWxlOyBpdCBvbmx5IHN0b3BzIHRoZSBicm93c2VyIGd1ZXNzaW5nLlxuLy8gLSBBIGNhbGVuZGFyIGRheSBpcyBuZXZlciBzaGlmdGVkOiBwYXJzZUlTTyByZWFkcyBpdCBhcyBsb2NhbCBtaWRuaWdodCwgc29cbi8vICAgdGhlIGRheSBwcmludGVkIGlzIHRoZSBkYXkgc3RvcmVkLCB3aGF0ZXZlciB0aGUgem9uZS5cbi8vIC0gQW4gaW5zdGFudCBpcyBwaW5uZWQgdG8gVVRDIHdpdGggYW4gZXhwbGljaXQgJ1onLCB0aGVuIHNob3duIGFzIHRoZSBkYXkgaXRcbi8vICAgZmVsbCBvbiBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgdGhlIHNhbWUgZGF5IHRoZSBmaWx0ZXJzIGFuZCB0aW1lIGJ1Y2tldHMgdXNlLlxuLy8gLSBBbnl0aGluZyBlbHNlIGlzIHNob3duIGFzIGl0IGNhbWUsIGFuZCBzbyBpcyBhIHZhbHVlIHRoYXQgaGFzIHRoZSBzaGFwZVxuLy8gICBidXQgbmFtZXMgbm8gcmVhbCBkYXkgKGEgemVybyBkYXRlICcwMDAwLTAwLTAwJywgb3IgJzIwMjYtMDItMzAnKTogb25lXG4vLyAgIGJhZCBjZWxsIG11c3Qgbm90IHRocm93IG91dCBvZiBhIHBpcGUgb3IgYWJvcnQgYW4gZXhwb3J0LlxuLy8gVGhlIGRheSBpcyB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGU6ICdKYW4gNSwgMjAyNicgaW4gZW4tVVMsICc1IGphbnYuXG4vLyAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZXBvcnREYXRlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgdGltZXpvbmU6IHN0cmluZyxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoREFURV9PTkxZX1BBVFRFUk4udGVzdCh0ZXh0KSkge1xuICAgIGNvbnN0IGRheSA9IHBhcnNlSVNPKHRleHQpO1xuXG4gICAgcmV0dXJuIGlzVmFsaWQoZGF5KSA/IGZvcm1hdExvY2FsRGF0ZShkYXksIGxvY2FsZSwgREFZX1NIT1JUKSA6IHRleHQ7XG4gIH1cblxuICBjb25zdCBkYXRlVGltZSA9IERBVEVfVElNRV9QQVRURVJOLmV4ZWModGV4dCk7XG4gIGlmICghZGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IGluc3RhbnQgPSBwYXJzZUlTTyhgJHtkYXRlVGltZVsxXX1UJHtkYXRlVGltZVsyXX1aYCk7XG5cbiAgcmV0dXJuIGlzVmFsaWQoaW5zdGFudCkgPyBmb3JtYXRMb2NhbERhdGUoaW5zdGFudCwgbG9jYWxlLCBEQVlfU0hPUlQsIHRpbWV6b25lKSA6IHRleHQ7XG59XG5cblxuLy8gVGhlIHRpbWUgb2YgZGF5IGFuIGluc3RhbnQgZmFsbHMgYXQgaW4gdGhlIHJlcG9ydCdzIHpvbmU6ICcyOjIzIFBNJyBpblxuLy8gZW4tVVMsICcxNCBoIDIzJyBpbiBmci1DQS5cbmV4cG9ydCBjb25zdCBUSU1FX1NIT1JUOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyA9IHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICcyLWRpZ2l0JyB9O1xuXG4vLyBBIHdpbmRvdydzIGluY2x1c2l2ZSBkYXlzLCBhcyB0aGUgc2VydmVyIHNlbmRzIHRoZW06ICd5eXl5LU1NLWRkJyBjYWxlbmRhclxuLy8gZGF5cyBhbHJlYWR5IGluIHRoZSByZXBvcnQncyB6b25lLiBMaWtlIGEgZGF0ZSBjZWxsIHRoZXkgYXJlIHJlYWQgYXMgbG9jYWxcbi8vIG1pZG5pZ2h0IGFuZCB3cml0dGVuIHdpdGggTk8gem9uZSwgc28gYSB2aWV3ZXIgaW4gYW55IHpvbmUgc2VlcyB0aGUgZGF5c1xuLy8gc2VudC4gQm90aCBkYXlzOiBJbnRsJ3MgcmFuZ2UgaW4gdGhlIGxvY2FsZSAoJ1NlcCAxIOKAkyAzMCwgMjAyNicgaW4gZW4tVVMsXG4vLyAnMeKAkzMwIHNlcHQuIDIwMjYnIGluIGZyLUNBLCBvbmUgZGF0ZSB3aGVuIHRoZXkgYXJlIHRoZSBzYW1lIGRheSkuIE9uZSBkYXk6XG4vLyBhbiBvcGVuIHdpbmRvdyAoJ1NpbmNlIFNlcCAxLCAyMDI2JywgJ1Rocm91Z2ggU2VwIDMwLCAyMDI2JykuIE5laXRoZXIsIG9yXG4vLyBkYXlzIHRoYXQgYXJlIG5vdCByZWFsIG9uZXM6ICcnLlxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERheVJhbmdlKFxuICBzdGFydDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZW5kOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgb3B0aW9uczogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSBEQVlfU0hPUlQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBmaXJzdCA9IHBhcnNlRGF5KHN0YXJ0KTtcbiAgY29uc3QgbGFzdCA9IHBhcnNlRGF5KGVuZCk7XG5cbiAgaWYgKGZpcnN0ICYmIGxhc3QpIHtcbiAgICByZXR1cm4gd3JpdGVEYXlSYW5nZShmaXJzdCwgbGFzdCwgbG9jYWxlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmIChmaXJzdCkge1xuICAgIHJldHVybiBgU2luY2UgJHtmb3JtYXRMb2NhbERhdGUoZmlyc3QsIGxvY2FsZSwgb3B0aW9ucyl9YDtcbiAgfVxuXG4gIHJldHVybiBsYXN0ID8gYFRocm91Z2ggJHtmb3JtYXRMb2NhbERhdGUobGFzdCwgbG9jYWxlLCBvcHRpb25zKX1gIDogJyc7XG59XG5cbi8vIFRoZSB0aW1lIGEgd2luZG93IGVuZGluZyB0b2RheSBpcyBjdXQgYXQ6IHRoZSBzZXJ2ZXIncyBVVENcbi8vICd5eXl5LU1NLWRkIEhIOm1tOnNzJyBpbnN0YW50LCBhcyBhIHRpbWUgb2YgZGF5IGluIHRoZSByZXBvcnQncyB6b25lLiAnJ1xuLy8gZm9yIG5vbmUsIG9yIGZvciBhIHZhbHVlIG9mIGFub3RoZXIgc2hhcGUuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGhyb3VnaFRpbWUoXG4gIHRocm91Z2g6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGF0ZVRpbWUgPSB0aHJvdWdoID8gREFURV9USU1FX1BBVFRFUk4uZXhlYyh0aHJvdWdoKSA6IG51bGw7XG4gIGNvbnN0IGluc3RhbnQgPSBkYXRlVGltZSA/IHBhcnNlSVNPKGAke2RhdGVUaW1lWzFdfVQke2RhdGVUaW1lWzJdfVpgKSA6IG51bGw7XG5cbiAgcmV0dXJuIGluc3RhbnQgJiYgaXNWYWxpZChpbnN0YW50KSA/IGZvcm1hdExvY2FsRGF0ZShpbnN0YW50LCBsb2NhbGUsIFRJTUVfU0hPUlQsIHRpbWV6b25lKSA6ICcnO1xufVxuXG4vLyBBIGNvbXBhcmlzb24gb3IgdGltZWZyYW1lIHdpbmRvdyBpbiBvbmUgbGluZTogaXRzIGRheXMsIGFuZCB0aGUgdGltZSBpdCBpc1xuLy8gY3V0IGF0IHdoZW4gaXQgZW5kcyB0b2RheSBvbiBhIGRhdGUtYW5kLXRpbWUgY29sdW1uICgnT2N0IDEg4oCTIDIsIDIwMjYsXG4vLyB1bnRpbCAyOjIzIFBNJykuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF5V2luZG93KFxuICBtZXRhOiB7IHN0YXJ0OiBzdHJpbmcgfCBudWxsOyBlbmQ6IHN0cmluZyB8IG51bGw7IHRocm91Z2g/OiBzdHJpbmcgfCBudWxsIH0sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGF5cyA9IGZvcm1hdERheVJhbmdlKG1ldGEuc3RhcnQsIG1ldGEuZW5kLCBsb2NhbGUpO1xuICBjb25zdCB0aW1lID0gZm9ybWF0VGhyb3VnaFRpbWUobWV0YS50aHJvdWdoLCB0aW1lem9uZSwgbG9jYWxlKTtcblxuICByZXR1cm4gZGF5cyAmJiB0aW1lID8gYCR7ZGF5c30sIHVudGlsICR7dGltZX1gIDogZGF5cztcbn1cblxuLy8gV2hldGhlciBhIGNvbXBhcmlzb24gaXMgcmVhZCBvbiBvbmUgZGF5OiBhIGNvbXBhcmlzb24gb2YgdmFsdWVzIHJlYWQgYXRcbi8vIHRoZSBlbmQgb2YgZWFjaCBwZXJpb2QsIHdpdGggbm8gdGltZSBheGlzIG9mIGl0cyBvd24gKGEgS1BJLCBhIG9uZS1yb3dcbi8vIGxpc3QpLCB3aG9zZSB2YWx1ZSBpcyByZWFkIHRvZGF5IGFuZCB3aG9zZSBwcmlvciBpcyByZWFkIGF0IHRoZSBlbmQgb2Zcbi8vIHRoZSBwZXJpb2QgYmVmb3JlLiBJdHMgdHdvIHdpbmRvd3MgYXJlIHRob3NlIHBlcmlvZHMsIGJhY2sgdG8gYmFjaywgYW5kXG4vLyBlYWNoIHZhbHVlIGlzIHJlYWQgb24gaXRzIHdpbmRvdydzIGxhc3QgZGF5LCBzbyB0aGUgd2luZG93cyBhcmUgd3JpdHRlbiBhc1xuLy8gdGhvc2UgZGF5cyAoZm9ybWF0UmVhZGluZ0RheSkuIEEgc3BpbmUgb2Ygc2V2ZXJhbCBwZXJpb2RzIHNldHMgZWFjaCBwZXJpb2Rcbi8vIGFnYWluc3QgYW4gZWFybGllciBvbmUsIGFuZCBpdHMgd2luZG93cyBhcmUgc3BhbnMgbGlrZSBhbnkgb3RoZXJcbi8vIGNvbXBhcmlzb24ncy5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlYWRPbk9uZURheShjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gY29tcGFyaXNvbj8uY3VycmVudDtcbiAgY29uc3QgcHJpb3IgPSBjb21wYXJpc29uPy5wcmlvcnM/LlswXTtcblxuICBpZiAoY29tcGFyaXNvbj8ubW9kZSAhPT0gJ3BlcmlvZF9lbmQnIHx8ICFjdXJyZW50IHx8ICFwcmlvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByaW9yRW5kID0gcGFyc2VEYXkocHJpb3IuZW5kKTtcbiAgY29uc3QgY3VycmVudFN0YXJ0ID0gcGFyc2VEYXkoY3VycmVudC5zdGFydCk7XG5cbiAgcmV0dXJuICEhcHJpb3JFbmQgJiYgISFjdXJyZW50U3RhcnQgJiYgYWRkRGF5cyhwcmlvckVuZCwgMSkuZ2V0VGltZSgpID09PSBjdXJyZW50U3RhcnQuZ2V0VGltZSgpO1xufVxuXG4vLyBUaGUgZGF5IGEgdmFsdWUgaXMgcmVhZCBvbjogJ29uIFNlcCAxNSwgMjAyNicgKCdPbiDigKYnIHRvIG9wZW4gYSBsaW5lKSwgYXNcbi8vIGEgY2hhcnQncyB0b29sdGlwIG5hbWVzIGEgcHJpb3IgcG9pbnQgcmVhZCBhdCB0aGUgZW5kIG9mIGl0cyBwZXJpb2QuICcnXG4vLyBmb3IgYSBkYXkgdGhhdCBpcyBub3QgYSByZWFsIG9uZS5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZWFkaW5nRGF5KFxuICB3aW5kb3c6IFBpY2s8Q29tcGFyaXNvbldpbmRvdywgJ2VuZCc+LFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgbGVhZCA9IGZhbHNlLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGF5ID0gZm9ybWF0RGF5KHdpbmRvdy5lbmQsIGxvY2FsZSk7XG5cbiAgaWYgKCFkYXkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gbGVhZCA/IGBPbiAke2RheX1gIDogYG9uICR7ZGF5fWA7XG59XG5cbi8vIE9uZSAneXl5eS1NTS1kZCcgZGF5IGluIHRoZSBsb2NhbGUsIHdyaXR0ZW4gd2l0aCBubyB6b25lOiAnU2VwIDEsIDIwMjYnLlxuZnVuY3Rpb24gZm9ybWF0RGF5KGRheTogc3RyaW5nLCBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGUgPSBwYXJzZURheShkYXkpO1xuXG4gIHJldHVybiBkYXRlID8gZm9ybWF0TG9jYWxEYXRlKGRhdGUsIGxvY2FsZSwgREFZX1NIT1JUKSA6ICcnO1xufVxuXG4vLyBBICd5eXl5LU1NLWRkJyBkYXkgYXMgbG9jYWwgbWlkbmlnaHQsIG9yIG51bGwgd2hlbiBpdCBpcyBub3QgYSByZWFsIGRheS5cbmZ1bmN0aW9uIHBhcnNlRGF5KGRheTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCFkYXkgfHwgIURBVEVfT05MWV9QQVRURVJOLnRlc3QoZGF5KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKGRheSk7XG5cbiAgcmV0dXJuIGlzVmFsaWQoZGF0ZSkgPyBkYXRlIDogbnVsbDtcbn1cblxuLy8gSW50bCdzIHJhbmdlIHdyaXRlcyB0aGUgc2hhcmVkIG1vbnRoIGFuZCB5ZWFyIG9uY2UuIEEgbWFsZm9ybWVkIGxvY2FsZVxuLy8gcmVhZHMgdGhlIGZhbGxiYWNrOyBhIHJ1bnRpbWUgdGhhdCBjYW5ub3Qgd3JpdGUgcmFuZ2VzIGpvaW5zIHR3byBkYXRlcy5cbmZ1bmN0aW9uIHdyaXRlRGF5UmFuZ2UoZmlyc3Q6IERhdGUsIGxhc3Q6IERhdGUsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLCBvcHRpb25zOiBJbnRsLkRhdGVUaW1lRm9ybWF0T3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IFtmcm9tLCB0b10gPSBmaXJzdCA8PSBsYXN0ID8gW2ZpcnN0LCBsYXN0XSA6IFtsYXN0LCBmaXJzdF07XG5cbiAgZm9yIChjb25zdCB0YWcgb2YgW2xvY2FsZSwgcmVzb2x2ZVJlcG9ydExvY2FsZShsb2NhbGUpXSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGF0ZUZvcm1hdCh0YWcsIG9wdGlvbnMpLmZvcm1hdFJhbmdlKGZyb20sIHRvKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBuZXh0IGxvY2FsZSwgdGhlbiB0aGUgam9pbmVkIGRhdGVzLlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBgJHtmb3JtYXRMb2NhbERhdGUoZnJvbSwgbG9jYWxlLCBvcHRpb25zKX0g4oCTICR7Zm9ybWF0TG9jYWxEYXRlKHRvLCBsb2NhbGUsIG9wdGlvbnMpfWA7XG59XG5cblxuLy8gRW5nbGlzaCBuYW1lcyBmb3IgYSBsb2NhbGUgYW5kIGEgY3VycmVuY3ksIGZvciB0aGUgc2V0dGluZ3Mgc2VsZWN0cy4gVGhlXG4vLyBpbnRlcmZhY2Ugc3RheXMgRW5nbGlzaCB3aGF0ZXZlciB0aGUgcmVwb3J0J3MgbG9jYWxlOiAnZnItQ0EnIHJlYWRzXG4vLyAnQ2FuYWRpYW4gRnJlbmNoJywgJ0NBRCcgcmVhZHMgJ0NhbmFkaWFuIERvbGxhcicuIEEgcnVudGltZSB3aXRob3V0IHRoZVxuLy8gbmFtZXMgc2hvd3MgdGhlIGNvZGUuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxlTmFtZSh0YWc6IFJlcG9ydExvY2FsZVRhZyk6IHN0cmluZyB7XG4gIHJldHVybiBkaXNwbGF5TmFtZSgnbGFuZ3VhZ2UnLCB0YWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3VycmVuY3lOYW1lKGNvZGU6IFJlcG9ydEN1cnJlbmN5Q29kZSk6IHN0cmluZyB7XG4gIHJldHVybiBkaXNwbGF5TmFtZSgnY3VycmVuY3knLCBjb2RlKTtcbn1cblxuZnVuY3Rpb24gZGlzcGxheU5hbWUodHlwZTogJ2xhbmd1YWdlJyB8ICdjdXJyZW5jeScsIGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBJbnRsLkRpc3BsYXlOYW1lcyhbJ2VuJ10sIHsgdHlwZSB9KS5vZihjb2RlKSA/PyBjb2RlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gY29kZTtcbiAgfVxufVxuXG5cbi8vIENvbXBhcmlzb24sIHdpbmRvdyBhbmQgS1BJIHdvcmRpbmcuIFRoZSBzZXJ2ZXIgc2VuZHMgY29kZXMgYW5kIGZpZWxkcyxcbi8vIG5ldmVyIHNlbnRlbmNlcyAoYSB3aW5kb3cncyBkZXNjcmlwdGlvbiBpcyBmb3IgdGhlIGFnZW50IGFuZCB0aGUgZXhwb3J0cydcbi8vIG5vdGVzLCBub3QgdGhlIHNjcmVlbik7IHRoZSBpbnRlcmZhY2Ugd29yZHMgdGhlbSBoZXJlLCBpbiBFbmdsaXNoIGxpa2Vcbi8vIGV2ZXJ5IG90aGVyIGxhYmVsLCB3aXRoIGFueSBkYXkgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLlxuXG5jb25zdCBHUkFOVUxBUklUWV9VTklUUzogUmVjb3JkPENoYXJ0R3JhbnVsYXJpdHksIHsgb25lOiBzdHJpbmc7IG1hbnk6IHN0cmluZyB9PiA9IHtcbiAgZGF5OiB7IG9uZTogJ2RheScsIG1hbnk6ICdkYXlzJyB9LFxuICB3ZWVrOiB7IG9uZTogJ3dlZWsnLCBtYW55OiAnd2Vla3MnIH0sXG4gIG1vbnRoOiB7IG9uZTogJ21vbnRoJywgbWFueTogJ21vbnRocycgfSxcbiAgcXVhcnRlcjogeyBvbmU6ICdxdWFydGVyJywgbWFueTogJ3F1YXJ0ZXJzJyB9LFxuICB5ZWFyOiB7IG9uZTogJ3llYXInLCBtYW55OiAneWVhcnMnIH0sXG59O1xuXG4vLyBXaGF0IGEgcHJpb3IgbGFuZSBpcyBjYWxsZWQ6IGFsd2F5cyBzbyBmb3IgYSBuYW1lZCBwZXJpb2QsIGFuZCBmb3IgdGhlXG4vLyBwcmV2aW91cyBwZXJpb2Qgd2hlbiB0aGUgc2VydmVyIG5hbWVzIG5vIHVuaXQgZm9yIGl0LlxuY29uc3QgQUdBSU5TVF9QSFJBU0VTOiBSZWNvcmQ8Q29tcGFyaXNvbkFnYWluc3QsIHN0cmluZz4gPSB7XG4gIHByZXZpb3VzX3BlcmlvZDogJ3ByZXZpb3VzIHBlcmlvZCcsXG4gIHByZXZpb3VzX3dlZWs6ICdwcmV2aW91cyB3ZWVrJyxcbiAgcHJldmlvdXNfbW9udGg6ICdwcmV2aW91cyBtb250aCcsXG4gIHByZXZpb3VzX3F1YXJ0ZXI6ICdwcmV2aW91cyBxdWFydGVyJyxcbiAgcHJldmlvdXNfeWVhcjogJ3ByZXZpb3VzIHllYXInLFxuICByYW5nZTogJ2N1c3RvbSByYW5nZScsXG59O1xuXG4vLyBBIHByaW9yIGxhbmUncyBsYWJlbCwgZnJvbSBpdHMgb2Zmc2V0IHJhdGhlciB0aGFuIGZyb20gdGhlIG1lYXN1cmUsIHNvIGFcbi8vIGNoYXJ0IHJlZ3JvdXBlZCBieSB0aGUgdmlld2VyIHNheXMgd2hhdCBpdCBub3cgY29tcGFyZXMuIEEgbmFtZWQgcGVyaW9kXG4vLyByZWFkcyBieSBpdHMgbmFtZSB3aGF0ZXZlciBzaGlmdCBjYXJyaWVzIGl0ICgndnMgcHJldmlvdXMgcXVhcnRlcicgZm9yIDNcbi8vIG1vbnRocywgJ3ZzIHByZXZpb3VzIHllYXInIGZvciAzNjQgZGF5cyBvciA1MiB3ZWVrcywgJ3ZzIGN1c3RvbSByYW5nZScpLlxuLy8gT25seSB0aGUgcHJldmlvdXMgcGVyaW9kIGlzIHdvcmRlZCBmcm9tIGl0cyB1bml0IGFuZCBjb3VudDogJ3ZzIHByZXZpb3VzXG4vLyB3ZWVrJywgJ3ZzIHByZXZpb3VzIDMgbW9udGhzJywgJ3ZzIHByZXZpb3VzIDggZGF5cycgKGEgZGF5LWxlbmd0aCBzaGlmdCkuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyaXNvbk9mZnNldExhYmVsKG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCk6IHN0cmluZyB7XG4gIHJldHVybiBgdnMgJHtvZmZzZXRQaHJhc2Uob2Zmc2V0KX1gO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRQaHJhc2Uob2Zmc2V0OiBDb21wYXJpc29uT2Zmc2V0KTogc3RyaW5nIHtcbiAgaWYgKG9mZnNldC5hZ2FpbnN0ICE9PSAncHJldmlvdXNfcGVyaW9kJyB8fCAhb2Zmc2V0LnVuaXQgfHwgIW9mZnNldC5jb3VudCkge1xuICAgIHJldHVybiBBR0FJTlNUX1BIUkFTRVNbb2Zmc2V0LmFnYWluc3RdID8/IEFHQUlOU1RfUEhSQVNFUy5wcmV2aW91c19wZXJpb2Q7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0LmNvdW50ID09PSAxXG4gICAgPyBgcHJldmlvdXMgJHtHUkFOVUxBUklUWV9VTklUU1tvZmZzZXQudW5pdF0ub25lfWBcbiAgICA6IGBwcmV2aW91cyAke29mZnNldC5jb3VudH0gJHtHUkFOVUxBUklUWV9VTklUU1tvZmZzZXQudW5pdF0ubWFueX1gO1xufVxuXG4vLyBPbmUgY29tcGFyaXNvbiBub3RlIGFzIGEgc2VudGVuY2UuIFRoZSBjb21wYXJpc29uLCB3aGVuIGdpdmVuLCBuYW1lcyB0aGVcbi8vIHBlcmlvZCBjb21wYXJlZCB3aXRoIChpdHMgZmlyc3QgcHJpb3IgbGFuZSkuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyaXNvbk5vdGVUZXh0KFxuICBjb2RlOiBDb21wYXJpc29uTm90ZUNvZGUsXG4gIGNvbXBhcmlzb24/OiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG9mZnNldCA9IGNvbXBhcmlzb24/Lm9mZnNldHM/LlswXSA/PyBudWxsO1xuICBjb25zdCBjb21wYXJlZCA9IG9mZnNldCA/IGBDb21wYXJlZCB3aXRoIHRoZSAke29mZnNldFBocmFzZShvZmZzZXQpfWAgOiBudWxsO1xuXG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgJ25vX3dpbmRvdyc6XG4gICAgICByZXR1cm4gJ1BpY2sgYSBkYXRlIHJhbmdlIHRvIHNlZSB0aGUgY29tcGFyaXNvbi4nO1xuICAgIGNhc2UgJ3VuaXRfaW5mZXJyZWQnOlxuICAgICAgcmV0dXJuIGNvbXBhcmVkXG4gICAgICAgID8gYCR7Y29tcGFyZWR9LCBqdWRnZWQgZnJvbSB0aGUgZGF0ZXMgcGlja2VkLmBcbiAgICAgICAgOiAnVGhlIHBlcmlvZCBjb21wYXJlZCB3aXRoIHdhcyBqdWRnZWQgZnJvbSB0aGUgZGF0ZXMgcGlja2VkLic7XG4gICAgY2FzZSAnd2luZG93X2luX2Z1dHVyZSc6XG4gICAgICByZXR1cm4gJ1RoZSBkYXRlIHJhbmdlIHN0YXJ0cyBhZnRlciB0b2RheSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBjb21wYXJlIHlldC4nO1xuICAgIGNhc2UgJ290aGVyX2RhdGVfZmlsdGVyJzpcbiAgICAgIHJldHVybiAnQSBkYXRlIGZpbHRlciBvbiBhbm90aGVyIGNvbHVtbiBhbHNvIGFwcGxpZXMgdG8gYm90aCBwZXJpb2RzLic7XG4gICAgY2FzZSAnZ3JhaW5fZm9sbG93ZWQnOlxuICAgICAgcmV0dXJuIGNvbXBhcmVkXG4gICAgICAgID8gYCR7Y29tcGFyZWR9LCBmb2xsb3dpbmcgdGhlIGdyb3VwaW5nIHBpY2tlZC5gXG4gICAgICAgIDogJ1RoZSBjb21wYXJpc29uIGZvbGxvd3MgdGhlIGdyb3VwaW5nIHBpY2tlZC4nO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLy8gV2hhdCBhIHdpbmRvd2VkIHZhbHVlIGlzOiAnUm9sbGluZyAzLW1vbnRoIHRvdGFsJywgJ01vbnRoLXRvLWRhdGUgdG90YWwnLFxuLy8gJ1J1bm5pbmcgdG90YWwgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhJywgdGhlbiBpdHMgZGF5cyB3aGVuIHRoZSBzZXJ2ZXJcbi8vIHNlbmRzIHRoZW0gKCdSb2xsaW5nIDctZGF5IGF2ZXJhZ2UsIFNlcCAyNCDigJMgMzAsIDIwMjYnKS4gZ3JhbnVsYXJpdHkgaXMgdGhlXG4vLyBncm91cGluZyB0aGUgcm93cyBhcmUgZHJhd24gYXQgKENvbXBvbmVudERhdGEuZ3JhbnVsYXJpdHkpLCB3aGljaCBuYW1lcyBhXG4vLyByb2xsaW5nIHdpbmRvdyBhdXRob3JlZCBpbiBwZXJpb2RzIG9mIHRoZSBheGlzLlxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd1RleHQoXG4gIG1ldGE6IFdpbmRvd01ldGEsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBncmFudWxhcml0eT86IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGF5cyA9IGZvcm1hdERheVJhbmdlKG1ldGEuc3RhcnQsIG1ldGEuZW5kLCBsb2NhbGUpO1xuICBjb25zdCBwaHJhc2UgPSB3aW5kb3dQaHJhc2UobWV0YSwgZ3JhbnVsYXJpdHkgPz8gbnVsbCk7XG5cbiAgcmV0dXJuIGRheXMgPyBgJHtwaHJhc2V9LCAke2RheXN9YCA6IHBocmFzZTtcbn1cblxuZnVuY3Rpb24gd2luZG93UGhyYXNlKG1ldGE6IFdpbmRvd01ldGEsIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gbWV0YS5hdmVyYWdlID8gJ2F2ZXJhZ2UnIDogJ3RvdGFsJztcblxuICBzd2l0Y2ggKG1ldGEua2luZCkge1xuICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgcmV0dXJuIG1ldGEuZnJvbUJlZ2lubmluZyA/IGBSdW5uaW5nICR7dmFsdWV9IHNpbmNlIHRoZSBzdGFydCBvZiB0aGUgZGF0YWAgOiBgUnVubmluZyAke3ZhbHVlfWA7XG4gICAgY2FzZSAndG9fZGF0ZSc6IHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gbWV0YS5yZXNldEV2ZXJ5ID8gR1JBTlVMQVJJVFlfVU5JVFNbbWV0YS5yZXNldEV2ZXJ5XS5vbmUgOiBudWxsO1xuXG4gICAgICByZXR1cm4gcmVzZXQgPyBgJHtjYXBpdGFsaXplKHJlc2V0KX0tdG8tZGF0ZSAke3ZhbHVlfWAgOiBgVG8tZGF0ZSAke3ZhbHVlfWA7XG4gICAgfVxuICAgIGNhc2UgJ3JvbGxpbmcnOiB7XG4gICAgICBjb25zdCB1bml0ID0gbWV0YS51bml0ID8/IGdyYW51bGFyaXR5O1xuICAgICAgY29uc3Qgc3BhbiA9IG1ldGEucGVyaW9kcyA/IGAke21ldGEucGVyaW9kc30tJHt1bml0ID8gR1JBTlVMQVJJVFlfVU5JVFNbdW5pdF0ub25lIDogJ3BlcmlvZCd9IGAgOiAnJztcblxuICAgICAgcmV0dXJuIGBSb2xsaW5nICR7c3Bhbn0ke3ZhbHVlfWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY2FwaXRhbGl6ZSh2YWx1ZSk7XG4gIH1cbn1cblxuLy8gT25lIHdpbmRvdyBub3RlIGFzIGEgc2VudGVuY2UuXG5leHBvcnQgZnVuY3Rpb24gd2luZG93Tm90ZVRleHQoXG4gIGNvZGU6IFdpbmRvd05vdGVDb2RlLFxuICBtZXRhOiBXaW5kb3dNZXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgZ3JhbnVsYXJpdHk/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIHN3aXRjaCAoY29kZSkge1xuICAgIGNhc2UgJ3NuYXBwZWRfc3RhcnQnOiB7XG4gICAgICBjb25zdCBzdGFydCA9IG1ldGEuc3RhcnQgPyBmb3JtYXREYXkobWV0YS5zdGFydCwgbG9jYWxlKSA6ICcnO1xuXG4gICAgICByZXR1cm4gc3RhcnRcbiAgICAgICAgPyBgVGhlIHN0YXJ0IHdhcyBtb3ZlZCB0byAke3N0YXJ0fSwgdGhlIHN0YXJ0IG9mIGl0cyBwZXJpb2QsIHNvIHRoZSBmaXJzdCBwZXJpb2QgaXMgd2hvbGUuYFxuICAgICAgICA6ICdUaGUgc3RhcnQgd2FzIG1vdmVkIHRvIHRoZSBzdGFydCBvZiBpdHMgcGVyaW9kLCBzbyB0aGUgZmlyc3QgcGVyaW9kIGlzIHdob2xlLic7XG4gICAgfVxuICAgIGNhc2UgJ3NwYW5fY29udmVydGVkJzpcbiAgICAgIHJldHVybiBzcGFuQ29udmVydGVkVGV4dChtZXRhLCBncmFudWxhcml0eSA/PyBudWxsKTtcbiAgICBjYXNlICdncmFpbl90b29fY29hcnNlJzpcbiAgICAgIHJldHVybiAnVGhlIGdyb3VwaW5nIGlzIGNvYXJzZXIgdGhhbiB0aGUgd2luZG93LCBzbyBpdCBoYXMgbm8gdmFsdWVzIGF0IHRoaXMgZ3JvdXBpbmcuJztcbiAgICBjYXNlICdlcXVhbF9ncmFpbl9wbGFpbic6XG4gICAgICByZXR1cm4gJ0F0IHRoaXMgZ3JvdXBpbmcgZWFjaCB3aW5kb3cgaXMgYSBzaW5nbGUgcGVyaW9kLCBzbyB0aGUgdmFsdWVzIGFyZSB0aGUgcGxhaW4gb25lcy4nO1xuICAgIGNhc2UgJ293bl9maWx0ZXJfY2Fwc19sZWFkX2luJzpcbiAgICAgIHJldHVybiAnVGhlIHF1ZXJ5XFwncyBvd24gZGF0ZSBjb25kaXRpb24gc3RhcnRzIHRoZSB3aW5kb3csIHNvIGVhcmxpZXIgcm93cyBhcmUgbm90IGNvdW50ZWQuJztcbiAgICBjYXNlICd3ZWVrX2J5X21vbmRheSc6XG4gICAgICByZXR1cm4gJ0Egd2VlayB0aGF0IHNwYW5zIHR3byBwZXJpb2RzIGNvdW50cyB0b3dhcmQgdGhlIHBlcmlvZCBpdHMgTW9uZGF5IGZhbGxzIGluLic7XG4gICAgY2FzZSAnaW5jb21wbGV0ZV9oZWFkJzpcbiAgICAgIHJldHVybiAnVGhlIGZpcnN0IHBlcmlvZHMgYXJlIGJsYW5rIGJlY2F1c2UgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZWFybGllciByb3dzIHRvIGZpbGwgYSB3aG9sZSB3aW5kb3cuJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8vICczIG1vbnRocyBhcmUgc2hvd24gYXMgMTMgd2Vla3MgYXQgdGhpcyBncm91cGluZy4nXG5mdW5jdGlvbiBzcGFuQ29udmVydGVkVGV4dChtZXRhOiBXaW5kb3dNZXRhLCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIW1ldGEucGVyaW9kcyB8fCAhbWV0YS51bml0IHx8ICFtZXRhLmRyYXduUGVyaW9kcykge1xuICAgIHJldHVybiAnVGhlIHdpbmRvd1xcJ3Mgc3BhbiB3YXMgY29udmVydGVkIHRvIHRoZSBncm91cGluZyBzaG93bi4nO1xuICB9XG5cbiAgY29uc3QgYXV0aG9yZWQgPSB1bml0Q291bnQobWV0YS5wZXJpb2RzLCBtZXRhLnVuaXQpO1xuICBjb25zdCBkcmF3biA9IGdyYW51bGFyaXR5XG4gICAgPyB1bml0Q291bnQobWV0YS5kcmF3blBlcmlvZHMsIGdyYW51bGFyaXR5KVxuICAgIDogYCR7bWV0YS5kcmF3blBlcmlvZHN9ICR7bWV0YS5kcmF3blBlcmlvZHMgPT09IDEgPyAncGVyaW9kJyA6ICdwZXJpb2RzJ31gO1xuXG4gIHJldHVybiBgJHthdXRob3JlZH0gJHttZXRhLnBlcmlvZHMgPT09IDEgPyAnaXMnIDogJ2FyZSd9IHNob3duIGFzICR7ZHJhd259IGF0IHRoaXMgZ3JvdXBpbmcuYDtcbn1cblxuZnVuY3Rpb24gdW5pdENvdW50KGNvdW50OiBudW1iZXIsIHVuaXQ6IENoYXJ0R3JhbnVsYXJpdHkpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y291bnR9ICR7Y291bnQgPT09IDEgPyBHUkFOVUxBUklUWV9VTklUU1t1bml0XS5vbmUgOiBHUkFOVUxBUklUWV9VTklUU1t1bml0XS5tYW55fWA7XG59XG5cbi8vIFdoeSBhIEtQSSdzIGRlbHRhIHJlYWRzIGFzIGl0IGRvZXMsIGFzIGEgc2VudGVuY2UuIFRoZSBiYXNlbGluZSBpcyBuYW1lZFxuLy8gYnkgd2hhdCB0aGUgdmFsdWUgaXMgY29tcGFyZWQgYWdhaW5zdDogdGhlIHNhbWUgcGVyaW9kIGxhc3QgeWVhciBmb3IgYVxuLy8geWVhci1vbi15ZWFyIGNvbXBhcmlzb24sIGVsc2UgdGhlIHBlcmlvZCBiZWZvcmUuXG5leHBvcnQgZnVuY3Rpb24ga3BpTm90ZVRleHQoY29kZTogS3BpTm90ZUNvZGUsIGFnYWluc3Q/OiBDb21wYXJpc29uQWdhaW5zdCB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZSA9IGtwaUJhc2VsaW5lVGV4dChhZ2FpbnN0KTtcblxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdub19wcmlvcl9kYXRhJzpcbiAgICAgIHJldHVybiBgTm8gYmFzZWxpbmU6ICR7YmFzZWxpbmV9IGhhcyBubyBkYXRhLmA7XG4gICAgY2FzZSAndXBfZnJvbV96ZXJvJzpcbiAgICAgIHJldHVybiBgTmV3OiAke2Jhc2VsaW5lfSB3YXMgMC5gO1xuICAgIGNhc2UgJ25vX2NoYW5nZSc6XG4gICAgICByZXR1cm4gYE5vIGNoYW5nZSBmcm9tICR7YmFzZWxpbmV9LmA7XG4gICAgY2FzZSAnbm9fZGF0YV9laXRoZXInOlxuICAgICAgcmV0dXJuICdObyBkYXRhIGluIGVpdGhlciBwZXJpb2QuJztcbiAgICBjYXNlICdzaWduX2NoYW5nZSc6XG4gICAgICByZXR1cm4gJ1RoZSB2YWx1ZSBjcm9zc2VkIHplcm8sIHNvIHRoZXJlIGlzIG5vIHBlcmNlbnQgY2hhbmdlLic7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vLyBUaGUgd2luZG93IGEgS1BJJ3MgdmFsdWUgaXMgY29tcGFyZWQgd2l0aCwgYXMgYSBub3VuIHBocmFzZS4gQW4gdW5rbm93biBvclxuLy8gbWlzc2luZyBjb21wYXJpc29uIHJlYWRzIGFzIG5ldXRyYWwgd29yZGluZyByYXRoZXIgdGhhbiBhIHdyb25nIHBlcmlvZC5cbmZ1bmN0aW9uIGtwaUJhc2VsaW5lVGV4dChhZ2FpbnN0OiBDb21wYXJpc29uQWdhaW5zdCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGFnYWluc3QpIHtcbiAgICBjYXNlICdwcmV2aW91c19wZXJpb2QnOlxuICAgICAgcmV0dXJuICd0aGUgcHJldmlvdXMgcGVyaW9kJztcbiAgICBjYXNlICdwcmV2aW91c193ZWVrJzpcbiAgICAgIHJldHVybiAndGhlIHByZXZpb3VzIHdlZWsnO1xuICAgIGNhc2UgJ3ByZXZpb3VzX21vbnRoJzpcbiAgICAgIHJldHVybiAndGhlIHByZXZpb3VzIG1vbnRoJztcbiAgICBjYXNlICdwcmV2aW91c19xdWFydGVyJzpcbiAgICAgIHJldHVybiAndGhlIHByZXZpb3VzIHF1YXJ0ZXInO1xuICAgIGNhc2UgJ3ByZXZpb3VzX3llYXInOlxuICAgICAgcmV0dXJuICd0aGUgc2FtZSBwZXJpb2QgbGFzdCB5ZWFyJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICd0aGUgY29tcGFyaXNvbiBwZXJpb2QnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcGl0YWxpemUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXh0LnNsaWNlKDEpO1xufVxuXG5cbi8vIEEgc2hvcnQsIGh1bWFuIGxhYmVsIGZvciBhIHpvbmU6IGl0cyBjaXR5IHBsdXMgdGhlIGN1cnJlbnQgYWJicmV2aWF0aW9uLFxuLy8gZS5nLiAnQW1lcmljYS9OZXdfWW9yaycgcmVhZHMgJ05ldyBZb3JrIChFRFQpJy4gVVRDIHN0YXlzICdVVEMnLCBhbmQgYW5cbi8vIHVua25vd24gem9uZSBpcyBzaG93biBhcyBpdHMgaWQuIEFuICdFdGMvJyB6b25lIG5hbWVzIG5vIGNpdHksIGFuZCBpdHMgUE9TSVhcbi8vIHNpZ24gaXMgdGhlIHJldmVyc2Ugb2YgdGhlIG9mZnNldCAoJ0V0Yy9HTVQrNScgaXMgR01ULTUpLCBzbyBpdCByZWFkcyBhcyB0aGVcbi8vIGFiYnJldmlhdGlvbiBhbG9uZTogJ0V0Yy9VVEMnIGlzICdVVEMnLCAnRXRjL0dNVCs1JyBpcyAnR01ULTUnLlxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWV6b25lTGFiZWwodGltZXpvbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0aW1lem9uZSA9PT0gJ1VUQycpIHtcbiAgICByZXR1cm4gdGltZXpvbmU7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHRpbWV6b25lLnNwbGl0KCcvJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBhYmJyZXZpYXRpb24gPSBmb3JtYXRJblRpbWVab25lKG5ldyBEYXRlKCksIHRpbWV6b25lLCAnenp6Jyk7XG5cbiAgICByZXR1cm4gc2VnbWVudHNbMF0gPT09ICdFdGMnXG4gICAgICA/IGFiYnJldmlhdGlvblxuICAgICAgOiBgJHtzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXS5yZXBsYWNlKC9fL2csICcgJyl9ICgke2FiYnJldmlhdGlvbn0pYDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRpbWV6b25lO1xuICB9XG59XG5cblxuLy8gXCJOb3dcIiBhcyBhIERhdGUgd2hvc2UgbG9jYWwgZmllbGRzIHJlYWQgdGhlIHdhbGwgY2xvY2sgaW4gdGhlIGdpdmVuIHpvbmUsIHNvXG4vLyBkYXRlLWZucyBjYWxlbmRhciBhcml0aG1ldGljIChzdGFydE9mV2Vlaywgc3RhcnRPZk1vbnRoLCAuLi4pIGFuZFxuLy8gZGF0ZUJvdW5kU3RyaW5nKCkgbGFuZCBvbiB0aGUgem9uZSdzIGNhbGVuZGFyIGRheSByYXRoZXIgdGhhbiB0aGUgYnJvd3NlcidzLlxuLy8gQW4gdW5rbm93biB6b25lIGZhbGxzIGJhY2sgdG8gdGhlIGJyb3dzZXIncyBjbG9jay5cbmV4cG9ydCBmdW5jdGlvbiBnZXRab25lZE5vdyh0aW1lem9uZTogc3RyaW5nKTogRGF0ZSB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB6b25lZCA9IHRvWm9uZWRUaW1lKG5vdywgdGltZXpvbmUpO1xuXG4gICAgcmV0dXJuIE51bWJlci5pc05hTih6b25lZC5nZXRUaW1lKCkpID8gbm93IDogem9uZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBub3c7XG4gIH1cbn1cbiJdfQ==
|