@workflow/web-shared 5.0.0-beta.17 → 5.0.0-beta.18
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/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +3 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/timeline.js +34 -51
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts +14 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/components/use-row-window.js +39 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +87 -23
- package/dist/components/new-trace-viewer/utils.d.ts +15 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -1
- package/dist/components/new-trace-viewer/utils.js +37 -31
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +3 -25
- package/dist/components/sidebar/attributes-block.d.ts +1 -1
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
- package/dist/components/sidebar/attributes-block.js +5 -7
- package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +6 -1
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/package.json +4 -3
- package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +142 -95
- package/src/components/new-trace-viewer/components/use-row-window.ts +47 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +108 -23
- package/src/components/new-trace-viewer/utils.test.ts +150 -0
- package/src/components/new-trace-viewer/utils.ts +61 -34
- package/src/components/sidebar/attribute-panel.tsx +5 -43
- package/src/components/sidebar/attributes-block.tsx +9 -18
- package/src/components/trace-viewer/trace-viewer.module.css +4 -4
- package/src/lib/hydration.ts +7 -0
- package/src/lib/zstd-browser-decoder.ts +42 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { SpanMarker } from '../utils';
|
|
3
|
+
export interface VisibleMarker {
|
|
4
|
+
leftPct: number;
|
|
5
|
+
/** Absolute (epoch) timestamp in ms — for the tooltip. */
|
|
6
|
+
timeMs: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Project point-in-time markers onto the visible window `[visibleStartMs,
|
|
10
|
+
* visibleEndMs]` of a bar, as percentages of that window. Markers outside the
|
|
11
|
+
* window are dropped.
|
|
12
|
+
*/
|
|
13
|
+
export declare function projectMarkers(markers: SpanMarker[], visibleStartMs: number, visibleEndMs: number): VisibleMarker[];
|
|
14
|
+
/**
|
|
15
|
+
* Thin out ticks that would visually collide: walk left-to-right and keep each
|
|
16
|
+
* one unless it sits within MARKER_MIN_GAP_PX of the last kept tick. Well-spaced
|
|
17
|
+
* markers survive even when a tight cluster elsewhere on the bar gets thinned —
|
|
18
|
+
* zoom in to resolve a cluster.
|
|
19
|
+
*/
|
|
20
|
+
export declare function cullCollidingMarkers(projected: VisibleMarker[], pixelWidth: number): VisibleMarker[];
|
|
21
|
+
/**
|
|
22
|
+
* Point-in-time markers overlaid on a bar — one vertical tick per event (hook
|
|
23
|
+
* resumptions and attribute writes), centered on the bar. Each tick sits inside
|
|
24
|
+
* a larger hit target and, on hover, shows the shared `TimestampTooltip` card
|
|
25
|
+
* (the same light Geist card used for every other timestamp in the app, e.g. the
|
|
26
|
+
* attribute panel and event list) so the time reads consistently with the rest
|
|
27
|
+
* of the product. The position is clamped a hair inside the bar so an edge
|
|
28
|
+
* marker never jams the rounded corner.
|
|
29
|
+
*/
|
|
30
|
+
export declare function MarkerLayer({ markers, }: {
|
|
31
|
+
markers: VisibleMarker[];
|
|
32
|
+
}): ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* Edge indicator for markers that have scrolled out of view while zoomed in.
|
|
35
|
+
* Pinned flush to the corresponding edge of the visible bar, it shows the marker
|
|
36
|
+
* glyph plus a chevron pointing the way to scroll. The chevron always sits on
|
|
37
|
+
* the outer (off-screen) side, in a box that lines up with the bare
|
|
38
|
+
* BoundaryArrow on adjacent rows.
|
|
39
|
+
*/
|
|
40
|
+
export declare function OffscreenMarkerIndicator({ direction, count, targetMs, onReveal, }: {
|
|
41
|
+
direction: 'left' | 'right';
|
|
42
|
+
count: number;
|
|
43
|
+
targetMs: number;
|
|
44
|
+
onReveal?: (timeMs: number) => void;
|
|
45
|
+
}): ReactNode;
|
|
46
|
+
//# sourceMappingURL=span-markers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-markers.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/span-markers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,aAAa,EAAE,CAejB;AAKD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EAAE,EAC1B,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAUjB;AAeD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B,GAAG,SAAS,CAkBZ;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GAAG,SAAS,CAyCZ"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowLeft, ArrowRight } from 'lucide-react';
|
|
4
|
+
import { cn } from '../../../lib/utils';
|
|
5
|
+
import { TimestampTooltip } from '../../ui/timestamp-tooltip';
|
|
6
|
+
/**
|
|
7
|
+
* Project point-in-time markers onto the visible window `[visibleStartMs,
|
|
8
|
+
* visibleEndMs]` of a bar, as percentages of that window. Markers outside the
|
|
9
|
+
* window are dropped.
|
|
10
|
+
*/
|
|
11
|
+
export function projectMarkers(markers, visibleStartMs, visibleEndMs) {
|
|
12
|
+
const visibleDurationMs = visibleEndMs - visibleStartMs;
|
|
13
|
+
if (visibleDurationMs <= 0)
|
|
14
|
+
return [];
|
|
15
|
+
return markers.flatMap((m) => {
|
|
16
|
+
if (m.timeMs < visibleStartMs || m.timeMs > visibleEndMs) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
leftPct: ((m.timeMs - visibleStartMs) / visibleDurationMs) * 100,
|
|
22
|
+
timeMs: m.timeMs,
|
|
23
|
+
},
|
|
24
|
+
];
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Min pixel gap a tick needs from the last-kept one, else it's culled. */
|
|
28
|
+
const MARKER_MIN_GAP_PX = 16;
|
|
29
|
+
/**
|
|
30
|
+
* Thin out ticks that would visually collide: walk left-to-right and keep each
|
|
31
|
+
* one unless it sits within MARKER_MIN_GAP_PX of the last kept tick. Well-spaced
|
|
32
|
+
* markers survive even when a tight cluster elsewhere on the bar gets thinned —
|
|
33
|
+
* zoom in to resolve a cluster.
|
|
34
|
+
*/
|
|
35
|
+
export function cullCollidingMarkers(projected, pixelWidth) {
|
|
36
|
+
const kept = [];
|
|
37
|
+
let lastKeptPct = Number.NEGATIVE_INFINITY;
|
|
38
|
+
for (const m of projected) {
|
|
39
|
+
const gapPx = ((m.leftPct - lastKeptPct) / 100) * pixelWidth;
|
|
40
|
+
if (gapPx < MARKER_MIN_GAP_PX)
|
|
41
|
+
continue;
|
|
42
|
+
kept.push(m);
|
|
43
|
+
lastKeptPct = m.leftPct;
|
|
44
|
+
}
|
|
45
|
+
return kept;
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Rendering
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/** Marker glyph: a rounded vertical tick (3px wide). */
|
|
51
|
+
function MarkerTick({ className }) {
|
|
52
|
+
return (_jsx("span", { className: cn('block w-[3px] rounded-full bg-gray-1000', className) }));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Point-in-time markers overlaid on a bar — one vertical tick per event (hook
|
|
56
|
+
* resumptions and attribute writes), centered on the bar. Each tick sits inside
|
|
57
|
+
* a larger hit target and, on hover, shows the shared `TimestampTooltip` card
|
|
58
|
+
* (the same light Geist card used for every other timestamp in the app, e.g. the
|
|
59
|
+
* attribute panel and event list) so the time reads consistently with the rest
|
|
60
|
+
* of the product. The position is clamped a hair inside the bar so an edge
|
|
61
|
+
* marker never jams the rounded corner.
|
|
62
|
+
*/
|
|
63
|
+
export function MarkerLayer({ markers, }) {
|
|
64
|
+
return (_jsx(_Fragment, { children: markers.map((m) => (_jsx("span", { className: "pointer-events-auto absolute top-0 bottom-0 z-10 flex w-8 -translate-x-1/2 items-center justify-center", style: { left: `clamp(8px, ${m.leftPct}%, calc(100% - 8px))` }, children: _jsx(TimestampTooltip, { date: m.timeMs, children: _jsx("span", { className: "flex h-6 w-8 items-center justify-center", children: _jsx(MarkerTick, { className: "h-3" }) }) }) }, m.timeMs))) }));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Edge indicator for markers that have scrolled out of view while zoomed in.
|
|
68
|
+
* Pinned flush to the corresponding edge of the visible bar, it shows the marker
|
|
69
|
+
* glyph plus a chevron pointing the way to scroll. The chevron always sits on
|
|
70
|
+
* the outer (off-screen) side, in a box that lines up with the bare
|
|
71
|
+
* BoundaryArrow on adjacent rows.
|
|
72
|
+
*/
|
|
73
|
+
export function OffscreenMarkerIndicator({ direction, count, targetMs, onReveal, }) {
|
|
74
|
+
const Chevron = direction === 'right' ? ArrowRight : ArrowLeft;
|
|
75
|
+
const label = `${count} marker${count === 1 ? '' : 's'} ${direction === 'right' ? 'ahead' : 'behind'} — click to scroll to ${count === 1 ? 'it' : 'the nearest'}`;
|
|
76
|
+
const chevron = (_jsx("span", { className: "flex h-6 w-6 shrink-0 items-center justify-center", children: _jsx(Chevron, { className: "size-3 text-gray-900" }) }));
|
|
77
|
+
const tick = _jsx(MarkerTick, { className: "h-3.5 shrink-0" });
|
|
78
|
+
return (_jsx("button", { type: "button", "aria-label": label, title: label, onClick: (e) => {
|
|
79
|
+
// Don't let the row's onClick fire — revealing shouldn't also
|
|
80
|
+
// change the span selection.
|
|
81
|
+
e.stopPropagation();
|
|
82
|
+
onReveal?.(targetMs);
|
|
83
|
+
}, className: cn('pointer-events-auto absolute top-1/2 z-20 flex h-6 -translate-y-1/2 cursor-pointer items-center rounded-[0.25rem] border border-gray-alpha-400 bg-background-100 shadow-sm hover:bg-gray-100', direction === 'right' ? 'right-0 pl-1.5' : 'left-0 pr-1.5'), children: direction === 'left' ? (_jsxs(_Fragment, { children: [chevron, tick] })) : (_jsxs(_Fragment, { children: [tick, chevron] })) }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1tYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL3NwYW4tbWFya2Vycy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXJELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWE5RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBcUIsRUFDckIsY0FBc0IsRUFDdEIsWUFBb0I7SUFFcEIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO0lBQ3hELElBQUksaUJBQWlCLElBQUksQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXRDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQzNCLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxjQUFjLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUN6RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPO1lBQ0w7Z0JBQ0UsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsR0FBRztnQkFDaEUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNO2FBQ2pCO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUU3Qjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMs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LENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FDM0QsWUFFQSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUN0Qiw4QkFDRyxPQUFPLEVBQ1AsSUFBSSxJQUNKLENBQ0osQ0FBQyxDQUFDLENBQUMsQ0FDRiw4QkFDRyxJQUFJLEVBQ0osT0FBTyxJQUNQLENBQ0osR0FDTSxDQUNWLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBBcnJvd0xlZnQsIEFycm93UmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUaW1lc3RhbXBUb29sdGlwIH0gZnJvbSAnLi4vLi4vdWkvdGltZXN0YW1wLXRvb2x0aXAnO1xuaW1wb3J0IHR5cGUgeyBTcGFuTWFya2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1hcmtlciBwcm9qZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBWaXNpYmxlTWFya2VyIHtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICAvKiogQWJzb2x1dGUgKGVwb2NoKSB0aW1lc3RhbXAgaW4gbXMg4oCUIGZvciB0aGUgdG9vbHRpcC4gKi9cbiAgdGltZU1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvamVjdCBwb2ludC1pbi10aW1lIG1hcmtlcnMgb250byB0aGUgdmlzaWJsZSB3aW5kb3cgYFt2aXNpYmxlU3RhcnRNcyxcbiAqIHZpc2libGVFbmRNc11gIG9mIGEgYmFyLCBhcyBwZXJjZW50YWdlcyBvZiB0aGF0IHdpbmRvdy4gTWFya2VycyBvdXRzaWRlIHRoZVxuICogd2luZG93IGFyZSBkcm9wcGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdE1hcmtlcnMoXG4gIG1hcmtlcnM6IFNwYW5NYXJrZXJbXSxcbiAgdmlzaWJsZVN0YXJ0TXM6IG51bWJlcixcbiAgdmlzaWJsZUVuZE1zOiBudW1iZXJcbik6IFZpc2libGVNYXJrZXJbXSB7XG4gIGNvbnN0IHZpc2libGVEdXJhdGlvbk1zID0gdmlzaWJsZUVuZE1zIC0gdmlzaWJsZVN0YXJ0TXM7XG4gIGlmICh2aXNpYmxlRHVyYXRpb25NcyA8PSAwKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIG1hcmtlcnMuZmxhdE1hcCgobSkgPT4ge1xuICAgIGlmIChtLnRpbWVNcyA8IHZpc2libGVTdGFydE1zIHx8IG0udGltZU1zID4gdmlzaWJsZUVuZE1zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGxlZnRQY3Q6ICgobS50aW1lTXMgLSB2aXNpYmxlU3RhcnRNcykgLyB2aXNpYmxlRHVyYXRpb25NcykgKiAxMDAsXG4gICAgICAgIHRpbWVNczogbS50aW1lTXMsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG4vKiogTWluIHBpeGVsIGdhcCBhIHRpY2sgbmVlZHMgZnJvbSB0aGUgbGFzdC1rZXB0IG9uZSwgZWxzZSBpdCdzIGN1bGxlZC4gKi9cbmNvbnN0IE1BUktFUl9NSU5fR0FQX1BYID0gMTY7XG5cbi8qKlxuICogVGhpbiBvdXQgdGlja3MgdGhhdCB3b3VsZCB2aXN1YWxseSBjb2xsaWRlOiB3YWxrIGxlZnQtdG8tcmlnaHQgYW5kIGtlZXAgZWFjaFxuICogb25lIHVubGVzcyBpdCBzaXRzIHdpdGhpbiBNQVJLRVJfTUlOX0dBUF9QWCBvZiB0aGUgbGFzdCBrZXB0IHRpY2suIFdlbGwtc3BhY2VkXG4gKiBtYXJrZXJzIHN1cnZpdmUgZXZlbiB3aGVuIGEgdGlnaHQgY2x1c3RlciBlbHNld2hlcmUgb24gdGhlIGJhciBnZXRzIHRoaW5uZWQg4oCUXG4gKiB6b29tIGluIHRvIHJlc29sdmUgYSBjbHVzdGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VsbENvbGxpZGluZ01hcmtlcnMoXG4gIHByb2plY3RlZDogVmlzaWJsZU1hcmtlcltdLFxuICBwaXhlbFdpZHRoOiBudW1iZXJcbik6IFZpc2libGVNYXJrZXJbXSB7XG4gIGNvbnN0IGtlcHQ6IFZpc2libGVNYXJrZXJbXSA9IFtdO1xuICBsZXQgbGFzdEtlcHRQY3QgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gIGZvciAoY29uc3QgbSBvZiBwcm9qZWN0ZWQpIHtcbiAgICBjb25zdCBnYXBQeCA9ICgobS5sZWZ0UGN0IC0gbGFzdEtlcHRQY3QpIC8gMTAwKSAqIHBpeGVsV2lkdGg7XG4gICAgaWYgKGdhcFB4IDwgTUFSS0VSX01JTl9HQVBfUFgpIGNvbnRpbnVlO1xuICAgIGtlcHQucHVzaChtKTtcbiAgICBsYXN0S2VwdFBjdCA9IG0ubGVmdFBjdDtcbiAgfVxuICByZXR1cm4ga2VwdDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZW5kZXJpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWFya2VyIGdseXBoOiBhIHJvdW5kZWQgdmVydGljYWwgdGljayAoM3B4IHdpZGUpLiAqL1xuZnVuY3Rpb24gTWFya2VyVGljayh7IGNsYXNzTmFtZSB9OiB7IGNsYXNzTmFtZT86IHN0cmluZyB9KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8c3BhblxuICAgICAgY2xhc3NOYW1lPXtjbignYmxvY2sgdy1bM3B4XSByb3VuZGVkLWZ1bGwgYmctZ3JheS0xMDAwJywgY2xhc3NOYW1lKX1cbiAgICAvPlxuICApO1xufVxuXG4vKipcbiAqIFBvaW50LWluLXRpbWUgbWFya2VycyBvdmVybGFpZCBvbiBhIGJhciDigJQgb25lIHZlcnRpY2FsIHRpY2sgcGVyIGV2ZW50IChob29rXG4gKiByZXN1bXB0aW9ucyBhbmQgYXR0cmlidXRlIHdyaXRlcyksIGNlbnRlcmVkIG9uIHRoZSBiYXIuIEVhY2ggdGljayBzaXRzIGluc2lkZVxuICogYSBsYXJnZXIgaGl0IHRhcmdldCBhbmQsIG9uIGhvdmVyLCBzaG93cyB0aGUgc2hhcmVkIGBUaW1lc3RhbXBUb29sdGlwYCBjYXJkXG4gKiAodGhlIHNhbWUgbGlnaHQgR2Vpc3QgY2FyZCB1c2VkIGZvciBldmVyeSBvdGhlciB0aW1lc3RhbXAgaW4gdGhlIGFwcCwgZS5nLiB0aGVcbiAqIGF0dHJpYnV0ZSBwYW5lbCBhbmQgZXZlbnQgbGlzdCkgc28gdGhlIHRpbWUgcmVhZHMgY29uc2lzdGVudGx5IHdpdGggdGhlIHJlc3RcbiAqIG9mIHRoZSBwcm9kdWN0LiBUaGUgcG9zaXRpb24gaXMgY2xhbXBlZCBhIGhhaXIgaW5zaWRlIHRoZSBiYXIgc28gYW4gZWRnZVxuICogbWFya2VyIG5ldmVyIGphbXMgdGhlIHJvdW5kZWQgY29ybmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFya2VyTGF5ZXIoe1xuICBtYXJrZXJzLFxufToge1xuICBtYXJrZXJzOiBWaXNpYmxlTWFya2VyW107XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge21hcmtlcnMubWFwKChtKSA9PiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAga2V5PXttLnRpbWVNc31cbiAgICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1hdXRvIGFic29sdXRlIHRvcC0wIGJvdHRvbS0wIHotMTAgZmxleCB3LTggLXRyYW5zbGF0ZS14LTEvMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGBjbGFtcCg4cHgsICR7bS5sZWZ0UGN0fSUsIGNhbGMoMTAwJSAtIDhweCkpYCB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFRpbWVzdGFtcFRvb2x0aXAgZGF0ZT17bS50aW1lTXN9PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmxleCBoLTYgdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8TWFya2VyVGljayBjbGFzc05hbWU9XCJoLTNcIiAvPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvVGltZXN0YW1wVG9vbHRpcD5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKSl9XG4gICAgPC8+XG4gICk7XG59XG5cbi8qKlxuICogRWRnZSBpbmRpY2F0b3IgZm9yIG1hcmtlcnMgdGhhdCBoYXZlIHNjcm9sbGVkIG91dCBvZiB2aWV3IHdoaWxlIHpvb21lZCBpbi5cbiAqIFBpbm5lZCBmbHVzaCB0byB0aGUgY29ycmVzcG9uZGluZyBlZGdlIG9mIHRoZSB2aXNpYmxlIGJhciwgaXQgc2hvd3MgdGhlIG1hcmtlclxuICogZ2x5cGggcGx1cyBhIGNoZXZyb24gcG9pbnRpbmcgdGhlIHdheSB0byBzY3JvbGwuIFRoZSBjaGV2cm9uIGFsd2F5cyBzaXRzIG9uXG4gKiB0aGUgb3V0ZXIgKG9mZi1zY3JlZW4pIHNpZGUsIGluIGEgYm94IHRoYXQgbGluZXMgdXAgd2l0aCB0aGUgYmFyZVxuICogQm91bmRhcnlBcnJvdyBvbiBhZGphY2VudCByb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT2Zmc2NyZWVuTWFya2VySW5kaWNhdG9yKHtcbiAgZGlyZWN0aW9uLFxuICBjb3VudCxcbiAgdGFyZ2V0TXMsXG4gIG9uUmV2ZWFsLFxufToge1xuICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XG4gIGNvdW50OiBudW1iZXI7XG4gIHRhcmdldE1zOiBudW1iZXI7XG4gIG9uUmV2ZWFsPzogKHRpbWVNczogbnVtYmVyKSA9PiB2b2lkO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IENoZXZyb24gPSBkaXJlY3Rpb24gPT09ICdyaWdodCcgPyBBcnJvd1JpZ2h0IDogQXJyb3dMZWZ0O1xuICBjb25zdCBsYWJlbCA9IGAke2NvdW50fSBtYXJrZXIke2NvdW50ID09PSAxID8gJycgOiAncyd9ICR7XG4gICAgZGlyZWN0aW9uID09PSAncmlnaHQnID8gJ2FoZWFkJyA6ICdiZWhpbmQnXG4gIH0g4oCUIGNsaWNrIHRvIHNjcm9sbCB0byAke2NvdW50ID09PSAxID8gJ2l0JyA6ICd0aGUgbmVhcmVzdCd9YDtcbiAgY29uc3QgY2hldnJvbiA9IChcbiAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4IGgtNiB3LTYgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8Q2hldnJvbiBjbGFzc05hbWU9XCJzaXplLTMgdGV4dC1ncmF5LTkwMFwiIC8+XG4gICAgPC9zcGFuPlxuICApO1xuICBjb25zdCB0aWNrID0gPE1hcmtlclRpY2sgY2xhc3NOYW1lPVwiaC0zLjUgc2hyaW5rLTBcIiAvPjtcblxuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgYXJpYS1sYWJlbD17bGFiZWx9XG4gICAgICB0aXRsZT17bGFiZWx9XG4gICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAvLyBEb24ndCBsZXQgdGhlIHJvdydzIG9uQ2xpY2sgZmlyZSDigJQgcmV2ZWFsaW5nIHNob3VsZG4ndCBhbHNvXG4gICAgICAgIC8vIGNoYW5nZSB0aGUgc3BhbiBzZWxlY3Rpb24uXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG9uUmV2ZWFsPy4odGFyZ2V0TXMpO1xuICAgICAgfX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1hdXRvIGFic29sdXRlIHRvcC0xLzIgei0yMCBmbGV4IGgtNiAtdHJhbnNsYXRlLXktMS8yIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLVswLjI1cmVtXSBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWJhY2tncm91bmQtMTAwIHNoYWRvdy1zbSBob3ZlcjpiZy1ncmF5LTEwMCcsXG4gICAgICAgIGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/ICdyaWdodC0wIHBsLTEuNScgOiAnbGVmdC0wIHByLTEuNSdcbiAgICAgICl9XG4gICAgPlxuICAgICAge2RpcmVjdGlvbiA9PT0gJ2xlZnQnID8gKFxuICAgICAgICA8PlxuICAgICAgICAgIHtjaGV2cm9ufVxuICAgICAgICAgIHt0aWNrfVxuICAgICAgICA8Lz5cbiAgICAgICkgOiAoXG4gICAgICAgIDw+XG4gICAgICAgICAge3RpY2t9XG4gICAgICAgICAge2NoZXZyb259XG4gICAgICAgIDwvPlxuICAgICAgKX1cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -11,6 +11,7 @@ declare const TimelineBar: import("react").NamedExoticComponent<{
|
|
|
11
11
|
isSelected: boolean;
|
|
12
12
|
isDimmed?: boolean;
|
|
13
13
|
onSelect: (spanId: string) => void;
|
|
14
|
+
onRevealTime?: (timeMs: number) => void;
|
|
14
15
|
}>;
|
|
15
16
|
export { TimelineBar };
|
|
16
17
|
export declare function TimelineHeader({ markers, hoverInfo, }: {
|
|
@@ -20,7 +21,7 @@ export declare function TimelineHeader({ markers, hoverInfo, }: {
|
|
|
20
21
|
label: string;
|
|
21
22
|
} | null;
|
|
22
23
|
}): ReactNode;
|
|
23
|
-
export declare function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, hoverFraction, altHeld, }: {
|
|
24
|
+
export declare function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, onRevealTime, hoverFraction, altHeld, }: {
|
|
24
25
|
spans: Span[];
|
|
25
26
|
viewStart: number;
|
|
26
27
|
viewEnd: number;
|
|
@@ -28,6 +29,7 @@ export declare function Timeline({ spans, viewStart, viewEnd, markers, selectedI
|
|
|
28
29
|
selectedId: string | null;
|
|
29
30
|
searchResult: SpanSearchResult;
|
|
30
31
|
onSelect: (spanId: string) => void;
|
|
32
|
+
onRevealTime?: (timeMs: number) => void;
|
|
31
33
|
hoverFraction?: number | null;
|
|
32
34
|
altHeld?: boolean;
|
|
33
35
|
}): ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBtD,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAIV,UAAU,EACX,MAAM,UAAU,CAAC;AAwBlB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA2TtC,QAAA,MAAM,WAAW;UAUT,IAAI;eACC,MAAM;kBACH,MAAM;oBACJ,MAAM;gBACV,OAAO;eACR,OAAO;cACR,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;mBACnB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;EAsJvC,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAiDvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CA6FZ"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { ArrowLeft, ArrowRight } from 'lucide-react';
|
|
4
|
-
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
+
import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
5
5
|
import { cn } from '../../../lib/utils';
|
|
6
6
|
import { formatDuration, formatDurationPrecise, getHighResInMs, } from '../../trace-viewer/util/timing';
|
|
7
|
-
import { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/tooltip';
|
|
8
7
|
import { isSpanDimmedBySearch } from '../search';
|
|
9
|
-
import { computeSpanGaps, computeSpanSegments, getResourceColor, getSpanDurationMs, } from '../utils';
|
|
8
|
+
import { computeOffscreenMarkers, computeSpanGaps, computeSpanMarkers, computeSpanSegments, getResourceColor, getSpanDurationMs, } from '../utils';
|
|
9
|
+
import { cullCollidingMarkers, MarkerLayer, OffscreenMarkerIndicator, projectMarkers, } from './span-markers';
|
|
10
10
|
import styles from './timeline.module.css';
|
|
11
11
|
import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -18,7 +18,7 @@ export const TIMELINE_PADDING_PX = 16;
|
|
|
18
18
|
const SEGMENT_CLASSES = {
|
|
19
19
|
queued: 'bg-gray-400 border border-gray-500',
|
|
20
20
|
retrying: 'bg-gray-400 border border-gray-500',
|
|
21
|
-
waiting: 'bg-gray-
|
|
21
|
+
waiting: 'bg-gray-200 border border-gray-500',
|
|
22
22
|
running: 'bg-blue-200 border border-blue-500',
|
|
23
23
|
completed: 'bg-blue-200 border border-blue-500',
|
|
24
24
|
failed: 'bg-red-200 border border-red-500',
|
|
@@ -120,8 +120,8 @@ function projectSegments(segments, spanStartMs, spanDurationMs, geometry) {
|
|
|
120
120
|
// ---------------------------------------------------------------------------
|
|
121
121
|
// Small render helpers
|
|
122
122
|
// ---------------------------------------------------------------------------
|
|
123
|
-
function DurationLabel({ label }) {
|
|
124
|
-
return (_jsx("span", { className:
|
|
123
|
+
function DurationLabel({ label, className, }) {
|
|
124
|
+
return (_jsx("span", { className: cn('pointer-events-none absolute inset-0 flex items-center justify-start overflow-hidden px-1 text-[10px] font-mono font-medium leading-none whitespace-nowrap text-left text-gray-1000 tabular-nums opacity-0 group-hover/timeline-row:opacity-100', className), children: label }));
|
|
125
125
|
}
|
|
126
126
|
function BoundaryArrow({ direction, }) {
|
|
127
127
|
const Icon = direction === 'right' ? ArrowRight : ArrowLeft;
|
|
@@ -136,16 +136,20 @@ function LeadInConnector({ leftPct, widthPct, label, }) {
|
|
|
136
136
|
width: `calc(${widthPct}% - 1px)`,
|
|
137
137
|
}, children: [_jsx("div", { className: "absolute left-0 top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500" }), _jsx("div", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-gray-500" }), label ? _jsx(DurationLabel, { label: label }) : null] }));
|
|
138
138
|
}
|
|
139
|
-
function SegmentBar({ segments }) {
|
|
139
|
+
function SegmentBar({ segments, showLabels = true, }) {
|
|
140
140
|
return (_jsx("div", { className: "relative h-6 w-full", children: segments.map((seg, i) => {
|
|
141
141
|
if (seg.status === 'queued') {
|
|
142
142
|
const leadInLabel = formatDurationPrecise(seg.fullDurationMs);
|
|
143
|
-
const showLeadInLabel =
|
|
144
|
-
|
|
143
|
+
const showLeadInLabel = showLabels &&
|
|
144
|
+
seg.pixelWidth >= Math.max(40, leadInLabel.length * 6 + 12);
|
|
145
|
+
const isFullWidthQueued = segments.length === 1;
|
|
146
|
+
return (_jsxs(Fragment, { children: [_jsx(LeadInConnector, { leftPct: seg.leftPct, widthPct: seg.widthPct, label: showLeadInLabel ? leadInLabel : null }), isFullWidthQueued ? (_jsx("div", { className: "absolute top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500", style: {
|
|
147
|
+
left: `calc(${seg.leftPct + seg.widthPct}% - 1.5px)`,
|
|
148
|
+
} })) : null] }, i));
|
|
145
149
|
}
|
|
146
150
|
const label = formatDurationPrecise(seg.fullDurationMs);
|
|
147
151
|
// Only render the label when there's enough room for it without clipping.
|
|
148
|
-
const showLabel = seg.pixelWidth >= Math.max(40, label.length * 6 + 12);
|
|
152
|
+
const showLabel = showLabels && seg.pixelWidth >= Math.max(40, label.length * 6 + 12);
|
|
149
153
|
return (_jsxs("div", { className: cn('absolute h-full overflow-hidden rounded-[0.25rem]', SEGMENT_CLASSES[seg.status]), style: {
|
|
150
154
|
// 1px gap between adjacent segments, distributed equally.
|
|
151
155
|
left: `calc(${seg.leftPct}% + 0.5px)`,
|
|
@@ -155,44 +159,9 @@ function SegmentBar({ segments }) {
|
|
|
155
159
|
}) }));
|
|
156
160
|
}
|
|
157
161
|
// ---------------------------------------------------------------------------
|
|
158
|
-
// Event markers (attr_set)
|
|
159
|
-
// ---------------------------------------------------------------------------
|
|
160
|
-
function formatMarkerTime(ms) {
|
|
161
|
-
const date = new Date(ms);
|
|
162
|
-
return (date.toLocaleTimeString('en-US', {
|
|
163
|
-
hour: '2-digit',
|
|
164
|
-
minute: '2-digit',
|
|
165
|
-
second: '2-digit',
|
|
166
|
-
hour12: false,
|
|
167
|
-
}) +
|
|
168
|
-
'.' +
|
|
169
|
-
date.getMilliseconds().toString().padStart(3, '0'));
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
* Diamond markers for `attr_set` events on a span's timeline row. Attribute
|
|
173
|
-
* changes are point-in-time events with no duration, so they don't get a
|
|
174
|
-
* status segment — instead they render as small teal diamonds at the moment
|
|
175
|
-
* the attributes were written.
|
|
176
|
-
*/
|
|
177
|
-
function AttrSetMarkers({ span, viewStart, viewDuration, }) {
|
|
178
|
-
const markers = useMemo(() => span.events.filter((e) => e.name === 'attr_set'), [span.events]);
|
|
179
|
-
if (markers.length === 0 || viewDuration <= 0)
|
|
180
|
-
return null;
|
|
181
|
-
return (_jsx(_Fragment, { children: markers.map((event, index) => {
|
|
182
|
-
const timeMs = getHighResInMs(event.timestamp);
|
|
183
|
-
const frac = (timeMs - viewStart) / viewDuration;
|
|
184
|
-
if (frac < 0 || frac > 1)
|
|
185
|
-
return null;
|
|
186
|
-
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("div", { "aria-label": "Attributes set", className: "absolute top-1/2 z-10 flex h-4 w-4 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center", style: { left: `${frac * 100}%` }, children: _jsx("div", { className: "h-2 w-2 rotate-45 rounded-[1px] border", style: {
|
|
187
|
-
backgroundColor: 'var(--ds-teal-400)',
|
|
188
|
-
borderColor: 'var(--ds-teal-900)',
|
|
189
|
-
} }) }) }), _jsxs(TooltipContent, { children: ["Attributes set \u00B7 ", formatMarkerTime(timeMs)] })] }, `attr-set-${index}`));
|
|
190
|
-
}) }));
|
|
191
|
-
}
|
|
192
|
-
// ---------------------------------------------------------------------------
|
|
193
162
|
// TimelineBar
|
|
194
163
|
// ---------------------------------------------------------------------------
|
|
195
|
-
const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, }) {
|
|
164
|
+
const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, onRevealTime, }) {
|
|
196
165
|
const startMs = getHighResInMs(span.startTime);
|
|
197
166
|
const endMs = getHighResInMs(span.endTime);
|
|
198
167
|
const totalDurationMs = getSpanDurationMs(span);
|
|
@@ -201,6 +170,18 @@ const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, c
|
|
|
201
170
|
const segments = useMemo(() => geometry.mode.kind === 'full'
|
|
202
171
|
? projectSegments(baseSegments, startMs, totalDurationMs, geometry)
|
|
203
172
|
: [], [geometry, baseSegments, startMs, totalDurationMs]);
|
|
173
|
+
const baseMarkers = useMemo(() => computeSpanMarkers(span), [span]);
|
|
174
|
+
const markers = useMemo(() => geometry.mode.kind === 'full'
|
|
175
|
+
? cullCollidingMarkers(projectMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs), geometry.visiblePixelWidth)
|
|
176
|
+
: [], [geometry, baseMarkers]);
|
|
177
|
+
// Markers that fall outside the visible window (scrolled off while zoomed in)
|
|
178
|
+
// — surfaced as edge indicators so they aren't silently lost.
|
|
179
|
+
const offscreen = useMemo(() => geometry.mode.kind === 'full'
|
|
180
|
+
? computeOffscreenMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs)
|
|
181
|
+
: { left: null, right: null }, [geometry, baseMarkers]);
|
|
182
|
+
// Markers (visible or off-screen) move the duration label into the overlay,
|
|
183
|
+
// so the in-bar segment label is suppressed.
|
|
184
|
+
const hasMarkers = markers.length > 0 || offscreen.left !== null || offscreen.right !== null;
|
|
204
185
|
const workflowStatus = span.attributes.data
|
|
205
186
|
?.status;
|
|
206
187
|
const isErrored = span.status.code === 2 || workflowStatus === 'failed';
|
|
@@ -216,7 +197,9 @@ const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, c
|
|
|
216
197
|
const handleClick = useCallback(() => {
|
|
217
198
|
onSelect(span.spanId);
|
|
218
199
|
}, [onSelect, span.spanId]);
|
|
219
|
-
return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsxs("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: [_jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }),
|
|
200
|
+
return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsxs("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: [_jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 overflow-hidden rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments, showLabels: !hasMarkers })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }), hasMarkers ? (_jsxs("div", { className: "pointer-events-none absolute top-1/2 h-6 -translate-y-1/2", style: getBarPositionStyle(geometry), children: [markers.length > 0 ? _jsx(MarkerLayer, { markers: markers }) : null, offscreen.left ? (_jsx(OffscreenMarkerIndicator, { direction: "left", count: offscreen.left.count, targetMs: offscreen.left.nearestMs, onReveal: onRevealTime })) : null, offscreen.right ? (_jsx(OffscreenMarkerIndicator, { direction: "right", count: offscreen.right.count, targetMs: offscreen.right.nearestMs, onReveal: onRevealTime })) : null, showTotalLabel ? (_jsx(DurationLabel, { label: totalLabel,
|
|
201
|
+
// Shift clear of the left edge indicator so it isn't covered.
|
|
202
|
+
className: offscreen.left ? 'pl-10' : undefined })) : null] })) : null] }) }));
|
|
220
203
|
});
|
|
221
204
|
export { TimelineBar };
|
|
222
205
|
// ---------------------------------------------------------------------------
|
|
@@ -245,7 +228,7 @@ export function TimelineHeader({ markers, hoverInfo, }) {
|
|
|
245
228
|
// ---------------------------------------------------------------------------
|
|
246
229
|
// Timeline
|
|
247
230
|
// ---------------------------------------------------------------------------
|
|
248
|
-
export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, hoverFraction, altHeld = false, }) {
|
|
231
|
+
export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, onRevealTime, hoverFraction, altHeld = false, }) {
|
|
249
232
|
const containerRef = useRef(null);
|
|
250
233
|
const [containerWidth, setContainerWidth] = useState(0);
|
|
251
234
|
const viewDuration = viewEnd - viewStart;
|
|
@@ -264,6 +247,6 @@ export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searc
|
|
|
264
247
|
const gaps = useMemo(() => computeSpanGaps(spans, viewStart, viewEnd), [spans, viewStart, viewEnd]);
|
|
265
248
|
return (_jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", style: { minHeight: spans.length * ROW_HEIGHT_PX }, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers.map((marker) =>
|
|
266
249
|
// Skip the "0s" origin marker since the left edge already implies it.
|
|
267
|
-
Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, String(marker.value))) : null) }), hoverFraction != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) })), _jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect }, span.spanId))) }), altHeld && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => (_jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex))) }))] }));
|
|
250
|
+
Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, String(marker.value))) : null) }), hoverFraction != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) })), _jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect, onRevealTime: onRevealTime }, span.spanId))) }), altHeld && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => (_jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex))) }))] }));
|
|
268
251
|
}
|
|
269
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdGltZWxpbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxvQkFBb0IsRUFBeUIsTUFBTSxXQUFXLENBQUM7QUFHeEUsT0FBTyxFQUNMLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9ELDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGVBQWUsR0FBa0M7SUFDckQsTUFBTSxFQUFFLG9DQUFvQztJQUM1QyxRQUFRLEVBQUUs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Q0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQ3RDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUpqQixHQUFHLENBQUMsUUFBUSxDQUtqQixDQUNILENBQUMsR0FDRSxDQUNQLElBQ0csQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQXJyb3dMZWZ0LCBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcbmltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uLFxuICBmb3JtYXREdXJhdGlvblByZWNpc2UsXG4gIGdldEhpZ2hSZXNJbk1zLFxufSBmcm9tICcuLi8uLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHsgVG9vbHRpcCwgVG9vbHRpcENvbnRlbnQsIFRvb2x0aXBUcmlnZ2VyIH0gZnJvbSAnLi4vLi4vdWkvdG9vbHRpcCc7XG5pbXBvcnQgeyBpc1NwYW5EaW1tZWRCeVNlYXJjaCwgdHlwZSBTcGFuU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vc2VhcmNoJztcbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2VnbWVudCwgU2VnbWVudFN0YXR1cywgVGltZU1hcmtlciB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVTcGFuR2FwcyxcbiAgY29tcHV0ZVNwYW5TZWdtZW50cyxcbiAgZ2V0UmVzb3VyY2VDb2xvcixcbiAgZ2V0U3BhbkR1cmF0aW9uTXMsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi90aW1lbGluZS5tb2R1bGUuY3NzJztcbmltcG9ydCB7IFJPV19IRUlHSFRfUFgsIHVzZVJvd1dpbmRvdyB9IGZyb20gJy4vdXNlLXJvdy13aW5kb3cnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRJTllfQkFSX0JPWF9TSVpFX1BYID0gMjQ7XG5jb25zdCBUSU5ZX0JBUl9XSURUSF9QWCA9IDQ7XG5leHBvcnQgY29uc3QgVElNRUxJTkVfUEFERElOR19QWCA9IDE2O1xuXG5jb25zdCBTRUdNRU5UX0NMQVNTRVM6IFJlY29yZDxTZWdtZW50U3RhdHVzLCBzdHJpbmc+ID0ge1xuICBxdWV1ZWQ6ICdiZy1ncmF5LTQwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcmV0cnlpbmc6ICdiZy1ncmF5LTQwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgd2FpdGluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICBydW5uaW5nOiAnYmctYmx1ZS0yMDAgYm9yZGVyIGJvcmRlci1ibHVlLTUwMCcsXG4gIGNvbXBsZXRlZDogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxuICBmYWlsZWQ6ICdiZy1yZWQtMjAwIGJvcmRlciBib3JkZXItcmVkLTUwMCcsXG4gIHN1Y2NlZWRlZDogJ2JnLWdyZWVuLTIwMCBib3JkZXIgYm9yZGVyLWdyZWVuLTUwMCcsXG4gIHNsZWVwaW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJlY2VpdmVkOiAnYmctYmx1ZS0yMDAgYm9yZGVyIGJvcmRlci1ibHVlLTUwMCcsXG59O1xuXG5jb25zdCBUSU1FTElORV9JTlNFVF9TVFlMRTogQ1NTUHJvcGVydGllcyA9IHtcbiAgbGVmdDogVElNRUxJTkVfUEFERElOR19QWCxcbiAgcmlnaHQ6IFRJTUVMSU5FX1BBRERJTkdfUFgsXG59O1xuXG5jb25zdCBBQ1RJVkVfU0VHTUVOVF9TVEFUVVNFUzogUmVhZG9ubHlTZXQ8U2VnbWVudFN0YXR1cz4gPSBuZXcgU2V0KFtcbiAgJ3J1bm5pbmcnLFxuICAncmVjZWl2ZWQnLFxuXSk7XG5cbmZ1bmN0aW9uIFJ1bm5pbmdTdHJpcGVzKCk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiA8ZGl2IGFyaWEtaGlkZGVuIGNsYXNzTmFtZT17c3R5bGVzLnJ1bm5pbmdTdHJpcGVzfSAvPjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCYXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEJhck1vZGUgPVxuICB8IHsga2luZDogJ2Fycm93JzsgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIH1cbiAgfCB7IGtpbmQ6ICd0aW55JyB9XG4gIHwgeyBraW5kOiAnZnVsbCcgfTtcblxuaW50ZXJmYWNlIEJhckdlb21ldHJ5IHtcbiAgbW9kZTogQmFyTW9kZTtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICB2aXNpYmxlU3RhcnRNczogbnVtYmVyO1xuICB2aXNpYmxlRW5kTXM6IG51bWJlcjtcbiAgdmlzaWJsZVBpeGVsV2lkdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBiYXIncyBnZW9tZXRyeSBpbnNpZGUgdGhlIHRpbWVsaW5lIHZpZXdwb3J0LiBQZXJjZW50YWdlcyBhcmVcbiAqIGFsd2F5cyBpbiBbMCwgMTAwXSBzbyB3ZSBuZXZlciBlbWl0IENTUyB2YWx1ZXMgdGhhdCBleGNlZWQgYnJvd3NlciBsYXlvdXRcbiAqIGxpbWl0cyBhdCBleHRyZW1lIHpvb20uXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVCYXJHZW9tZXRyeShcbiAgc3RhcnRNczogbnVtYmVyLFxuICBlbmRNczogbnVtYmVyLFxuICB2aWV3U3RhcnQ6IG51bWJlcixcbiAgdmlld0VuZDogbnVtYmVyLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyXG4pOiBCYXJHZW9tZXRyeSB7XG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGNvbnN0IHZpc2libGVTdGFydE1zID0gTWF0aC5tYXgoc3RhcnRNcywgdmlld1N0YXJ0KTtcbiAgY29uc3QgdmlzaWJsZUVuZE1zID0gTWF0aC5taW4oZW5kTXMsIHZpZXdFbmQpO1xuICBjb25zdCB2aXNpYmxlRHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIHZpc2libGVFbmRNcyAtIHZpc2libGVTdGFydE1zKTtcbiAgY29uc3Qgd2lkdGhGcmFjID0gdmlld0R1cmF0aW9uID4gMCA/IHZpc2libGVEdXJhdGlvbk1zIC8gdmlld0R1cmF0aW9uIDogMDtcbiAgY29uc3QgdmlzaWJsZVBpeGVsV2lkdGggPSB3aWR0aEZyYWMgKiBjb250YWluZXJXaWR0aDtcblxuICBjb25zdCBpc1RpbnkgPSBjb250YWluZXJXaWR0aCA+IDAgJiYgdmlzaWJsZVBpeGVsV2lkdGggPCBUSU5ZX0JBUl9CT1hfU0laRV9QWDtcbiAgY29uc3QgZXh0ZW5kc09mZkxlZnQgPSBzdGFydE1zIDwgdmlld1N0YXJ0O1xuICBjb25zdCBleHRlbmRzT2ZmUmlnaHQgPSBlbmRNcyA+IHZpZXdFbmQ7XG5cbiAgY29uc3QgbW9kZTogQmFyTW9kZSA9XG4gICAgaXNUaW55ICYmIChleHRlbmRzT2ZmTGVmdCB8fCBleHRlbmRzT2ZmUmlnaHQpXG4gICAgICA/IHsga2luZDogJ2Fycm93JywgZGlyZWN0aW9uOiBleHRlbmRzT2ZmUmlnaHQgPyAncmlnaHQnIDogJ2xlZnQnIH1cbiAgICAgIDogaXNUaW55XG4gICAgICAgID8geyBraW5kOiAndGlueScgfVxuICAgICAgICA6IHsga2luZDogJ2Z1bGwnIH07XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlLFxuICAgIGxlZnRQY3Q6XG4gICAgICB2aWV3RHVyYXRpb24gPiAwXG4gICAgICAgID8gKCh2aXNpYmxlU3RhcnRNcyAtIHZpZXdTdGFydCkgLyB2aWV3RHVyYXRpb24pICogMTAwXG4gICAgICAgIDogMCxcbiAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgIHZpc2libGVTdGFydE1zLFxuICAgIHZpc2libGVFbmRNcyxcbiAgICB2aXNpYmxlUGl4ZWxXaWR0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeTogQmFyR2VvbWV0cnkpOiB7XG4gIGxlZnQ6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbn0ge1xuICBzd2l0Y2ggKGdlb21ldHJ5Lm1vZGUua2luZCkge1xuICAgIGNhc2UgJ2Fycm93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6XG4gICAgICAgICAgZ2VvbWV0cnkubW9kZS5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgID8gYGNhbGMoMTAwJSAtICR7VElOWV9CQVJfQk9YX1NJWkVfUFh9cHgpYFxuICAgICAgICAgICAgOiAnMHB4JyxcbiAgICAgICAgd2lkdGg6IGAke1RJTllfQkFSX0JPWF9TSVpFX1BYfXB4YCxcbiAgICAgIH07XG4gICAgY2FzZSAndGlueSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBgbWluKCR7Z2VvbWV0cnkubGVmdFBjdH0lLCBjYWxjKDEwMCUgLSAke1RJTllfQkFSX1dJRFRIX1BYfXB4KSlgLFxuICAgICAgICB3aWR0aDogYCR7VElOWV9CQVJfV0lEVEhfUFh9cHhgLFxuICAgICAgfTtcbiAgICBjYXNlICdmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGAke2dlb21ldHJ5LmxlZnRQY3R9JWAsXG4gICAgICAgIHdpZHRoOiBgbWF4KCR7Z2VvbWV0cnkud2lkdGhQY3R9JSwgNHB4KWAsXG4gICAgICB9O1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VnbWVudCBwcm9qZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFZpc2libGVTZWdtZW50IHtcbiAgc3RhdHVzOiBTZWdtZW50U3RhdHVzO1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIHBpeGVsV2lkdGg6IG51bWJlcjtcbiAgZnVsbER1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IHN0YXR1cyBzZWdtZW50cyBvbnRvIHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgYSBiYXIuIFNlZ21lbnRzIGZ1bGx5XG4gKiBvdXRzaWRlIHRoZSB2aXNpYmxlIHdpbmRvdyBhcmUgZHJvcHBlZDsgc2VnbWVudHMgY3Jvc3NpbmcgdGhlIGVkZ2UgYXJlXG4gKiBjbGlwcGVkIHRvIFswJSwgMTAwJV0gb2YgdGhlIHZpc2libGUgYmFyLlxuICovXG5mdW5jdGlvbiBwcm9qZWN0U2VnbWVudHMoXG4gIHNlZ21lbnRzOiBTZWdtZW50W10sXG4gIHNwYW5TdGFydE1zOiBudW1iZXIsXG4gIHNwYW5EdXJhdGlvbk1zOiBudW1iZXIsXG4gIGdlb21ldHJ5OiBCYXJHZW9tZXRyeVxuKTogVmlzaWJsZVNlZ21lbnRbXSB7XG4gIGNvbnN0IHZpc2libGVEdXJhdGlvbk1zID0gZ2VvbWV0cnkudmlzaWJsZUVuZE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXM7XG4gIGlmICh2aXNpYmxlRHVyYXRpb25NcyA8PSAwKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHNlZ21lbnRzLmZsYXRNYXAoKHNlZykgPT4ge1xuICAgIGNvbnN0IHNlZ1N0YXJ0TXMgPSBzcGFuU3RhcnRNcyArIHNlZy5zdGFydEZyYWN0aW9uICogc3BhbkR1cmF0aW9uTXM7XG4gICAgY29uc3Qgc2VnRW5kTXMgPSBzcGFuU3RhcnRNcyArIHNlZy5lbmRGcmFjdGlvbiAqIHNwYW5EdXJhdGlvbk1zO1xuICAgIGNvbnN0IHN0YXJ0TXMgPSBNYXRoLm1heChzZWdTdGFydE1zLCBnZW9tZXRyeS52aXNpYmxlU3RhcnRNcyk7XG4gICAgY29uc3QgZW5kTXMgPSBNYXRoLm1pbihzZWdFbmRNcywgZ2VvbWV0cnkudmlzaWJsZUVuZE1zKTtcbiAgICBpZiAoZW5kTXMgPD0gc3RhcnRNcykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgd2lkdGhGcmFjID0gKGVuZE1zIC0gc3RhcnRNcykgLyB2aXNpYmxlRHVyYXRpb25NcztcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzdGF0dXM6IHNlZy5zdGF0dXMsXG4gICAgICAgIGxlZnRQY3Q6XG4gICAgICAgICAgKChzdGFydE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMpIC8gdmlzaWJsZUR1cmF0aW9uTXMpICogMTAwLFxuICAgICAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgICAgICBwaXhlbFdpZHRoOiB3aWR0aEZyYWMgKiBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aCxcbiAgICAgICAgZnVsbER1cmF0aW9uTXM6IChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb25NcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU21hbGwgcmVuZGVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBEdXJhdGlvbkxhYmVsKHsgbGFiZWwgfTogeyBsYWJlbDogc3RyaW5nIH0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IG92ZXJmbG93LWhpZGRlbiBweC0xIHRleHQtWzEwcHhdIGZvbnQtbW9ubyBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmUgd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1sZWZ0IHRleHQtZ3JheS0xMDAwIHRhYnVsYXItbnVtcyBvcGFjaXR5LTAgZ3JvdXAtaG92ZXIvdGltZWxpbmUtcm93Om9wYWNpdHktMTAwXCI+XG4gICAgICB7bGFiZWx9XG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBCb3VuZGFyeUFycm93KHtcbiAgZGlyZWN0aW9uLFxufToge1xuICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgSWNvbiA9IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IEFycm93UmlnaHQgOiBBcnJvd0xlZnQ7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzAuMjVyZW1dXCI+XG4gICAgICA8SWNvbiBjbGFzc05hbWU9XCJzaXplLTMgdGV4dC1ncmF5LTkwMFwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFBsYWluQmFyKHtcbiAgYmcsXG4gIGJvcmRlcixcbiAgbGFiZWwsXG59OiB7XG4gIGJnOiBzdHJpbmc7XG4gIGJvcmRlcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGwgbWluLXctMSByb3VuZGVkLVswLjI1cmVtXSBib3JkZXJcIlxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogYmcsIGJvcmRlckNvbG9yOiBib3JkZXIgfX1cbiAgICA+XG4gICAgICB7bGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gTGVhZEluQ29ubmVjdG9yKHtcbiAgbGVmdFBjdCxcbiAgd2lkdGhQY3QsXG4gIGxhYmVsLFxufToge1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTYgLXRyYW5zbGF0ZS15LTEvMlwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBsZWZ0OiBgY2FsYygke2xlZnRQY3R9JSArIDAuNXB4KWAsXG4gICAgICAgIHdpZHRoOiBgY2FsYygke3dpZHRoUGN0fSUgLSAxcHgpYCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTEvMiBoLTQgdy1weCAtdHJhbnNsYXRlLXktMS8yIGJnLWdyYXktNTAwXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteC0wIHRvcC0xLzIgaC1weCAtdHJhbnNsYXRlLXktMS8yIGJnLWdyYXktNTAwXCIgLz5cbiAgICAgIHtsYWJlbCA/IDxEdXJhdGlvbkxhYmVsIGxhYmVsPXtsYWJlbH0gLz4gOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBTZWdtZW50QmFyKHsgc2VnbWVudHMgfTogeyBzZWdtZW50czogVmlzaWJsZVNlZ21lbnRbXSB9KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGxcIj5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBpZiAoc2VnLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgICBjb25zdCBsZWFkSW5MYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAgIGNvbnN0IHNob3dMZWFkSW5MYWJlbCA9XG4gICAgICAgICAgICBzZWcucGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgbGVhZEluTGFiZWwubGVuZ3RoICogNiArIDEyKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPExlYWRJbkNvbm5lY3RvclxuICAgICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICAgIGxlZnRQY3Q9e3NlZy5sZWZ0UGN0fVxuICAgICAgICAgICAgICB3aWR0aFBjdD17c2VnLndpZHRoUGN0fVxuICAgICAgICAgICAgICBsYWJlbD17c2hvd0xlYWRJbkxhYmVsID8gbGVhZEluTGFiZWwgOiBudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBmb3JtYXREdXJhdGlvblByZWNpc2Uoc2VnLmZ1bGxEdXJhdGlvbk1zKTtcbiAgICAgICAgLy8gT25seSByZW5kZXIgdGhlIGxhYmVsIHdoZW4gdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgaXQgd2l0aG91dCBjbGlwcGluZy5cbiAgICAgICAgY29uc3Qgc2hvd0xhYmVsID0gc2VnLnBpeGVsV2lkdGggPj0gTWF0aC5tYXgoNDAsIGxhYmVsLmxlbmd0aCAqIDYgKyAxMik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnYWJzb2x1dGUgaC1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVswLjI1cmVtXScsXG4gICAgICAgICAgICAgIFNFR01FTlRfQ0xBU1NFU1tzZWcuc3RhdHVzXVxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC8vIDFweCBnYXAgYmV0d2VlbiBhZGphY2VudCBzZWdtZW50cywgZGlzdHJpYnV0ZWQgZXF1YWxseS5cbiAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtzZWcubGVmdFBjdH0lICsgMC41cHgpYCxcbiAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKCR7c2VnLndpZHRoUGN0fSUgLSAxcHgpYCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IDEsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtBQ1RJVkVfU0VHTUVOVF9TVEFUVVNFUy5oYXMoc2VnLnN0YXR1cykgPyAoXG4gICAgICAgICAgICAgIDxSdW5uaW5nU3RyaXBlcyAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7c2hvd0xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBtYXJrZXJzIChhdHRyX3NldClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBmb3JtYXRNYXJrZXJUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gKFxuICAgIGRhdGUudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1VUycsIHtcbiAgICAgIGhvdXI6ICcyLWRpZ2l0JyxcbiAgICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgICAgc2Vjb25kOiAnMi1kaWdpdCcsXG4gICAgICBob3VyMTI6IGZhbHNlLFxuICAgIH0pICtcbiAgICAnLicgK1xuICAgIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgzLCAnMCcpXG4gICk7XG59XG5cbi8qKlxuICogRGlhbW9uZCBtYXJrZXJzIGZvciBgYXR0cl9zZXRgIGV2ZW50cyBvbiBhIHNwYW4ncyB0aW1lbGluZSByb3cuIEF0dHJpYnV0ZVxuICogY2hhbmdlcyBhcmUgcG9pbnQtaW4tdGltZSBldmVudHMgd2l0aCBubyBkdXJhdGlvbiwgc28gdGhleSBkb24ndCBnZXQgYVxuICogc3RhdHVzIHNlZ21lbnQg4oCUIGluc3RlYWQgdGhleSByZW5kZXIgYXMgc21hbGwgdGVhbCBkaWFtb25kcyBhdCB0aGUgbW9tZW50XG4gKiB0aGUgYXR0cmlidXRlcyB3ZXJlIHdyaXR0ZW4uXG4gKi9cbmZ1bmN0aW9uIEF0dHJTZXRNYXJrZXJzKHtcbiAgc3BhbixcbiAgdmlld1N0YXJ0LFxuICB2aWV3RHVyYXRpb24sXG59OiB7XG4gIHNwYW46IFNwYW47XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RHVyYXRpb246IG51bWJlcjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBtYXJrZXJzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzcGFuLmV2ZW50cy5maWx0ZXIoKGUpID0+IGUubmFtZSA9PT0gJ2F0dHJfc2V0JyksXG4gICAgW3NwYW4uZXZlbnRzXVxuICApO1xuXG4gIGlmIChtYXJrZXJzLmxlbmd0aCA9PT0gMCB8fCB2aWV3RHVyYXRpb24gPD0gMCkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge21hcmtlcnMubWFwKChldmVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdGltZU1zID0gZ2V0SGlnaFJlc0luTXMoZXZlbnQudGltZXN0YW1wKTtcbiAgICAgICAgY29uc3QgZnJhYyA9ICh0aW1lTXMgLSB2aWV3U3RhcnQpIC8gdmlld0R1cmF0aW9uO1xuICAgICAgICBpZiAoZnJhYyA8IDAgfHwgZnJhYyA+IDEpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFRvb2x0aXAga2V5PXtgYXR0ci1zZXQtJHtpbmRleH1gfT5cbiAgICAgICAgICAgIDxUb29sdGlwVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkF0dHJpYnV0ZXMgc2V0XCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIHotMTAgZmxleCBoLTQgdy00IC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMiBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2ZyYWMgKiAxMDB9JWAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMiB3LTIgcm90YXRlLTQ1IHJvdW5kZWQtWzFweF0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLXRlYWwtNDAwKScsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtdGVhbC05MDApJyxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAgPFRvb2x0aXBDb250ZW50PlxuICAgICAgICAgICAgICBBdHRyaWJ1dGVzIHNldCDCtyB7Zm9ybWF0TWFya2VyVGltZSh0aW1lTXMpfVxuICAgICAgICAgICAgPC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8Lz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZUJhclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRpbWVsaW5lQmFyID0gbWVtbyhmdW5jdGlvbiBUaW1lbGluZUJhcih7XG4gIHNwYW4sXG4gIHZpZXdTdGFydCxcbiAgdmlld0R1cmF0aW9uLFxuICBjb250YWluZXJXaWR0aCxcbiAgaXNTZWxlY3RlZCxcbiAgaXNEaW1tZWQsXG4gIG9uU2VsZWN0LFxufToge1xuICBzcGFuOiBTcGFuO1xuICB2aWV3U3RhcnQ6IG51bWJlcjtcbiAgdmlld0R1cmF0aW9uOiBudW1iZXI7XG4gIGNvbnRhaW5lcldpZHRoOiBudW1iZXI7XG4gIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGlzRGltbWVkPzogYm9vbGVhbjtcbiAgb25TZWxlY3Q6IChzcGFuSWQ6IHN0cmluZykgPT4gdm9pZDtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gIGNvbnN0IHRvdGFsRHVyYXRpb25NcyA9IGdldFNwYW5EdXJhdGlvbk1zKHNwYW4pO1xuXG4gIGNvbnN0IGdlb21ldHJ5ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgY29tcHV0ZUJhckdlb21ldHJ5KFxuICAgICAgICBzdGFydE1zLFxuICAgICAgICBlbmRNcyxcbiAgICAgICAgdmlld1N0YXJ0LFxuICAgICAgICB2aWV3U3RhcnQgKyB2aWV3RHVyYXRpb24sXG4gICAgICAgIGNvbnRhaW5lcldpZHRoXG4gICAgICApLFxuICAgIFtzdGFydE1zLCBlbmRNcywgdmlld1N0YXJ0LCB2aWV3RHVyYXRpb24sIGNvbnRhaW5lcldpZHRoXVxuICApO1xuXG4gIGNvbnN0IGJhc2VTZWdtZW50cyA9IHVzZU1lbW8oKCkgPT4gY29tcHV0ZVNwYW5TZWdtZW50cyhzcGFuKSwgW3NwYW5dKTtcbiAgY29uc3Qgc2VnbWVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICdmdWxsJ1xuICAgICAgICA/IHByb2plY3RTZWdtZW50cyhiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25NcywgZ2VvbWV0cnkpXG4gICAgICAgIDogW10sXG4gICAgW2dlb21ldHJ5LCBiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25Nc11cbiAgKTtcblxuICBjb25zdCB3b3JrZmxvd1N0YXR1cyA9IChzcGFuLmF0dHJpYnV0ZXMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGlzRXJyb3JlZCA9IHNwYW4uc3RhdHVzLmNvZGUgPT09IDIgfHwgd29ya2Zsb3dTdGF0dXMgPT09ICdmYWlsZWQnO1xuICBjb25zdCBjb2xvcnMgPSBnZXRSZXNvdXJjZUNvbG9yKHNwYW4ucmVzb3VyY2UpO1xuICBjb25zdCBmYWxsYmFja0JnID0gaXNFcnJvcmVkXG4gICAgPyAoY29sb3JzLmVycm9yQmcgPz8gJ3ZhcigtLWRzLXJlZC0yMDApJylcbiAgICA6IGNvbG9ycy5iZztcbiAgY29uc3QgZmFsbGJhY2tCb3JkZXIgPSBpc0Vycm9yZWRcbiAgICA/IChjb2xvcnMuZXJyb3JCb3JkZXIgPz8gJ3ZhcigtLWRzLXJlZC01MDApJylcbiAgICA6IGNvbG9ycy5ib3JkZXI7XG5cbiAgY29uc3QgdG90YWxMYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZSh0b3RhbER1cmF0aW9uTXMpO1xuICBjb25zdCBzaG93VG90YWxMYWJlbCA9XG4gICAgZ2VvbWV0cnkudmlzaWJsZVBpeGVsV2lkdGggPj0gTWF0aC5tYXgoNDAsIHRvdGFsTGFiZWwubGVuZ3RoICogNiArIDEyKTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvblNlbGVjdChzcGFuLnNwYW5JZCk7XG4gIH0sIFtvblNlbGVjdCwgc3Bhbi5zcGFuSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICBhcmlhLXNlbGVjdGVkPXtpc1NlbGVjdGVkfVxuICAgICAgYXJpYS1leHBhbmRlZD17aXNTZWxlY3RlZH1cbiAgICAgIGFyaWEtbGV2ZWw9ezF9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZ3JvdXAvdGltZWxpbmUtcm93IGgtMTAgcmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIgaG92ZXI6YmctZ3JheS0xMDAgYXJpYS1zZWxlY3RlZDpiZy1ncmF5LTEwMCBhcmlhLXNlbGVjdGVkOmhvdmVyOmJnLWdyYXktMjAwIHRyYW5zaXRpb24tb3BhY2l0eScsXG4gICAgICAgIGlzRGltbWVkICYmICdvcGFjaXR5LTM1J1xuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wXCIgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgaC02IC10cmFuc2xhdGUteS0xLzIgcm91bmRlZC1bMC4yNXJlbV1cIlxuICAgICAgICAgIHN0eWxlPXtnZXRCYXJQb3NpdGlvblN0eWxlKGdlb21ldHJ5KX1cbiAgICAgICAgPlxuICAgICAgICAgIHtnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICdhcnJvdycgPyAoXG4gICAgICAgICAgICA8Qm91bmRhcnlBcnJvdyBkaXJlY3Rpb249e2dlb21ldHJ5Lm1vZGUuZGlyZWN0aW9ufSAvPlxuICAgICAgICAgICkgOiBnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICd0aW55JyA/IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC02IHJvdW5kZWQtWzAuMjVyZW1dIGJvcmRlclwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGZhbGxiYWNrQmcsIGJvcmRlckNvbG9yOiBmYWxsYmFja0JvcmRlciB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogc2VnbWVudHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgIDxTZWdtZW50QmFyIHNlZ21lbnRzPXtzZWdtZW50c30gLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFBsYWluQmFyXG4gICAgICAgICAgICAgIGJnPXtmYWxsYmFja0JnfVxuICAgICAgICAgICAgICBib3JkZXI9e2ZhbGxiYWNrQm9yZGVyfVxuICAgICAgICAgICAgICBsYWJlbD17c2hvd1RvdGFsTGFiZWwgPyB0b3RhbExhYmVsIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxBdHRyU2V0TWFya2Vyc1xuICAgICAgICAgIHNwYW49e3NwYW59XG4gICAgICAgICAgdmlld1N0YXJ0PXt2aWV3U3RhcnR9XG4gICAgICAgICAgdmlld0R1cmF0aW9uPXt2aWV3RHVyYXRpb259XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuXG5leHBvcnQgeyBUaW1lbGluZUJhciB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbHRhSW5kaWNhdG9yIChBbHQta2V5IGdhcCBvdmVybGF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFTFRBX0NBUF9IRUlHSFRfUFggPSA4O1xuLy8gVmVydGljYWwgb2Zmc2V0IHRvIHNpdCB0aGUgaW5kaWNhdG9yIGluc2lkZSB0aGUgZ2FwIGJldHdlZW4gcm93IE4gYW5kIE4rMSxcbi8vIGFsaWduZWQgd2l0aCB3aGVyZSB0aGUgYmFyIHN0YXJ0cyBpbiB0aGUgbmV4dCByb3cgKHJvd3MgY2VudGVyIGEgMjRweCBiYXJcbi8vIGluc2lkZSA0MHB4LCBzbyBiYXJzIHN0YXJ0IH44cHggZnJvbSB0aGUgdG9wIG9mIHRoZSByb3cpLlxuY29uc3QgREVMVEFfUk9XX09GRlNFVF9QWCA9IDg7XG5cbmNvbnN0IERlbHRhSW5kaWNhdG9yID0gbWVtbyhmdW5jdGlvbiBEZWx0YUluZGljYXRvcih7XG4gIGxlZnRGcmFjLFxuICByaWdodEZyYWMsXG4gIGxhYmVsLFxuICByb3dJbmRleCxcbn06IHtcbiAgbGVmdEZyYWM6IG51bWJlcjtcbiAgcmlnaHRGcmFjOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJvd0luZGV4OiBudW1iZXI7XG59KSB7XG4gIGNvbnN0IGNlbnRlclkgPSBERUxUQV9ST1dfT0ZGU0VUX1BYICsgKHJvd0luZGV4ICsgMSkgKiBST1dfSEVJR0hUX1BYO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBsZWZ0OiBgJHtsZWZ0RnJhYyAqIDEwMH0lYCxcbiAgICAgICAgd2lkdGg6IGAkeyhyaWdodEZyYWMgLSBsZWZ0RnJhYykgKiAxMDB9JWAsXG4gICAgICAgIHRvcDogY2VudGVyWSAtIERFTFRBX0NBUF9IRUlHSFRfUFggLyAyLFxuICAgICAgICBoZWlnaHQ6IERFTFRBX0NBUF9IRUlHSFRfUFgsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHctcHggaC1mdWxsIGJnLWFtYmVyLTgwMFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMCByaWdodC0wIHRvcC0xLzIgaC1weCBiZy1hbWJlci04MDBcIiAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0wIHctcHggaC1mdWxsIGJnLWFtYmVyLTgwMFwiIC8+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTEvMiB0b3AtMS8yIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LWxhYmVsLTEyIGxlYWRpbmctbm9uZSB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLXhzIHB4LTEgcHktMC41IHRleHQtZ3JheS0xMDAgYmctYW1iZXItODAwXCI+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lSGVhZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVsaW5lSGVhZGVyKHtcbiAgbWFya2VycyxcbiAgaG92ZXJJbmZvLFxufToge1xuICBtYXJrZXJzOiBUaW1lTWFya2VyW107XG4gIGhvdmVySW5mbz86IHsgZnJhY3Rpb246IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9IHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgYmctYmFja2dyb3VuZC0xMDAgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGgtMTAgbWluLWgtMTAgZmxleCBpdGVtcy1lbmQgcHgtNCBwYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBmbGV4LTFcIj5cbiAgICAgICAge21hcmtlcnMubWFwKChtKSA9PiAoXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT17U3RyaW5nKG0udmFsdWUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTEgZm9udC1tb25vIHRleHQteHMgZm9udC1ub3JtYWwgbGVhZGluZy00IHRleHQtZ3JheS05MDAgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bS5wb3NpdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHttLmxhYmVsfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKSl9XG4gICAgICAgIHtob3ZlckluZm8gJiYgKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMSBwb2ludGVyLWV2ZW50cy1ub25lIHotMTAgZm9udC1tb25vIHRleHQtWzExcHhdIGxlYWRpbmctNCB0ZXh0LWdyYXktMTAwMCB3aGl0ZXNwYWNlLW5vd3JhcCBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIHJvdW5kZWQgcHgtMSAtdHJhbnNsYXRlLXgtMS8yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVySW5mby5mcmFjdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtob3ZlckluZm8ubGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZWxpbmUoe1xuICBzcGFucyxcbiAgdmlld1N0YXJ0LFxuICB2aWV3RW5kLFxuICBtYXJrZXJzLFxuICBzZWxlY3RlZElkLFxuICBzZWFyY2hSZXN1bHQsXG4gIG9uU2VsZWN0LFxuICBob3ZlckZyYWN0aW9uLFxuICBhbHRIZWxkID0gZmFsc2UsXG59OiB7XG4gIHNwYW5zOiBTcGFuW107XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RW5kOiBudW1iZXI7XG4gIG1hcmtlcnM6IFRpbWVNYXJrZXJbXTtcbiAgc2VsZWN0ZWRJZDogc3RyaW5nIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTcGFuU2VhcmNoUmVzdWx0O1xuICBvblNlbGVjdDogKHNwYW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBob3ZlckZyYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbiAgYWx0SGVsZD86IGJvb2xlYW47XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgW2NvbnRhaW5lcldpZHRoLCBzZXRDb250YWluZXJXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3Qgdmlld0R1cmF0aW9uID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgY29uc3QgdGltZWxpbmVXaWR0aCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lcldpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDIpO1xuICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHVzZVJvd1dpbmRvdyhcbiAgICBjb250YWluZXJSZWYsXG4gICAgc3BhbnMubGVuZ3RoLFxuICAgIFJPV19IRUlHSFRfUFhcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKChbZW50cnldKSA9PiB7XG4gICAgICBzZXRDb250YWluZXJXaWR0aChlbnRyeS5jb250ZW50UmVjdC53aWR0aCk7XG4gICAgfSk7XG4gICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgcmV0dXJuICgpID0+IHJvLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdhcHMgPSB1c2VNZW1vKFxuICAgICgpID0+IGNvbXB1dGVTcGFuR2FwcyhzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kKSxcbiAgICBbc3BhbnMsIHZpZXdTdGFydCwgdmlld0VuZF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6IHNwYW5zLmxlbmd0aCAqIFJPV19IRUlHSFRfUFggfX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgPlxuICAgICAgICB7bWFya2Vycy5tYXAoKG1hcmtlcikgPT5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBcIjBzXCIgb3JpZ2luIG1hcmtlciBzaW5jZSB0aGUgbGVmdCBlZGdlIGFscmVhZHkgaW1wbGllcyBpdC5cbiAgICAgICAgICBNYXRoLmFicyhtYXJrZXIudmFsdWUpID4gMC4wMDAwMDEgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG1hcmtlci52YWx1ZSl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0wIGJvdHRvbS0wIHctcHggYmctZ3JheS1hbHBoYS0zMDBcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHttYXJrZXIucG9zaXRpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2hvdmVyRnJhY3Rpb24gIT0gbnVsbCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZSB6LTEwXCJcbiAgICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCB3LXB4IGJnLWdyYXktYWxwaGEtNTAwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVyRnJhY3Rpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8ZGl2IHN0eWxlPXt7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoJHtzdGFydCAqIFJPV19IRUlHSFRfUFh9cHgpYCB9fT5cbiAgICAgICAge3NwYW5zLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgoc3BhbikgPT4gKFxuICAgICAgICAgIDxUaW1lbGluZUJhclxuICAgICAgICAgICAga2V5PXtzcGFuLnNwYW5JZH1cbiAgICAgICAgICAgIHNwYW49e3NwYW59XG4gICAgICAgICAgICB2aWV3U3RhcnQ9e3ZpZXdTdGFydH1cbiAgICAgICAgICAgIHZpZXdEdXJhdGlvbj17dmlld0R1cmF0aW9ufVxuICAgICAgICAgICAgY29udGFpbmVyV2lkdGg9e3RpbWVsaW5lV2lkdGh9XG4gICAgICAgICAgICBpc1NlbGVjdGVkPXtzZWxlY3RlZElkID09PSBzcGFuLnNwYW5JZH1cbiAgICAgICAgICAgIGlzRGltbWVkPXtpc1NwYW5EaW1tZWRCeVNlYXJjaChzcGFuLnNwYW5JZCwgc2VhcmNoUmVzdWx0KX1cbiAgICAgICAgICAgIG9uU2VsZWN0PXtvblNlbGVjdH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2FsdEhlbGQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAge2dhcHMubWFwKChnYXApID0+IChcbiAgICAgICAgICAgIDxEZWx0YUluZGljYXRvclxuICAgICAgICAgICAgICBrZXk9e2dhcC5yb3dJbmRleH1cbiAgICAgICAgICAgICAgbGVmdEZyYWM9e2dhcC5sZWZ0RnJhY31cbiAgICAgICAgICAgICAgcmlnaHRGcmFjPXtnYXAucmlnaHRGcmFjfVxuICAgICAgICAgICAgICBsYWJlbD17Zm9ybWF0RHVyYXRpb24oZ2FwLmdhcE1zLCB0cnVlKX1cbiAgICAgICAgICAgICAgcm93SW5kZXg9e2dhcC5yb3dJbmRleH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
|
|
252
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdGltZWxpbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFDTCxjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGNBQWMsR0FDZixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBeUIsTUFBTSxXQUFXLENBQUM7QUFReEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixjQUFjLEdBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9ELDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGVBQWUsR0FBa0M7SUFDckQsTUFBTSxFQUFFLG9DQUFvQztJQUM1QyxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLE9BQU8sRUFBRSxvQ0FBb0M7SUFDN0MsT0FBTyxFQUFFLG9DQUFvQztJQUM3QyxTQUFTLEVBQUUsb0NBQW9DO0lBQy9DLE1BQU0sRUFBRSxrQ0FBa0M7SUFDMUMsU0FBUyxFQUFFLHNDQUFzQztJQUNqRCxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLFFBQVEsRUFBRSxvQ0FBb0M7Q0FDL0MsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQWtCO0lBQzFDLElBQUksRUFBRSxtQkFBbUI7SUFDekIsS0FBSyxFQUFFLG1CQUFtQjtDQUMzQixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBK0IsSUFBSSxHQUFHLENBQUM7SUFDbEUsU0FBUztJQUNULFVBQVU7Q0FDWCxDQUFDLENBQUM7QUFFSCxTQUFTLGNBQWM7SUFDckIsT0FBTyxtQ0FBaUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEdBQUksQ0FBQztBQUMvRCxDQUFDO0FBb0JEOzs7O0dBSUc7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixPQUFlLEVBQ2YsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixjQUFzQjtJQUV0QixNQUFNLFlBQVksR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sU0FBUyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0saUJBQWlCLEdBQUcsU0FBUyxHQUFHLGNBQWMsQ0FBQztJQUVyRCxNQUFNLE1BQU0sR0FBRyxjQUFjLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDO0lBQzlFLE1BQU0sY0FBYyxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0MsTUFBTSxlQUFlLEdBQUcsS0FBSyxHQUFHLE9BQU8sQ0FBQztJQUV4QyxNQUFNLElBQUksR0FDUixNQUFNLElBQUksQ0FBQyxjQUFjLElBQUksZUFBZSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUU7UUFDbEUsQ0FBQyxDQUFDLE1BQU07WUFDTixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUV6QixPQUFPO1FBQ0wsSUFBSTtRQUNKLE9BQU8sRUFDTCxZQUFZLEdBQUcsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxHQUFHLEdBQUc7WUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDUCxRQUFRLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDekIsY0FBYztRQUNkLFlBQVk7UUFDWixpQkFBaUI7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLFFBQXFCO0lBSWhELFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixLQUFLLE9BQU87WUFDVixPQUFPO2dCQUNMLElBQUksRUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPO29CQUNqQyxDQUFDLENBQUMsZUFBZSxvQkFBb0IsS0FBSztvQkFDMUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1gsS0FBSyxFQUFFLEdBQUcsb0JBQW9CLElBQUk7YUFDbkMsQ0FBQztRQUNKLEtBQUssTUFBTTtZQUNULE9BQU87Z0JBQ0wsSUFBSSxFQUFFLE9BQU8sUUFBUSxDQUFDLE9BQU8sa0JBQWtCLGlCQUFpQixNQUFNO2dCQUN0RSxLQUFLLEVBQUUsR0FBRyxpQkFBaUIsSUFBSTthQUNoQyxDQUFDO1FBQ0osS0FBSyxNQUFNO1lBQ1QsT0FBTztnQkFDTCxJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxHQUFHO2dCQUM1QixLQUFLLEVBQUUsT0FBTyxRQUFRLENBQUMsUUFBUSxTQUFTO2FBQ3pDLENBQUM7SUFDTixDQUFDO0FBQ0gsQ0FBQztBQWNEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FDdEIsUUFBbUIsRUFDbkIsV0FBbUIsRUFDbkIsY0FBc0IsRUFDdEIsUUFBcUI7SUFFckIsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7SUFDMUUsSUFBSSxpQkFBaUIsSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxVQUFVLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELElBQUksS0FBSyxJQUFJLE9BQU87WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVoQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztRQUN4RCxPQUFPO1lBQ0w7Z0JBQ0UsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dCQUNsQixPQUFPLEVBQ0wsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxHQUFHO2dCQUNqRSxRQUFRLEVBQUUsU0FBUyxHQUFHLEdBQUc7Z0JBQ3pCLFVBQVUsRUFBRSxTQUFTLEdBQUcsUUFBUSxDQUFDLGlCQUFpQjtnQkFDbEQsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsY0FBYzthQUN2RTtTQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsdUJBQXVCO0FBQ3ZCLDhFQUE4RTtBQUU5RSxTQUFTLGFBQWEsQ0FBQyxFQUNyQixLQUFLLEVBQ0wsU0FBUyxHQUlWO0lBQ0MsT0FBTyxDQUNMLGVBQ0UsU0FBUyxFQUFFLEVBQUUsQ0FDWCxpUEFBaVAsRUFDalAsU0FBUyxDQUNWLFlBRUEsS0FBSyxHQUNELENBQ1IsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxFQUNyQixTQUFTLEdBR1Y7SUFDQyxNQUFNLElBQUksR0FBRyxTQUFTLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM1RCxPQUFPLENBQ0wsY0FBSyxTQUFTLEVBQUMsNERBQTRELFlBQ3pFLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyxzQkFBc0IsR0FBRyxHQUNyQyxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsRUFDaEIsRUFBRSxFQUNGLE1BQU0sRUFDTixLQUFLLEdBS047SUFDQyxPQUFPLENBQ0wsY0FDRSxTQUFTLEVBQUMsc0RBQXNELEVBQ2hFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUU3QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUMsYUFBYSxJQUFDLEtBQUssRUFBRSxLQUFLLEdBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUMzQyxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsRUFDdkIsT0FBTyxFQUNQLFFBQVEsRUFDUixLQUFLLEdBS047SUFDQyxPQUFPLENBQ0wsZUFDRSxTQUFTLEVBQUMsdUNBQXVDLEVBQ2pELEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxRQUFRLE9BQU8sWUFBWTtZQUNqQyxLQUFLLEVBQUUsUUFBUSxRQUFRLFVBQVU7U0FDbEMsYUFFRCxjQUFLLFNBQVMsRUFBQywrREFBK0QsR0FBRyxFQUNqRixjQUFLLFNBQVMsRUFBQyw4REFBOEQsR0FBRyxFQUMvRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUMsYUFBYSxJQUFDLEtBQUssRUFBRSxLQUFLLEdBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUMzQyxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsRUFDbEIsUUFBUSxFQUNSLFVBQVUsR0FBRyxJQUFJLEdBU2xCO0lBQ0MsT0FBTyxDQUNMLGNBQUssU0FBUyxFQUFDLHFCQUFxQixZQUNqQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLGVBQWUsR0FDbkIsVUFBVTtvQkFDVixHQUFHLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxPQUFPLENBQ0wsTUFBQyxRQUFRLGVBQ1AsS0FBQyxlQUFlLElBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQ3BCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUN0QixLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksR0FDM0MsRUFDRCxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FDbkIsY0FDRSxTQUFTLEVBQUMsd0RBQXdELEVBQ2xFLEtBQUssRUFBRTtnQ0FDTCxJQUFJLEVBQUUsUUFBUSxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLFlBQVk7NkJBQ3JELEdBQ0QsQ0FDSCxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBYkssQ0FBQyxDQWNMLENBQ1osQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEQsMEVBQTBFO1lBQzFFLE1BQU0sU0FBUyxHQUNiLFVBQVUsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBRXRFLE9BQU8sQ0FDTCxlQUVFLFNBQVMsRUFBRSxFQUFFLENBQ1gsbURBQW1ELEVBQ25ELGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQzVCLEVBQ0QsS0FBSyxFQUFFO29CQUNMLDBEQUEwRDtvQkFDMUQsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDLE9BQU8sWUFBWTtvQkFDckMsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLFFBQVEsVUFBVTtvQkFDckMsUUFBUSxFQUFFLENBQUM7aUJBQ1osYUFFQSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN6QyxLQUFDLGNBQWMsS0FBRyxDQUNuQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ1AsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFDLGFBQWEsSUFBQyxLQUFLLEVBQUUsS0FBSyxHQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FmOUMsQ0FBQyxDQWdCRixDQUNQLENBQUM7UUFDSixDQUFDLENBQUMsR0FDRSxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLGNBQWM7QUFDZCw4RUFBOEU7QUFFOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsV0FBVyxDQUFDLEVBQzVDLElBQUksRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGNBQWMsRUFDZCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsRUFDUixZQUFZLEdBVWI7SUFDQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUN0QixHQUFHLEVBQUUsQ0FDSCxrQkFBa0IsQ0FDaEIsT0FBTyxFQUNQLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUFHLFlBQVksRUFDeEIsY0FBYyxDQUNmLEVBQ0gsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQzFELENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FDdEIsR0FBRyxFQUFFLENBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTTtRQUMzQixDQUFDLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQztRQUNuRSxDQUFDLENBQUMsRUFBRSxFQUNSLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQ25ELENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FDckIsR0FBRyxFQUFFLENBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTTtRQUMzQixDQUFDLENBQUMsb0JBQW9CLENBQ2xCLGNBQWMsQ0FDWixXQUFXLEVBQ1gsUUFBUSxDQUFDLGNBQWMsRUFDdkIsUUFBUSxDQUFDLFlBQVksQ0FDdEIsRUFDRCxRQUFRLENBQUMsaUJBQWlCLENBQzNCO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsRUFDUixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FDeEIsQ0FBQztJQUVGLDhFQUE4RTtJQUM5RSw4REFBOEQ7SUFDOUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUN2QixHQUFHLEVBQUUsQ0FDSCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO1FBQzNCLENBQUMsQ0FBQyx1QkFBdUIsQ0FDckIsV0FBVyxFQUNYLFFBQVEsQ0FBQyxjQUFjLEVBQ3ZCLFFBQVEsQ0FBQyxZQUFZLENBQ3RCO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQ2pDLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUN4QixDQUFDO0lBRUYsNEVBQTRFO0lBQzVFLDZDQUE2QztJQUM3QyxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztJQUU1RSxNQUFNLGNBQWMsR0FBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQWdDO1FBQ3RFLEVBQUUsTUFBNEIsQ0FBQztJQUNqQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksY0FBYyxLQUFLLFFBQVEsQ0FBQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsTUFBTSxVQUFVLEdBQUcsU0FBUztRQUMxQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLG1CQUFtQixDQUFDO1FBQ3pDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ2QsTUFBTSxjQUFjLEdBQUcsU0FBUztRQUM5QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLG1CQUFtQixDQUFDO1FBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRWxCLE1BQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFELE1BQU0sY0FBYyxHQUNsQixRQUFRLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFekUsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNuQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPLENBQ0wsY0FDRSxJQUFJLEVBQUMsVUFBVSxtQkFDQSxVQUFVLG1CQUNWLFVBQVUsZ0JBQ2IsQ0FBQyxFQUNiLFNBQVMsRUFBRSxFQUFFLENBQ1gsbUpBQW1KLEVBQ25KLFFBQVEsSUFBSSxZQUFZLENBQ3pCLEVBQ0QsT0FBTyxFQUFFLFdBQVcsWUFFcEIsZUFBSyxTQUFTLEVBQUMsb0JBQW9CLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixhQUM3RCxjQUNFLFNBQVMsRUFBQyx5RUFBeUUsRUFDbkYsS0FBSyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxZQUVuQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQ2hDLEtBQUMsYUFBYSxJQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBSSxDQUN0RCxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ2xDLGNBQ0UsU0FBUyxFQUFDLDhCQUE4QixFQUN4QyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsR0FDOUQsQ0FDSCxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEIsS0FBQyxVQUFVLElBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxVQUFVLEdBQUksQ0FDNUQsQ0FBQyxDQUFDLENBQUMsQ0FDRixLQUFDLFFBQVEsSUFDUCxFQUFFLEVBQUUsVUFBVSxFQUNkLE1BQU0sRUFBRSxjQUFjLEVBQ3RCLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUN6QyxDQUNILEdBQ0csRUFFTCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ1osZUFDRSxTQUFTLEVBQUMsMkRBQTJELEVBQ3JFLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsYUFFbkMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUMsV0FBVyxJQUFDLE9BQU8sRUFBRSxPQUFPLEdBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUM3RCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNoQixLQUFDLHdCQUF3QixJQUN2QixTQUFTLEVBQUMsTUFBTSxFQUNoQixLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQzNCLFFBQVEsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDbEMsUUFBUSxFQUFFLFlBQVksR0FDdEIsQ0FDSCxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQ1AsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDakIsS0FBQyx3QkFBd0IsSUFDdkIsU0FBUyxFQUFDLE9BQU8sRUFDakIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUM1QixRQUFRLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQ25DLFFBQVEsRUFBRSxZQUFZLEdBQ3RCLENBQ0gsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUNQLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FDaEIsS0FBQyxhQUFhLElBQ1osS0FBSyxFQUFFLFVBQVU7NEJBQ2pCLDhEQUE4RDs0QkFDOUQsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUMvQyxDQUNILENBQUMsQ0FBQyxDQUFDLElBQUksSUFDSixDQUNQLENBQUMsQ0FBQyxDQUFDLElBQUksSUFDSixHQUNGLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0FBRXZCLDhFQUE4RTtBQUM5RSx1Q0FBdUM7QUFDdkMsOEVBQThFO0FBRTlFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsNERBQTREO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTlCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLGNBQWMsQ0FBQyxFQUNsRCxRQUFRLEVBQ1IsU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEdBTVQ7SUFDQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7SUFFckUsT0FBTyxDQUNMLGVBQ0UsU0FBUyxFQUFDLDhCQUE4QixFQUN4QyxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHO1lBQzFCLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRztZQUN6QyxHQUFHLEVBQUUsT0FBTyxHQUFHLG1CQUFtQixHQUFHLENBQUM7WUFDdEMsTUFBTSxFQUFFLG1CQUFtQjtTQUM1QixhQUVELGNBQUssU0FBUyxFQUFDLGdEQUFnRCxHQUFHLEVBQ2xFLGNBQUssU0FBUyxFQUFDLG1EQUFtRCxHQUFHLEVBQ3JFLGNBQUssU0FBUyxFQUFDLGlEQUFpRCxHQUFHLEVBQ25FLGVBQU0sU0FBUyxFQUFDLDRKQUE0SixZQUN6SyxLQUFLLEdBQ0QsSUFDSCxDQUNQLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQUVILDhFQUE4RTtBQUM5RSxpQkFBaUI7QUFDakIsOEVBQThFO0FBRTlFLE1BQU0sVUFBVSxjQUFjLENBQUMsRUFDN0IsT0FBTyxFQUNQLFNBQVMsR0FJVjtJQUNDLE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyxrR0FBa0csWUFDL0csZUFBSyxTQUFTLEVBQUMsd0JBQXdCLGFBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2xCLGVBRUUsU0FBUyxFQUFDLDJGQUEyRixFQUNyRyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxFQUFFLFlBRXRDLENBQUMsQ0FBQyxLQUFLLElBSkgsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FLZixDQUNSLENBQUMsRUFDRCxTQUFTLElBQUksQ0FDWixlQUNFLFNBQVMsRUFBQyx1TEFBdUwsRUFDak0sS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsRUFBRSxZQUU5QyxTQUFTLENBQUMsS0FBSyxHQUNYLENBQ1IsSUFDRyxHQUNGLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsV0FBVztBQUNYLDhFQUE4RTtBQUU5RSxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQ3ZCLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBQ1osYUFBYSxFQUNiLE9BQU8sR0FBRyxLQUFLLEdBWWhCO0lBQ0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sWUFBWSxHQUFHLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDekMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsY0FBYyxHQUFHLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUNqQyxZQUFZLEVBQ1osS0FBSyxDQUFDLE1BQU0sRUFDWixhQUFhLENBQ2QsQ0FBQztJQUVGLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQixNQUFNLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNmLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQy9CLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FDbEIsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQ2hELENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FDNUIsQ0FBQztJQUVGLE9BQU8sQ0FDTCxlQUNFLEdBQUcsRUFBRSxZQUFZLEVBQ2pCLFNBQVMsRUFBQyxpQ0FBaUMsRUFDM0MsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxFQUFFLGFBRWxELG1DQUVFLFNBQVMsRUFBQyx3Q0FBd0MsRUFDbEQsS0FBSyxFQUFFLG9CQUFvQixZQUUxQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ3RCLHNFQUFzRTtnQkFDdEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUNsQyxjQUVFLFNBQVMsRUFBQyxnREFBZ0QsRUFDMUQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUZ2QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUd6QixDQUNILENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDVCxHQUNHLEVBQ0wsYUFBYSxJQUFJLElBQUksSUFBSSxDQUN4QixjQUNFLFNBQVMsRUFBQyw2Q0FBNkMsRUFDdkQsS0FBSyxFQUFFLG9CQUFvQixZQUUzQixjQUNFLFNBQVMsRUFBQyxnREFBZ0QsRUFDMUQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQzFDLEdBQ0UsQ0FDUCxFQUNELGNBQUssS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLGNBQWMsS0FBSyxHQUFHLGFBQWEsS0FBSyxFQUFFLFlBQ2hFLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDckMsS0FBQyxXQUFXLElBRVYsSUFBSSxFQUFFLElBQUksRUFDVixTQUFTLEVBQUUsU0FBUyxFQUNwQixZQUFZLEVBQUUsWUFBWSxFQUMxQixjQUFjLEVBQUUsYUFBYSxFQUM3QixVQUFVLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQ3RDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUN6RCxRQUFRLEVBQUUsUUFBUSxFQUNsQixZQUFZLEVBQUUsWUFBWSxJQVJyQixJQUFJLENBQUMsTUFBTSxDQVNoQixDQUNILENBQUMsR0FDRSxFQUNMLE9BQU8sSUFBSSxDQUNWLG1DQUVFLFNBQVMsRUFBQyx3Q0FBd0MsRUFDbEQsS0FBSyxFQUFFLG9CQUFvQixZQUUxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNqQixLQUFDLGNBQWMsSUFFYixRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFDdEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQ3hCLEtBQUssRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsRUFDdEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBSmpCLEdBQUcsQ0FBQyxRQUFRLENBS2pCLENBQ0gsQ0FBQyxHQUNFLENBQ1AsSUFDRyxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBBcnJvd0xlZnQsIEFycm93UmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGZvcm1hdER1cmF0aW9uUHJlY2lzZSxcbiAgZ2V0SGlnaFJlc0luTXMsXG59IGZyb20gJy4uLy4uL3RyYWNlLXZpZXdlci91dGlsL3RpbWluZyc7XG5pbXBvcnQgeyBpc1NwYW5EaW1tZWRCeVNlYXJjaCwgdHlwZSBTcGFuU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vc2VhcmNoJztcbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHtcbiAgT2Zmc2NyZWVuTWFya2VycyxcbiAgU2VnbWVudCxcbiAgU2VnbWVudFN0YXR1cyxcbiAgVGltZU1hcmtlcixcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZU9mZnNjcmVlbk1hcmtlcnMsXG4gIGNvbXB1dGVTcGFuR2FwcyxcbiAgY29tcHV0ZVNwYW5NYXJrZXJzLFxuICBjb21wdXRlU3BhblNlZ21lbnRzLFxuICBnZXRSZXNvdXJjZUNvbG9yLFxuICBnZXRTcGFuRHVyYXRpb25Ncyxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgY3VsbENvbGxpZGluZ01hcmtlcnMsXG4gIE1hcmtlckxheWVyLFxuICBPZmZzY3JlZW5NYXJrZXJJbmRpY2F0b3IsXG4gIHByb2plY3RNYXJrZXJzLFxufSBmcm9tICcuL3NwYW4tbWFya2Vycyc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vdGltZWxpbmUubW9kdWxlLmNzcyc7XG5pbXBvcnQgeyBST1dfSEVJR0hUX1BYLCB1c2VSb3dXaW5kb3cgfSBmcm9tICcuL3VzZS1yb3ctd2luZG93JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBUSU5ZX0JBUl9CT1hfU0laRV9QWCA9IDI0O1xuY29uc3QgVElOWV9CQVJfV0lEVEhfUFggPSA0O1xuZXhwb3J0IGNvbnN0IFRJTUVMSU5FX1BBRERJTkdfUFggPSAxNjtcblxuY29uc3QgU0VHTUVOVF9DTEFTU0VTOiBSZWNvcmQ8U2VnbWVudFN0YXR1cywgc3RyaW5nPiA9IHtcbiAgcXVldWVkOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJldHJ5aW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHdhaXRpbmc6ICdiZy1ncmF5LTIwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcnVubmluZzogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxuICBjb21wbGV0ZWQ6ICdiZy1ibHVlLTIwMCBib3JkZXIgYm9yZGVyLWJsdWUtNTAwJyxcbiAgZmFpbGVkOiAnYmctcmVkLTIwMCBib3JkZXIgYm9yZGVyLXJlZC01MDAnLFxuICBzdWNjZWVkZWQ6ICdiZy1ncmVlbi0yMDAgYm9yZGVyIGJvcmRlci1ncmVlbi01MDAnLFxuICBzbGVlcGluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICByZWNlaXZlZDogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxufTtcblxuY29uc3QgVElNRUxJTkVfSU5TRVRfU1RZTEU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGxlZnQ6IFRJTUVMSU5FX1BBRERJTkdfUFgsXG4gIHJpZ2h0OiBUSU1FTElORV9QQURESU5HX1BYLFxufTtcblxuY29uc3QgQUNUSVZFX1NFR01FTlRfU1RBVFVTRVM6IFJlYWRvbmx5U2V0PFNlZ21lbnRTdGF0dXM+ID0gbmV3IFNldChbXG4gICdydW5uaW5nJyxcbiAgJ3JlY2VpdmVkJyxcbl0pO1xuXG5mdW5jdGlvbiBSdW5uaW5nU3RyaXBlcygpOiBSZWFjdE5vZGUge1xuICByZXR1cm4gPGRpdiBhcmlhLWhpZGRlbiBjbGFzc05hbWU9e3N0eWxlcy5ydW5uaW5nU3RyaXBlc30gLz47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQmFyIGdlb21ldHJ5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBCYXJNb2RlID1cbiAgfCB7IGtpbmQ6ICdhcnJvdyc7IGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyB9XG4gIHwgeyBraW5kOiAndGlueScgfVxuICB8IHsga2luZDogJ2Z1bGwnIH07XG5cbmludGVyZmFjZSBCYXJHZW9tZXRyeSB7XG4gIG1vZGU6IEJhck1vZGU7XG4gIGxlZnRQY3Q6IG51bWJlcjtcbiAgd2lkdGhQY3Q6IG51bWJlcjtcbiAgdmlzaWJsZVN0YXJ0TXM6IG51bWJlcjtcbiAgdmlzaWJsZUVuZE1zOiBudW1iZXI7XG4gIHZpc2libGVQaXhlbFdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgYmFyJ3MgZ2VvbWV0cnkgaW5zaWRlIHRoZSB0aW1lbGluZSB2aWV3cG9ydC4gUGVyY2VudGFnZXMgYXJlXG4gKiBhbHdheXMgaW4gWzAsIDEwMF0gc28gd2UgbmV2ZXIgZW1pdCBDU1MgdmFsdWVzIHRoYXQgZXhjZWVkIGJyb3dzZXIgbGF5b3V0XG4gKiBsaW1pdHMgYXQgZXh0cmVtZSB6b29tLlxuICovXG5mdW5jdGlvbiBjb21wdXRlQmFyR2VvbWV0cnkoXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZW5kTXM6IG51bWJlcixcbiAgdmlld1N0YXJ0OiBudW1iZXIsXG4gIHZpZXdFbmQ6IG51bWJlcixcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlclxuKTogQmFyR2VvbWV0cnkge1xuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBjb25zdCB2aXNpYmxlU3RhcnRNcyA9IE1hdGgubWF4KHN0YXJ0TXMsIHZpZXdTdGFydCk7XG4gIGNvbnN0IHZpc2libGVFbmRNcyA9IE1hdGgubWluKGVuZE1zLCB2aWV3RW5kKTtcbiAgY29uc3QgdmlzaWJsZUR1cmF0aW9uTXMgPSBNYXRoLm1heCgwLCB2aXNpYmxlRW5kTXMgLSB2aXNpYmxlU3RhcnRNcyk7XG4gIGNvbnN0IHdpZHRoRnJhYyA9IHZpZXdEdXJhdGlvbiA+IDAgPyB2aXNpYmxlRHVyYXRpb25NcyAvIHZpZXdEdXJhdGlvbiA6IDA7XG4gIGNvbnN0IHZpc2libGVQaXhlbFdpZHRoID0gd2lkdGhGcmFjICogY29udGFpbmVyV2lkdGg7XG5cbiAgY29uc3QgaXNUaW55ID0gY29udGFpbmVyV2lkdGggPiAwICYmIHZpc2libGVQaXhlbFdpZHRoIDwgVElOWV9CQVJfQk9YX1NJWkVfUFg7XG4gIGNvbnN0IGV4dGVuZHNPZmZMZWZ0ID0gc3RhcnRNcyA8IHZpZXdTdGFydDtcbiAgY29uc3QgZXh0ZW5kc09mZlJpZ2h0ID0gZW5kTXMgPiB2aWV3RW5kO1xuXG4gIGNvbnN0IG1vZGU6IEJhck1vZGUgPVxuICAgIGlzVGlueSAmJiAoZXh0ZW5kc09mZkxlZnQgfHwgZXh0ZW5kc09mZlJpZ2h0KVxuICAgICAgPyB7IGtpbmQ6ICdhcnJvdycsIGRpcmVjdGlvbjogZXh0ZW5kc09mZlJpZ2h0ID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9XG4gICAgICA6IGlzVGlueVxuICAgICAgICA/IHsga2luZDogJ3RpbnknIH1cbiAgICAgICAgOiB7IGtpbmQ6ICdmdWxsJyB9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBsZWZ0UGN0OlxuICAgICAgdmlld0R1cmF0aW9uID4gMFxuICAgICAgICA/ICgodmlzaWJsZVN0YXJ0TXMgLSB2aWV3U3RhcnQpIC8gdmlld0R1cmF0aW9uKSAqIDEwMFxuICAgICAgICA6IDAsXG4gICAgd2lkdGhQY3Q6IHdpZHRoRnJhYyAqIDEwMCxcbiAgICB2aXNpYmxlU3RhcnRNcyxcbiAgICB2aXNpYmxlRW5kTXMsXG4gICAgdmlzaWJsZVBpeGVsV2lkdGgsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEJhclBvc2l0aW9uU3R5bGUoZ2VvbWV0cnk6IEJhckdlb21ldHJ5KToge1xuICBsZWZ0OiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG59IHtcbiAgc3dpdGNoIChnZW9tZXRyeS5tb2RlLmtpbmQpIHtcbiAgICBjYXNlICdhcnJvdyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OlxuICAgICAgICAgIGdlb21ldHJ5Lm1vZGUuZGlyZWN0aW9uID09PSAncmlnaHQnXG4gICAgICAgICAgICA/IGBjYWxjKDEwMCUgLSAke1RJTllfQkFSX0JPWF9TSVpFX1BYfXB4KWBcbiAgICAgICAgICAgIDogJzBweCcsXG4gICAgICAgIHdpZHRoOiBgJHtUSU5ZX0JBUl9CT1hfU0laRV9QWH1weGAsXG4gICAgICB9O1xuICAgIGNhc2UgJ3RpbnknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogYG1pbigke2dlb21ldHJ5LmxlZnRQY3R9JSwgY2FsYygxMDAlIC0gJHtUSU5ZX0JBUl9XSURUSF9QWH1weCkpYCxcbiAgICAgICAgd2lkdGg6IGAke1RJTllfQkFSX1dJRFRIX1BYfXB4YCxcbiAgICAgIH07XG4gICAgY2FzZSAnZnVsbCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBgJHtnZW9tZXRyeS5sZWZ0UGN0fSVgLFxuICAgICAgICB3aWR0aDogYG1heCgke2dlb21ldHJ5LndpZHRoUGN0fSUsIDRweClgLFxuICAgICAgfTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlZ21lbnQgcHJvamVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBWaXNpYmxlU2VnbWVudCB7XG4gIHN0YXR1czogU2VnbWVudFN0YXR1cztcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICBwaXhlbFdpZHRoOiBudW1iZXI7XG4gIGZ1bGxEdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvamVjdCBzdGF0dXMgc2VnbWVudHMgb250byB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIGEgYmFyLiBTZWdtZW50cyBmdWxseVxuICogb3V0c2lkZSB0aGUgdmlzaWJsZSB3aW5kb3cgYXJlIGRyb3BwZWQ7IHNlZ21lbnRzIGNyb3NzaW5nIHRoZSBlZGdlIGFyZVxuICogY2xpcHBlZCB0byBbMCUsIDEwMCVdIG9mIHRoZSB2aXNpYmxlIGJhci5cbiAqL1xuZnVuY3Rpb24gcHJvamVjdFNlZ21lbnRzKFxuICBzZWdtZW50czogU2VnbWVudFtdLFxuICBzcGFuU3RhcnRNczogbnVtYmVyLFxuICBzcGFuRHVyYXRpb25NczogbnVtYmVyLFxuICBnZW9tZXRyeTogQmFyR2VvbWV0cnlcbik6IFZpc2libGVTZWdtZW50W10ge1xuICBjb25zdCB2aXNpYmxlRHVyYXRpb25NcyA9IGdlb21ldHJ5LnZpc2libGVFbmRNcyAtIGdlb21ldHJ5LnZpc2libGVTdGFydE1zO1xuICBpZiAodmlzaWJsZUR1cmF0aW9uTXMgPD0gMCkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBzZWdtZW50cy5mbGF0TWFwKChzZWcpID0+IHtcbiAgICBjb25zdCBzZWdTdGFydE1zID0gc3BhblN0YXJ0TXMgKyBzZWcuc3RhcnRGcmFjdGlvbiAqIHNwYW5EdXJhdGlvbk1zO1xuICAgIGNvbnN0IHNlZ0VuZE1zID0gc3BhblN0YXJ0TXMgKyBzZWcuZW5kRnJhY3Rpb24gKiBzcGFuRHVyYXRpb25NcztcbiAgICBjb25zdCBzdGFydE1zID0gTWF0aC5tYXgoc2VnU3RhcnRNcywgZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMpO1xuICAgIGNvbnN0IGVuZE1zID0gTWF0aC5taW4oc2VnRW5kTXMsIGdlb21ldHJ5LnZpc2libGVFbmRNcyk7XG4gICAgaWYgKGVuZE1zIDw9IHN0YXJ0TXMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHdpZHRoRnJhYyA9IChlbmRNcyAtIHN0YXJ0TXMpIC8gdmlzaWJsZUR1cmF0aW9uTXM7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBzZWcuc3RhdHVzLFxuICAgICAgICBsZWZ0UGN0OlxuICAgICAgICAgICgoc3RhcnRNcyAtIGdlb21ldHJ5LnZpc2libGVTdGFydE1zKSAvIHZpc2libGVEdXJhdGlvbk1zKSAqIDEwMCxcbiAgICAgICAgd2lkdGhQY3Q6IHdpZHRoRnJhYyAqIDEwMCxcbiAgICAgICAgcGl4ZWxXaWR0aDogd2lkdGhGcmFjICogZ2VvbWV0cnkudmlzaWJsZVBpeGVsV2lkdGgsXG4gICAgICAgIGZ1bGxEdXJhdGlvbk1zOiAoc2VnLmVuZEZyYWN0aW9uIC0gc2VnLnN0YXJ0RnJhY3Rpb24pICogc3BhbkR1cmF0aW9uTXMsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNtYWxsIHJlbmRlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gRHVyYXRpb25MYWJlbCh7XG4gIGxhYmVsLFxuICBjbGFzc05hbWUsXG59OiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktc3RhcnQgb3ZlcmZsb3ctaGlkZGVuIHB4LTEgdGV4dC1bMTBweF0gZm9udC1tb25vIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWxlZnQgdGV4dC1ncmF5LTEwMDAgdGFidWxhci1udW1zIG9wYWNpdHktMCBncm91cC1ob3Zlci90aW1lbGluZS1yb3c6b3BhY2l0eS0xMDAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAge2xhYmVsfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gQm91bmRhcnlBcnJvdyh7XG4gIGRpcmVjdGlvbixcbn06IHtcbiAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IEljb24gPSBkaXJlY3Rpb24gPT09ICdyaWdodCcgPyBBcnJvd1JpZ2h0IDogQXJyb3dMZWZ0O1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVswLjI1cmVtXVwiPlxuICAgICAgPEljb24gY2xhc3NOYW1lPVwic2l6ZS0zIHRleHQtZ3JheS05MDBcIiAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBQbGFpbkJhcih7XG4gIGJnLFxuICBib3JkZXIsXG4gIGxhYmVsLFxufToge1xuICBiZzogc3RyaW5nO1xuICBib3JkZXI6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTYgdy1mdWxsIG1pbi13LTEgcm91bmRlZC1bMC4yNXJlbV0gYm9yZGVyXCJcbiAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGJnLCBib3JkZXJDb2xvcjogYm9yZGVyIH19XG4gICAgPlxuICAgICAge2xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIExlYWRJbkNvbm5lY3Rvcih7XG4gIGxlZnRQY3QsXG4gIHdpZHRoUGN0LFxuICBsYWJlbCxcbn06IHtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgaC02IC10cmFuc2xhdGUteS0xLzJcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgbGVmdDogYGNhbGMoJHtsZWZ0UGN0fSUgKyAwLjVweClgLFxuICAgICAgICB3aWR0aDogYGNhbGMoJHt3aWR0aFBjdH0lIC0gMXB4KWAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgaC00IHctcHggLXRyYW5zbGF0ZS15LTEvMiBiZy1ncmF5LTUwMFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXgtMCB0b3AtMS8yIGgtcHggLXRyYW5zbGF0ZS15LTEvMiBiZy1ncmF5LTUwMFwiIC8+XG4gICAgICB7bGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2VnbWVudEJhcih7XG4gIHNlZ21lbnRzLFxuICBzaG93TGFiZWxzID0gdHJ1ZSxcbn06IHtcbiAgc2VnbWVudHM6IFZpc2libGVTZWdtZW50W107XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBzZWdtZW50IGR1cmF0aW9uIGxhYmVscyBhcmUgc3VwcHJlc3NlZC4gVXNlZCB3aGVuIGEgc2VwYXJhdGVcbiAgICogdG9wIGxheWVyIChlLmcuIHRoZSByZXN1bXB0aW9uLW1hcmtlciBkdXJhdGlvbiBvdmVybGF5KSByZW5kZXJzIHRoZSBsYWJlbFxuICAgKiBhYm92ZSB0aGUgbWFya2VycyBpbnN0ZWFkLCBzbyB3ZSBkb24ndCBkcmF3IGl0IHR3aWNlLlxuICAgKi9cbiAgc2hvd0xhYmVscz86IGJvb2xlYW47XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGxcIj5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBpZiAoc2VnLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgICBjb25zdCBsZWFkSW5MYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAgIGNvbnN0IHNob3dMZWFkSW5MYWJlbCA9XG4gICAgICAgICAgICBzaG93TGFiZWxzICYmXG4gICAgICAgICAgICBzZWcucGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgbGVhZEluTGFiZWwubGVuZ3RoICogNiArIDEyKTtcbiAgICAgICAgICBjb25zdCBpc0Z1bGxXaWR0aFF1ZXVlZCA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17aX0+XG4gICAgICAgICAgICAgIDxMZWFkSW5Db25uZWN0b3JcbiAgICAgICAgICAgICAgICBsZWZ0UGN0PXtzZWcubGVmdFBjdH1cbiAgICAgICAgICAgICAgICB3aWR0aFBjdD17c2VnLndpZHRoUGN0fVxuICAgICAgICAgICAgICAgIGxhYmVsPXtzaG93TGVhZEluTGFiZWwgPyBsZWFkSW5MYWJlbCA6IG51bGx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIHtpc0Z1bGxXaWR0aFF1ZXVlZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGgtNCB3LXB4IC10cmFuc2xhdGUteS0xLzIgYmctZ3JheS01MDBcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtzZWcubGVmdFBjdCArIHNlZy53aWR0aFBjdH0lIC0gMS41cHgpYCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAvLyBPbmx5IHJlbmRlciB0aGUgbGFiZWwgd2hlbiB0aGVyZSdzIGVub3VnaCByb29tIGZvciBpdCB3aXRob3V0IGNsaXBwaW5nLlxuICAgICAgICBjb25zdCBzaG93TGFiZWwgPVxuICAgICAgICAgIHNob3dMYWJlbHMgJiYgc2VnLnBpeGVsV2lkdGggPj0gTWF0aC5tYXgoNDAsIGxhYmVsLmxlbmd0aCAqIDYgKyAxMik7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2l9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnYWJzb2x1dGUgaC1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVswLjI1cmVtXScsXG4gICAgICAgICAgICAgIFNFR01FTlRfQ0xBU1NFU1tzZWcuc3RhdHVzXVxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIC8vIDFweCBnYXAgYmV0d2VlbiBhZGphY2VudCBzZWdtZW50cywgZGlzdHJpYnV0ZWQgZXF1YWxseS5cbiAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtzZWcubGVmdFBjdH0lICsgMC41cHgpYCxcbiAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKCR7c2VnLndpZHRoUGN0fSUgLSAxcHgpYCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IDEsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtBQ1RJVkVfU0VHTUVOVF9TVEFUVVNFUy5oYXMoc2VnLnN0YXR1cykgPyAoXG4gICAgICAgICAgICAgIDxSdW5uaW5nU3RyaXBlcyAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7c2hvd0xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZUJhclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRpbWVsaW5lQmFyID0gbWVtbyhmdW5jdGlvbiBUaW1lbGluZUJhcih7XG4gIHNwYW4sXG4gIHZpZXdTdGFydCxcbiAgdmlld0R1cmF0aW9uLFxuICBjb250YWluZXJXaWR0aCxcbiAgaXNTZWxlY3RlZCxcbiAgaXNEaW1tZWQsXG4gIG9uU2VsZWN0LFxuICBvblJldmVhbFRpbWUsXG59OiB7XG4gIHNwYW46IFNwYW47XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RHVyYXRpb246IG51bWJlcjtcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgaXNEaW1tZWQ/OiBib29sZWFuO1xuICBvblNlbGVjdDogKHNwYW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblJldmVhbFRpbWU/OiAodGltZU1zOiBudW1iZXIpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qgc3RhcnRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgY29uc3QgZW5kTXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLmVuZFRpbWUpO1xuICBjb25zdCB0b3RhbER1cmF0aW9uTXMgPSBnZXRTcGFuRHVyYXRpb25NcyhzcGFuKTtcblxuICBjb25zdCBnZW9tZXRyeSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGNvbXB1dGVCYXJHZW9tZXRyeShcbiAgICAgICAgc3RhcnRNcyxcbiAgICAgICAgZW5kTXMsXG4gICAgICAgIHZpZXdTdGFydCxcbiAgICAgICAgdmlld1N0YXJ0ICsgdmlld0R1cmF0aW9uLFxuICAgICAgICBjb250YWluZXJXaWR0aFxuICAgICAgKSxcbiAgICBbc3RhcnRNcywgZW5kTXMsIHZpZXdTdGFydCwgdmlld0R1cmF0aW9uLCBjb250YWluZXJXaWR0aF1cbiAgKTtcblxuICBjb25zdCBiYXNlU2VnbWVudHMgPSB1c2VNZW1vKCgpID0+IGNvbXB1dGVTcGFuU2VnbWVudHMoc3BhbiksIFtzcGFuXSk7XG4gIGNvbnN0IHNlZ21lbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ2VvbWV0cnkubW9kZS5raW5kID09PSAnZnVsbCdcbiAgICAgICAgPyBwcm9qZWN0U2VnbWVudHMoYmFzZVNlZ21lbnRzLCBzdGFydE1zLCB0b3RhbER1cmF0aW9uTXMsIGdlb21ldHJ5KVxuICAgICAgICA6IFtdLFxuICAgIFtnZW9tZXRyeSwgYmFzZVNlZ21lbnRzLCBzdGFydE1zLCB0b3RhbER1cmF0aW9uTXNdXG4gICk7XG5cbiAgY29uc3QgYmFzZU1hcmtlcnMgPSB1c2VNZW1vKCgpID0+IGNvbXB1dGVTcGFuTWFya2VycyhzcGFuKSwgW3NwYW5dKTtcbiAgY29uc3QgbWFya2VycyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Z1bGwnXG4gICAgICAgID8gY3VsbENvbGxpZGluZ01hcmtlcnMoXG4gICAgICAgICAgICBwcm9qZWN0TWFya2VycyhcbiAgICAgICAgICAgICAgYmFzZU1hcmtlcnMsXG4gICAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVTdGFydE1zLFxuICAgICAgICAgICAgICBnZW9tZXRyeS52aXNpYmxlRW5kTXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aFxuICAgICAgICAgIClcbiAgICAgICAgOiBbXSxcbiAgICBbZ2VvbWV0cnksIGJhc2VNYXJrZXJzXVxuICApO1xuXG4gIC8vIE1hcmtlcnMgdGhhdCBmYWxsIG91dHNpZGUgdGhlIHZpc2libGUgd2luZG93IChzY3JvbGxlZCBvZmYgd2hpbGUgem9vbWVkIGluKVxuICAvLyDigJQgc3VyZmFjZWQgYXMgZWRnZSBpbmRpY2F0b3JzIHNvIHRoZXkgYXJlbid0IHNpbGVudGx5IGxvc3QuXG4gIGNvbnN0IG9mZnNjcmVlbiA9IHVzZU1lbW88T2Zmc2NyZWVuTWFya2Vycz4oXG4gICAgKCkgPT5cbiAgICAgIGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Z1bGwnXG4gICAgICAgID8gY29tcHV0ZU9mZnNjcmVlbk1hcmtlcnMoXG4gICAgICAgICAgICBiYXNlTWFya2VycyxcbiAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVTdGFydE1zLFxuICAgICAgICAgICAgZ2VvbWV0cnkudmlzaWJsZUVuZE1zXG4gICAgICAgICAgKVxuICAgICAgICA6IHsgbGVmdDogbnVsbCwgcmlnaHQ6IG51bGwgfSxcbiAgICBbZ2VvbWV0cnksIGJhc2VNYXJrZXJzXVxuICApO1xuXG4gIC8vIE1hcmtlcnMgKHZpc2libGUgb3Igb2ZmLXNjcmVlbikgbW92ZSB0aGUgZHVyYXRpb24gbGFiZWwgaW50byB0aGUgb3ZlcmxheSxcbiAgLy8gc28gdGhlIGluLWJhciBzZWdtZW50IGxhYmVsIGlzIHN1cHByZXNzZWQuXG4gIGNvbnN0IGhhc01hcmtlcnMgPVxuICAgIG1hcmtlcnMubGVuZ3RoID4gMCB8fCBvZmZzY3JlZW4ubGVmdCAhPT0gbnVsbCB8fCBvZmZzY3JlZW4ucmlnaHQgIT09IG51bGw7XG5cbiAgY29uc3Qgd29ya2Zsb3dTdGF0dXMgPSAoc3Bhbi5hdHRyaWJ1dGVzLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgPy5zdGF0dXMgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0Vycm9yZWQgPSBzcGFuLnN0YXR1cy5jb2RlID09PSAyIHx8IHdvcmtmbG93U3RhdHVzID09PSAnZmFpbGVkJztcbiAgY29uc3QgY29sb3JzID0gZ2V0UmVzb3VyY2VDb2xvcihzcGFuLnJlc291cmNlKTtcbiAgY29uc3QgZmFsbGJhY2tCZyA9IGlzRXJyb3JlZFxuICAgID8gKGNvbG9ycy5lcnJvckJnID8/ICd2YXIoLS1kcy1yZWQtMjAwKScpXG4gICAgOiBjb2xvcnMuYmc7XG4gIGNvbnN0IGZhbGxiYWNrQm9yZGVyID0gaXNFcnJvcmVkXG4gICAgPyAoY29sb3JzLmVycm9yQm9yZGVyID8/ICd2YXIoLS1kcy1yZWQtNTAwKScpXG4gICAgOiBjb2xvcnMuYm9yZGVyO1xuXG4gIGNvbnN0IHRvdGFsTGFiZWwgPSBmb3JtYXREdXJhdGlvblByZWNpc2UodG90YWxEdXJhdGlvbk1zKTtcbiAgY29uc3Qgc2hvd1RvdGFsTGFiZWwgPVxuICAgIGdlb21ldHJ5LnZpc2libGVQaXhlbFdpZHRoID49IE1hdGgubWF4KDQwLCB0b3RhbExhYmVsLmxlbmd0aCAqIDYgKyAxMik7XG5cbiAgY29uc3QgaGFuZGxlQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgb25TZWxlY3Qoc3Bhbi5zcGFuSWQpO1xuICB9LCBbb25TZWxlY3QsIHNwYW4uc3BhbklkXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgYXJpYS1zZWxlY3RlZD17aXNTZWxlY3RlZH1cbiAgICAgIGFyaWEtZXhwYW5kZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICBhcmlhLWxldmVsPXsxfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2dyb3VwL3RpbWVsaW5lLXJvdyBoLTEwIHJlbGF0aXZlIGZsZXggaXRlbXMtY2VudGVyIGhvdmVyOmJnLWdyYXktMTAwIGFyaWEtc2VsZWN0ZWQ6YmctZ3JheS0xMDAgYXJpYS1zZWxlY3RlZDpob3ZlcjpiZy1ncmF5LTIwMCB0cmFuc2l0aW9uLW9wYWNpdHknLFxuICAgICAgICBpc0RpbW1lZCAmJiAnb3BhY2l0eS0zNSdcbiAgICAgICl9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMFwiIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGgtNiAtdHJhbnNsYXRlLXktMS8yIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVswLjI1cmVtXVwiXG4gICAgICAgICAgc3R5bGU9e2dldEJhclBvc2l0aW9uU3R5bGUoZ2VvbWV0cnkpfVxuICAgICAgICA+XG4gICAgICAgICAge2dlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Fycm93JyA/IChcbiAgICAgICAgICAgIDxCb3VuZGFyeUFycm93IGRpcmVjdGlvbj17Z2VvbWV0cnkubW9kZS5kaXJlY3Rpb259IC8+XG4gICAgICAgICAgKSA6IGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ3RpbnknID8gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTYgcm91bmRlZC1bMC4yNXJlbV0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogZmFsbGJhY2tCZywgYm9yZGVyQ29sb3I6IGZhbGxiYWNrQm9yZGVyIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBzZWdtZW50cy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgICAgPFNlZ21lbnRCYXIgc2VnbWVudHM9e3NlZ21lbnRzfSBzaG93TGFiZWxzPXshaGFzTWFya2Vyc30gLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPFBsYWluQmFyXG4gICAgICAgICAgICAgIGJnPXtmYWxsYmFja0JnfVxuICAgICAgICAgICAgICBib3JkZXI9e2ZhbGxiYWNrQm9yZGVyfVxuICAgICAgICAgICAgICBsYWJlbD17c2hvd1RvdGFsTGFiZWwgPyB0b3RhbExhYmVsIDogbnVsbH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHsvKiBPdmVybGF5IChub3QgY2xpcHBlZCk6IHRpY2tzLCBvZmYtc2NyZWVuIGluZGljYXRvcnMsIHRoZW4gdGhlIGR1cmF0aW9uIGxhYmVsIG9uIHRvcC4gKi99XG4gICAgICAgIHtoYXNNYXJrZXJzID8gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgdG9wLTEvMiBoLTYgLXRyYW5zbGF0ZS15LTEvMlwiXG4gICAgICAgICAgICBzdHlsZT17Z2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge21hcmtlcnMubGVuZ3RoID4gMCA/IDxNYXJrZXJMYXllciBtYXJrZXJzPXttYXJrZXJzfSAvPiA6IG51bGx9XG4gICAgICAgICAgICB7b2Zmc2NyZWVuLmxlZnQgPyAoXG4gICAgICAgICAgICAgIDxPZmZzY3JlZW5NYXJrZXJJbmRpY2F0b3JcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb249XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICBjb3VudD17b2Zmc2NyZWVuLmxlZnQuY291bnR9XG4gICAgICAgICAgICAgICAgdGFyZ2V0TXM9e29mZnNjcmVlbi5sZWZ0Lm5lYXJlc3RNc31cbiAgICAgICAgICAgICAgICBvblJldmVhbD17b25SZXZlYWxUaW1lfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7b2Zmc2NyZWVuLnJpZ2h0ID8gKFxuICAgICAgICAgICAgICA8T2Zmc2NyZWVuTWFya2VySW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvdW50PXtvZmZzY3JlZW4ucmlnaHQuY291bnR9XG4gICAgICAgICAgICAgICAgdGFyZ2V0TXM9e29mZnNjcmVlbi5yaWdodC5uZWFyZXN0TXN9XG4gICAgICAgICAgICAgICAgb25SZXZlYWw9e29uUmV2ZWFsVGltZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAge3Nob3dUb3RhbExhYmVsID8gKFxuICAgICAgICAgICAgICA8RHVyYXRpb25MYWJlbFxuICAgICAgICAgICAgICAgIGxhYmVsPXt0b3RhbExhYmVsfVxuICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGNsZWFyIG9mIHRoZSBsZWZ0IGVkZ2UgaW5kaWNhdG9yIHNvIGl0IGlzbid0IGNvdmVyZWQuXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtvZmZzY3JlZW4ubGVmdCA/ICdwbC0xMCcgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuXG5leHBvcnQgeyBUaW1lbGluZUJhciB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbHRhSW5kaWNhdG9yIChBbHQta2V5IGdhcCBvdmVybGF5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFTFRBX0NBUF9IRUlHSFRfUFggPSA4O1xuLy8gVmVydGljYWwgb2Zmc2V0IHRvIHNpdCB0aGUgaW5kaWNhdG9yIGluc2lkZSB0aGUgZ2FwIGJldHdlZW4gcm93IE4gYW5kIE4rMSxcbi8vIGFsaWduZWQgd2l0aCB3aGVyZSB0aGUgYmFyIHN0YXJ0cyBpbiB0aGUgbmV4dCByb3cgKHJvd3MgY2VudGVyIGEgMjRweCBiYXJcbi8vIGluc2lkZSA0MHB4LCBzbyBiYXJzIHN0YXJ0IH44cHggZnJvbSB0aGUgdG9wIG9mIHRoZSByb3cpLlxuY29uc3QgREVMVEFfUk9XX09GRlNFVF9QWCA9IDg7XG5cbmNvbnN0IERlbHRhSW5kaWNhdG9yID0gbWVtbyhmdW5jdGlvbiBEZWx0YUluZGljYXRvcih7XG4gIGxlZnRGcmFjLFxuICByaWdodEZyYWMsXG4gIGxhYmVsLFxuICByb3dJbmRleCxcbn06IHtcbiAgbGVmdEZyYWM6IG51bWJlcjtcbiAgcmlnaHRGcmFjOiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHJvd0luZGV4OiBudW1iZXI7XG59KSB7XG4gIGNvbnN0IGNlbnRlclkgPSBERUxUQV9ST1dfT0ZGU0VUX1BYICsgKHJvd0luZGV4ICsgMSkgKiBST1dfSEVJR0hUX1BYO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBsZWZ0OiBgJHtsZWZ0RnJhYyAqIDEwMH0lYCxcbiAgICAgICAgd2lkdGg6IGAkeyhyaWdodEZyYWMgLSBsZWZ0RnJhYykgKiAxMDB9JWAsXG4gICAgICAgIHRvcDogY2VudGVyWSAtIERFTFRBX0NBUF9IRUlHSFRfUFggLyAyLFxuICAgICAgICBoZWlnaHQ6IERFTFRBX0NBUF9IRUlHSFRfUFgsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0wIHctcHggaC1mdWxsIGJnLWFtYmVyLTgwMFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMCByaWdodC0wIHRvcC0xLzIgaC1weCBiZy1hbWJlci04MDBcIiAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0wIHRvcC0wIHctcHggaC1mdWxsIGJnLWFtYmVyLTgwMFwiIC8+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTEvMiB0b3AtMS8yIC10cmFuc2xhdGUteC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LWxhYmVsLTEyIGxlYWRpbmctbm9uZSB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLXhzIHB4LTEgcHktMC41IHRleHQtZ3JheS0xMDAgYmctYW1iZXItODAwXCI+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lSGVhZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVsaW5lSGVhZGVyKHtcbiAgbWFya2VycyxcbiAgaG92ZXJJbmZvLFxufToge1xuICBtYXJrZXJzOiBUaW1lTWFya2VyW107XG4gIGhvdmVySW5mbz86IHsgZnJhY3Rpb246IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9IHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgYmctYmFja2dyb3VuZC0xMDAgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGgtMTAgbWluLWgtMTAgZmxleCBpdGVtcy1lbmQgcHgtNCBwYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBmbGV4LTFcIj5cbiAgICAgICAge21hcmtlcnMubWFwKChtKSA9PiAoXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT17U3RyaW5nKG0udmFsdWUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTEgZm9udC1tb25vIHRleHQteHMgZm9udC1ub3JtYWwgbGVhZGluZy00IHRleHQtZ3JheS05MDAgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bS5wb3NpdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHttLmxhYmVsfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKSl9XG4gICAgICAgIHtob3ZlckluZm8gJiYgKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMSBwb2ludGVyLWV2ZW50cy1ub25lIHotMTAgZm9udC1tb25vIHRleHQtWzExcHhdIGxlYWRpbmctNCB0ZXh0LWdyYXktMTAwMCB3aGl0ZXNwYWNlLW5vd3JhcCBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIHJvdW5kZWQgcHgtMSAtdHJhbnNsYXRlLXgtMS8yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVySW5mby5mcmFjdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtob3ZlckluZm8ubGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZWxpbmUoe1xuICBzcGFucyxcbiAgdmlld1N0YXJ0LFxuICB2aWV3RW5kLFxuICBtYXJrZXJzLFxuICBzZWxlY3RlZElkLFxuICBzZWFyY2hSZXN1bHQsXG4gIG9uU2VsZWN0LFxuICBvblJldmVhbFRpbWUsXG4gIGhvdmVyRnJhY3Rpb24sXG4gIGFsdEhlbGQgPSBmYWxzZSxcbn06IHtcbiAgc3BhbnM6IFNwYW5bXTtcbiAgdmlld1N0YXJ0OiBudW1iZXI7XG4gIHZpZXdFbmQ6IG51bWJlcjtcbiAgbWFya2VyczogVGltZU1hcmtlcltdO1xuICBzZWxlY3RlZElkOiBzdHJpbmcgfCBudWxsO1xuICBzZWFyY2hSZXN1bHQ6IFNwYW5TZWFyY2hSZXN1bHQ7XG4gIG9uU2VsZWN0OiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUmV2ZWFsVGltZT86ICh0aW1lTXM6IG51bWJlcikgPT4gdm9pZDtcbiAgaG92ZXJGcmFjdGlvbj86IG51bWJlciB8IG51bGw7XG4gIGFsdEhlbGQ/OiBib29sZWFuO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtjb250YWluZXJXaWR0aCwgc2V0Q29udGFpbmVyV2lkdGhdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGNvbnN0IHRpbWVsaW5lV2lkdGggPSBNYXRoLm1heCgwLCBjb250YWluZXJXaWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyKTtcbiAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB1c2VSb3dXaW5kb3coXG4gICAgY29udGFpbmVyUmVmLFxuICAgIHNwYW5zLmxlbmd0aCxcbiAgICBST1dfSEVJR0hUX1BYXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlbCA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoW2VudHJ5XSkgPT4ge1xuICAgICAgc2V0Q29udGFpbmVyV2lkdGgoZW50cnkuY29udGVudFJlY3Qud2lkdGgpO1xuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIHJldHVybiAoKSA9PiByby5kaXNjb25uZWN0KCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBnYXBzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBjb21wdXRlU3BhbkdhcHMoc3BhbnMsIHZpZXdTdGFydCwgdmlld0VuZCksXG4gICAgW3NwYW5zLCB2aWV3U3RhcnQsIHZpZXdFbmRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e2NvbnRhaW5lclJlZn1cbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiBzcGFucy5sZW5ndGggKiBST1dfSEVJR0hUX1BYIH19XG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX1cbiAgICAgID5cbiAgICAgICAge21hcmtlcnMubWFwKChtYXJrZXIpID0+XG4gICAgICAgICAgLy8gU2tpcCB0aGUgXCIwc1wiIG9yaWdpbiBtYXJrZXIgc2luY2UgdGhlIGxlZnQgZWRnZSBhbHJlYWR5IGltcGxpZXMgaXQuXG4gICAgICAgICAgTWF0aC5hYnMobWFya2VyLnZhbHVlKSA+IDAuMDAwMDAxID8gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhtYXJrZXIudmFsdWUpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCB3LXB4IGJnLWdyYXktYWxwaGEtMzAwXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bWFya2VyLnBvc2l0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtob3ZlckZyYWN0aW9uICE9IG51bGwgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIHBvaW50ZXItZXZlbnRzLW5vbmUgei0xMFwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgdy1weCBiZy1ncmF5LWFscGhhLTUwMFwiXG4gICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHtob3ZlckZyYWN0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPGRpdiBzdHlsZT17eyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7c3RhcnQgKiBST1dfSEVJR0hUX1BYfXB4KWAgfX0+XG4gICAgICAgIHtzcGFucy5zbGljZShzdGFydCwgZW5kKS5tYXAoKHNwYW4pID0+IChcbiAgICAgICAgICA8VGltZWxpbmVCYXJcbiAgICAgICAgICAgIGtleT17c3Bhbi5zcGFuSWR9XG4gICAgICAgICAgICBzcGFuPXtzcGFufVxuICAgICAgICAgICAgdmlld1N0YXJ0PXt2aWV3U3RhcnR9XG4gICAgICAgICAgICB2aWV3RHVyYXRpb249e3ZpZXdEdXJhdGlvbn1cbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoPXt0aW1lbGluZVdpZHRofVxuICAgICAgICAgICAgaXNTZWxlY3RlZD17c2VsZWN0ZWRJZCA9PT0gc3Bhbi5zcGFuSWR9XG4gICAgICAgICAgICBpc0RpbW1lZD17aXNTcGFuRGltbWVkQnlTZWFyY2goc3Bhbi5zcGFuSWQsIHNlYXJjaFJlc3VsdCl9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgICBvblJldmVhbFRpbWU9e29uUmV2ZWFsVGltZX1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2FsdEhlbGQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAge2dhcHMubWFwKChnYXApID0+IChcbiAgICAgICAgICAgIDxEZWx0YUluZGljYXRvclxuICAgICAgICAgICAgICBrZXk9e2dhcC5yb3dJbmRleH1cbiAgICAgICAgICAgICAgbGVmdEZyYWM9e2dhcC5sZWZ0RnJhY31cbiAgICAgICAgICAgICAgcmlnaHRGcmFjPXtnYXAucmlnaHRGcmFjfVxuICAgICAgICAgICAgICBsYWJlbD17Zm9ybWF0RHVyYXRpb24oZ2FwLmdhcE1zLCB0cnVlKX1cbiAgICAgICAgICAgICAgcm93SW5kZXg9e2dhcC5yb3dJbmRleH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -17,4 +17,18 @@ export interface RowWindow {
|
|
|
17
17
|
export declare function useRowWindow(ref: RefObject<HTMLElement | null>, rowCount: number, rowHeight: number, overscan?: number): RowWindow;
|
|
18
18
|
/** Row height (px) shared by the events list and timeline rows (`h-10`). */
|
|
19
19
|
export declare const ROW_HEIGHT_PX = 40;
|
|
20
|
+
/**
|
|
21
|
+
* Scroll a windowed row into view by index.
|
|
22
|
+
*
|
|
23
|
+
* The list is virtualized (fixed `rowHeight` rows), so an off-screen row has no
|
|
24
|
+
* DOM node to `scrollIntoView` — its target offset is computed from its index
|
|
25
|
+
* instead. Walks up from `listEl` to the shared scrollable ancestor (the same
|
|
26
|
+
* one `useRowWindow` measures against), only scrolls when the row sits outside
|
|
27
|
+
* the visible area, leaves a one-row `margin` of breathing room past it, and
|
|
28
|
+
* clamps the result to `[0, scrollHeight - clientHeight]`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function scrollRowIntoView(listEl: HTMLElement | null, index: number, rowHeight: number, opts?: {
|
|
31
|
+
margin?: number;
|
|
32
|
+
behavior?: ScrollBehavior;
|
|
33
|
+
}): void;
|
|
20
34
|
//# sourceMappingURL=use-row-window.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-row-window.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/use-row-window.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAK5D,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;AAaD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,SAAK,GACZ,SAAS,CAkDX;AAED,4EAA4E;AAC5E,eAAO,MAAM,aAAa,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"use-row-window.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/use-row-window.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAK5D,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;CACb;AAaD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,SAAK,GACZ,SAAS,CAkDX;AAED,4EAA4E;AAC5E,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACpD,IAAI,CA8BN"}
|