@workflow/web-shared 5.0.0-beta.42 → 5.0.0-beta.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +4 -4
  2. package/dist/components/event-list-view.d.ts +12 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +41 -20
  5. package/dist/components/sidebar/attribute-panel.d.ts +6 -2
  6. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  7. package/dist/components/sidebar/attribute-panel.js +10 -8
  8. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  9. package/dist/components/sidebar/copyable-data-block.js +2 -2
  10. package/dist/components/sidebar/entity-detail-panel.d.ts +6 -2
  11. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  12. package/dist/components/sidebar/entity-detail-panel.js +13 -5
  13. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  14. package/dist/components/sidebar/events-list.js +12 -5
  15. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  16. package/dist/components/sidebar/sidebar-data-context.d.ts +2 -0
  17. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  18. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  19. package/dist/components/stream-viewer.js +2 -2
  20. package/dist/components/trace-viewer/components/detail-panel-width.d.ts +4 -4
  21. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -1
  22. package/dist/components/trace-viewer/components/detail-panel-width.js +5 -5
  23. package/dist/components/trace-viewer/components/detail-panel.d.ts +1 -1
  24. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -1
  25. package/dist/components/trace-viewer/components/detail-panel.js +3 -3
  26. package/dist/components/trace-viewer/components/draggable-border.d.ts +1 -1
  27. package/dist/components/trace-viewer/components/draggable-border.js +2 -2
  28. package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.d.ts +9 -0
  29. package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.d.ts.map +1 -0
  30. package/dist/components/trace-viewer/components/middle-truncate/measurement-batch.js +29 -0
  31. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -1
  32. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +16 -8
  33. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -1
  34. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +83 -19
  35. package/dist/components/trace-viewer/components/minimap.js +4 -4
  36. package/dist/components/trace-viewer/components/span-markers.d.ts +8 -9
  37. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -1
  38. package/dist/components/trace-viewer/components/span-markers.js +13 -10
  39. package/dist/components/trace-viewer/components/timeline.d.ts +1 -1
  40. package/dist/components/trace-viewer/components/timeline.js +4 -4
  41. package/dist/components/trace-viewer/components/use-row-window.d.ts +1 -1
  42. package/dist/components/trace-viewer/components/use-row-window.js +2 -2
  43. package/dist/components/trace-viewer/trace-viewer.js +3 -3
  44. package/dist/components/trace-viewer/utils.d.ts +3 -1
  45. package/dist/components/trace-viewer/utils.d.ts.map +1 -1
  46. package/dist/components/trace-viewer/utils.js +6 -5
  47. package/dist/components/ui/data-inspector.d.ts +7 -1
  48. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  49. package/dist/components/ui/data-inspector.js +10 -5
  50. package/dist/components/ui/decrypt-button.d.ts +5 -1
  51. package/dist/components/ui/decrypt-button.d.ts.map +1 -1
  52. package/dist/components/ui/decrypt-button.js +4 -4
  53. package/dist/components/ui/duplicate-event-tooltip.d.ts +15 -5
  54. package/dist/components/ui/duplicate-event-tooltip.d.ts.map +1 -1
  55. package/dist/components/ui/duplicate-event-tooltip.js +18 -9
  56. package/dist/components/ui/error-stack-block.js +4 -4
  57. package/dist/components/ui/timestamp-tooltip.d.ts +5 -3
  58. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  59. package/dist/components/ui/timestamp-tooltip.js +9 -9
  60. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  61. package/dist/components/workflow-traces/event-colors.js +11 -1
  62. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  63. package/dist/components/workflow-traces/trace-span-construction.js +5 -4
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -1
  67. package/dist/lib/duplicate-events.d.ts +1 -1
  68. package/dist/lib/duplicate-events.js +2 -2
  69. package/dist/lib/hydration.d.ts.map +1 -1
  70. package/dist/lib/hydration.js +8 -13
  71. package/dist/lib/sealed-events.d.ts +28 -0
  72. package/dist/lib/sealed-events.d.ts.map +1 -0
  73. package/dist/lib/sealed-events.js +30 -0
  74. package/dist/lib/trace-builder.d.ts.map +1 -1
  75. package/dist/lib/trace-builder.js +8 -5
  76. package/dist/lib/utils.d.ts +1 -1
  77. package/dist/lib/utils.js +2 -2
  78. package/dist/lib/zstd-browser-decoder.js +2 -2
  79. package/package.json +5 -5
  80. package/src/components/event-list-view.tsx +57 -22
  81. package/src/components/sidebar/attribute-panel.tsx +15 -7
  82. package/src/components/sidebar/copyable-data-block.tsx +8 -1
  83. package/src/components/sidebar/entity-detail-panel.tsx +18 -2
  84. package/src/components/sidebar/events-list.tsx +16 -6
  85. package/src/components/sidebar/resolve-hook-modal.tsx +2 -2
  86. package/src/components/sidebar/sidebar-data-context.tsx +2 -0
  87. package/src/components/stream-viewer.tsx +1 -1
  88. package/src/components/trace-viewer/components/detail-panel-width.ts +4 -4
  89. package/src/components/trace-viewer/components/detail-panel.tsx +3 -1
  90. package/src/components/trace-viewer/components/draggable-border.tsx +1 -1
  91. package/src/components/trace-viewer/components/middle-truncate/measurement-batch.ts +47 -0
  92. package/src/components/trace-viewer/components/middle-truncate/middle-truncate.tsx +15 -7
  93. package/src/components/trace-viewer/components/middle-truncate/use-middle-truncate.ts +132 -38
  94. package/src/components/trace-viewer/components/minimap.tsx +3 -3
  95. package/src/components/trace-viewer/components/span-markers.tsx +18 -13
  96. package/src/components/trace-viewer/components/timeline.tsx +4 -4
  97. package/src/components/trace-viewer/components/use-row-window.ts +1 -1
  98. package/src/components/trace-viewer/trace-viewer.tsx +2 -2
  99. package/src/components/trace-viewer/utils.test.ts +5 -3
  100. package/src/components/trace-viewer/utils.ts +12 -8
  101. package/src/components/ui/data-inspector.tsx +19 -3
  102. package/src/components/ui/decrypt-button.tsx +9 -2
  103. package/src/components/ui/duplicate-event-tooltip.tsx +32 -10
  104. package/src/components/ui/error-stack-block.tsx +3 -3
  105. package/src/components/ui/timestamp-tooltip.tsx +16 -6
  106. package/src/components/workflow-traces/event-colors.ts +11 -0
  107. package/src/components/workflow-traces/trace-span-construction.test.ts +27 -1
  108. package/src/components/workflow-traces/trace-span-construction.ts +5 -3
  109. package/src/index.ts +4 -0
  110. package/src/lib/duplicate-events.ts +1 -1
  111. package/src/lib/hydration.ts +7 -12
  112. package/src/lib/sealed-events.ts +32 -0
  113. package/src/lib/trace-builder.test.ts +29 -1
  114. package/src/lib/trace-builder.ts +10 -5
  115. package/src/lib/utils.ts +1 -1
  116. package/src/lib/zstd-browser-decoder.ts +1 -1
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, } from 'react';
3
+ import { cancelMeasurement, scheduleMeasurement } from './measurement-batch';
3
4
  import { middleTruncate, toGraphemes } from './truncate';
4
5
  const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;
5
6
  function createFullState(value, graphemes) {
@@ -26,7 +27,13 @@ function useMiddleTruncate(value) {
26
27
  const ref = useRef(null);
27
28
  const measureRef = useRef(null);
28
29
  const [state, setState] = useState(() => fullState);
29
- const rafRef = useRef(0);
30
+ const measurementKeyRef = useRef({});
31
+ const textMeasurementCacheRef = useRef({
32
+ typography: '',
33
+ value,
34
+ widths: new Map(),
35
+ });
36
+ const lastMeasurementRef = useRef(null);
30
37
  const updateState = useCallback((nextState) => {
31
38
  setState((currentState) => {
32
39
  if (currentState.displayText === nextState.displayText &&
@@ -40,26 +47,71 @@ function useMiddleTruncate(value) {
40
47
  return nextState;
41
48
  });
42
49
  }, []);
43
- const recalculate = useCallback(() => {
50
+ const readMeasurement = useCallback(() => {
44
51
  const el = ref.current;
45
52
  const measureEl = measureRef.current;
46
53
  if (!el || !measureEl)
54
+ return null;
55
+ const availableWidth = el.clientWidth;
56
+ const style = getComputedStyle(measureEl);
57
+ return {
58
+ availableWidth,
59
+ typography: [
60
+ style.fontFamily,
61
+ style.fontFeatureSettings,
62
+ style.fontKerning,
63
+ style.fontSize,
64
+ style.fontStretch,
65
+ style.fontStyle,
66
+ style.fontVariationSettings,
67
+ style.fontWeight,
68
+ style.letterSpacing,
69
+ style.textTransform,
70
+ ].join('\0'),
71
+ };
72
+ }, []);
73
+ const recalculate = useCallback(({ availableWidth, typography }) => {
74
+ const measureEl = measureRef.current;
75
+ if (!measureEl)
47
76
  return;
48
- const available = el.clientWidth;
49
- if (available <= 0) {
77
+ const lastMeasurement = lastMeasurementRef.current;
78
+ if (lastMeasurement?.availableWidth === availableWidth &&
79
+ lastMeasurement.typography === typography &&
80
+ lastMeasurement.value === value) {
81
+ return;
82
+ }
83
+ lastMeasurementRef.current = {
84
+ availableWidth,
85
+ typography,
86
+ value,
87
+ };
88
+ if (availableWidth <= 0) {
50
89
  updateState(fullState);
51
90
  return;
52
91
  }
92
+ const textMeasurementCache = textMeasurementCacheRef.current;
93
+ if (textMeasurementCache.typography !== typography ||
94
+ textMeasurementCache.value !== value) {
95
+ textMeasurementCache.typography = typography;
96
+ textMeasurementCache.value = value;
97
+ textMeasurementCache.widths.clear();
98
+ }
53
99
  const measure = (text) => {
100
+ const cachedWidth = textMeasurementCache.widths.get(text);
101
+ if (cachedWidth !== undefined) {
102
+ return cachedWidth;
103
+ }
54
104
  measureEl.textContent = text;
55
- return measureEl.scrollWidth;
105
+ const width = measureEl.scrollWidth;
106
+ textMeasurementCache.widths.set(text, width);
107
+ return width;
56
108
  };
57
109
  const fullWidth = measure(value);
58
- if (fullWidth <= available) {
110
+ if (fullWidth <= availableWidth) {
59
111
  updateState(fullState);
60
112
  return;
61
113
  }
62
- const result = middleTruncate(graphemes, available, measure, fullWidth);
114
+ const result = middleTruncate(graphemes, availableWidth, measure, fullWidth);
63
115
  updateState({
64
116
  displayText: result.text,
65
117
  isTruncated: result.truncated,
@@ -71,34 +123,46 @@ function useMiddleTruncate(value) {
71
123
  }, [fullState, graphemes, updateState, value]);
72
124
  // Measure on mount and when value changes - before paint
73
125
  useIsomorphicLayoutEffect(() => {
74
- recalculate();
75
- }, [recalculate]);
126
+ const measurement = readMeasurement();
127
+ if (measurement) {
128
+ recalculate(measurement);
129
+ }
130
+ }, [readMeasurement, recalculate]);
76
131
  // ResizeObserver + font loading for ongoing responsiveness
77
132
  useEffect(() => {
78
133
  const el = ref.current;
79
134
  if (!el)
80
135
  return;
81
- const debouncedRecalc = () => {
82
- cancelAnimationFrame(rafRef.current);
83
- rafRef.current = requestAnimationFrame(recalculate);
136
+ const measurementKey = measurementKeyRef.current;
137
+ const scheduleRecalculation = () => {
138
+ scheduleMeasurement(measurementKey, {
139
+ read: readMeasurement,
140
+ measure: recalculate,
141
+ });
84
142
  };
85
143
  const ro = typeof ResizeObserver !== 'undefined'
86
- ? new ResizeObserver(debouncedRecalc)
144
+ ? new ResizeObserver(scheduleRecalculation)
87
145
  : null;
88
146
  ro?.observe(el);
89
- window.addEventListener('resize', debouncedRecalc);
147
+ if (!ro) {
148
+ window.addEventListener('resize', scheduleRecalculation);
149
+ }
90
150
  const onFontsLoaded = () => {
91
- debouncedRecalc();
151
+ textMeasurementCacheRef.current.widths.clear();
152
+ lastMeasurementRef.current = null;
153
+ scheduleRecalculation();
92
154
  };
93
155
  const fontSet = 'fonts' in document ? document.fonts : null;
94
156
  fontSet?.addEventListener?.('loadingdone', onFontsLoaded);
95
157
  return () => {
96
158
  ro?.disconnect();
97
- window.removeEventListener('resize', debouncedRecalc);
98
- cancelAnimationFrame(rafRef.current);
159
+ if (!ro) {
160
+ window.removeEventListener('resize', scheduleRecalculation);
161
+ }
162
+ cancelMeasurement(measurementKey);
99
163
  fontSet?.removeEventListener?.('loadingdone', onFontsLoaded);
100
164
  };
101
- }, [recalculate]);
165
+ }, [readMeasurement, recalculate]);
102
166
  return {
103
167
  ref,
104
168
  measureRef,
@@ -111,4 +175,4 @@ function useMiddleTruncate(value) {
111
175
  };
112
176
  }
113
177
  export { useMiddleTruncate };
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1pZGRsZS10cnVuY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21pZGRsZS10cnVuY2F0ZS91c2UtbWlkZGxlLXRydW5jYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGVBQWUsRUFDZixPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXpELE1BQU0seUJBQXlCLEdBQzdCLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFXOUQsU0FBUyxlQUFlLENBQ3RCLEtBQWEsRUFDYixTQUFtQjtJQUVuQixPQUFPO1FBQ0wsV0FBVyxFQUFFLEtBQUs7UUFDbEIsV0FBVyxFQUFFLEtBQUs7UUFDbEIsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLE1BQU07UUFDckMsVUFBVSxFQUFFLEtBQUs7UUFDakIsbUJBQW1CLEVBQUUsQ0FBQztRQUN0QixVQUFVLEVBQUUsRUFBRTtLQUNmLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQVV0QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQ3ZCLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQ3ZDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUNuQixDQUFD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V0FBVztRQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7UUFDNUIsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7S0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBtaWRkbGVUcnVuY2F0ZSwgdG9HcmFwaGVtZXMgfSBmcm9tICcuL3RydW5jYXRlJztcblxuY29uc3QgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9XG4gIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gdXNlRWZmZWN0IDogdXNlTGF5b3V0RWZmZWN0O1xuXG5pbnRlcmZhY2UgTWlkZGxlVHJ1bmNhdGVTdGF0ZSB7XG4gIGRpc3BsYXlUZXh0OiBzdHJpbmc7XG4gIGlzVHJ1bmNhdGVkOiBib29sZWFuO1xuICBwcmVmaXhHcmFwaGVtZUNvdW50OiBudW1iZXI7XG4gIHByZWZpeFRleHQ6IHN0cmluZztcbiAgc3VmZml4R3JhcGhlbWVDb3VudDogbnVtYmVyO1xuICBzdWZmaXhUZXh0OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bGxTdGF0ZShcbiAgdmFsdWU6IHN0cmluZyxcbiAgZ3JhcGhlbWVzOiBzdHJpbmdbXVxuKTogTWlkZGxlVHJ1bmNhdGVTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgZGlzcGxheVRleHQ6IHZhbHVlLFxuICAgIGlzVHJ1bmNhdGVkOiBmYWxzZSxcbiAgICBwcmVmaXhHcmFwaGVtZUNvdW50OiBncmFwaGVtZXMubGVuZ3RoLFxuICAgIHByZWZpeFRleHQ6IHZhbHVlLFxuICAgIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IDAsXG4gICAgc3VmZml4VGV4dDogJycsXG4gIH07XG59XG5cbi8qKlxuICogTWlkZGxlLXRydW5jYXRpb24gbG9naWMuIFJldHVybnMgcmVmcyB0byBhdHRhY2ggdG8gdGhlIGNvbnRhaW5lciBhbmQgbWVhc3VyZW1lbnQgZWxlbWVudHMsIHBsdXMgdGhlIHRydW5jYXRlZCBkaXNwbGF5IHRleHQuIFJlY2FsY3VsYXRlcyBvbiByZXNpemUsIGZvbnQgbG9hZGluZywgYW5kIHZhbHVlIGNoYW5nZXMuXG4gKiBQb3dlcnMgdGhlIGA8TWlkZGxlVHJ1bmNhdGU+YCAoYDxzcGFuPmApIGNvbXBvbmVudC5cbiAqXG4gKiBEb2N1bWVudGF0aW9uOiBbR2Vpc3QgTWlkZGxlIFRydW5jYXRlXShodHRwczovL3ZlcmNlbC5jb20vZ2Vpc3QvbWlkZGxlLXRydW5jYXRlKVxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIEZ1bGwgdGV4dCBzdHJpbmcgdG8gdHJ1bmNhdGUuXG4gKi9cbmZ1bmN0aW9uIHVzZU1pZGRsZVRydW5jYXRlKHZhbHVlOiBzdHJpbmcpOiB7XG4gIHJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxTcGFuRWxlbWVudCB8IG51bGw+O1xuICBtZWFzdXJlUmVmOiBSZWFjdC5SZWZPYmplY3Q8SFRNTFNwYW5FbGVtZW50IHwgbnVsbD47XG4gIGRpc3BsYXlUZXh0OiBzdHJpbmc7XG4gIGlzVHJ1bmNhdGVkOiBib29sZWFuO1xuICBwcmVmaXhHcmFwaGVtZUNvdW50OiBudW1iZXI7XG4gIHByZWZpeFRleHQ6IHN0cmluZztcbiAgc3VmZml4R3JhcGhlbWVDb3VudDogbnVtYmVyO1xuICBzdWZmaXhUZXh0OiBzdHJpbmc7XG59IHtcbiAgY29uc3QgZ3JhcGhlbWVzID0gdXNlTWVtbygoKSA9PiB0b0dyYXBoZW1lcyh2YWx1ZSksIFt2YWx1ZV0pO1xuICBjb25zdCBmdWxsU3RhdGUgPSB1c2VNZW1vKFxuICAgICgpID0+IGNyZWF0ZUZ1bGxTdGF0ZSh2YWx1ZSwgZ3JhcGhlbWVzKSxcbiAgICBbZ3JhcGhlbWVzLCB2YWx1ZV1cbiAgKTtcbiAgY29uc3QgcmVmID0gdXNlUmVmPEhUTUxTcGFuRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBtZWFzdXJlUmVmID0gdXNlUmVmPEhUTUxTcGFuRWxlbWVudCB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc3RhdGUsIHNldFN0YXRlXSA9IHVzZVN0YXRlPE1pZGRsZVRydW5jYXRlU3RhdGU+KCgpID0+IGZ1bGxTdGF0ZSk7XG4gIGNvbnN0IHJhZlJlZiA9IHVzZVJlZjxudW1iZXI+KDApO1xuXG4gIGNvbnN0IHVwZGF0ZVN0YXRlID0gdXNlQ2FsbGJhY2soKG5leHRTdGF0ZTogTWlkZGxlVHJ1bmNhdGVTdGF0ZSkgPT4ge1xuICAgIHNldFN0YXRlKChjdXJyZW50U3RhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgY3VycmVudFN0YXRlLmRpc3BsYXlUZXh0ID09PSBuZXh0U3RhdGUuZGlzcGxheVRleHQgJiZcbiAgICAgICAgY3VycmVudFN0YXRlLmlzVHJ1bmNhdGVkID09PSBuZXh0U3RhdGUuaXNUcnVuY2F0ZWQgJiZcbiAgICAgICAgY3VycmVudFN0YXRlLnByZWZpeFRleHQgPT09IG5leHRTdGF0ZS5wcmVmaXhUZXh0ICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5wcmVmaXhHcmFwaGVtZUNvdW50ID09PSBuZXh0U3RhdGUucHJlZml4R3JhcGhlbWVDb3VudCAmJlxuICAgICAgICBjdXJyZW50U3RhdGUuc3VmZml4VGV4dCA9PT0gbmV4dFN0YXRlLnN1ZmZpeFRleHQgJiZcbiAgICAgICAgY3VycmVudFN0YXRlLnN1ZmZpeEdyYXBoZW1lQ291bnQgPT09IG5leHRTdGF0ZS5zdWZmaXhHcmFwaGVtZUNvdW50XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9KTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IHJlY2FsY3VsYXRlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gcmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgbWVhc3VyZUVsID0gbWVhc3VyZVJlZi5jdXJyZW50O1xuICAgIGlmICghZWwgfHwgIW1lYXN1cmVFbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYXZhaWxhYmxlID0gZWwuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoYXZhaWxhYmxlIDw9IDApIHtcbiAgICAgIHVwZGF0ZVN0YXRlKGZ1bGxTdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVhc3VyZSA9ICh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgICAgbWVhc3VyZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgIHJldHVybiBtZWFzdXJlRWwuc2Nyb2xsV2lkdGg7XG4gICAgfTtcblxuICAgIGNvbnN0IGZ1bGxXaWR0aCA9IG1lYXN1cmUodmFsdWUpO1xuXG4gICAgaWYgKGZ1bGxXaWR0aCA8PSBhdmFpbGFibGUpIHtcbiAgICAgIHVwZGF0ZVN0YXRlKGZ1bGxTdGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbWlkZGxlVHJ1bmNhdGUoZ3JhcGhlbWVzLCBhdmFpbGFibGUsIG1lYXN1cmUsIGZ1bGxXaWR0aCk7XG4gICAgdXBkYXRlU3RhdGUoe1xuICAgICAgZGlzcGxheVRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgaXNUcnVuY2F0ZWQ6IHJlc3VsdC50cnVuY2F0ZWQsXG4gICAgICBwcmVmaXhHcmFwaGVtZUNvdW50OiByZXN1bHQucHJlZml4R3JhcGhlbWVDb3VudCxcbiAgICAgIHByZWZpeFRleHQ6IHJlc3VsdC5wcmVmaXhUZXh0LFxuICAgICAgc3VmZml4R3JhcGhlbWVDb3VudDogcmVzdWx0LnN1ZmZpeEdyYXBoZW1lQ291bnQsXG4gICAgICBzdWZmaXhUZXh0OiByZXN1bHQuc3VmZml4VGV4dCxcbiAgICB9KTtcbiAgfSwgW2Z1bGxTdGF0ZSwgZ3JhcGhlbWVzLCB1cGRhdGVTdGF0ZSwgdmFsdWVdKTtcblxuICAvLyBNZWFzdXJlIG9uIG1vdW50IGFuZCB3aGVuIHZhbHVlIGNoYW5nZXMgLSBiZWZvcmUgcGFpbnRcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgcmVjYWxjdWxhdGUoKTtcbiAgfSwgW3JlY2FsY3VsYXRlXSk7XG5cbiAgLy8gUmVzaXplT2JzZXJ2ZXIgKyBmb250IGxvYWRpbmcgZm9yIG9uZ29pbmcgcmVzcG9uc2l2ZW5lc3NcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlbCA9IHJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IGRlYm91bmNlZFJlY2FsYyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlY2FsY3VsYXRlKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm8gPVxuICAgICAgdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IG5ldyBSZXNpemVPYnNlcnZlcihkZWJvdW5jZWRSZWNhbGMpXG4gICAgICAgIDogbnVsbDtcbiAgICBybz8ub2JzZXJ2ZShlbCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGRlYm91bmNlZFJlY2FsYyk7XG5cbiAgICBjb25zdCBvbkZvbnRzTG9hZGVkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgZGVib3VuY2VkUmVjYWxjKCk7XG4gICAgfTtcbiAgICBjb25zdCBmb250U2V0ID0gJ2ZvbnRzJyBpbiBkb2N1bWVudCA/IGRvY3VtZW50LmZvbnRzIDogbnVsbDtcbiAgICBmb250U2V0Py5hZGRFdmVudExpc3RlbmVyPy4oJ2xvYWRpbmdkb25lJywgb25Gb250c0xvYWRlZCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcm8/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBkZWJvdW5jZWRSZWNhbGMpO1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgICAgZm9udFNldD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKCdsb2FkaW5nZG9uZScsIG9uRm9udHNMb2FkZWQpO1xuICAgIH07XG4gIH0sIFtyZWNhbGN1bGF0ZV0pO1xuXG4gIHJldHVybiB7XG4gICAgcmVmLFxuICAgIG1lYXN1cmVSZWYsXG4gICAgZGlzcGxheVRleHQ6IHN0YXRlLmRpc3BsYXlUZXh0LFxuICAgIGlzVHJ1bmNhdGVkOiBzdGF0ZS5pc1RydW5jYXRlZCxcbiAgICBwcmVmaXhHcmFwaGVtZUNvdW50OiBzdGF0ZS5wcmVmaXhHcmFwaGVtZUNvdW50LFxuICAgIHByZWZpeFRleHQ6IHN0YXRlLnByZWZpeFRleHQsXG4gICAgc3VmZml4R3JhcGhlbWVDb3VudDogc3RhdGUuc3VmZml4R3JhcGhlbWVDb3VudCxcbiAgICBzdWZmaXhUZXh0OiBzdGF0ZS5zdWZmaXhUZXh0LFxuICB9O1xufVxuXG5leHBvcnQgeyB1c2VNaWRkbGVUcnVuY2F0ZSB9O1xuIl19
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1pZGRsZS10cnVuY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21pZGRsZS10cnVuY2F0ZS91c2UtbWlkZGxlLXRydW5jYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULGVBQWUsRUFDZixPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXpELE1BQU0seUJBQXlCLEdBQzdCLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7QUFzQjlELFNBQVMsZUFBZSxDQUN0QixLQUFhLEVBQ2IsU0FBbUI7SUFFbkIsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxNQUFNO1FBQ3JDLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLG1CQUFtQixFQUFFLENBQUM7UUFDdEIsVUFBVSxFQUFFLEVBQUU7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFVdEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUN2QixHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FB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LEtBQUssQ0FBQyxXQUFXO1FBQzlCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2FuY2VsTWVhc3VyZW1lbnQsIHNjaGVkdWxlTWVhc3VyZW1lbnQgfSBmcm9tICcuL21lYXN1cmVtZW50LWJhdGNoJztcbmltcG9ydCB7IG1pZGRsZVRydW5jYXRlLCB0b0dyYXBoZW1lcyB9IGZyb20gJy4vdHJ1bmNhdGUnO1xuXG5jb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID1cbiAgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyB1c2VFZmZlY3QgOiB1c2VMYXlvdXRFZmZlY3Q7XG5cbmludGVyZmFjZSBNaWRkbGVUcnVuY2F0ZVN0YXRlIHtcbiAgZGlzcGxheVRleHQ6IHN0cmluZztcbiAgaXNUcnVuY2F0ZWQ6IGJvb2xlYW47XG4gIHByZWZpeEdyYXBoZW1lQ291bnQ6IG51bWJlcjtcbiAgcHJlZml4VGV4dDogc3RyaW5nO1xuICBzdWZmaXhHcmFwaGVtZUNvdW50OiBudW1iZXI7XG4gIHN1ZmZpeFRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE1pZGRsZVRydW5jYXRlTWVhc3VyZW1lbnQge1xuICBhdmFpbGFibGVXaWR0aDogbnVtYmVyO1xuICB0eXBvZ3JhcGh5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUZXh0TWVhc3VyZW1lbnRDYWNoZSB7XG4gIHR5cG9ncmFwaHk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgd2lkdGhzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdWxsU3RhdGUoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGdyYXBoZW1lczogc3RyaW5nW11cbik6IE1pZGRsZVRydW5jYXRlU3RhdGUge1xuICByZXR1cm4ge1xuICAgIGRpc3BsYXlUZXh0OiB2YWx1ZSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgcHJlZml4R3JhcGhlbWVDb3VudDogZ3JhcGhlbWVzLmxlbmd0aCxcbiAgICBwcmVmaXhUZXh0OiB2YWx1ZSxcbiAgICBzdWZmaXhHcmFwaGVtZUNvdW50OiAwLFxuICAgIHN1ZmZpeFRleHQ6ICcnLFxuICB9O1xufVxuXG4vKipcbiAqIE1pZGRsZS10cnVuY2F0aW9uIGxvZ2ljLiBSZXR1cm5zIHJlZnMgdG8gYXR0YWNoIHRvIHRoZSBjb250YWluZXIgYW5kIG1lYXN1cmVtZW50IGVsZW1lbnRzLCBwbHVzIHRoZSB0cnVuY2F0ZWQgZGlzcGxheSB0ZXh0LiBSZWNhbGN1bGF0ZXMgb24gcmVzaXplLCBmb250IGxvYWRpbmcsIGFuZCB2YWx1ZSBjaGFuZ2VzLlxuICogUG93ZXJzIHRoZSBgPE1pZGRsZVRydW5jYXRlPmAgKGA8c3Bhbj5gKSBjb21wb25lbnQuXG4gKlxuICogRG9jdW1lbnRhdGlvbjogW0dlaXN0IE1pZGRsZSBUcnVuY2F0ZV0oaHR0cHM6Ly92ZXJjZWwuY29tL2dlaXN0L21pZGRsZS10cnVuY2F0ZSlcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBGdWxsIHRleHQgc3RyaW5nIHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiB1c2VNaWRkbGVUcnVuY2F0ZSh2YWx1ZTogc3RyaW5nKToge1xuICByZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPjtcbiAgbWVhc3VyZVJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxTcGFuRWxlbWVudCB8IG51bGw+O1xuICBkaXNwbGF5VGV4dDogc3RyaW5nO1xuICBpc1RydW5jYXRlZDogYm9vbGVhbjtcbiAgcHJlZml4R3JhcGhlbWVDb3VudDogbnVtYmVyO1xuICBwcmVmaXhUZXh0OiBzdHJpbmc7XG4gIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IG51bWJlcjtcbiAgc3VmZml4VGV4dDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IGdyYXBoZW1lcyA9IHVzZU1lbW8oKCkgPT4gdG9HcmFwaGVtZXModmFsdWUpLCBbdmFsdWVdKTtcbiAgY29uc3QgZnVsbFN0YXRlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBjcmVhdGVGdWxsU3RhdGUodmFsdWUsIGdyYXBoZW1lcyksXG4gICAgW2dyYXBoZW1lcywgdmFsdWVdXG4gICk7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVhc3VyZVJlZiA9IHVzZVJlZjxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxNaWRkbGVUcnVuY2F0ZVN0YXRlPigoKSA9PiBmdWxsU3RhdGUpO1xuICBjb25zdCBtZWFzdXJlbWVudEtleVJlZiA9IHVzZVJlZjxvYmplY3Q+KHt9KTtcbiAgY29uc3QgdGV4dE1lYXN1cmVtZW50Q2FjaGVSZWYgPSB1c2VSZWY8VGV4dE1lYXN1cmVtZW50Q2FjaGU+KHtcbiAgICB0eXBvZ3JhcGh5OiAnJyxcbiAgICB2YWx1ZSxcbiAgICB3aWR0aHM6IG5ldyBNYXAoKSxcbiAgfSk7XG4gIGNvbnN0IGxhc3RNZWFzdXJlbWVudFJlZiA9IHVzZVJlZjxcbiAgICAoTWlkZGxlVHJ1bmNhdGVNZWFzdXJlbWVudCAmIHsgdmFsdWU6IHN0cmluZyB9KSB8IG51bGxcbiAgPihudWxsKTtcblxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IHVzZUNhbGxiYWNrKChuZXh0U3RhdGU6IE1pZGRsZVRydW5jYXRlU3RhdGUpID0+IHtcbiAgICBzZXRTdGF0ZSgoY3VycmVudFN0YXRlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5kaXNwbGF5VGV4dCA9PT0gbmV4dFN0YXRlLmRpc3BsYXlUZXh0ICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5pc1RydW5jYXRlZCA9PT0gbmV4dFN0YXRlLmlzVHJ1bmNhdGVkICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5wcmVmaXhUZXh0ID09PSBuZXh0U3RhdGUucHJlZml4VGV4dCAmJlxuICAgICAgICBjdXJyZW50U3RhdGUucHJlZml4R3JhcGhlbWVDb3VudCA9PT0gbmV4dFN0YXRlLnByZWZpeEdyYXBoZW1lQ291bnQgJiZcbiAgICAgICAgY3VycmVudFN0YXRlLnN1ZmZpeFRleHQgPT09IG5leHRTdGF0ZS5zdWZmaXhUZXh0ICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5zdWZmaXhHcmFwaGVtZUNvdW50ID09PSBuZXh0U3RhdGUuc3VmZml4R3JhcGhlbWVDb3VudFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCByZWFkTWVhc3VyZW1lbnQgPSB1c2VDYWxsYmFjaygoKTogTWlkZGxlVHJ1bmNhdGVNZWFzdXJlbWVudCB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGVsID0gcmVmLmN1cnJlbnQ7XG4gICAgY29uc3QgbWVhc3VyZUVsID0gbWVhc3VyZVJlZi5jdXJyZW50O1xuICAgIGlmICghZWwgfHwgIW1lYXN1cmVFbCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IGVsLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShtZWFzdXJlRWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF2YWlsYWJsZVdpZHRoLFxuICAgICAgdHlwb2dyYXBoeTogW1xuICAgICAgICBzdHlsZS5mb250RmFtaWx5LFxuICAgICAgICBzdHlsZS5mb250RmVhdHVyZVNldHRpbmdzLFxuICAgICAgICBzdHlsZS5mb250S2VybmluZyxcbiAgICAgICAgc3R5bGUuZm9udFNpemUsXG4gICAgICAgIHN0eWxlLmZvbnRTdHJldGNoLFxuICAgICAgICBzdHlsZS5mb250U3R5bGUsXG4gICAgICAgIHN0eWxlLmZvbnRWYXJpYXRpb25TZXR0aW5ncyxcbiAgICAgICAgc3R5bGUuZm9udFdlaWdodCxcbiAgICAgICAgc3R5bGUubGV0dGVyU3BhY2luZyxcbiAgICAgICAgc3R5bGUudGV4dFRyYW5zZm9ybSxcbiAgICAgIF0uam9pbignXFwwJyksXG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IHJlY2FsY3VsYXRlID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgYXZhaWxhYmxlV2lkdGgsIHR5cG9ncmFwaHkgfTogTWlkZGxlVHJ1bmNhdGVNZWFzdXJlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWVhc3VyZUVsID0gbWVhc3VyZVJlZi5jdXJyZW50O1xuICAgICAgaWYgKCFtZWFzdXJlRWwpIHJldHVybjtcblxuICAgICAgY29uc3QgbGFzdE1lYXN1cmVtZW50ID0gbGFzdE1lYXN1cmVtZW50UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RNZWFzdXJlbWVudD8uYXZhaWxhYmxlV2lkdGggPT09IGF2YWlsYWJsZVdpZHRoICYmXG4gICAgICAgIGxhc3RNZWFzdXJlbWVudC50eXBvZ3JhcGh5ID09PSB0eXBvZ3JhcGh5ICYmXG4gICAgICAgIGxhc3RNZWFzdXJlbWVudC52YWx1ZSA9PT0gdmFsdWVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RNZWFzdXJlbWVudFJlZi5jdXJyZW50ID0ge1xuICAgICAgICBhdmFpbGFibGVXaWR0aCxcbiAgICAgICAgdHlwb2dyYXBoeSxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9O1xuXG4gICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPD0gMCkge1xuICAgICAgICB1cGRhdGVTdGF0ZShmdWxsU3RhdGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRleHRNZWFzdXJlbWVudENhY2hlID0gdGV4dE1lYXN1cmVtZW50Q2FjaGVSZWYuY3VycmVudDtcbiAgICAgIGlmIChcbiAgICAgICAgdGV4dE1lYXN1cmVtZW50Q2FjaGUudHlwb2dyYXBoeSAhPT0gdHlwb2dyYXBoeSB8fFxuICAgICAgICB0ZXh0TWVhc3VyZW1lbnRDYWNoZS52YWx1ZSAhPT0gdmFsdWVcbiAgICAgICkge1xuICAgICAgICB0ZXh0TWVhc3VyZW1lbnRDYWNoZS50eXBvZ3JhcGh5ID0gdHlwb2dyYXBoeTtcbiAgICAgICAgdGV4dE1lYXN1cmVtZW50Q2FjaGUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGV4dE1lYXN1cmVtZW50Q2FjaGUud2lkdGhzLmNsZWFyKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lYXN1cmUgPSAodGV4dDogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVkV2lkdGggPSB0ZXh0TWVhc3VyZW1lbnRDYWNoZS53aWR0aHMuZ2V0KHRleHQpO1xuICAgICAgICBpZiAoY2FjaGVkV2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBjYWNoZWRXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lYXN1cmVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gbWVhc3VyZUVsLnNjcm9sbFdpZHRoO1xuICAgICAgICB0ZXh0TWVhc3VyZW1lbnRDYWNoZS53aWR0aHMuc2V0KHRleHQsIHdpZHRoKTtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZnVsbFdpZHRoID0gbWVhc3VyZSh2YWx1ZSk7XG5cbiAgICAgIGlmIChmdWxsV2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpIHtcbiAgICAgICAgdXBkYXRlU3RhdGUoZnVsbFN0YXRlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBtaWRkbGVUcnVuY2F0ZShcbiAgICAgICAgZ3JhcGhlbWVzLFxuICAgICAgICBhdmFpbGFibGVXaWR0aCxcbiAgICAgICAgbWVhc3VyZSxcbiAgICAgICAgZnVsbFdpZHRoXG4gICAgICApO1xuICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICBkaXNwbGF5VGV4dDogcmVzdWx0LnRleHQsXG4gICAgICAgIGlzVHJ1bmNhdGVkOiByZXN1bHQudHJ1bmNhdGVkLFxuICAgICAgICBwcmVmaXhHcmFwaGVtZUNvdW50OiByZXN1bHQucHJlZml4R3JhcGhlbWVDb3VudCxcbiAgICAgICAgcHJlZml4VGV4dDogcmVzdWx0LnByZWZpeFRleHQsXG4gICAgICAgIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IHJlc3VsdC5zdWZmaXhHcmFwaGVtZUNvdW50LFxuICAgICAgICBzdWZmaXhUZXh0OiByZXN1bHQuc3VmZml4VGV4dCxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgW2Z1bGxTdGF0ZSwgZ3JhcGhlbWVzLCB1cGRhdGVTdGF0ZSwgdmFsdWVdXG4gICk7XG5cbiAgLy8gTWVhc3VyZSBvbiBtb3VudCBhbmQgd2hlbiB2YWx1ZSBjaGFuZ2VzIC0gYmVmb3JlIHBhaW50XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG1lYXN1cmVtZW50ID0gcmVhZE1lYXN1cmVtZW50KCk7XG4gICAgaWYgKG1lYXN1cmVtZW50KSB7XG4gICAgICByZWNhbGN1bGF0ZShtZWFzdXJlbWVudCk7XG4gICAgfVxuICB9LCBbcmVhZE1lYXN1cmVtZW50LCByZWNhbGN1bGF0ZV0pO1xuXG4gIC8vIFJlc2l6ZU9ic2VydmVyICsgZm9udCBsb2FkaW5nIGZvciBvbmdvaW5nIHJlc3BvbnNpdmVuZXNzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSByZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBtZWFzdXJlbWVudEtleSA9IG1lYXN1cmVtZW50S2V5UmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qgc2NoZWR1bGVSZWNhbGN1bGF0aW9uID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2NoZWR1bGVNZWFzdXJlbWVudChtZWFzdXJlbWVudEtleSwge1xuICAgICAgICByZWFkOiByZWFkTWVhc3VyZW1lbnQsXG4gICAgICAgIG1lYXN1cmU6IHJlY2FsY3VsYXRlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvID1cbiAgICAgIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBuZXcgUmVzaXplT2JzZXJ2ZXIoc2NoZWR1bGVSZWNhbGN1bGF0aW9uKVxuICAgICAgICA6IG51bGw7XG4gICAgcm8/Lm9ic2VydmUoZWwpO1xuICAgIGlmICghcm8pIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBzY2hlZHVsZVJlY2FsY3VsYXRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IG9uRm9udHNMb2FkZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0ZXh0TWVhc3VyZW1lbnRDYWNoZVJlZi5jdXJyZW50LndpZHRocy5jbGVhcigpO1xuICAgICAgbGFzdE1lYXN1cmVtZW50UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgc2NoZWR1bGVSZWNhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgICBjb25zdCBmb250U2V0ID0gJ2ZvbnRzJyBpbiBkb2N1bWVudCA/IGRvY3VtZW50LmZvbnRzIDogbnVsbDtcbiAgICBmb250U2V0Py5hZGRFdmVudExpc3RlbmVyPy4oJ2xvYWRpbmdkb25lJywgb25Gb250c0xvYWRlZCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcm8/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIGlmICghcm8pIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHNjaGVkdWxlUmVjYWxjdWxhdGlvbik7XG4gICAgICB9XG4gICAgICBjYW5jZWxNZWFzdXJlbWVudChtZWFzdXJlbWVudEtleSk7XG4gICAgICBmb250U2V0Py5yZW1vdmVFdmVudExpc3RlbmVyPy4oJ2xvYWRpbmdkb25lJywgb25Gb250c0xvYWRlZCk7XG4gICAgfTtcbiAgfSwgW3JlYWRNZWFzdXJlbWVudCwgcmVjYWxjdWxhdGVdKTtcblxuICByZXR1cm4ge1xuICAgIHJlZixcbiAgICBtZWFzdXJlUmVmLFxuICAgIGRpc3BsYXlUZXh0OiBzdGF0ZS5kaXNwbGF5VGV4dCxcbiAgICBpc1RydW5jYXRlZDogc3RhdGUuaXNUcnVuY2F0ZWQsXG4gICAgcHJlZml4R3JhcGhlbWVDb3VudDogc3RhdGUucHJlZml4R3JhcGhlbWVDb3VudCxcbiAgICBwcmVmaXhUZXh0OiBzdGF0ZS5wcmVmaXhUZXh0LFxuICAgIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IHN0YXRlLnN1ZmZpeEdyYXBoZW1lQ291bnQsXG4gICAgc3VmZml4VGV4dDogc3RhdGUuc3VmZml4VGV4dCxcbiAgfTtcbn1cblxuZXhwb3J0IHsgdXNlTWlkZGxlVHJ1bmNhdGUgfTtcbiJdfQ==
@@ -103,9 +103,9 @@ export const Minimap = memo(function Minimap({ spans, root, viewport, minViewpor
103
103
  const clamp = useCallback((next) => clampViewportToRoot(next, rootStartMs, rootEndMs, minViewportMs), [rootStartMs, rootEndMs, minViewportMs]);
104
104
  // Density canvas: one thin line per span across the full run. Sizing is
105
105
  // read live and redraws run straight from the ResizeObserver (which fires
106
- // before paint), so layout changes e.g. the detail panel opening never
106
+ // before paint), so layout changes (e.g. the detail panel opening) never
107
107
  // paint a frame with a stale, stretched bitmap.
108
- // biome-ignore lint/correctness/useExhaustiveDependencies: themeVersion is a redraw trigger the canvas re-resolves its token colors when the theme flips
108
+ // biome-ignore lint/correctness/useExhaustiveDependencies: themeVersion is a redraw trigger; the canvas re-resolves its token colors when the theme flips
109
109
  useLayoutEffect(() => {
110
110
  const canvas = canvasRef.current;
111
111
  const container = containerRef.current;
@@ -167,7 +167,7 @@ export const Minimap = memo(function Minimap({ spans, root, viewport, minViewpor
167
167
  return { mode: 'resize-right' };
168
168
  }
169
169
  // Panning a full-extent window is a no-op, so let a drag on the brush
170
- // start a selection instead the natural first gesture on the map.
170
+ // start a selection instead, the natural first gesture on the map.
171
171
  const { start, end } = viewportRef.current;
172
172
  const isFullExtent = start - rootStartMs < rootDurationMs * 0.001 &&
173
173
  rootEndMs - end < rootDurationMs * 0.001;
@@ -334,4 +334,4 @@ export const Minimap = memo(function Minimap({ spans, root, viewport, minViewpor
334
334
  // Glass thumb, matching the legacy trace viewer's map window.
335
335
  'group/minimap-brush absolute top-0.5 bottom-0.5 rounded-[3px] border border-gray-alpha-400 bg-gray-alpha-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--ds-focus-color)]', drag?.mode === 'pan' ? 'cursor-grabbing' : 'cursor-grab'), style: brushStyle, children: [_jsx("div", { "data-minimap-handle": "left", className: "absolute inset-y-0 -left-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) }), _jsx("div", { "data-minimap-handle": "right", className: "absolute inset-y-0 -right-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) })] })] }));
336
336
  });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21pbmltYXAudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFHYixPQUFPLEVBQ0wsSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxFQUdiLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3QixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QiwwRUFBMEU7QUFDMUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBRWxDOzs7O0dBSUc7QUFDSCxNQUFNLG9CQUFvQixHQUEyQjtJQUNuRCxHQUFHLEVBQUUsZUFBZTtJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxlQUFlO0lBQ3JCLEtBQUssRUFBRSxlQUFlO0NBQ3ZCLENBQUM7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eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblByZWNpc2UsIGdldEhpZ2hSZXNJbk1zIH0gZnJvbSAnLi4vdXRpbC90aW1pbmcnO1xuaW1wb3J0IHtcbiAgY2xhbXBWaWV3cG9ydFRvUm9vdCxcbiAgaXNTcGFuRXJyb3JlZCxcbiAgdHlwZSBSb290Qm91bmRzLFxuICB0eXBlIFZpZXdwb3J0UmFuZ2UsXG4gIHdoZWVsRGVsdGFUb1BpeGVscyxcbiAgd2hlZWxab29tU2NhbGVGYWN0b3IsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRJTUVMSU5FX1BBRERJTkdfUFggfSBmcm9tICcuL3RpbWVsaW5lJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBDQU5WQVNfUEFEX1lfUFggPSA2O1xuY29uc3QgTUlOX0xJTkVfSEVJR0hUX1BYID0gMS41O1xuY29uc3QgTUFYX0xJTkVfSEVJR0hUX1BYID0gMztcbmNvbnN0IE1JTl9MSU5FX1dJRFRIX1BYID0gMjtcbi8qKiBQb2ludGVyIHRyYXZlbCBiZWxvdyB0aGlzIGlzIHRyZWF0ZWQgYXMgYSBjbGljayByYXRoZXIgdGhhbiBhIGRyYWcuICovXG5jb25zdCBDTElDS19EUkFHX1RIUkVTSE9MRF9QWCA9IDM7XG5jb25zdCBNSU5fQlJVU0hfV0lEVEhfUFggPSA2O1xuLyoqIEZyYWN0aW9uIG9mIHRoZSBjdXJyZW50IHdpbmRvdyB0aGF0IGFycm93IGtleXMgcGFuIGJ5LiAqL1xuY29uc3QgS0VZQk9BUkRfUEFOX0ZSQUNUSU9OID0gMC4xO1xuXG4vKipcbiAqIExpbmUgY29sb3JzIHJlc29sdmVkIGZyb20gdGhlIGRlc2lnbi1zeXN0ZW0gdG9rZW5zIG9uIHRoZSBjb250YWluZXIsIHNvIHRoZVxuICogY2FudmFzIGZvbGxvd3MgdGhlIGFjdGl2ZSB0aGVtZS4gUnVucyBhbmQgc3RlcHMgY2FycnkgdGhlIGFjY2VudCBodWVzO1xuICogcGFzc2l2ZSBzcGFucyAoaG9va3MsIHNsZWVwcykgc3RheSBncmF5IGxpa2UgdGhlaXIgZXZlbnQtbGlzdCBpY29ucy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfTElORV9UT0tFTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHJ1bjogJy0tZHMtYmx1ZS00MDAnLFxuICBzdGVwOiAnLS1kcy1ncmVlbi00MDAnLFxuICBob29rOiAnLS1kcy1ncmF5LTQwMCcsXG4gIHNsZWVwOiAnLS1kcy1ncmF5LTQwMCcsXG59O1xuY29uc3QgREVGQVVMVF9MSU5FX1RPS0VOID0gJy0tZHMtZ3JheS00MDAnO1xuY29uc3QgRVJST1JfTElORV9UT0tFTiA9ICctLWRzLXJlZC00MDAnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbnNpdHkgbGF5ZXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgRGVuc2l0eUxheW91dCB7XG4gIGxpbmVIZWlnaHQ6IG51bWJlcjtcbiAgLyoqIFt4LCB5LCB3aWR0aF0gcmVjdHMgZ3JvdXBlZCBieSBjb2xvciB0b2tlbiwgb25lIGZpbGwgcGFzcyBwZXIgY29sb3IuICovXG4gIHJlY3RzQnlUb2tlbjogTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVuc2l0eUxheW91dChcbiAgc3BhbnM6IFNwYW5bXSxcbiAgcm9vdFN0YXJ0TXM6IG51bWJlcixcbiAgcm9vdER1cmF0aW9uTXM6IG51bWJlcixcbiAgY29udGVudFdpZHRoOiBudW1iZXIsXG4gIGNvbnRlbnRIZWlnaHQ6IG51bWJlclxuKTogRGVuc2l0eUxheW91dCB7XG4gIGNvbnN0IGNvdW50ID0gc3BhbnMubGVuZ3RoO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gTWF0aC5tYXgoXG4gICAgTUlOX0xJTkVfSEVJR0hUX1BYLFxuICAgIE1hdGgubWluKE1BWF9MSU5FX0hFSUdIVF9QWCwgY29udGVudEhlaWdodCAvIGNvdW50KVxuICApO1xuICAvLyBEaXN0cmlidXRlIHJvd3MgYWNyb3NzIHRoZSBzdHJpcDsgbmV2ZXIgc3ByZWFkIGEgaGFuZGZ1bCBvZiBzcGFucyBmdXJ0aGVyXG4gIC8vIGFwYXJ0IHRoYW4gb25lIGxpbmUgKyAxcHggZ2FwLlxuICBjb25zdCByb3dTdGVwID1cbiAgICBjb3VudCA+IDFcbiAgICAgID8gTWF0aC5taW4oKGNvbnRlbnRIZWlnaHQgLSBsaW5lSGVpZ2h0KSAvIChjb3VudCAtIDEpLCBsaW5lSGVpZ2h0ICsgMSlcbiAgICAgIDogMDtcblxuICBjb25zdCByZWN0c0J5VG9rZW4gPSBuZXcgTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+KCk7XG4gIHNwYW5zLmZvckVhY2goKHNwYW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBpc1NwYW5FcnJvcmVkKHNwYW4pXG4gICAgICA/IEVSUk9SX0xJTkVfVE9LRU5cbiAgICAgIDogKFJFU09VUkNFX0xJTkVfVE9LRU5TW3NwYW4ucmVzb3VyY2VdID8/IERFRkFVTFRfTElORV9UT0tFTik7XG4gICAgY29uc3Qgc3RhcnRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gICAgY29uc3QgeCA9XG4gICAgICBUSU1FTElORV9QQURESU5HX1BYICtcbiAgICAgICgoc3RhcnRNcyAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aDtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoXG4gICAgICBNSU5fTElORV9XSURUSF9QWCxcbiAgICAgICgoZW5kTXMgLSBzdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aFxuICAgICk7XG4gICAgY29uc3QgeSA9IENBTlZBU19QQURfWV9QWCArIGluZGV4ICogcm93U3RlcDtcbiAgICBjb25zdCByZWN0cyA9IHJlY3RzQnlUb2tlbi5nZXQodG9rZW4pID8/IFtdO1xuICAgIHJlY3RzLnB1c2goW3gsIHksIHddKTtcbiAgICByZWN0c0J5VG9rZW4uc2V0KHRva2VuLCByZWN0cyk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGxpbmVIZWlnaHQsIHJlY3RzQnlUb2tlbiB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvb2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRyYWNrIHRoZSBkaXNwbGF5J3MgZGV2aWNlIHBpeGVsIHJhdGlvIChjaGFuZ2VzIHdoZW4gbW92aW5nIG1vbml0b3JzKS4gKi9cbmZ1bmN0aW9uIHVzZURwcigpOiBudW1iZXIge1xuICBjb25zdCBbZHByLCBzZXREcHJdID0gdXNlU3RhdGUoMSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKTogdm9pZCA9PiBzZXREcHIod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgY29uc3QgbWVkaWEgPSBtYXRjaE1lZGlhKGAocmVzb2x1dGlvbjogJHtkcHJ9ZHBweClgKTtcbiAgICBtZWRpYS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgb25DaGFuZ2UoKTtcbiAgICByZXR1cm4gKCkgPT4gbWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25DaGFuZ2UpO1xuICB9LCBbZHByXSk7XG4gIHJldHVybiBkcHI7XG59XG5cbi8qKiBCdW1wIGEgY291bnRlciB3aGVuIHRoZSB0aGVtZSAoaHRtbCBjbGFzcy9kYXRhLXRoZW1lKSBjaGFuZ2VzLiAqL1xuZnVuY3Rpb24gdXNlVGhlbWVWZXJzaW9uKCk6IG51bWJlciB7XG4gIGNvbnN0IFt2ZXJzaW9uLCBzZXRWZXJzaW9uXSA9IHVzZVN0YXRlKDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2V0VmVyc2lvbigodikgPT4gdiArIDEpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcycsICdkYXRhLXRoZW1lJywgJ3N0eWxlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaW5pbWFwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBEcmFnU3RhdGUgPVxuICB8IHsgbW9kZTogJ3Bhbic7IGdyYWJPZmZzZXRNczogbnVtYmVyIH1cbiAgfCB7IG1vZGU6ICdyZXNpemUtbGVmdCcgfVxuICB8IHsgbW9kZTogJ3Jlc2l6ZS1yaWdodCcgfVxuICB8IHsgbW9kZTogJ3NlbGVjdCc7IG9yaWdpblg6IG51bWJlcjsgb3JpZ2luTXM6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgTWluaW1hcCA9IG1lbW8oZnVuY3Rpb24gTWluaW1hcCh7XG4gIHNwYW5zLFxuICByb290LFxuICB2aWV3cG9ydCxcbiAgbWluVmlld3BvcnRNcyxcbiAgb25WaWV3cG9ydENoYW5nZSxcbiAgb25BbmltYXRlVG8sXG59OiB7XG4gIHNwYW5zOiBTcGFuW107XG4gIHJvb3Q6IFJvb3RCb3VuZHM7XG4gIHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlO1xuICBtaW5WaWV3cG9ydE1zOiBudW1iZXI7XG4gIC8qKiBJbW1lZGlhdGUgdmlld3BvcnQgdXBkYXRlICh1c2VkIHdoaWxlIGRyYWdnaW5nKS4gKi9cbiAgb25WaWV3cG9ydENoYW5nZTogKHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlKSA9PiB2b2lkO1xuICAvKiogRWFzZWQgdmlld3BvcnQgdHJhbnNpdGlvbiAodXNlZCBmb3IgY2xpY2stdG8tanVtcCBhbmQgc2VsZWN0aW9ucykuICovXG4gIG9uQW5pbWF0ZVRvOiAodmlld3BvcnQ6IFZpZXdwb3J0UmFuZ2UpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qge1xuICAgIHN0YXJ0VGltZTogcm9vdFN0YXJ0TXMsXG4gICAgZW5kVGltZTogcm9vdEVuZE1zLFxuICAgIGR1cmF0aW9uOiByb290RHVyYXRpb25NcyxcbiAgfSA9IHJvb3Q7XG5cbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgY2FudmFzUmVmID0gdXNlUmVmPEhUTUxDYW52YXNFbGVtZW50PihudWxsKTtcbiAgY29uc3QgZHByID0gdXNlRHByKCk7XG4gIGNvbnN0IHRoZW1lVmVyc2lvbiA9IHVzZVRoZW1lVmVyc2lvbigpO1xuXG4gIC8vIExhdGVzdCB2aWV3cG9ydCBmb3IgcG9pbnRlciBoYW5kbGVycywgd2l0aG91dCByZS1iaW5kaW5nIHRoZW0gcGVyIGZyYW1lLlxuICBjb25zdCB2aWV3cG9ydFJlZiA9IHVzZVJlZjxWaWV3cG9ydFJhbmdlPih2aWV3cG9ydCk7XG4gIHZpZXdwb3J0UmVmLmN1cnJlbnQgPSB2aWV3cG9ydDtcblxuICBjb25zdCBbZHJhZywgc2V0RHJhZ10gPSB1c2VTdGF0ZTxEcmFnU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3NlbGVjdGlvbiwgc2V0U2VsZWN0aW9uXSA9IHVzZVN0YXRlPHsgeDA6IG51bWJlcjsgeDE6IG51bWJlciB9IHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuXG4gIGNvbnN0IHhUb1RpbWUgPSB1c2VDYWxsYmFjayhcbiAgICAoeDogbnVtYmVyLCBjb250ZW50V2lkdGg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAoY29udGVudFdpZHRoIDw9IDApIHJldHVybiByb290U3RhcnRNcztcbiAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHggLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGNvbnRlbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgocm9vdFN0YXJ0TXMgKyBmcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zLCByb290U3RhcnRNcyksXG4gICAgICAgIHJvb3RFbmRNc1xuICAgICAgKTtcbiAgICB9LFxuICAgIFtyb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBjbGFtcCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBWaWV3cG9ydFJhbmdlKTogVmlld3BvcnRSYW5nZSA9PlxuICAgICAgY2xhbXBWaWV3cG9ydFRvUm9vdChuZXh0LCByb290U3RhcnRNcywgcm9vdEVuZE1zLCBtaW5WaWV3cG9ydE1zKSxcbiAgICBbcm9vdFN0YXJ0TXMsIHJvb3RFbmRNcywgbWluVmlld3BvcnRNc11cbiAgKTtcblxuICAvLyBEZW5zaXR5IGNhbnZhczogb25lIHRoaW4gbGluZSBwZXIgc3BhbiBhY3Jvc3MgdGhlIGZ1bGwgcnVuLiBTaXppbmcgaXNcbiAgLy8gcmVhZCBsaXZlIGFuZCByZWRyYXdzIHJ1biBzdHJhaWdodCBmcm9tIHRoZSBSZXNpemVPYnNlcnZlciAod2hpY2ggZmlyZXNcbiAgLy8gYmVmb3JlIHBhaW50KSwgc28gbGF5b3V0IGNoYW5nZXMg4oCUIGUuZy4gdGhlIGRldGFpbCBwYW5lbCBvcGVuaW5nIOKAlCBuZXZlclxuICAvLyBwYWludCBhIGZyYW1lIHdpdGggYSBzdGFsZSwgc3RyZXRjaGVkIGJpdG1hcC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdGhlbWVWZXJzaW9uIGlzIGEgcmVkcmF3IHRyaWdnZXIg4oCUIHRoZSBjYW52YXMgcmUtcmVzb2x2ZXMgaXRzIHRva2VuIGNvbG9ycyB3aGVuIHRoZSB0aGVtZSBmbGlwc1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcz8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY29udGFpbmVyIHx8ICFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSB3aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyO1xuICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgY29udGVudFdpZHRoIDw9IDApIHJldHVybjtcblxuICAgICAgY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIGRwcik7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkcHIpO1xuICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBpZiAoc3BhbnMubGVuZ3RoID09PSAwIHx8IHJvb3REdXJhdGlvbk1zIDw9IDApIHJldHVybjtcblxuICAgICAgY29uc3QgeyBsaW5lSGVpZ2h0LCByZWN0c0J5VG9rZW4gfSA9IGNvbXB1dGVEZW5zaXR5TGF5b3V0KFxuICAgICAgICBzcGFucyxcbiAgICAgICAgcm9vdFN0YXJ0TXMsXG4gICAgICAgIHJvb3REdXJhdGlvbk1zLFxuICAgICAgICBjb250ZW50V2lkdGgsXG4gICAgICAgIGhlaWdodCAtIENBTlZBU19QQURfWV9QWCAqIDJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgZHJhd1Rva2VuID0gKHRva2VuOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSByZWN0c0J5VG9rZW4uZ2V0KHRva2VuKTtcbiAgICAgICAgaWYgKCFyZWN0cykgcmV0dXJuO1xuICAgICAgICBjdHguZmlsbFN0eWxlID1cbiAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHRva2VuKS50cmltKCkgfHwgJ3JnYigxNjAsMTYwLDE2MCknO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAoY29uc3QgW3gsIHksIHddIG9mIHJlY3RzKSB7XG4gICAgICAgICAgY3R4LnJvdW5kUmVjdCh4LCB5LCB3LCBsaW5lSGVpZ2h0LCBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH07XG4gICAgICAvLyBFcnJvcmVkIHNwYW5zIGFyZSBkcmF3biBsYXN0IHNvIHJlZCBuZXZlciBkaXNhcHBlYXJzIHVuZGVyIG5laWdoYm9ycy5cbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmVjdHNCeVRva2VuLmtleXMoKSkge1xuICAgICAgICBpZiAodG9rZW4gIT09IEVSUk9SX0xJTkVfVE9LRU4pIGRyYXdUb2tlbih0b2tlbik7XG4gICAgICB9XG4gICAgICBkcmF3VG9rZW4oRVJST1JfTElORV9UT0tFTik7XG4gICAgfTtcblxuICAgIGRyYXcoKTtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihkcmF3KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3NwYW5zLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIGRwciwgdGhlbWVWZXJzaW9uXSk7XG5cbiAgLy8gQ29udGVudCB3aWR0aCBpcyByZWFkIGZyb20gdGhlIGxpdmUgcmVjdCBhdCBldmVudCB0aW1lLCBzbyBwb2ludGVyIG1hdGhcbiAgLy8gc3RheXMgZXhhY3Qgd2hpbGUgdGhlIHN0cmlwIGlzIGJlaW5nIHJlc2l6ZWQgbWlkLWdlc3R1cmUuXG4gIGNvbnN0IHBvaW50ZXJGcmFtZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KTogeyB4OiBudW1iZXI7IGN3OiBudW1iZXIgfSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICBjdzogcmVjdC53aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyLFxuICAgICAgfTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgcmVzb2x2ZURyYWdTdGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXQ6IEhUTUxFbGVtZW50LCB4OiBudW1iZXIsIGN3OiBudW1iZXIpOiBEcmFnU3RhdGUgPT4ge1xuICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCdbZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLWxlZnQnIH07XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1pbmltYXAtaGFuZGxlPVwicmlnaHRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLXJpZ2h0JyB9O1xuICAgICAgfVxuICAgICAgLy8gUGFubmluZyBhIGZ1bGwtZXh0ZW50IHdpbmRvdyBpcyBhIG5vLW9wLCBzbyBsZXQgYSBkcmFnIG9uIHRoZSBicnVzaFxuICAgICAgLy8gc3RhcnQgYSBzZWxlY3Rpb24gaW5zdGVhZCDigJQgdGhlIG5hdHVyYWwgZmlyc3QgZ2VzdHVyZSBvbiB0aGUgbWFwLlxuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgaXNGdWxsRXh0ZW50ID1cbiAgICAgICAgc3RhcnQgLSByb290U3RhcnRNcyA8IHJvb3REdXJhdGlvbk1zICogMC4wMDEgJiZcbiAgICAgICAgcm9vdEVuZE1zIC0gZW5kIDwgcm9vdER1cmF0aW9uTXMgKiAwLjAwMTtcbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbWluaW1hcC1icnVzaF0nKSAmJiAhaXNGdWxsRXh0ZW50KSB7XG4gICAgICAgIHJldHVybiB7IG1vZGU6ICdwYW4nLCBncmFiT2Zmc2V0TXM6IHhUb1RpbWUoeCwgY3cpIC0gc3RhcnQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1vZGU6ICdzZWxlY3QnLCBvcmlnaW5YOiB4LCBvcmlnaW5NczogeFRvVGltZSh4LCBjdykgfTtcbiAgICB9LFxuICAgIFt4VG9UaW1lLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBlLmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgc2V0RHJhZyhyZXNvbHZlRHJhZ1N0YXRlKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB4LCBjdykpO1xuICAgIH0sXG4gICAgW3BvaW50ZXJGcmFtZSwgcmVzb2x2ZURyYWdTdGF0ZV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyTW92ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGNvbnN0IHQgPSB4VG9UaW1lKHgsIGN3KTtcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGRyYWcubW9kZSA9PT0gJ3BhbicpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICBzdGFydDogdCAtIGRyYWcuZ3JhYk9mZnNldE1zLFxuICAgICAgICAgICAgZW5kOiB0IC0gZHJhZy5ncmFiT2Zmc2V0TXMgKyBkdXJhdGlvbixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtbGVmdCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZSh7IHN0YXJ0OiBNYXRoLm1pbih0LCBlbmQgLSBtaW5WaWV3cG9ydE1zKSwgZW5kIH0pO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtcmlnaHQnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoeyBzdGFydCwgZW5kOiBNYXRoLm1heCh0LCBzdGFydCArIG1pblZpZXdwb3J0TXMpIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc2VsZWN0aW9uIHx8XG4gICAgICAgIE1hdGguYWJzKHggLSBkcmFnLm9yaWdpblgpID4gQ0xJQ0tfRFJBR19USFJFU0hPTERfUFhcbiAgICAgICkge1xuICAgICAgICBzZXRTZWxlY3Rpb24oe1xuICAgICAgICAgIHgwOiBNYXRoLm1pbihkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICAgIHgxOiBNYXRoLm1heChkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGRyYWcsXG4gICAgICBzZWxlY3Rpb24sXG4gICAgICBwb2ludGVyRnJhbWUsXG4gICAgICB4VG9UaW1lLFxuICAgICAgb25WaWV3cG9ydENoYW5nZSxcbiAgICAgIGNsYW1wLFxuICAgICAgbWluVmlld3BvcnRNcyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgZW5kRHJhZyA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGlmIChkcmFnLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgICAgY29uc3QgdCA9IHhUb1RpbWUoeCwgY3cpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgb25BbmltYXRlVG8oXG4gICAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbihkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgICAgZW5kOiBNYXRoLm1heChkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQbGFpbiBjbGljazoga2VlcCB0aGUgY3VycmVudCB6b29tLCBjZW50ZXIgdGhlIHdpbmRvdyB0aGVyZS5cbiAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICBvbkFuaW1hdGVUbyhcbiAgICAgICAgICAgIGNsYW1wKHsgc3RhcnQ6IHQgLSBkdXJhdGlvbiAvIDIsIGVuZDogdCArIGR1cmF0aW9uIC8gMiB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFNlbGVjdGlvbihudWxsKTtcbiAgICAgIHNldERyYWcobnVsbCk7XG4gICAgfSxcbiAgICBbZHJhZywgc2VsZWN0aW9uLCBwb2ludGVyRnJhbWUsIHhUb1RpbWUsIG9uQW5pbWF0ZVRvLCBjbGFtcF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVMb3N0UG9pbnRlckNhcHR1cmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0aW9uKG51bGwpO1xuICAgIHNldERyYWcobnVsbCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVEb3VibGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvbkFuaW1hdGVUbyh7IHN0YXJ0OiByb290U3RhcnRNcywgZW5kOiByb290RW5kTXMgfSk7XG4gIH0sIFtvbkFuaW1hdGVUbywgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc10pO1xuXG4gIC8vIFdoZWVsOiBzYW1lIGdlc3R1cmVzIGFzIHRoZSB0aW1lbGluZSwgbWFwcGVkIHRocm91Z2ggdGhlIGZ1bGwgZXh0ZW50LlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCB8fCByb290RHVyYXRpb25NcyA8PSAwKSByZXR1cm47XG5cbiAgICAvLyBUaGUgbWluaW1hcCdzIHggYXhpcyBpcyB0aGUgZnVsbCBydW4sIHNvIHpvb20gYXJvdW5kIHRoZSBhYnNvbHV0ZSB0aW1lXG4gICAgLy8gdW5kZXIgdGhlIGN1cnNvciByYXRoZXIgdGhhbiBhIHZpZXdwb3J0IGZyYWN0aW9uLlxuICAgIGNvbnN0IHpvb21BdEN1cnNvciA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyLCBsZWZ0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gd2hlZWxab29tU2NhbGVGYWN0b3IoZSk7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgY29uc3QgY3Vyc29yRnJhY3Rpb24gPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoKGUuY2xpZW50WCAtIGxlZnQgLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGN3LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGN1cnNvck1zID0gcm9vdFN0YXJ0TXMgKyBjdXJzb3JGcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zO1xuICAgICAgY29uc3QgYW5jaG9yID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KGR1cmF0aW9uID4gMCA/IChjdXJzb3JNcyAtIHN0YXJ0KSAvIGR1cmF0aW9uIDogMC41LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gZHVyYXRpb24gKiBzY2FsZUZhY3RvcjtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgIGNsYW1wKHtcbiAgICAgICAgICBzdGFydDogY3Vyc29yTXMgLSBhbmNob3IgKiBuZXdEdXJhdGlvbixcbiAgICAgICAgICBlbmQ6IGN1cnNvck1zICsgKDEgLSBhbmNob3IpICogbmV3RHVyYXRpb24sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBQYW4gaW4gbWFwIGNvb3JkaW5hdGVzOiBvbmUgbWFwIHBpeGVsIGlzIG9uZSBmdWxsLWV4dGVudCBmcmFjdGlvbi5cbiAgICBjb25zdCBwYW5CeU1hcFBpeGVscyA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBkeCA9IHdoZWVsRGVsdGFUb1BpeGVscyhlLmRlbHRhWCwgZS5kZWx0YU1vZGUpO1xuICAgICAgY29uc3QgcGFuTXMgPSAoZHggLyBjdykgKiByb290RHVyYXRpb25NcztcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoY2xhbXAoeyBzdGFydDogc3RhcnQgKyBwYW5NcywgZW5kOiBlbmQgKyBwYW5NcyB9KSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uV2hlZWwgPSAoZTogV2hlZWxFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaXNab29tR2VzdHVyZSA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XG4gICAgICBjb25zdCBoYXNEZWx0YVggPSBNYXRoLmFicyhlLmRlbHRhWCkgPiBNYXRoLmFicyhlLmRlbHRhWSk7XG4gICAgICBpZiAoIWlzWm9vbUdlc3R1cmUgJiYgIWhhc0RlbHRhWCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjdyA9IHJlY3Qud2lkdGggLSBUSU1FTElORV9QQURESU5HX1BYICogMjtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBpZiAoaXNab29tR2VzdHVyZSkgem9vbUF0Q3Vyc29yKGUsIGN3LCByZWN0LmxlZnQpO1xuICAgICAgZWxzZSBwYW5CeU1hcFBpeGVscyhlLCBjdyk7XG4gICAgfTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgfSwgW3Jvb3RTdGFydE1zLCByb290RHVyYXRpb25Ncywgb25WaWV3cG9ydENoYW5nZSwgY2xhbXBdKTtcblxuICAvLyBBcnJvdyBrZXlzIHBhbiB0aGUgZm9jdXNlZCBicnVzaDsgSG9tZS9FbmQganVtcCB0byB0aGUgZW5kcy5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgIGNvbnN0IHBhbiA9IGR1cmF0aW9uICogS0VZQk9BUkRfUEFOX0ZSQUNUSU9OO1xuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKGNsYW1wKHsgc3RhcnQ6IHN0YXJ0IC0gcGFuLCBlbmQ6IGVuZCAtIHBhbiB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShjbGFtcCh7IHN0YXJ0OiBzdGFydCArIHBhbiwgZW5kOiBlbmQgKyBwYW4gfSkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgICAgY2xhbXAoeyBzdGFydDogcm9vdFN0YXJ0TXMsIGVuZDogcm9vdFN0YXJ0TXMgKyBkdXJhdGlvbiB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7IHN0YXJ0OiByb290RW5kTXMgLSBkdXJhdGlvbiwgZW5kOiByb290RW5kTXMgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIFtvblZpZXdwb3J0Q2hhbmdlLCBjbGFtcCwgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICAvLyBCcnVzaCBnZW9tZXRyeSBpbiBDU1MgY2FsYygpIGZyb20gdGltZSBmcmFjdGlvbnMsIHNvIHRoZSB0aHVtYiByZWZsb3dzIGluXG4gIC8vIHRoZSBzYW1lIGZyYW1lIGFzIGFueSBjb250YWluZXIgcmVzaXplIGluc3RlYWQgb2YgbGFnZ2luZyBhIHN0YXRlIHVwZGF0ZS5cbiAgY29uc3Qgc3RhcnRGcmFjdGlvbiA9ICh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zO1xuICBjb25zdCBlbmRGcmFjdGlvbiA9ICh2aWV3cG9ydC5lbmQgLSByb290U3RhcnRNcykgLyByb290RHVyYXRpb25NcztcbiAgY29uc3QgdHJhY2tXaWR0aCA9IGAoMTAwJSAtICR7VElNRUxJTkVfUEFERElOR19QWCAqIDJ9cHgpYDtcbiAgY29uc3QgYnJ1c2hTdHlsZSA9IHtcbiAgICBsZWZ0OiBgY2FsYygke1RJTUVMSU5FX1BBRERJTkdfUFh9cHggKyAke3N0YXJ0RnJhY3Rpb259ICogJHt0cmFja1dpZHRofSlgLFxuICAgIHdpZHRoOiBgbWF4KCR7TUlOX0JSVVNIX1dJRFRIX1BYfXB4LCBjYWxjKCR7XG4gICAgICBlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb25cbiAgICB9ICogJHt0cmFja1dpZHRofSkpYCxcbiAgfTtcblxuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3cG9ydC5lbmQgLSB2aWV3cG9ydC5zdGFydDtcbiAgY29uc3Qgc2Nyb2xsYWJsZU1zID0gTWF0aC5tYXgocm9vdER1cmF0aW9uTXMgLSB2aWV3RHVyYXRpb24sIDApO1xuICBjb25zdCBzY3JvbGxQZXJjZW50ID1cbiAgICBzY3JvbGxhYmxlTXMgPiAwXG4gICAgICA/IE1hdGgucm91bmQoKCh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHNjcm9sbGFibGVNcykgKiAxMDApXG4gICAgICA6IDA7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9hMTF5L25vU3RhdGljRWxlbWVudEludGVyYWN0aW9uczogcG9pbnRlciBnZXN0dXJlcyBhcmUgYSBtb3VzZS1vbmx5IGVuaGFuY2VtZW50OyB0aGUgYnJ1c2ggaW5zaWRlIGlzIGtleWJvYXJkLW9wZXJhYmxlXG4gICAgPGRpdlxuICAgICAgcmVmPXtjb250YWluZXJSZWZ9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncmVsYXRpdmUgaC0xMCBtaW4taC0xMCB3LWZ1bGwgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWJhY2tncm91bmQtMTAwIHNlbGVjdC1ub25lIG92ZXJmbG93LWhpZGRlbiB0b3VjaC1ub25lJyxcbiAgICAgICAgZHJhZz8ubW9kZSA9PT0gJ3NlbGVjdCcgJiYgJ2N1cnNvci1jcm9zc2hhaXInXG4gICAgICApfVxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgICBvblBvaW50ZXJNb3ZlPXtoYW5kbGVQb2ludGVyTW92ZX1cbiAgICAgIG9uUG9pbnRlclVwPXtlbmREcmFnfVxuICAgICAgb25Qb2ludGVyQ2FuY2VsPXtlbmREcmFnfVxuICAgICAgb25Mb3N0UG9pbnRlckNhcHR1cmU9e2hhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZX1cbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZURvdWJsZUNsaWNrfVxuICAgID5cbiAgICAgIHsvKiBNdWx0aXBseSBvbiBsaWdodCB0aGVtZXMgLyBzY3JlZW4gb24gZGFyaywgc28gb3ZlcmxhcHBpbmcgc3BhbiBsaW5lc1xuICAgICAgICAgIGRlZXBlbiBpbnN0ZWFkIG9mIG9jY2x1ZGluZyBhbmQgdGhlIGdsYXNzIHRodW1iIHJlYWRzIHRocm91Z2ggdGhlbS4gKi99XG4gICAgICA8Y2FudmFzXG4gICAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBtaXgtYmxlbmQtbXVsdGlwbHkgWy5kYXJrLXRoZW1lXyZdOm1peC1ibGVuZC1zY3JlZW4gWy5kYXJrXyZdOm1peC1ibGVuZC1zY3JlZW4gW1tkYXRhLXRoZW1lPWRhcmtdXyZdOm1peC1ibGVuZC1zY3JlZW5cIlxuICAgICAgLz5cbiAgICAgIHtzZWxlY3Rpb24gPyAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteS0wIGJvcmRlciBib3JkZXItYmx1ZS01MDAgYmctYmx1ZS0zMDAgb3BhY2l0eS00MFwiXG4gICAgICAgICAgc3R5bGU9e3sgbGVmdDogc2VsZWN0aW9uLngwLCB3aWR0aDogc2VsZWN0aW9uLngxIC0gc2VsZWN0aW9uLngwIH19XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS1taW5pbWFwLWJydXNoXG4gICAgICAgIHJvbGU9XCJzY3JvbGxiYXJcIlxuICAgICAgICBhcmlhLWNvbnRyb2xzPVwidHJhY2UtdGltZWxpbmVcIlxuICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgIGFyaWEtdmFsdWVtaW49ezB9XG4gICAgICAgIGFyaWEtdmFsdWVtYXg9ezEwMH1cbiAgICAgICAgYXJpYS12YWx1ZW5vdz17c2Nyb2xsUGVyY2VudH1cbiAgICAgICAgYXJpYS12YWx1ZXRleHQ9e2BWaWV3aW5nICR7Zm9ybWF0RHVyYXRpb25QcmVjaXNlKFxuICAgICAgICAgIHZpZXdwb3J0LnN0YXJ0IC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gdG8gJHtmb3JtYXREdXJhdGlvblByZWNpc2UoXG4gICAgICAgICAgdmlld3BvcnQuZW5kIC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gb2YgJHtmb3JtYXREdXJhdGlvblByZWNpc2Uocm9vdER1cmF0aW9uTXMpfWB9XG4gICAgICAgIGFyaWEtbGFiZWw9XCJUaW1lbGluZSBvdmVydmlld1wiXG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgLy8gR2xhc3MgdGh1bWIsIG1hdGNoaW5nIHRoZSBsZWdhY3kgdHJhY2Ugdmlld2VyJ3MgbWFwIHdpbmRvdy5cbiAgICAgICAgICAnZ3JvdXAvbWluaW1hcC1icnVzaCBhYnNvbHV0ZSB0b3AtMC41IGJvdHRvbS0wLjUgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWdyYXktYWxwaGEtMjAwIHNoYWRvdy1zbSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTotb3V0bGluZS1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLWRzLWZvY3VzLWNvbG9yKV0nLFxuICAgICAgICAgIGRyYWc/Lm1vZGUgPT09ICdwYW4nID8gJ2N1cnNvci1ncmFiYmluZycgOiAnY3Vyc29yLWdyYWInXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXticnVzaFN0eWxlfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCAtbGVmdC0xIGZsZXggdy0yLjUgY3Vyc29yLWV3LXJlc2l6ZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdoLTMuNSB3LVszcHhdIHJvdW5kZWQtZnVsbCBiZy1ncmF5LTYwMCBvcGFjaXR5LTAgdHJhbnNpdGlvbi1vcGFjaXR5IGdyb3VwLWhvdmVyL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAgZ3JvdXAtZm9jdXMtdmlzaWJsZS9taW5pbWFwLWJydXNoOm9wYWNpdHktMTAwJyxcbiAgICAgICAgICAgICAgZHJhZyAmJiAnb3BhY2l0eS0xMDAnXG4gICAgICAgICAgICApfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cInJpZ2h0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgLXJpZ2h0LTEgZmxleCB3LTIuNSBjdXJzb3ItZXctcmVzaXplIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtMy41IHctWzNweF0gcm91bmRlZC1mdWxsIGJnLWdyYXktNjAwIG9wYWNpdHktMCB0cmFuc2l0aW9uLW9wYWNpdHkgZ3JvdXAtaG92ZXIvbWluaW1hcC1icnVzaDpvcGFjaXR5LTEwMCBncm91cC1mb2N1cy12aXNpYmxlL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAnLFxuICAgICAgICAgICAgICBkcmFnICYmICdvcGFjaXR5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuIl19
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21pbmltYXAudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFHYixPQUFPLEVBQ0wsSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxFQUdiLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3QixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QiwwRUFBMEU7QUFDMUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBRWxDOzs7O0dBSUc7QUFDSCxNQUFNLG9CQUFvQixHQUEyQjtJQUNuRCxHQUFHLEVBQUUsZUFBZTtJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxlQUFlO0lBQ3JCLEtBQUssRUFBRSxlQUFlO0NBQ3ZCLENBQUM7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eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblByZWNpc2UsIGdldEhpZ2hSZXNJbk1zIH0gZnJvbSAnLi4vdXRpbC90aW1pbmcnO1xuaW1wb3J0IHtcbiAgY2xhbXBWaWV3cG9ydFRvUm9vdCxcbiAgaXNTcGFuRXJyb3JlZCxcbiAgdHlwZSBSb290Qm91bmRzLFxuICB0eXBlIFZpZXdwb3J0UmFuZ2UsXG4gIHdoZWVsRGVsdGFUb1BpeGVscyxcbiAgd2hlZWxab29tU2NhbGVGYWN0b3IsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRJTUVMSU5FX1BBRERJTkdfUFggfSBmcm9tICcuL3RpbWVsaW5lJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBDQU5WQVNfUEFEX1lfUFggPSA2O1xuY29uc3QgTUlOX0xJTkVfSEVJR0hUX1BYID0gMS41O1xuY29uc3QgTUFYX0xJTkVfSEVJR0hUX1BYID0gMztcbmNvbnN0IE1JTl9MSU5FX1dJRFRIX1BYID0gMjtcbi8qKiBQb2ludGVyIHRyYXZlbCBiZWxvdyB0aGlzIGlzIHRyZWF0ZWQgYXMgYSBjbGljayByYXRoZXIgdGhhbiBhIGRyYWcuICovXG5jb25zdCBDTElDS19EUkFHX1RIUkVTSE9MRF9QWCA9IDM7XG5jb25zdCBNSU5fQlJVU0hfV0lEVEhfUFggPSA2O1xuLyoqIEZyYWN0aW9uIG9mIHRoZSBjdXJyZW50IHdpbmRvdyB0aGF0IGFycm93IGtleXMgcGFuIGJ5LiAqL1xuY29uc3QgS0VZQk9BUkRfUEFOX0ZSQUNUSU9OID0gMC4xO1xuXG4vKipcbiAqIExpbmUgY29sb3JzIHJlc29sdmVkIGZyb20gdGhlIGRlc2lnbi1zeXN0ZW0gdG9rZW5zIG9uIHRoZSBjb250YWluZXIsIHNvIHRoZVxuICogY2FudmFzIGZvbGxvd3MgdGhlIGFjdGl2ZSB0aGVtZS4gUnVucyBhbmQgc3RlcHMgY2FycnkgdGhlIGFjY2VudCBodWVzO1xuICogcGFzc2l2ZSBzcGFucyAoaG9va3MsIHNsZWVwcykgc3RheSBncmF5IGxpa2UgdGhlaXIgZXZlbnQtbGlzdCBpY29ucy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfTElORV9UT0tFTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHJ1bjogJy0tZHMtYmx1ZS00MDAnLFxuICBzdGVwOiAnLS1kcy1ncmVlbi00MDAnLFxuICBob29rOiAnLS1kcy1ncmF5LTQwMCcsXG4gIHNsZWVwOiAnLS1kcy1ncmF5LTQwMCcsXG59O1xuY29uc3QgREVGQVVMVF9MSU5FX1RPS0VOID0gJy0tZHMtZ3JheS00MDAnO1xuY29uc3QgRVJST1JfTElORV9UT0tFTiA9ICctLWRzLXJlZC00MDAnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbnNpdHkgbGF5ZXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgRGVuc2l0eUxheW91dCB7XG4gIGxpbmVIZWlnaHQ6IG51bWJlcjtcbiAgLyoqIFt4LCB5LCB3aWR0aF0gcmVjdHMgZ3JvdXBlZCBieSBjb2xvciB0b2tlbiwgb25lIGZpbGwgcGFzcyBwZXIgY29sb3IuICovXG4gIHJlY3RzQnlUb2tlbjogTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVuc2l0eUxheW91dChcbiAgc3BhbnM6IFNwYW5bXSxcbiAgcm9vdFN0YXJ0TXM6IG51bWJlcixcbiAgcm9vdER1cmF0aW9uTXM6IG51bWJlcixcbiAgY29udGVudFdpZHRoOiBudW1iZXIsXG4gIGNvbnRlbnRIZWlnaHQ6IG51bWJlclxuKTogRGVuc2l0eUxheW91dCB7XG4gIGNvbnN0IGNvdW50ID0gc3BhbnMubGVuZ3RoO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gTWF0aC5tYXgoXG4gICAgTUlOX0xJTkVfSEVJR0hUX1BYLFxuICAgIE1hdGgubWluKE1BWF9MSU5FX0hFSUdIVF9QWCwgY29udGVudEhlaWdodCAvIGNvdW50KVxuICApO1xuICAvLyBEaXN0cmlidXRlIHJvd3MgYWNyb3NzIHRoZSBzdHJpcDsgbmV2ZXIgc3ByZWFkIGEgaGFuZGZ1bCBvZiBzcGFucyBmdXJ0aGVyXG4gIC8vIGFwYXJ0IHRoYW4gb25lIGxpbmUgKyAxcHggZ2FwLlxuICBjb25zdCByb3dTdGVwID1cbiAgICBjb3VudCA+IDFcbiAgICAgID8gTWF0aC5taW4oKGNvbnRlbnRIZWlnaHQgLSBsaW5lSGVpZ2h0KSAvIChjb3VudCAtIDEpLCBsaW5lSGVpZ2h0ICsgMSlcbiAgICAgIDogMDtcblxuICBjb25zdCByZWN0c0J5VG9rZW4gPSBuZXcgTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+KCk7XG4gIHNwYW5zLmZvckVhY2goKHNwYW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBpc1NwYW5FcnJvcmVkKHNwYW4pXG4gICAgICA/IEVSUk9SX0xJTkVfVE9LRU5cbiAgICAgIDogKFJFU09VUkNFX0xJTkVfVE9LRU5TW3NwYW4ucmVzb3VyY2VdID8/IERFRkFVTFRfTElORV9UT0tFTik7XG4gICAgY29uc3Qgc3RhcnRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gICAgY29uc3QgeCA9XG4gICAgICBUSU1FTElORV9QQURESU5HX1BYICtcbiAgICAgICgoc3RhcnRNcyAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aDtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoXG4gICAgICBNSU5fTElORV9XSURUSF9QWCxcbiAgICAgICgoZW5kTXMgLSBzdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aFxuICAgICk7XG4gICAgY29uc3QgeSA9IENBTlZBU19QQURfWV9QWCArIGluZGV4ICogcm93U3RlcDtcbiAgICBjb25zdCByZWN0cyA9IHJlY3RzQnlUb2tlbi5nZXQodG9rZW4pID8/IFtdO1xuICAgIHJlY3RzLnB1c2goW3gsIHksIHddKTtcbiAgICByZWN0c0J5VG9rZW4uc2V0KHRva2VuLCByZWN0cyk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGxpbmVIZWlnaHQsIHJlY3RzQnlUb2tlbiB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvb2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRyYWNrIHRoZSBkaXNwbGF5J3MgZGV2aWNlIHBpeGVsIHJhdGlvIChjaGFuZ2VzIHdoZW4gbW92aW5nIG1vbml0b3JzKS4gKi9cbmZ1bmN0aW9uIHVzZURwcigpOiBudW1iZXIge1xuICBjb25zdCBbZHByLCBzZXREcHJdID0gdXNlU3RhdGUoMSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKTogdm9pZCA9PiBzZXREcHIod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgY29uc3QgbWVkaWEgPSBtYXRjaE1lZGlhKGAocmVzb2x1dGlvbjogJHtkcHJ9ZHBweClgKTtcbiAgICBtZWRpYS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgb25DaGFuZ2UoKTtcbiAgICByZXR1cm4gKCkgPT4gbWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25DaGFuZ2UpO1xuICB9LCBbZHByXSk7XG4gIHJldHVybiBkcHI7XG59XG5cbi8qKiBCdW1wIGEgY291bnRlciB3aGVuIHRoZSB0aGVtZSAoaHRtbCBjbGFzcy9kYXRhLXRoZW1lKSBjaGFuZ2VzLiAqL1xuZnVuY3Rpb24gdXNlVGhlbWVWZXJzaW9uKCk6IG51bWJlciB7XG4gIGNvbnN0IFt2ZXJzaW9uLCBzZXRWZXJzaW9uXSA9IHVzZVN0YXRlKDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2V0VmVyc2lvbigodikgPT4gdiArIDEpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcycsICdkYXRhLXRoZW1lJywgJ3N0eWxlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaW5pbWFwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBEcmFnU3RhdGUgPVxuICB8IHsgbW9kZTogJ3Bhbic7IGdyYWJPZmZzZXRNczogbnVtYmVyIH1cbiAgfCB7IG1vZGU6ICdyZXNpemUtbGVmdCcgfVxuICB8IHsgbW9kZTogJ3Jlc2l6ZS1yaWdodCcgfVxuICB8IHsgbW9kZTogJ3NlbGVjdCc7IG9yaWdpblg6IG51bWJlcjsgb3JpZ2luTXM6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgTWluaW1hcCA9IG1lbW8oZnVuY3Rpb24gTWluaW1hcCh7XG4gIHNwYW5zLFxuICByb290LFxuICB2aWV3cG9ydCxcbiAgbWluVmlld3BvcnRNcyxcbiAgb25WaWV3cG9ydENoYW5nZSxcbiAgb25BbmltYXRlVG8sXG59OiB7XG4gIHNwYW5zOiBTcGFuW107XG4gIHJvb3Q6IFJvb3RCb3VuZHM7XG4gIHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlO1xuICBtaW5WaWV3cG9ydE1zOiBudW1iZXI7XG4gIC8qKiBJbW1lZGlhdGUgdmlld3BvcnQgdXBkYXRlICh1c2VkIHdoaWxlIGRyYWdnaW5nKS4gKi9cbiAgb25WaWV3cG9ydENoYW5nZTogKHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlKSA9PiB2b2lkO1xuICAvKiogRWFzZWQgdmlld3BvcnQgdHJhbnNpdGlvbiAodXNlZCBmb3IgY2xpY2stdG8tanVtcCBhbmQgc2VsZWN0aW9ucykuICovXG4gIG9uQW5pbWF0ZVRvOiAodmlld3BvcnQ6IFZpZXdwb3J0UmFuZ2UpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qge1xuICAgIHN0YXJ0VGltZTogcm9vdFN0YXJ0TXMsXG4gICAgZW5kVGltZTogcm9vdEVuZE1zLFxuICAgIGR1cmF0aW9uOiByb290RHVyYXRpb25NcyxcbiAgfSA9IHJvb3Q7XG5cbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgY2FudmFzUmVmID0gdXNlUmVmPEhUTUxDYW52YXNFbGVtZW50PihudWxsKTtcbiAgY29uc3QgZHByID0gdXNlRHByKCk7XG4gIGNvbnN0IHRoZW1lVmVyc2lvbiA9IHVzZVRoZW1lVmVyc2lvbigpO1xuXG4gIC8vIExhdGVzdCB2aWV3cG9ydCBmb3IgcG9pbnRlciBoYW5kbGVycywgd2l0aG91dCByZS1iaW5kaW5nIHRoZW0gcGVyIGZyYW1lLlxuICBjb25zdCB2aWV3cG9ydFJlZiA9IHVzZVJlZjxWaWV3cG9ydFJhbmdlPih2aWV3cG9ydCk7XG4gIHZpZXdwb3J0UmVmLmN1cnJlbnQgPSB2aWV3cG9ydDtcblxuICBjb25zdCBbZHJhZywgc2V0RHJhZ10gPSB1c2VTdGF0ZTxEcmFnU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3NlbGVjdGlvbiwgc2V0U2VsZWN0aW9uXSA9IHVzZVN0YXRlPHsgeDA6IG51bWJlcjsgeDE6IG51bWJlciB9IHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuXG4gIGNvbnN0IHhUb1RpbWUgPSB1c2VDYWxsYmFjayhcbiAgICAoeDogbnVtYmVyLCBjb250ZW50V2lkdGg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAoY29udGVudFdpZHRoIDw9IDApIHJldHVybiByb290U3RhcnRNcztcbiAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHggLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGNvbnRlbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgocm9vdFN0YXJ0TXMgKyBmcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zLCByb290U3RhcnRNcyksXG4gICAgICAgIHJvb3RFbmRNc1xuICAgICAgKTtcbiAgICB9LFxuICAgIFtyb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBjbGFtcCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBWaWV3cG9ydFJhbmdlKTogVmlld3BvcnRSYW5nZSA9PlxuICAgICAgY2xhbXBWaWV3cG9ydFRvUm9vdChuZXh0LCByb290U3RhcnRNcywgcm9vdEVuZE1zLCBtaW5WaWV3cG9ydE1zKSxcbiAgICBbcm9vdFN0YXJ0TXMsIHJvb3RFbmRNcywgbWluVmlld3BvcnRNc11cbiAgKTtcblxuICAvLyBEZW5zaXR5IGNhbnZhczogb25lIHRoaW4gbGluZSBwZXIgc3BhbiBhY3Jvc3MgdGhlIGZ1bGwgcnVuLiBTaXppbmcgaXNcbiAgLy8gcmVhZCBsaXZlIGFuZCByZWRyYXdzIHJ1biBzdHJhaWdodCBmcm9tIHRoZSBSZXNpemVPYnNlcnZlciAod2hpY2ggZmlyZXNcbiAgLy8gYmVmb3JlIHBhaW50KSwgc28gbGF5b3V0IGNoYW5nZXMgKGUuZy4gdGhlIGRldGFpbCBwYW5lbCBvcGVuaW5nKSBuZXZlclxuICAvLyBwYWludCBhIGZyYW1lIHdpdGggYSBzdGFsZSwgc3RyZXRjaGVkIGJpdG1hcC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdGhlbWVWZXJzaW9uIGlzIGEgcmVkcmF3IHRyaWdnZXI7IHRoZSBjYW52YXMgcmUtcmVzb2x2ZXMgaXRzIHRva2VuIGNvbG9ycyB3aGVuIHRoZSB0aGVtZSBmbGlwc1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcz8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY29udGFpbmVyIHx8ICFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSB3aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyO1xuICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgY29udGVudFdpZHRoIDw9IDApIHJldHVybjtcblxuICAgICAgY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIGRwcik7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkcHIpO1xuICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBpZiAoc3BhbnMubGVuZ3RoID09PSAwIHx8IHJvb3REdXJhdGlvbk1zIDw9IDApIHJldHVybjtcblxuICAgICAgY29uc3QgeyBsaW5lSGVpZ2h0LCByZWN0c0J5VG9rZW4gfSA9IGNvbXB1dGVEZW5zaXR5TGF5b3V0KFxuICAgICAgICBzcGFucyxcbiAgICAgICAgcm9vdFN0YXJ0TXMsXG4gICAgICAgIHJvb3REdXJhdGlvbk1zLFxuICAgICAgICBjb250ZW50V2lkdGgsXG4gICAgICAgIGhlaWdodCAtIENBTlZBU19QQURfWV9QWCAqIDJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgZHJhd1Rva2VuID0gKHRva2VuOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSByZWN0c0J5VG9rZW4uZ2V0KHRva2VuKTtcbiAgICAgICAgaWYgKCFyZWN0cykgcmV0dXJuO1xuICAgICAgICBjdHguZmlsbFN0eWxlID1cbiAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHRva2VuKS50cmltKCkgfHwgJ3JnYigxNjAsMTYwLDE2MCknO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAoY29uc3QgW3gsIHksIHddIG9mIHJlY3RzKSB7XG4gICAgICAgICAgY3R4LnJvdW5kUmVjdCh4LCB5LCB3LCBsaW5lSGVpZ2h0LCBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH07XG4gICAgICAvLyBFcnJvcmVkIHNwYW5zIGFyZSBkcmF3biBsYXN0IHNvIHJlZCBuZXZlciBkaXNhcHBlYXJzIHVuZGVyIG5laWdoYm9ycy5cbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmVjdHNCeVRva2VuLmtleXMoKSkge1xuICAgICAgICBpZiAodG9rZW4gIT09IEVSUk9SX0xJTkVfVE9LRU4pIGRyYXdUb2tlbih0b2tlbik7XG4gICAgICB9XG4gICAgICBkcmF3VG9rZW4oRVJST1JfTElORV9UT0tFTik7XG4gICAgfTtcblxuICAgIGRyYXcoKTtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihkcmF3KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3NwYW5zLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIGRwciwgdGhlbWVWZXJzaW9uXSk7XG5cbiAgLy8gQ29udGVudCB3aWR0aCBpcyByZWFkIGZyb20gdGhlIGxpdmUgcmVjdCBhdCBldmVudCB0aW1lLCBzbyBwb2ludGVyIG1hdGhcbiAgLy8gc3RheXMgZXhhY3Qgd2hpbGUgdGhlIHN0cmlwIGlzIGJlaW5nIHJlc2l6ZWQgbWlkLWdlc3R1cmUuXG4gIGNvbnN0IHBvaW50ZXJGcmFtZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KTogeyB4OiBudW1iZXI7IGN3OiBudW1iZXIgfSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICBjdzogcmVjdC53aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyLFxuICAgICAgfTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgcmVzb2x2ZURyYWdTdGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXQ6IEhUTUxFbGVtZW50LCB4OiBudW1iZXIsIGN3OiBudW1iZXIpOiBEcmFnU3RhdGUgPT4ge1xuICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCdbZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLWxlZnQnIH07XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1pbmltYXAtaGFuZGxlPVwicmlnaHRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLXJpZ2h0JyB9O1xuICAgICAgfVxuICAgICAgLy8gUGFubmluZyBhIGZ1bGwtZXh0ZW50IHdpbmRvdyBpcyBhIG5vLW9wLCBzbyBsZXQgYSBkcmFnIG9uIHRoZSBicnVzaFxuICAgICAgLy8gc3RhcnQgYSBzZWxlY3Rpb24gaW5zdGVhZCwgdGhlIG5hdHVyYWwgZmlyc3QgZ2VzdHVyZSBvbiB0aGUgbWFwLlxuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgaXNGdWxsRXh0ZW50ID1cbiAgICAgICAgc3RhcnQgLSByb290U3RhcnRNcyA8IHJvb3REdXJhdGlvbk1zICogMC4wMDEgJiZcbiAgICAgICAgcm9vdEVuZE1zIC0gZW5kIDwgcm9vdER1cmF0aW9uTXMgKiAwLjAwMTtcbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbWluaW1hcC1icnVzaF0nKSAmJiAhaXNGdWxsRXh0ZW50KSB7XG4gICAgICAgIHJldHVybiB7IG1vZGU6ICdwYW4nLCBncmFiT2Zmc2V0TXM6IHhUb1RpbWUoeCwgY3cpIC0gc3RhcnQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1vZGU6ICdzZWxlY3QnLCBvcmlnaW5YOiB4LCBvcmlnaW5NczogeFRvVGltZSh4LCBjdykgfTtcbiAgICB9LFxuICAgIFt4VG9UaW1lLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBlLmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgc2V0RHJhZyhyZXNvbHZlRHJhZ1N0YXRlKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB4LCBjdykpO1xuICAgIH0sXG4gICAgW3BvaW50ZXJGcmFtZSwgcmVzb2x2ZURyYWdTdGF0ZV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyTW92ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGNvbnN0IHQgPSB4VG9UaW1lKHgsIGN3KTtcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGRyYWcubW9kZSA9PT0gJ3BhbicpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICBzdGFydDogdCAtIGRyYWcuZ3JhYk9mZnNldE1zLFxuICAgICAgICAgICAgZW5kOiB0IC0gZHJhZy5ncmFiT2Zmc2V0TXMgKyBkdXJhdGlvbixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtbGVmdCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZSh7IHN0YXJ0OiBNYXRoLm1pbih0LCBlbmQgLSBtaW5WaWV3cG9ydE1zKSwgZW5kIH0pO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtcmlnaHQnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoeyBzdGFydCwgZW5kOiBNYXRoLm1heCh0LCBzdGFydCArIG1pblZpZXdwb3J0TXMpIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc2VsZWN0aW9uIHx8XG4gICAgICAgIE1hdGguYWJzKHggLSBkcmFnLm9yaWdpblgpID4gQ0xJQ0tfRFJBR19USFJFU0hPTERfUFhcbiAgICAgICkge1xuICAgICAgICBzZXRTZWxlY3Rpb24oe1xuICAgICAgICAgIHgwOiBNYXRoLm1pbihkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICAgIHgxOiBNYXRoLm1heChkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGRyYWcsXG4gICAgICBzZWxlY3Rpb24sXG4gICAgICBwb2ludGVyRnJhbWUsXG4gICAgICB4VG9UaW1lLFxuICAgICAgb25WaWV3cG9ydENoYW5nZSxcbiAgICAgIGNsYW1wLFxuICAgICAgbWluVmlld3BvcnRNcyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgZW5kRHJhZyA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGlmIChkcmFnLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgICAgY29uc3QgdCA9IHhUb1RpbWUoeCwgY3cpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgb25BbmltYXRlVG8oXG4gICAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbihkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgICAgZW5kOiBNYXRoLm1heChkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQbGFpbiBjbGljazoga2VlcCB0aGUgY3VycmVudCB6b29tLCBjZW50ZXIgdGhlIHdpbmRvdyB0aGVyZS5cbiAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICBvbkFuaW1hdGVUbyhcbiAgICAgICAgICAgIGNsYW1wKHsgc3RhcnQ6IHQgLSBkdXJhdGlvbiAvIDIsIGVuZDogdCArIGR1cmF0aW9uIC8gMiB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFNlbGVjdGlvbihudWxsKTtcbiAgICAgIHNldERyYWcobnVsbCk7XG4gICAgfSxcbiAgICBbZHJhZywgc2VsZWN0aW9uLCBwb2ludGVyRnJhbWUsIHhUb1RpbWUsIG9uQW5pbWF0ZVRvLCBjbGFtcF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVMb3N0UG9pbnRlckNhcHR1cmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0aW9uKG51bGwpO1xuICAgIHNldERyYWcobnVsbCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVEb3VibGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvbkFuaW1hdGVUbyh7IHN0YXJ0OiByb290U3RhcnRNcywgZW5kOiByb290RW5kTXMgfSk7XG4gIH0sIFtvbkFuaW1hdGVUbywgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc10pO1xuXG4gIC8vIFdoZWVsOiBzYW1lIGdlc3R1cmVzIGFzIHRoZSB0aW1lbGluZSwgbWFwcGVkIHRocm91Z2ggdGhlIGZ1bGwgZXh0ZW50LlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCB8fCByb290RHVyYXRpb25NcyA8PSAwKSByZXR1cm47XG5cbiAgICAvLyBUaGUgbWluaW1hcCdzIHggYXhpcyBpcyB0aGUgZnVsbCBydW4sIHNvIHpvb20gYXJvdW5kIHRoZSBhYnNvbHV0ZSB0aW1lXG4gICAgLy8gdW5kZXIgdGhlIGN1cnNvciByYXRoZXIgdGhhbiBhIHZpZXdwb3J0IGZyYWN0aW9uLlxuICAgIGNvbnN0IHpvb21BdEN1cnNvciA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyLCBsZWZ0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gd2hlZWxab29tU2NhbGVGYWN0b3IoZSk7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgY29uc3QgY3Vyc29yRnJhY3Rpb24gPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoKGUuY2xpZW50WCAtIGxlZnQgLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGN3LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGN1cnNvck1zID0gcm9vdFN0YXJ0TXMgKyBjdXJzb3JGcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zO1xuICAgICAgY29uc3QgYW5jaG9yID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KGR1cmF0aW9uID4gMCA/IChjdXJzb3JNcyAtIHN0YXJ0KSAvIGR1cmF0aW9uIDogMC41LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gZHVyYXRpb24gKiBzY2FsZUZhY3RvcjtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgIGNsYW1wKHtcbiAgICAgICAgICBzdGFydDogY3Vyc29yTXMgLSBhbmNob3IgKiBuZXdEdXJhdGlvbixcbiAgICAgICAgICBlbmQ6IGN1cnNvck1zICsgKDEgLSBhbmNob3IpICogbmV3RHVyYXRpb24sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBQYW4gaW4gbWFwIGNvb3JkaW5hdGVzOiBvbmUgbWFwIHBpeGVsIGlzIG9uZSBmdWxsLWV4dGVudCBmcmFjdGlvbi5cbiAgICBjb25zdCBwYW5CeU1hcFBpeGVscyA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBkeCA9IHdoZWVsRGVsdGFUb1BpeGVscyhlLmRlbHRhWCwgZS5kZWx0YU1vZGUpO1xuICAgICAgY29uc3QgcGFuTXMgPSAoZHggLyBjdykgKiByb290RHVyYXRpb25NcztcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoY2xhbXAoeyBzdGFydDogc3RhcnQgKyBwYW5NcywgZW5kOiBlbmQgKyBwYW5NcyB9KSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uV2hlZWwgPSAoZTogV2hlZWxFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaXNab29tR2VzdHVyZSA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XG4gICAgICBjb25zdCBoYXNEZWx0YVggPSBNYXRoLmFicyhlLmRlbHRhWCkgPiBNYXRoLmFicyhlLmRlbHRhWSk7XG4gICAgICBpZiAoIWlzWm9vbUdlc3R1cmUgJiYgIWhhc0RlbHRhWCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjdyA9IHJlY3Qud2lkdGggLSBUSU1FTElORV9QQURESU5HX1BYICogMjtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBpZiAoaXNab29tR2VzdHVyZSkgem9vbUF0Q3Vyc29yKGUsIGN3LCByZWN0LmxlZnQpO1xuICAgICAgZWxzZSBwYW5CeU1hcFBpeGVscyhlLCBjdyk7XG4gICAgfTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgfSwgW3Jvb3RTdGFydE1zLCByb290RHVyYXRpb25Ncywgb25WaWV3cG9ydENoYW5nZSwgY2xhbXBdKTtcblxuICAvLyBBcnJvdyBrZXlzIHBhbiB0aGUgZm9jdXNlZCBicnVzaDsgSG9tZS9FbmQganVtcCB0byB0aGUgZW5kcy5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgIGNvbnN0IHBhbiA9IGR1cmF0aW9uICogS0VZQk9BUkRfUEFOX0ZSQUNUSU9OO1xuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKGNsYW1wKHsgc3RhcnQ6IHN0YXJ0IC0gcGFuLCBlbmQ6IGVuZCAtIHBhbiB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShjbGFtcCh7IHN0YXJ0OiBzdGFydCArIHBhbiwgZW5kOiBlbmQgKyBwYW4gfSkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgICAgY2xhbXAoeyBzdGFydDogcm9vdFN0YXJ0TXMsIGVuZDogcm9vdFN0YXJ0TXMgKyBkdXJhdGlvbiB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7IHN0YXJ0OiByb290RW5kTXMgLSBkdXJhdGlvbiwgZW5kOiByb290RW5kTXMgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIFtvblZpZXdwb3J0Q2hhbmdlLCBjbGFtcCwgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICAvLyBCcnVzaCBnZW9tZXRyeSBpbiBDU1MgY2FsYygpIGZyb20gdGltZSBmcmFjdGlvbnMsIHNvIHRoZSB0aHVtYiByZWZsb3dzIGluXG4gIC8vIHRoZSBzYW1lIGZyYW1lIGFzIGFueSBjb250YWluZXIgcmVzaXplIGluc3RlYWQgb2YgbGFnZ2luZyBhIHN0YXRlIHVwZGF0ZS5cbiAgY29uc3Qgc3RhcnRGcmFjdGlvbiA9ICh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zO1xuICBjb25zdCBlbmRGcmFjdGlvbiA9ICh2aWV3cG9ydC5lbmQgLSByb290U3RhcnRNcykgLyByb290RHVyYXRpb25NcztcbiAgY29uc3QgdHJhY2tXaWR0aCA9IGAoMTAwJSAtICR7VElNRUxJTkVfUEFERElOR19QWCAqIDJ9cHgpYDtcbiAgY29uc3QgYnJ1c2hTdHlsZSA9IHtcbiAgICBsZWZ0OiBgY2FsYygke1RJTUVMSU5FX1BBRERJTkdfUFh9cHggKyAke3N0YXJ0RnJhY3Rpb259ICogJHt0cmFja1dpZHRofSlgLFxuICAgIHdpZHRoOiBgbWF4KCR7TUlOX0JSVVNIX1dJRFRIX1BYfXB4LCBjYWxjKCR7XG4gICAgICBlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb25cbiAgICB9ICogJHt0cmFja1dpZHRofSkpYCxcbiAgfTtcblxuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3cG9ydC5lbmQgLSB2aWV3cG9ydC5zdGFydDtcbiAgY29uc3Qgc2Nyb2xsYWJsZU1zID0gTWF0aC5tYXgocm9vdER1cmF0aW9uTXMgLSB2aWV3RHVyYXRpb24sIDApO1xuICBjb25zdCBzY3JvbGxQZXJjZW50ID1cbiAgICBzY3JvbGxhYmxlTXMgPiAwXG4gICAgICA/IE1hdGgucm91bmQoKCh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHNjcm9sbGFibGVNcykgKiAxMDApXG4gICAgICA6IDA7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9hMTF5L25vU3RhdGljRWxlbWVudEludGVyYWN0aW9uczogcG9pbnRlciBnZXN0dXJlcyBhcmUgYSBtb3VzZS1vbmx5IGVuaGFuY2VtZW50OyB0aGUgYnJ1c2ggaW5zaWRlIGlzIGtleWJvYXJkLW9wZXJhYmxlXG4gICAgPGRpdlxuICAgICAgcmVmPXtjb250YWluZXJSZWZ9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncmVsYXRpdmUgaC0xMCBtaW4taC0xMCB3LWZ1bGwgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWJhY2tncm91bmQtMTAwIHNlbGVjdC1ub25lIG92ZXJmbG93LWhpZGRlbiB0b3VjaC1ub25lJyxcbiAgICAgICAgZHJhZz8ubW9kZSA9PT0gJ3NlbGVjdCcgJiYgJ2N1cnNvci1jcm9zc2hhaXInXG4gICAgICApfVxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgICBvblBvaW50ZXJNb3ZlPXtoYW5kbGVQb2ludGVyTW92ZX1cbiAgICAgIG9uUG9pbnRlclVwPXtlbmREcmFnfVxuICAgICAgb25Qb2ludGVyQ2FuY2VsPXtlbmREcmFnfVxuICAgICAgb25Mb3N0UG9pbnRlckNhcHR1cmU9e2hhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZX1cbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZURvdWJsZUNsaWNrfVxuICAgID5cbiAgICAgIHsvKiBNdWx0aXBseSBvbiBsaWdodCB0aGVtZXMgLyBzY3JlZW4gb24gZGFyaywgc28gb3ZlcmxhcHBpbmcgc3BhbiBsaW5lc1xuICAgICAgICAgIGRlZXBlbiBpbnN0ZWFkIG9mIG9jY2x1ZGluZyBhbmQgdGhlIGdsYXNzIHRodW1iIHJlYWRzIHRocm91Z2ggdGhlbS4gKi99XG4gICAgICA8Y2FudmFzXG4gICAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBtaXgtYmxlbmQtbXVsdGlwbHkgWy5kYXJrLXRoZW1lXyZdOm1peC1ibGVuZC1zY3JlZW4gWy5kYXJrXyZdOm1peC1ibGVuZC1zY3JlZW4gW1tkYXRhLXRoZW1lPWRhcmtdXyZdOm1peC1ibGVuZC1zY3JlZW5cIlxuICAgICAgLz5cbiAgICAgIHtzZWxlY3Rpb24gPyAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteS0wIGJvcmRlciBib3JkZXItYmx1ZS01MDAgYmctYmx1ZS0zMDAgb3BhY2l0eS00MFwiXG4gICAgICAgICAgc3R5bGU9e3sgbGVmdDogc2VsZWN0aW9uLngwLCB3aWR0aDogc2VsZWN0aW9uLngxIC0gc2VsZWN0aW9uLngwIH19XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS1taW5pbWFwLWJydXNoXG4gICAgICAgIHJvbGU9XCJzY3JvbGxiYXJcIlxuICAgICAgICBhcmlhLWNvbnRyb2xzPVwidHJhY2UtdGltZWxpbmVcIlxuICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgIGFyaWEtdmFsdWVtaW49ezB9XG4gICAgICAgIGFyaWEtdmFsdWVtYXg9ezEwMH1cbiAgICAgICAgYXJpYS12YWx1ZW5vdz17c2Nyb2xsUGVyY2VudH1cbiAgICAgICAgYXJpYS12YWx1ZXRleHQ9e2BWaWV3aW5nICR7Zm9ybWF0RHVyYXRpb25QcmVjaXNlKFxuICAgICAgICAgIHZpZXdwb3J0LnN0YXJ0IC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gdG8gJHtmb3JtYXREdXJhdGlvblByZWNpc2UoXG4gICAgICAgICAgdmlld3BvcnQuZW5kIC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gb2YgJHtmb3JtYXREdXJhdGlvblByZWNpc2Uocm9vdER1cmF0aW9uTXMpfWB9XG4gICAgICAgIGFyaWEtbGFiZWw9XCJUaW1lbGluZSBvdmVydmlld1wiXG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgLy8gR2xhc3MgdGh1bWIsIG1hdGNoaW5nIHRoZSBsZWdhY3kgdHJhY2Ugdmlld2VyJ3MgbWFwIHdpbmRvdy5cbiAgICAgICAgICAnZ3JvdXAvbWluaW1hcC1icnVzaCBhYnNvbHV0ZSB0b3AtMC41IGJvdHRvbS0wLjUgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWdyYXktYWxwaGEtMjAwIHNoYWRvdy1zbSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTotb3V0bGluZS1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLWRzLWZvY3VzLWNvbG9yKV0nLFxuICAgICAgICAgIGRyYWc/Lm1vZGUgPT09ICdwYW4nID8gJ2N1cnNvci1ncmFiYmluZycgOiAnY3Vyc29yLWdyYWInXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXticnVzaFN0eWxlfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCAtbGVmdC0xIGZsZXggdy0yLjUgY3Vyc29yLWV3LXJlc2l6ZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdoLTMuNSB3LVszcHhdIHJvdW5kZWQtZnVsbCBiZy1ncmF5LTYwMCBvcGFjaXR5LTAgdHJhbnNpdGlvbi1vcGFjaXR5IGdyb3VwLWhvdmVyL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAgZ3JvdXAtZm9jdXMtdmlzaWJsZS9taW5pbWFwLWJydXNoOm9wYWNpdHktMTAwJyxcbiAgICAgICAgICAgICAgZHJhZyAmJiAnb3BhY2l0eS0xMDAnXG4gICAgICAgICAgICApfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cInJpZ2h0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgLXJpZ2h0LTEgZmxleCB3LTIuNSBjdXJzb3ItZXctcmVzaXplIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtMy41IHctWzNweF0gcm91bmRlZC1mdWxsIGJnLWdyYXktNjAwIG9wYWNpdHktMCB0cmFuc2l0aW9uLW9wYWNpdHkgZ3JvdXAtaG92ZXIvbWluaW1hcC1icnVzaDpvcGFjaXR5LTEwMCBncm91cC1mb2N1cy12aXNpYmxlL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAnLFxuICAgICAgICAgICAgICBkcmFnICYmICdvcGFjaXR5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuIl19
@@ -1,9 +1,10 @@
1
1
  import type { ReactNode } from 'react';
2
- import type { SpanMarker } from '../utils';
2
+ import type { SpanMarker, SpanMarkerKind } from '../utils';
3
3
  export interface VisibleMarker {
4
4
  leftPct: number;
5
- /** Absolute (epoch) timestamp in ms for the tooltip. */
5
+ /** Absolute (epoch) timestamp in ms, for the tooltip. */
6
6
  timeMs: number;
7
+ kind: SpanMarkerKind;
7
8
  }
8
9
  /**
9
10
  * Project point-in-time markers onto the visible window `[visibleStartMs,
@@ -14,18 +15,16 @@ export declare function projectMarkers(markers: SpanMarker[], visibleStartMs: nu
14
15
  /**
15
16
  * Thin out ticks that would visually collide: walk left-to-right and keep each
16
17
  * 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
+ * markers survive even when a tight cluster elsewhere on the bar gets thinned;
18
19
  * zoom in to resolve a cluster.
19
20
  */
20
21
  export declare function cullCollidingMarkers(projected: VisibleMarker[], pixelWidth: number): VisibleMarker[];
21
22
  /**
22
- * Point-in-time markers overlaid on a bar one vertical tick per event (hook
23
+ * Point-in-time markers overlaid on a bar: one vertical tick per event (hook
23
24
  * 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.
25
+ * a larger hit target and, on hover, shows the shared relative-time context
26
+ * card, prefixed with the event kind. The position is clamped a hair inside
27
+ * the bar so an edge marker never jams the rounded corner.
29
28
  */
30
29
  export declare function MarkerLayer({ markers, }: {
31
30
  markers: VisibleMarker[];
@@ -1 +1 @@
1
- {"version":3,"file":"span-markers.d.ts","sourceRoot":"","sources":["../../../../src/components/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"}
1
+ {"version":3,"file":"span-markers.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-markers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAW3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,aAAa,EAAE,CAgBjB;AAKD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EAAE,EAC1B,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAUjB;AAeD;;;;;;GAMG;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"}