@workflow/web-shared 5.0.0-beta.0 → 5.0.0-beta.10

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 (275) hide show
  1. package/README.md +1 -1
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +18 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +242 -142
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +4 -1
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +5 -2
  10. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  11. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  12. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  13. package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
  14. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/event-list.js +39 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  27. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  28. package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
  29. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.js +99 -0
  31. package/dist/components/new-trace-viewer/components/timeline.d.ts +34 -0
  32. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  33. package/dist/components/new-trace-viewer/components/timeline.js +223 -0
  34. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  35. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  36. package/dist/components/new-trace-viewer/context.js +47 -0
  37. package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
  38. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/detail-panel.js +13 -0
  40. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  41. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/icons.js +15 -0
  43. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  44. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  45. package/dist/components/new-trace-viewer/search.js +134 -0
  46. package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
  47. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  48. package/dist/components/new-trace-viewer/trace-viewer.js +387 -0
  49. package/dist/components/new-trace-viewer/types.d.ts +1 -0
  50. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/types.js +2 -0
  52. package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
  53. package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
  54. package/dist/components/new-trace-viewer/util/constants.js +2 -0
  55. package/dist/components/new-trace-viewer/utils.d.ts +46 -0
  56. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/utils.js +330 -0
  58. package/dist/components/run-trace-view.d.ts +2 -1
  59. package/dist/components/run-trace-view.d.ts.map +1 -1
  60. package/dist/components/run-trace-view.js +3 -3
  61. package/dist/components/sidebar/attribute-panel.d.ts +7 -1
  62. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  63. package/dist/components/sidebar/attribute-panel.js +131 -70
  64. package/dist/components/sidebar/conversation-view.js +1 -1
  65. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  66. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  67. package/dist/components/sidebar/copyable-data-block.js +16 -15
  68. package/dist/components/sidebar/detail-card.d.ts +5 -6
  69. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  70. package/dist/components/sidebar/detail-card.js +32 -16
  71. package/dist/components/sidebar/entity-detail-panel.d.ts +3 -1
  72. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  73. package/dist/components/sidebar/entity-detail-panel.js +20 -37
  74. package/dist/components/sidebar/events-list.d.ts +1 -1
  75. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  76. package/dist/components/sidebar/events-list.js +46 -32
  77. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  78. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  79. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  80. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  81. package/dist/components/stream-viewer.d.ts +1 -1
  82. package/dist/components/stream-viewer.d.ts.map +1 -1
  83. package/dist/components/stream-viewer.js +3 -27
  84. package/dist/components/trace-viewer/components/map.js +1 -1
  85. package/dist/components/trace-viewer/components/markers.js +1 -1
  86. package/dist/components/trace-viewer/components/node.js +1 -1
  87. package/dist/components/trace-viewer/components/search-input.js +1 -1
  88. package/dist/components/trace-viewer/components/search.js +1 -1
  89. package/dist/components/trace-viewer/components/span-content.js +1 -1
  90. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  91. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  92. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  93. package/dist/components/trace-viewer/components/ui.js +1 -1
  94. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  95. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  96. package/dist/components/trace-viewer/context.js +1 -1
  97. package/dist/components/trace-viewer/index.js +1 -1
  98. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  99. package/dist/components/trace-viewer/types.js +1 -1
  100. package/dist/components/trace-viewer/util/constants.js +1 -1
  101. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  102. package/dist/components/trace-viewer/util/timing.d.ts +1 -1
  103. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  104. package/dist/components/trace-viewer/util/timing.js +6 -9
  105. package/dist/components/trace-viewer/util/tree.js +1 -1
  106. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  107. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  108. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  109. package/dist/components/trace-viewer/worker.js +1 -1
  110. package/dist/components/trace-viewer-new.d.ts +10 -0
  111. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  112. package/dist/components/trace-viewer-new.js +23 -0
  113. package/dist/components/ui/alert.js +1 -1
  114. package/dist/components/ui/button.d.ts +10 -0
  115. package/dist/components/ui/button.d.ts.map +1 -0
  116. package/dist/components/ui/button.js +46 -0
  117. package/dist/components/ui/card.js +1 -1
  118. package/dist/components/ui/data-inspector.d.ts +39 -1
  119. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  120. package/dist/components/ui/data-inspector.js +207 -22
  121. package/dist/components/ui/decrypt-button.js +1 -1
  122. package/dist/components/ui/error-card.js +1 -1
  123. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  124. package/dist/components/ui/error-stack-block.js +27 -19
  125. package/dist/components/ui/icon-button.d.ts +13 -0
  126. package/dist/components/ui/icon-button.d.ts.map +1 -0
  127. package/dist/components/ui/icon-button.js +29 -0
  128. package/dist/components/ui/inspector-theme.d.ts +9 -10
  129. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  130. package/dist/components/ui/inspector-theme.js +39 -72
  131. package/dist/components/ui/load-more-button.js +1 -1
  132. package/dist/components/ui/menu-dropdown.js +1 -1
  133. package/dist/components/ui/skeleton.js +1 -1
  134. package/dist/components/ui/spinner.js +1 -1
  135. package/dist/components/ui/timestamp-tooltip.js +1 -1
  136. package/dist/components/workflow-trace-view.d.ts +3 -1
  137. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  138. package/dist/components/workflow-trace-view.js +10 -5
  139. package/dist/components/workflow-traces/event-colors.js +1 -1
  140. package/dist/components/workflow-traces/trace-colors.js +1 -1
  141. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  142. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  143. package/dist/components/workflow-traces/trace-span-construction.js +19 -6
  144. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  145. package/dist/hooks/use-dark-mode.js +1 -1
  146. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  147. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  148. package/dist/hooks/use-reduced-motion.js +29 -0
  149. package/dist/index.d.ts +3 -1
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +3 -2
  152. package/dist/lib/event-analysis.js +1 -1
  153. package/dist/lib/event-materialization.js +1 -1
  154. package/dist/lib/exact-event-search-id.d.ts +25 -0
  155. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  156. package/dist/lib/exact-event-search-id.js +39 -0
  157. package/dist/lib/hydration.d.ts +15 -2
  158. package/dist/lib/hydration.d.ts.map +1 -1
  159. package/dist/lib/hydration.js +168 -16
  160. package/dist/lib/stream-display.d.ts +18 -0
  161. package/dist/lib/stream-display.d.ts.map +1 -0
  162. package/dist/lib/stream-display.js +30 -0
  163. package/dist/lib/toast.js +1 -1
  164. package/dist/lib/trace-builder.d.ts.map +1 -1
  165. package/dist/lib/trace-builder.js +3 -2
  166. package/dist/lib/utils.d.ts +9 -9
  167. package/dist/lib/utils.d.ts.map +1 -1
  168. package/dist/lib/utils.js +27 -32
  169. package/dist/styles.css +475 -1
  170. package/package.json +6 -4
  171. package/src/components/event-list-view.tsx +447 -282
  172. package/src/components/index.ts +12 -1
  173. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  174. package/src/components/new-trace-viewer/components/event-list.tsx +127 -0
  175. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  176. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  177. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  178. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  179. package/src/components/new-trace-viewer/components/split-pane.tsx +185 -0
  180. package/src/components/new-trace-viewer/components/timeline.tsx +552 -0
  181. package/src/components/new-trace-viewer/context.tsx +92 -0
  182. package/src/components/new-trace-viewer/detail-panel.tsx +55 -0
  183. package/src/components/new-trace-viewer/icons.tsx +79 -0
  184. package/src/components/new-trace-viewer/search.ts +178 -0
  185. package/src/components/new-trace-viewer/trace-viewer.tsx +694 -0
  186. package/src/components/new-trace-viewer/types.ts +0 -0
  187. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  188. package/src/components/new-trace-viewer/utils.ts +482 -0
  189. package/src/components/run-trace-view.tsx +3 -0
  190. package/src/components/sidebar/attribute-panel.tsx +240 -196
  191. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  192. package/src/components/sidebar/detail-card.tsx +119 -59
  193. package/src/components/sidebar/entity-detail-panel.tsx +92 -148
  194. package/src/components/sidebar/events-list.tsx +93 -108
  195. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  196. package/src/components/stream-viewer.tsx +18 -40
  197. package/src/components/trace-viewer/util/timing.ts +5 -9
  198. package/src/components/trace-viewer-new.tsx +49 -0
  199. package/src/components/ui/button.tsx +68 -0
  200. package/src/components/ui/data-inspector.tsx +427 -31
  201. package/src/components/ui/error-stack-block.tsx +39 -30
  202. package/src/components/ui/icon-button.tsx +57 -0
  203. package/src/components/ui/inspector-theme.ts +39 -81
  204. package/src/components/workflow-trace-view.tsx +12 -2
  205. package/src/components/workflow-traces/trace-span-construction.ts +24 -6
  206. package/src/hooks/use-reduced-motion.ts +34 -0
  207. package/src/index.ts +9 -0
  208. package/src/lib/exact-event-search-id.ts +67 -0
  209. package/src/lib/hydration.ts +182 -14
  210. package/src/lib/stream-display.ts +48 -0
  211. package/src/lib/trace-builder.ts +2 -1
  212. package/src/lib/utils.ts +27 -32
  213. package/src/styles.css +475 -1
  214. package/dist/components/error-boundary.js.map +0 -1
  215. package/dist/components/event-list-view.js.map +0 -1
  216. package/dist/components/hook-actions.js.map +0 -1
  217. package/dist/components/index.js.map +0 -1
  218. package/dist/components/run-trace-view.js.map +0 -1
  219. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  220. package/dist/components/sidebar/conversation-view.js.map +0 -1
  221. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  222. package/dist/components/sidebar/detail-card.js.map +0 -1
  223. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  224. package/dist/components/sidebar/events-list.js.map +0 -1
  225. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  226. package/dist/components/stream-viewer.js.map +0 -1
  227. package/dist/components/trace-viewer/components/map.js.map +0 -1
  228. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  229. package/dist/components/trace-viewer/components/node.js.map +0 -1
  230. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  231. package/dist/components/trace-viewer/components/search.js.map +0 -1
  232. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  233. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  234. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  235. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  236. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  237. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  238. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  239. package/dist/components/trace-viewer/context.js.map +0 -1
  240. package/dist/components/trace-viewer/index.js.map +0 -1
  241. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  242. package/dist/components/trace-viewer/types.js.map +0 -1
  243. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  244. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  245. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  246. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  247. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  248. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  249. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  250. package/dist/components/trace-viewer/worker.js.map +0 -1
  251. package/dist/components/ui/alert.js.map +0 -1
  252. package/dist/components/ui/card.js.map +0 -1
  253. package/dist/components/ui/data-inspector.js.map +0 -1
  254. package/dist/components/ui/decrypt-button.js.map +0 -1
  255. package/dist/components/ui/error-card.js.map +0 -1
  256. package/dist/components/ui/error-stack-block.js.map +0 -1
  257. package/dist/components/ui/inspector-theme.js.map +0 -1
  258. package/dist/components/ui/load-more-button.js.map +0 -1
  259. package/dist/components/ui/menu-dropdown.js.map +0 -1
  260. package/dist/components/ui/skeleton.js.map +0 -1
  261. package/dist/components/ui/spinner.js.map +0 -1
  262. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  263. package/dist/components/workflow-trace-view.js.map +0 -1
  264. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  265. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  266. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  267. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  268. package/dist/hooks/use-dark-mode.js.map +0 -1
  269. package/dist/index.js.map +0 -1
  270. package/dist/lib/event-analysis.js.map +0 -1
  271. package/dist/lib/event-materialization.js.map +0 -1
  272. package/dist/lib/hydration.js.map +0 -1
  273. package/dist/lib/toast.js.map +0 -1
  274. package/dist/lib/trace-builder.js.map +0 -1
  275. package/dist/lib/utils.js.map +0 -1
@@ -1,8 +1,19 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Copy } from 'lucide-react';
4
- import { useToast } from '../../lib/toast';
5
- import { DataInspector } from '../ui/data-inspector';
3
+ import { Lock } from 'lucide-react';
4
+ import { useContext } from 'react';
5
+ import { CopyButton } from '../new-trace-viewer/components/copy-button';
6
+ import { Button } from '../ui/button';
7
+ import { DataInspector, DecryptClickContext } from '../ui/data-inspector';
8
+ import { Spinner } from '../ui/spinner';
9
+ const encryptedPlaceholderPreview = `{
10
+ "input": "[encrypted]",
11
+ "result": "[encrypted]"
12
+ }`;
13
+ export function EncryptedDataBlock() {
14
+ const ctx = useContext(DecryptClickContext);
15
+ return (_jsxs("div", { className: "relative min-h-20 overflow-hidden rounded-md border border-gray-alpha-400 bg-background-100", children: [_jsx("pre", { "aria-hidden": "true", className: "pointer-events-none m-0 select-none p-3 font-mono text-label-12 text-gray-900 blur-[4px]", children: encryptedPlaceholderPreview }), _jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: ctx ? (_jsxs(Button, { onClick: ctx.onDecrypt, disabled: ctx.isDecrypting, size: "xs", children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 10 })) : (_jsx(Lock, { className: "h-3 w-3" })), _jsx("span", { children: "Decrypt" })] })) : (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-gray-alpha-400 bg-gray-100 px-1.5 py-0.5 text-button-12 font-medium text-gray-700", children: [_jsx(Lock, { className: "h-3 w-3" }), "Encrypted"] })) })] }));
16
+ }
6
17
  const serializeForClipboard = (value) => {
7
18
  if (typeof value === 'string')
8
19
  return value;
@@ -19,16 +30,6 @@ const serializeForClipboard = (value) => {
19
30
  }
20
31
  };
21
32
  export function CopyableDataBlock({ data }) {
22
- const toast = useToast();
23
- return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border p-3 pt-9", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("button", { type: "button", "aria-label": "Copy data", title: "Copy", className: "!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border !bg-[var(--ds-background-100)] !text-[var(--ds-gray-800)] transition-transform transition-colors duration-100 hover:!bg-[var(--ds-gray-alpha-200)] active:!scale-95 active:!bg-[var(--ds-gray-alpha-300)]", style: { borderColor: 'var(--ds-gray-300)' }, onClick: () => {
24
- navigator.clipboard
25
- .writeText(serializeForClipboard(data))
26
- .then(() => {
27
- toast.success('Copied to clipboard');
28
- })
29
- .catch(() => {
30
- toast.error('Failed to copy');
31
- });
32
- }, children: _jsx(Copy, { size: 12 }) }), _jsx(DataInspector, { data: data })] }));
33
+ return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border border-gray-alpha-400 p-3", children: [_jsx(CopyButton, { copyText: serializeForClipboard(data), ariaLabel: "Copy data", className: "absolute right-2 top-2 z-10 flex h-6 w-6 items-center justify-center rounded-md border border-gray-alpha-400 !bg-background-100 p-0 text-gray-900 transition-transform transition-colors duration-100 hover:bg-gray-200 active:scale-95 active:bg-gray-300" }), _jsx(DataInspector, { data: data })] }));
33
34
  }
34
- //# sourceMappingURL=copyable-data-block.js.map
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weWFibGUtZGF0YS1ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvY29weWFibGUtZGF0YS1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4QyxNQUFNLDJCQUEyQixHQUFHOzs7RUFHbEMsQ0FBQztBQUVILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFNUMsT0FBTyxDQUNMLGVBQUssU0FBUyxFQUFDLDZGQUE2RixhQUMxRyw2QkFDYyxNQUFNLEVBQ2xCLFNBQVMsRUFBQywwRkFBMEYsWUFFbkcsMkJBQTJCLEdBQ3hCLEVBQ04sY0FBSyxTQUFTLEVBQUMsbURBQW1ELFlBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDTCxNQUFDLE1BQU0sSUFBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUMsSUFBSSxhQUNsRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNsQixLQUFDLE9BQU8sSUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLENBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxJQUFJLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxDQUM3QixFQUNELHFDQUFvQixJQUNiLENBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FDRixnQkFBTSxTQUFTLEVBQUMsd0lBQXdJLGFBQ3RKLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyxTQUFTLEdBQUcsaUJBRXZCLENBQ1IsR0FDRyxJQUNGLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUU7SUFDdkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFDMUIsS0FBSyxLQUFLLElBQUksRUFDZCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFxQjtJQUMzRCxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMsc0VBQXNFLGFBQ25GLEtBQUMsVUFBVSxJQUNULFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFDckMsU0FBUyxFQUFDLFdBQVcsRUFDckIsU0FBUyxFQUFDLDRQQUE0UCxHQUN0USxFQUNGLEtBQUMsYUFBYSxJQUFDLElBQUksRUFBRSxJQUFJLEdBQUksSUFDekIsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgTG9jayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29weUJ1dHRvbiB9IGZyb20gJy4uL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9jb3B5LWJ1dHRvbic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi91aS9idXR0b24nO1xuaW1wb3J0IHsgRGF0YUluc3BlY3RvciwgRGVjcnlwdENsaWNrQ29udGV4dCB9IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuLi91aS9zcGlubmVyJztcblxuY29uc3QgZW5jcnlwdGVkUGxhY2Vob2xkZXJQcmV2aWV3ID0gYHtcbiAgXCJpbnB1dFwiOiBcIltlbmNyeXB0ZWRdXCIsXG4gIFwicmVzdWx0XCI6IFwiW2VuY3J5cHRlZF1cIlxufWA7XG5cbmV4cG9ydCBmdW5jdGlvbiBFbmNyeXB0ZWREYXRhQmxvY2soKSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGVjcnlwdENsaWNrQ29udGV4dCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG1pbi1oLTIwIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgYmctYmFja2dyb3VuZC0xMDBcIj5cbiAgICAgIDxwcmVcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBtLTAgc2VsZWN0LW5vbmUgcC0zIGZvbnQtbW9ubyB0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDAgYmx1ci1bNHB4XVwiXG4gICAgICA+XG4gICAgICAgIHtlbmNyeXB0ZWRQbGFjZWhvbGRlclByZXZpZXd9XG4gICAgICA8L3ByZT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICB7Y3R4ID8gKFxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17Y3R4Lm9uRGVjcnlwdH0gZGlzYWJsZWQ9e2N0eC5pc0RlY3J5cHRpbmd9IHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgICAgIDxTcGlubmVyIHNpemU9ezEwfSAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPHNwYW4+RGVjcnlwdDwvc3Bhbj5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWdyYXktMTAwIHB4LTEuNSBweS0wLjUgdGV4dC1idXR0b24tMTIgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICAgICBFbmNyeXB0ZWRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3Qgc2VyaWFsaXplRm9yQ2xpcGJvYXJkID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fFxuICAgIHZhbHVlID09PSBudWxsXG4gICkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3B5YWJsZURhdGFCbG9jayh7IGRhdGEgfTogeyBkYXRhOiB1bmtub3duIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG92ZXJmbG93LXgtYXV0byByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgcC0zXCI+XG4gICAgICA8Q29weUJ1dHRvblxuICAgICAgICBjb3B5VGV4dD17c2VyaWFsaXplRm9yQ2xpcGJvYXJkKGRhdGEpfVxuICAgICAgICBhcmlhTGFiZWw9XCJDb3B5IGRhdGFcIlxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0yIHRvcC0yIHotMTAgZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgIWJnLWJhY2tncm91bmQtMTAwIHAtMCB0ZXh0LWdyYXktOTAwIHRyYW5zaXRpb24tdHJhbnNmb3JtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTEwMCBob3ZlcjpiZy1ncmF5LTIwMCBhY3RpdmU6c2NhbGUtOTUgYWN0aXZlOmJnLWdyYXktMzAwXCJcbiAgICAgIC8+XG4gICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtkYXRhfSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
@@ -1,14 +1,13 @@
1
- import type { ReactNode } from 'react';
2
- export declare function DetailCard({ summary, children, onToggle, disabled, summaryClassName, contentClassName, }: {
1
+ import { type ReactNode } from 'react';
2
+ export declare function DetailCard({ summary, children, onToggle, disabled, defaultOpen, variant, trailing, summaryClassName, contentClassName, }: {
3
3
  summary: ReactNode;
4
4
  children?: ReactNode;
5
- /** Called when the detail card is expanded/collapsed */
6
5
  onToggle?: (open: boolean) => void;
7
- /** Renders a non-expandable summary card when true. */
8
6
  disabled?: boolean;
9
- /** Extra classes for the summary row. */
7
+ defaultOpen?: boolean;
8
+ variant?: 'section' | 'card';
9
+ trailing?: ReactNode;
10
10
  summaryClassName?: string;
11
- /** Extra classes for expanded content wrapper. */
12
11
  contentClassName?: string;
13
12
  }): import("react/jsx-runtime").JSX.Element;
14
13
  //# sourceMappingURL=detail-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detail-card.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,2CA6DA"}
1
+ {"version":3,"file":"detail-card.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/detail-card.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAGjD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAgB,EAChB,WAAmB,EACnB,OAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GACjB,EAAE;IACD,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,2CAsHA"}
@@ -1,20 +1,36 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { ChevronRight } from 'lucide-react';
3
- export function DetailCard({ summary, children, onToggle, disabled = false, summaryClassName, contentClassName, }) {
2
+ import { ChevronDown, ChevronRight } from 'lucide-react';
3
+ import { useState } from 'react';
4
+ import { cn } from '../../lib/utils';
5
+ export function DetailCard({ summary, children, onToggle, disabled = false, defaultOpen = false, variant = 'section', trailing, summaryClassName, contentClassName, }) {
6
+ const [open, setOpen] = useState(defaultOpen);
7
+ const handleToggle = (e) => {
8
+ // React surfaces `toggle` as a bubbling synthetic event even though the
9
+ // native event doesn't bubble. Without this guard, a nested <details>
10
+ // (e.g. an event card inside the Events section) collapsing would flip
11
+ // the outer DetailCard's state. Only react to direct toggles.
12
+ if (e.target !== e.currentTarget)
13
+ return;
14
+ const next = e.currentTarget.open;
15
+ setOpen(next);
16
+ onToggle?.(next);
17
+ };
18
+ if (variant === 'card') {
19
+ if (disabled) {
20
+ return (_jsx("div", { className: cn('list-none px-3 py-4 bg-background-200 [&::-webkit-details-marker]:hidden', summaryClassName), style: { cursor: 'not-allowed', opacity: 0.8 }, children: summary }));
21
+ }
22
+ return (_jsxs("details", { className: "group/card last:border-b border-gray-alpha-400", open: open, onToggle: handleToggle, children: [_jsx("summary", { className: cn('list-none cursor-pointer px-3 py-4 border-t border-gray-alpha-400 bg-background-200 hover:bg-gray-100 [&::-webkit-details-marker]:hidden', summaryClassName), children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(ChevronRight, { size: 14, className: cn('shrink-0 text-gray-700 group-hover/card:text-gray-1000', open && 'rotate-90') }), summary] }) }), _jsx("div", { className: contentClassName, children: children })] }));
23
+ }
24
+ // Shared height with the expandable summary row. Keeps the trailing /
25
+ // disabled / chevron variants visually identical in height regardless of
26
+ // what's in the trailing slot.
27
+ const rowClasses = 'flex h-9 items-center gap-2 px-2 -mx-2 text-heading-14 font-medium my-2';
28
+ if (trailing) {
29
+ return (_jsx("section", { className: "-mx-4 border-t px-4 border-gray-alpha-400", children: _jsxs("div", { className: cn(rowClasses, summaryClassName), children: [_jsx("div", { className: "isolate relative shrink-0 w-3.5 h-3.5 text-gray-700", children: _jsx(ChevronRight, { size: 14, className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2" }) }), _jsx("span", { className: "min-w-0 flex-1", children: summary }), _jsx("div", { className: "shrink-0 pr-1", children: trailing })] }) }));
30
+ }
4
31
  if (disabled) {
5
- return (_jsx("div", { className: `rounded-md border px-2.5 py-1.5 text-xs ${summaryClassName ?? ''}`, style: {
6
- borderColor: 'var(--ds-gray-300)',
7
- backgroundColor: 'var(--ds-gray-100)',
8
- color: 'var(--ds-gray-700)',
9
- cursor: 'not-allowed',
10
- opacity: 0.8,
11
- }, children: summary }));
32
+ return (_jsx("section", { className: "-mx-4 border-t px-4 border-gray-alpha-400", children: _jsx("div", { className: cn(rowClasses, summaryClassName), style: { color: 'var(--ds-gray-700)', cursor: 'not-allowed' }, children: _jsx("span", { className: "min-w-0 flex-1", children: summary }) }) }));
12
33
  }
13
- return (_jsxs("details", { className: "group", onToggle: (e) => onToggle?.(e.target.open), children: [_jsx("summary", { className: `cursor-pointer rounded-md border px-2.5 py-1.5 text-xs hover:brightness-95 [&::-webkit-details-marker]:hidden ${summaryClassName ?? ''}`, style: {
14
- borderColor: 'var(--ds-gray-300)',
15
- backgroundColor: 'var(--ds-gray-100)',
16
- color: 'var(--ds-gray-900)',
17
- listStyle: 'none',
18
- }, children: _jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(ChevronRight, { size: 14, className: "shrink-0 transition-transform group-open:rotate-90" }), summary] }) }), _jsxs("div", { className: `relative pl-6 mt-3 ${contentClassName ?? ''}`, children: [_jsx("div", { className: "absolute left-3 -top-3 w-px h-3", style: { backgroundColor: 'var(--ds-gray-400)' } }), _jsx("div", { className: "absolute left-3 top-0 w-3 h-3 border-l border-b rounded-bl-lg", style: { borderColor: 'var(--ds-gray-400)' } }), _jsx("div", { className: "absolute left-6 top-3 w-0 h-px -translate-y-px", style: { backgroundColor: 'var(--ds-gray-400)' } }), _jsx("div", { children: children })] })] }));
34
+ return (_jsx("section", { className: "-mx-4 border-t px-4 border-gray-alpha-400", children: _jsxs("details", { className: "group", open: open, onToggle: handleToggle, children: [_jsxs("summary", { className: cn('group/trigger list-none cursor-pointer rounded hover:bg-gray-alpha-100 [&::-webkit-details-marker]:hidden', rowClasses, summaryClassName), children: [_jsxs("div", { className: "isolate relative shrink-0 text-gray-700 group-hover/trigger:text-gray-1000 w-3.5 h-3.5", children: [_jsx(ChevronRight, { size: 14, className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-100 group-open:opacity-0" }), _jsx(ChevronDown, { size: 14, className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 opacity-0 group-open:opacity-100" })] }), _jsx("span", { className: "min-w-0 flex-1", children: summary })] }), _jsx("div", { className: cn('mb-3', contentClassName), children: children })] }) }));
19
35
  }
20
- //# sourceMappingURL=detail-card.js.map
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWNhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2RldGFpbC1jYXJkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFrQixRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJDLE1BQU0sVUFBVSxVQUFVLENBQUMsRUFDekIsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsUUFBUSxHQUFHLEtBQUssRUFDaEIsV0FBVyxHQUFHLEtBQUssRUFDbkIsT0FBTyxHQUFHLFNBQVMsRUFDbkIsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FXakI7SUFDQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU5QyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQTJDLEVBQUUsRUFBRTtRQUNuRSx3RUFBd0U7UUFDeEUsc0VBQXNFO1FBQ3RFLHVFQUF1RTtRQUN2RSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUN6QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZCxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUNMLGNBQ0UsU0FBUyxFQUFFLEVBQUUsQ0FDWCwwRUFBMEUsRUFDMUUsZ0JBQWdCLENBQ2pCLEVBQ0QsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFlBRTdDLE9BQU8sR0FDSixDQUNQLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxDQUNMLG1CQUNFLFNBQVMsRUFBQyxnREFBZ0QsRUFDMUQsSUFBSSxFQUFFLElBQUksRUFDVixRQUFRLEVBQUUsWUFBWSxhQUV0QixrQkFDRSxTQUFTLEVBQUUsRUFBRSxDQUNYLDBJQUEwSSxFQUMxSSxnQkFBZ0IsQ0FDakIsWUFFRCxnQkFBTSxTQUFTLEVBQUMsMkJBQTJCLGFBQ3pDLEtBQUMsWUFBWSxJQUNYLElBQUksRUFBRSxFQUFFLEVBQ1IsU0FBUyxFQUFFLEVBQUUsQ0FDWCx3REFBd0QsRUFDeEQsSUFBSSxJQUFJLFdBQVcsQ0FDcEIsR0FDRCxFQUNELE9BQU8sSUFDSCxHQUNDLEVBQ1YsY0FBSyxTQUFTLEVBQUUsZ0JBQWdCLFlBQUcsUUFBUSxHQUFPLElBQzFDLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUseUVBQXlFO0lBQ3pFLCtCQUErQjtJQUMvQixNQUFNLFVBQVUsR0FDZCx5RUFBeUUsQ0FBQztJQUU1RSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUNMLGtCQUFTLFNBQVMsRUFBQywyQ0FBMkMsWUFDNUQsZUFBSyxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxhQUM5QyxjQUFLLFNBQVMsRUFBQyxxREFBcUQsWUFDbEUsS0FBQyxZQUFZLElBQ1gsSUFBSSxFQUFFLEVBQUUsRUFDUixTQUFTLEVBQUMsNkRBQTZELEdBQ3ZFLEdBQ0UsRUFDTixlQUFNLFNBQVMsRUFBQyxnQkFBZ0IsWUFBRSxPQUFPLEdBQVEsRUFDakQsY0FBSyxTQUFTLEVBQUMsZUFBZSxZQUFFLFFBQVEsR0FBTyxJQUMzQyxHQUNFLENBQ1gsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUNMLGtCQUFTLFNBQVMsRUFBQywyQ0FBMkMsWUFDNUQsY0FDRSxTQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxFQUMzQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUU3RCxlQUFNLFNBQVMsRUFBQyxnQkFBZ0IsWUFBRSxPQUFPLEdBQVEsR0FDN0MsR0FDRSxDQUNYLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUNMLGtCQUFTLFNBQVMsRUFBQywyQ0FBMkMsWUFDNUQsbUJBQVMsU0FBUyxFQUFDLE9BQU8sRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLGFBQzNELG1CQUNFLFNBQVMsRUFBRSxFQUFFLENBQ1gsMkdBQTJHLEVBQzNHLFVBQVUsRUFDVixnQkFBZ0IsQ0FDakIsYUFFRCxlQUFLLFNBQVMsRUFBQyx3RkFBd0YsYUFDckcsS0FBQyxZQUFZLElBQ1gsSUFBSSxFQUFFLEVBQUUsRUFDUixTQUFTLEVBQUMsOEZBQThGLEdBQ3hHLEVBQ0YsS0FBQyxXQUFXLElBQ1YsSUFBSSxFQUFFLEVBQUUsRUFDUixTQUFTLEVBQUMsOEZBQThGLEdBQ3hHLElBQ0UsRUFDTixlQUFNLFNBQVMsRUFBQyxnQkFBZ0IsWUFBRSxPQUFPLEdBQVEsSUFDekMsRUFDVixjQUFLLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLFlBQUcsUUFBUSxHQUFPLElBQ3RELEdBQ0YsQ0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoZXZyb25Eb3duLCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHsgdHlwZSBSZWFjdE5vZGUsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gRGV0YWlsQ2FyZCh7XG4gIHN1bW1hcnksXG4gIGNoaWxkcmVuLFxuICBvblRvZ2dsZSxcbiAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgZGVmYXVsdE9wZW4gPSBmYWxzZSxcbiAgdmFyaWFudCA9ICdzZWN0aW9uJyxcbiAgdHJhaWxpbmcsXG4gIHN1bW1hcnlDbGFzc05hbWUsXG4gIGNvbnRlbnRDbGFzc05hbWUsXG59OiB7XG4gIHN1bW1hcnk6IFJlYWN0Tm9kZTtcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIG9uVG9nZ2xlPzogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuO1xuICB2YXJpYW50PzogJ3NlY3Rpb24nIHwgJ2NhcmQnO1xuICB0cmFpbGluZz86IFJlYWN0Tm9kZTtcbiAgc3VtbWFyeUNsYXNzTmFtZT86IHN0cmluZztcbiAgY29udGVudENsYXNzTmFtZT86IHN0cmluZztcbn0pIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZSA9IChlOiBSZWFjdC5TeW50aGV0aWNFdmVudDxIVE1MRGV0YWlsc0VsZW1lbnQ+KSA9PiB7XG4gICAgLy8gUmVhY3Qgc3VyZmFjZXMgYHRvZ2dsZWAgYXMgYSBidWJibGluZyBzeW50aGV0aWMgZXZlbnQgZXZlbiB0aG91Z2ggdGhlXG4gICAgLy8gbmF0aXZlIGV2ZW50IGRvZXNuJ3QgYnViYmxlLiBXaXRob3V0IHRoaXMgZ3VhcmQsIGEgbmVzdGVkIDxkZXRhaWxzPlxuICAgIC8vIChlLmcuIGFuIGV2ZW50IGNhcmQgaW5zaWRlIHRoZSBFdmVudHMgc2VjdGlvbikgY29sbGFwc2luZyB3b3VsZCBmbGlwXG4gICAgLy8gdGhlIG91dGVyIERldGFpbENhcmQncyBzdGF0ZS4gT25seSByZWFjdCB0byBkaXJlY3QgdG9nZ2xlcy5cbiAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkgcmV0dXJuO1xuICAgIGNvbnN0IG5leHQgPSBlLmN1cnJlbnRUYXJnZXQub3BlbjtcbiAgICBzZXRPcGVuKG5leHQpO1xuICAgIG9uVG9nZ2xlPy4obmV4dCk7XG4gIH07XG5cbiAgaWYgKHZhcmlhbnQgPT09ICdjYXJkJykge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAnbGlzdC1ub25lIHB4LTMgcHktNCBiZy1iYWNrZ3JvdW5kLTIwMCBbJjo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlcl06aGlkZGVuJyxcbiAgICAgICAgICAgIHN1bW1hcnlDbGFzc05hbWVcbiAgICAgICAgICApfVxuICAgICAgICAgIHN0eWxlPXt7IGN1cnNvcjogJ25vdC1hbGxvd2VkJywgb3BhY2l0eTogMC44IH19XG4gICAgICAgID5cbiAgICAgICAgICB7c3VtbWFyeX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRldGFpbHNcbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JvdXAvY2FyZCBsYXN0OmJvcmRlci1iIGJvcmRlci1ncmF5LWFscGhhLTQwMFwiXG4gICAgICAgIG9wZW49e29wZW59XG4gICAgICAgIG9uVG9nZ2xlPXtoYW5kbGVUb2dnbGV9XG4gICAgICA+XG4gICAgICAgIDxzdW1tYXJ5XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdsaXN0LW5vbmUgY3Vyc29yLXBvaW50ZXIgcHgtMyBweS00IGJvcmRlci10IGJvcmRlci1ncmF5LWFscGhhLTQwMCBiZy1iYWNrZ3JvdW5kLTIwMCBob3ZlcjpiZy1ncmF5LTEwMCBbJjo6LXdlYmtpdC1kZXRhaWxzLW1hcmtlcl06aGlkZGVuJyxcbiAgICAgICAgICAgIHN1bW1hcnlDbGFzc05hbWVcbiAgICAgICAgICApfVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNVwiPlxuICAgICAgICAgICAgPENoZXZyb25SaWdodFxuICAgICAgICAgICAgICBzaXplPXsxNH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAnc2hyaW5rLTAgdGV4dC1ncmF5LTcwMCBncm91cC1ob3Zlci9jYXJkOnRleHQtZ3JheS0xMDAwJyxcbiAgICAgICAgICAgICAgICBvcGVuICYmICdyb3RhdGUtOTAnXG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge3N1bW1hcnl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L3N1bW1hcnk+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjb250ZW50Q2xhc3NOYW1lfT57Y2hpbGRyZW59PC9kaXY+XG4gICAgICA8L2RldGFpbHM+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFNoYXJlZCBoZWlnaHQgd2l0aCB0aGUgZXhwYW5kYWJsZSBzdW1tYXJ5IHJvdy4gS2VlcHMgdGhlIHRyYWlsaW5nIC9cbiAgLy8gZGlzYWJsZWQgLyBjaGV2cm9uIHZhcmlhbnRzIHZpc3VhbGx5IGlkZW50aWNhbCBpbiBoZWlnaHQgcmVnYXJkbGVzcyBvZlxuICAvLyB3aGF0J3MgaW4gdGhlIHRyYWlsaW5nIHNsb3QuXG4gIGNvbnN0IHJvd0NsYXNzZXMgPVxuICAgICdmbGV4IGgtOSBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMiAtbXgtMiB0ZXh0LWhlYWRpbmctMTQgZm9udC1tZWRpdW0gbXktMic7XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIi1teC00IGJvcmRlci10IHB4LTQgYm9yZGVyLWdyYXktYWxwaGEtNDAwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbihyb3dDbGFzc2VzLCBzdW1tYXJ5Q2xhc3NOYW1lKX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpc29sYXRlIHJlbGF0aXZlIHNocmluay0wIHctMy41IGgtMy41IHRleHQtZ3JheS03MDBcIj5cbiAgICAgICAgICAgIDxDaGV2cm9uUmlnaHRcbiAgICAgICAgICAgICAgc2l6ZT17MTR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgbGVmdC0xLzIgLXRyYW5zbGF0ZS14LTEvMiAtdHJhbnNsYXRlLXktMS8yXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWluLXctMCBmbGV4LTFcIj57c3VtbWFyeX08L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaHJpbmstMCBwci0xXCI+e3RyYWlsaW5nfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICApO1xuICB9XG5cbiAgaWYgKGRpc2FibGVkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIi1teC00IGJvcmRlci10IHB4LTQgYm9yZGVyLWdyYXktYWxwaGEtNDAwXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2NuKHJvd0NsYXNzZXMsIHN1bW1hcnlDbGFzc05hbWUpfVxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJywgY3Vyc29yOiAnbm90LWFsbG93ZWQnIH19XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtaW4tdy0wIGZsZXgtMVwiPntzdW1tYXJ5fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwiLW14LTQgYm9yZGVyLXQgcHgtNCBib3JkZXItZ3JheS1hbHBoYS00MDBcIj5cbiAgICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cImdyb3VwXCIgb3Blbj17b3Blbn0gb25Ub2dnbGU9e2hhbmRsZVRvZ2dsZX0+XG4gICAgICAgIDxzdW1tYXJ5XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdncm91cC90cmlnZ2VyIGxpc3Qtbm9uZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkIGhvdmVyOmJnLWdyYXktYWxwaGEtMTAwIFsmOjotd2Via2l0LWRldGFpbHMtbWFya2VyXTpoaWRkZW4nLFxuICAgICAgICAgICAgcm93Q2xhc3NlcyxcbiAgICAgICAgICAgIHN1bW1hcnlDbGFzc05hbWVcbiAgICAgICAgICApfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpc29sYXRlIHJlbGF0aXZlIHNocmluay0wIHRleHQtZ3JheS03MDAgZ3JvdXAtaG92ZXIvdHJpZ2dlcjp0ZXh0LWdyYXktMTAwMCB3LTMuNSBoLTMuNVwiPlxuICAgICAgICAgICAgPENoZXZyb25SaWdodFxuICAgICAgICAgICAgICBzaXplPXsxNH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yIC10cmFuc2xhdGUteS0xLzIgb3BhY2l0eS0xMDAgZ3JvdXAtb3BlbjpvcGFjaXR5LTBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxDaGV2cm9uRG93blxuICAgICAgICAgICAgICBzaXplPXsxNH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yIC10cmFuc2xhdGUteS0xLzIgb3BhY2l0eS0wIGdyb3VwLW9wZW46b3BhY2l0eS0xMDBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtaW4tdy0wIGZsZXgtMVwiPntzdW1tYXJ5fTwvc3Bhbj5cbiAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ21iLTMnLCBjb250ZW50Q2xhc3NOYW1lKX0+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgPC9kZXRhaWxzPlxuICAgIDwvc2VjdGlvbj5cbiAgKTtcbn1cbiJdfQ==
@@ -26,10 +26,12 @@ export interface SelectedSpanInfo {
26
26
  * This component is rendered OUTSIDE the trace viewer context — it
27
27
  * receives all data via props rather than reading from context.
28
28
  */
29
- export declare function EntityDetailPanel({ run, onStreamClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting, selectedSpan, }: {
29
+ export declare function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting, selectedSpan, }: {
30
30
  run: WorkflowRun;
31
31
  /** Callback when a stream reference is clicked */
32
32
  onStreamClick?: (streamId: string) => void;
33
+ /** Callback when a run reference is clicked */
34
+ onRunClick?: (runId: string) => void;
33
35
  /** Pre-fetched span detail data for the selected span. */
34
36
  spanDetailData: WorkflowRun | Step | Hook | Event | null;
35
37
  /** Error from external span detail fetch. */
@@ -1 +1 @@
1
- {"version":3,"file":"entity-detail-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAwBtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAoB,EACpB,YAAY,GACb,EAAE;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,0DAA0D;IAC1D,cAAc,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IACzD,6CAA6C;IAC7C,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,sEAAsE;IACtE,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,iDAAiD;IACjD,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sFAAsF;IACtF,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAmZ3B"}
1
+ {"version":3,"file":"entity-detail-panel.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/entity-detail-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAwBtE;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAoB,EACpB,YAAY,GACb,EAAE;IACD,GAAG,EAAE,WAAW,CAAC;IACjB,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0DAA0D;IAC1D,cAAc,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IACzD,6CAA6C;IAC7C,eAAe,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uGAAuG;IACvG,YAAY,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,KAClB,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvC,sEAAsE;IACtE,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,iDAAiD;IACjD,aAAa,CAAC,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sFAAsF;IACtF,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mEAAmE;IACnE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAwV3B"}
@@ -4,11 +4,11 @@ import clsx from 'clsx';
4
4
  import { Send, Zap } from 'lucide-react';
5
5
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { useToast } from '../../lib/toast';
7
- import { isEncryptedMarker } from '../../lib/hydration';
8
- import { DecryptButton } from '../ui/decrypt-button';
7
+ import { DecryptClickContext } from '../ui/data-inspector';
9
8
  import { AttributePanel } from './attribute-panel';
10
9
  import { EventsList } from './events-list';
11
10
  import { ResolveHookModal } from './resolve-hook-modal';
11
+ import { useSidebarDataOptional } from './sidebar-data-context';
12
12
  // Type guards for runtime validation of span attribute data
13
13
  function isStep(data) {
14
14
  return data !== null && typeof data === 'object' && 'stepId' in data;
@@ -25,7 +25,7 @@ function isHook(data) {
25
25
  * This component is rendered OUTSIDE the trace viewer context — it
26
26
  * receives all data via props rather than reading from context.
27
27
  */
28
- export function EntityDetailPanel({ run, onStreamClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, }) {
28
+ export function EntityDetailPanel({ run, onStreamClick, onRunClick, spanDetailData, spanDetailError, spanDetailLoading, onSpanSelect, onWakeUpSleep, onLoadEventData, onResolveHook, encryptionKey, onDecrypt, isDecrypting = false, selectedSpan, }) {
29
29
  const toast = useToast();
30
30
  const [stoppingSleep, setStoppingSleep] = useState(false);
31
31
  const [showResolveHookModal, setShowResolveHookModal] = useState(false);
@@ -33,6 +33,8 @@ export function EntityDetailPanel({ run, onStreamClick, spanDetailData, spanDeta
33
33
  // Track hooks that were resolved in this session so the button hides
34
34
  // immediately without waiting for the next event poll.
35
35
  const [resolvedHookIds, setResolvedHookIds] = useState(new Set());
36
+ const sidebar = useSidebarDataOptional();
37
+ const hasEncryptedData = Boolean(sidebar?.hasEncryptedData && !encryptionKey);
36
38
  const data = selectedSpan?.data;
37
39
  const rawEvents = selectedSpan?.rawEvents;
38
40
  const rawEventsLength = rawEvents?.length ?? 0;
@@ -117,15 +119,6 @@ export function EntityDetailPanel({ run, onStreamClick, spanDetailData, spanDeta
117
119
  ]);
118
120
  const error = spanDetailError ?? undefined;
119
121
  const loading = spanDetailLoading ?? false;
120
- const hasEncryptedFields = useMemo(() => {
121
- if (!spanDetailData)
122
- return false;
123
- const d = spanDetailData;
124
- return (isEncryptedMarker(d.input) ||
125
- isEncryptedMarker(d.output) ||
126
- isEncryptedMarker(d.error) ||
127
- isEncryptedMarker(d.metadata));
128
- }, [spanDetailData]);
129
122
  // Get the hook token for resolving (prefer fetched data, then hooks array fallback)
130
123
  const hookToken = useMemo(() => {
131
124
  if (resource !== 'hook' || !resourceId)
@@ -241,31 +234,21 @@ export function EntityDetailPanel({ run, onStreamClick, spanDetailData, spanDeta
241
234
  if (!selectedSpan || !resource || !resourceId) {
242
235
  return null;
243
236
  }
244
- const resourceLabel = resource.charAt(0).toUpperCase() + resource.slice(1);
245
237
  const hasPendingActions = (resource === 'sleep' && canWakeUp) ||
246
238
  (resource === 'hook' && canResolveHook);
247
- const runStateLabel = run.completedAt ? 'Completed' : 'Live';
248
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx("div", { className: "border-b px-3 py-3", style: { borderColor: 'var(--ds-gray-200)' }, children: _jsxs("div", { className: "flex items-start justify-between gap-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex items-center rounded-full border px-2 py-0.5 text-[13px] font-medium", style: {
249
- borderColor: 'var(--ds-gray-300)',
250
- color: 'var(--ds-gray-900)',
251
- backgroundColor: 'var(--ds-background-100)',
252
- }, children: resourceLabel }), _jsx("span", { className: "text-[13px]", style: {
253
- color: run.completedAt
254
- ? 'var(--ds-gray-700)'
255
- : 'var(--ds-green-800)',
256
- }, children: runStateLabel })] }), _jsx("p", { className: "mt-1 truncate font-mono text-[13px]", style: { color: 'var(--ds-gray-700)' }, title: resourceId, children: resourceId })] }), (hasEncryptedFields || encryptionKey) && onDecrypt && (_jsx(DecryptButton, { decrypted: !!encryptionKey, loading: isDecrypting, onClick: onDecrypt }))] }) }), _jsxs("div", { className: "flex-1 overflow-y-auto px-3 pt-3 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
257
- borderColor: 'var(--ds-gray-300)',
258
- backgroundColor: 'var(--ds-gray-100)',
259
- }, children: [_jsx("p", { className: "mb-2 px-1 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Actions" }), _jsxs("div", { className: "flex flex-col gap-2", children: [resource === 'sleep' && canWakeUp && (_jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', stoppingSleep
260
- ? 'opacity-50 cursor-not-allowed'
261
- : 'cursor-pointer'), style: {
262
- background: 'var(--ds-amber-200)',
263
- color: 'var(--ds-amber-900)',
264
- }, children: [_jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'] })), resource === 'hook' && canResolveHook && (_jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', resolvingHook
265
- ? 'opacity-50 cursor-not-allowed'
266
- : 'cursor-pointer'), style: {
267
- background: 'var(--ds-gray-1000)',
268
- color: 'var(--ds-background-100)',
269
- }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsxs("div", { className: "space-y-4", children: [_jsxs("section", { children: [_jsx("h3", { className: "mb-2 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Details" }), _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, resource: resource })] }), resource !== 'run' && rawEvents && (_jsx("section", { children: _jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }) }))] })] }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
239
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting, hasEncryptedData } : undefined, children: _jsxs("div", { className: "flex-1 overflow-y-auto px-4 pb-8", children: [hasPendingActions && (_jsxs("div", { className: "mb-4 rounded-lg border p-2", style: {
240
+ borderColor: 'var(--ds-gray-300)',
241
+ backgroundColor: 'var(--ds-gray-100)',
242
+ }, children: [_jsx("p", { className: "mb-2 px-1 text-[13px] font-medium uppercase tracking-wide", style: { color: 'var(--ds-gray-700)' }, children: "Actions" }), _jsxs("div", { className: "flex flex-col gap-2", children: [resource === 'sleep' && canWakeUp && (_jsxs("button", { type: "button", onClick: handleWakeUp, disabled: stoppingSleep, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', stoppingSleep
243
+ ? 'opacity-50 cursor-not-allowed'
244
+ : 'cursor-pointer'), style: {
245
+ background: 'var(--ds-amber-200)',
246
+ color: 'var(--ds-amber-900)',
247
+ }, children: [_jsx(Zap, { className: "h-4 w-4" }), stoppingSleep ? 'Waking up...' : 'Wake Up Sleep'] })), resource === 'hook' && canResolveHook && (_jsxs("button", { type: "button", onClick: () => setShowResolveHookModal(true), disabled: resolvingHook, className: clsx('flex items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium', 'disabled:opacity-50 disabled:cursor-not-allowed transition-colors', resolvingHook
248
+ ? 'opacity-50 cursor-not-allowed'
249
+ : 'cursor-pointer'), style: {
250
+ background: 'var(--ds-gray-1000)',
251
+ color: 'var(--ds-background-100)',
252
+ }, children: [_jsx(Send, { className: "h-4 w-4" }), "Resolve Hook"] }))] })] })), _jsx(AttributePanel, { data: displayData, moduleSpecifier: moduleSpecifier, expiredAt: run.expiredAt, isLoading: loading, error: error ?? undefined, onStreamClick: onStreamClick, onRunClick: onRunClick, onDecrypt: onDecrypt, isDecrypting: isDecrypting, resource: resource }), resource !== 'run' && rawEvents && (_jsx(EventsList, { events: rawEvents, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }))] }) }), _jsx(ResolveHookModal, { isOpen: showResolveHookModal, onClose: () => setShowResolveHookModal(false), onSubmit: handleResolveHook, isSubmitting: resolvingHook })] }));
270
253
  }
271
- //# sourceMappingURL=entity-detail-panel.js.map
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWRldGFpbC1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvZW50aXR5LWRldGFpbC1wYW5lbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUdiLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEUsNERBQTREO0FBQzVELFNBQVMsTUFBTSxDQUFDLElBQWE7SUFDM0IsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFhO0lBQ2xDLE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQztBQUN0RSxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsSUFBYTtJQUMzQixPQUFPLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtB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Q0FDYixpRkFBaUYsRUFDakYsbUVBQW1FLEVBQ25FLGFBQWE7Z0RBQ1gsQ0FBQyxDQUFDLCtCQUErQjtnREFDakMsQ0FBQyxDQUFDLGdCQUFnQixDQUNyQixFQUNELEtBQUssRUFBRTtnREFDTCxVQUFVLEVBQUUscUJBQXFCO2dEQUNqQyxLQUFLLEVBQUUsMEJBQTBCOzZDQUNsQyxhQUVELEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyxTQUFTLEdBQUcsb0JBRXJCLENBQ1YsSUFDRyxJQUNGLENBQ1AsRUFFRCxLQUFDLGNBQWMsSUFDYixJQUFJLEVBQUUsV0FBVyxFQUNqQixlQUFlLEVBQUUsZUFBZSxFQUNoQyxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFDeEIsU0FBUyxFQUFFLE9BQU8sRUFDbEIsS0FBSyxFQUFFLEtBQUssSUFBSSxTQUFTLEVBQ3pCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxRQUFRLEdBQ2xCLEVBRUQsUUFBUSxLQUFLLEtBQUssSUFBSSxTQUFTLElBQUksQ0FDbEMsS0FBQyxVQUFVLElBQ1QsTUFBTSxFQUFFLFNBQVMsRUFDakIsZUFBZSxFQUFFLGVBQWUsRUFDaEMsYUFBYSxFQUFFLGFBQWEsR0FDNUIsQ0FDSCxJQUNHLEdBQ3VCLEVBRy9CLEtBQUMsZ0JBQWdCLElBQ2YsTUFBTSxFQUFFLG9CQUFvQixFQUM1QixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEVBQzdDLFFBQVEsRUFBRSxpQkFBaUIsRUFDM0IsWUFBWSxFQUFFLGFBQWEsR0FDM0IsSUFDRSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IFNlbmQsIFphcCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICcuLi8uLi9saWIvdG9hc3QnO1xuaW1wb3J0IHsgRGVjcnlwdENsaWNrQ29udGV4dCB9IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IEF0dHJpYnV0ZVBhbmVsIH0gZnJvbSAnLi9hdHRyaWJ1dGUtcGFuZWwnO1xuaW1wb3J0IHsgRXZlbnRzTGlzdCB9IGZyb20gJy4vZXZlbnRzLWxpc3QnO1xuaW1wb3J0IHsgUmVzb2x2ZUhvb2tNb2RhbCB9IGZyb20gJy4vcmVzb2x2ZS1ob29rLW1vZGFsJztcbmltcG9ydCB7IHVzZVNpZGViYXJEYXRhT3B0aW9uYWwgfSBmcm9tICcuL3NpZGViYXItZGF0YS1jb250ZXh0JztcblxuLy8gVHlwZSBndWFyZHMgZm9yIHJ1bnRpbWUgdmFsaWRhdGlvbiBvZiBzcGFuIGF0dHJpYnV0ZSBkYXRhXG5mdW5jdGlvbiBpc1N0ZXAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgU3RlcCB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnc3RlcElkJyBpbiBkYXRhO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93UnVuKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFdvcmtmbG93UnVuIHtcbiAgcmV0dXJuIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmICdydW5JZCcgaW4gZGF0YTtcbn1cblxuZnVuY3Rpb24gaXNIb29rKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEhvb2sge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ2hvb2tJZCcgaW4gZGF0YTtcbn1cblxuLyoqXG4gKiBJbmZvIGFib3V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BhblxuICovXG5leHBvcnQgdHlwZSBTcGFuU2VsZWN0aW9uSW5mbyA9IHtcbiAgcmVzb3VyY2U6ICdydW4nIHwgJ3N0ZXAnIHwgJ2hvb2snIHwgJ3NsZWVwJztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBydW5JZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogSW5mbyBhYm91dCB0aGUgc2VsZWN0ZWQgc3BhbiBmcm9tIHRoZSB0cmFjZSB2aWV3ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0ZWRTcGFuSW5mbyB7XG4gIC8qKiBUaGUgcmF3IGRhdGEgZnJvbSB0aGUgc3BhbiBhdHRyaWJ1dGVzIChzdGVwL3J1bi9ob29rIG9iamVjdCBmcm9tIHRoZSB0cmFjZSkgKi9cbiAgZGF0YT86IHVua25vd247XG4gIC8qKiBUaGUgc3BhbiByZXNvdXJjZSB0eXBlIChmcm9tIHNwYW4gYXR0cmlidXRlcykgKi9cbiAgcmVzb3VyY2U/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3BhbiBJRCAoY29ycmVsYXRpb25JZCBmb3IgZmlsdGVyaW5nIGV2ZW50cykgKi9cbiAgc3BhbklkPzogc3RyaW5nO1xuICAvKiogUmF3IGNvcnJlbGF0ZWQgZXZlbnRzIGZyb20gdGhlIHN0b3JlIChOT1QgZnJvbSB0aGUgdHJhY2Ugd29ya2VyIHBpcGVsaW5lKSAqL1xuICByYXdFdmVudHM/OiBFdmVudFtdO1xufVxuXG4vKipcbiAqIFBhbmVsIGNvbXBvbmVudCBmb3Igd29ya2Zsb3cgdHJhY2VzIHRoYXQgZGlzcGxheXMgZW50aXR5IGRldGFpbHMuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgcmVuZGVyZWQgT1VUU0lERSB0aGUgdHJhY2Ugdmlld2VyIGNvbnRleHQg4oCUIGl0XG4gKiByZWNlaXZlcyBhbGwgZGF0YSB2aWEgcHJvcHMgcmF0aGVyIHRoYW4gcmVhZGluZyBmcm9tIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHlEZXRhaWxQYW5lbCh7XG4gIHJ1bixcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgc3BhbkRldGFpbERhdGEsXG4gIHNwYW5EZXRhaWxFcnJvcixcbiAgc3BhbkRldGFpbExvYWRpbmcsXG4gIG9uU3BhblNlbGVjdCxcbiAgb25XYWtlVXBTbGVlcCxcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBvblJlc29sdmVIb29rLFxuICBlbmNyeXB0aW9uS2V5LFxuICBvbkRlY3J5cHQsXG4gIGlzRGVjcnlwdGluZyA9IGZhbHNlLFxuICBzZWxlY3RlZFNwYW4sXG59OiB7XG4gIHJ1bjogV29ya2Zsb3dSdW47XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3RyZWFtIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogUHJlLWZldGNoZWQgc3BhbiBkZXRhaWwgZGF0YSBmb3IgdGhlIHNlbGVjdGVkIHNwYW4uICovXG4gIHNwYW5EZXRhaWxEYXRhOiBXb3JrZmxvd1J1biB8IFN0ZXAgfCBIb29rIHwgRXZlbnQgfCBudWxsO1xuICAvKiogRXJyb3IgZnJvbSBleHRlcm5hbCBzcGFuIGRldGFpbCBmZXRjaC4gKi9cbiAgc3BhbkRldGFpbEVycm9yPzogRXJyb3IgfCBudWxsO1xuICAvKiogTG9hZGluZyBzdGF0ZSBmcm9tIGV4dGVybmFsIHNwYW4gZGV0YWlsIGZldGNoLiAqL1xuICBzcGFuRGV0YWlsTG9hZGluZz86IGJvb2xlYW47XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3BhbiBpcyBzZWxlY3RlZC4gVXNlIHRoaXMgdG8gZmV0Y2ggZGF0YSBleHRlcm5hbGx5IGFuZCBwYXNzIHZpYSBzcGFuRGV0YWlsRGF0YS4gKi9cbiAgb25TcGFuU2VsZWN0OiAoaW5mbzogU3BhblNlbGVjdGlvbkluZm8pID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB0byB3YWtlIHVwIGEgcGVuZGluZyBzbGVlcCBjYWxsLiAqL1xuICBvbldha2VVcFNsZWVwPzogKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx7IHN0b3BwZWRDb3VudDogbnVtYmVyIH0+O1xuICAvKiogQ2FsbGJhY2sgdG8gbG9hZCBldmVudCBkYXRhIGZvciBhIHNwZWNpZmljIGV2ZW50IChsYXp5IGxvYWRpbmcpICovXG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBDYWxsYmFjayB0byByZXNvbHZlIGEgaG9vayB3aXRoIGEgcGF5bG9hZC4gKi9cbiAgb25SZXNvbHZlSG9vaz86IChcbiAgICBob29rVG9rZW46IHN0cmluZyxcbiAgICBwYXlsb2FkOiB1bmtub3duLFxuICAgIGhvb2s/OiBIb29rXG4gICkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEVuY3J5cHRpb24ga2V5IChhdmFpbGFibGUgYWZ0ZXIgRGVjcnlwdCBpcyBjbGlja2VkKSwgdXNlZCB0byByZS1sb2FkIGV2ZW50IGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBDYWxsYmFjayB0byBpbml0aWF0ZSBkZWNyeXB0aW9uIG9mIGVuY3J5cHRlZCBydW4gZGF0YSAqL1xuICBvbkRlY3J5cHQ/OiAoKSA9PiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgZW5jcnlwdGlvbiBrZXkgaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbiAgLyoqIEluZm8gYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzcGFuIGZyb20gdGhlIHRyYWNlIHZpZXdlciAqL1xuICBzZWxlY3RlZFNwYW46IFNlbGVjdGVkU3BhbkluZm8gfCBudWxsO1xufSk6IFJlYWN0LkpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgY29uc3QgW3N0b3BwaW5nU2xlZXAsIHNldFN0b3BwaW5nU2xlZXBdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2hvd1Jlc29sdmVIb29rTW9kYWwsIHNldFNob3dSZXNvbHZlSG9va01vZGFsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Jlc29sdmluZ0hvb2ssIHNldFJlc29sdmluZ0hvb2tdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAvLyBUcmFjayBob29rcyB0aGF0IHdlcmUgcmVzb2x2ZWQgaW4gdGhpcyBzZXNzaW9uIHNvIHRoZSBidXR0b24gaGlkZXNcbiAgLy8gaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgbmV4dCBldmVudCBwb2xsLlxuICBjb25zdCBbcmVzb2x2ZWRIb29rSWRzLCBzZXRSZXNvbHZlZEhvb2tJZHNdID0gdXNlU3RhdGU8U2V0PHN0cmluZz4+KFxuICAgIG5ldyBTZXQoKVxuICApO1xuXG4gIGNvbnN0IHNpZGViYXIgPSB1c2VTaWRlYmFyRGF0YU9wdGlvbmFsKCk7XG4gIGNvbnN0IGhhc0VuY3J5cHRlZERhdGEgPSBCb29sZWFuKHNpZGViYXI/Lmhhc0VuY3J5cHRlZERhdGEgJiYgIWVuY3J5cHRpb25LZXkpO1xuXG4gIGNvbnN0IGRhdGEgPSBzZWxlY3RlZFNwYW4/LmRhdGE7XG4gIGNvbnN0IHJhd0V2ZW50cyA9IHNlbGVjdGVkU3Bhbj8ucmF3RXZlbnRzO1xuICBjb25zdCByYXdFdmVudHNMZW5ndGggPSByYXdFdmVudHM/Lmxlbmd0aCA/PyAwO1xuXG4gIC8vIERldGVybWluZSByZXNvdXJjZSB0eXBlLCBJRCwgYW5kIHJ1bklkIGZyb20gdGhlIHNlbGVjdGVkIHNwYW5cbiAgY29uc3QgeyByZXNvdXJjZSwgcmVzb3VyY2VJZCwgcnVuSWQgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRTcGFuKSB7XG4gICAgICByZXR1cm4geyByZXNvdXJjZTogdW5kZWZpbmVkLCByZXNvdXJjZUlkOiB1bmRlZmluZWQsIHJ1bklkOiB1bmRlZmluZWQgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBzZWxlY3RlZFNwYW4ucmVzb3VyY2U7XG4gICAgaWYgKHJlcyA9PT0gJ3N0ZXAnICYmIGlzU3RlcChkYXRhKSkge1xuICAgICAgcmV0dXJuIHsgcmVzb3VyY2U6ICdzdGVwJywgcmVzb3VyY2VJZDogZGF0YS5zdGVwSWQsIHJ1bklkOiBkYXRhLnJ1bklkIH07XG4gICAgfVxuICAgIGlmIChyZXMgPT09ICdydW4nICYmIGlzV29ya2Zsb3dSdW4oZGF0YSkpIHtcbiAgICAgIHJldHVybiB7IHJlc291cmNlOiAncnVuJywgcmVzb3VyY2VJZDogZGF0YS5ydW5JZCwgcnVuSWQ6IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICBpZiAocmVzID09PSAnaG9vaycgJiYgaXNIb29rKGRhdGEpKSB7XG4gICAgICByZXR1cm4geyByZXNvdXJjZTogJ2hvb2snLCByZXNvdXJjZUlkOiBkYXRhLmhvb2tJZCwgcnVuSWQ6IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICBpZiAocmVzID09PSAnc2xlZXAnKSB7XG4gICAgICBjb25zdCB3YWl0RGF0YSA9IGRhdGEgYXMgeyBydW5JZD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzb3VyY2U6ICdzbGVlcCcsXG4gICAgICAgIHJlc291cmNlSWQ6IHNlbGVjdGVkU3Bhbi5zcGFuSWQsXG4gICAgICAgIHJ1bklkOiB3YWl0RGF0YT8ucnVuSWQsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyByZXNvdXJjZTogdW5kZWZpbmVkLCByZXNvdXJjZUlkOiB1bmRlZmluZWQsIHJ1bklkOiB1bmRlZmluZWQgfTtcbiAgfSwgW3NlbGVjdGVkU3BhbiwgZGF0YV0pO1xuXG4gIC8vIE5vdGlmeSBwYXJlbnQgd2hlbiBzcGFuIHNlbGVjdGlvbiBjaGFuZ2VzLlxuICAvLyBVc2UgYSByZWYgZm9yIHRoZSBjYWxsYmFjayBzbyB0aGUgZWZmZWN0IG9ubHkgZmlyZXMgd2hlbiB0aGUgYWN0dWFsXG4gIC8vIHNlbGVjdGlvbiB2YWx1ZXMgY2hhbmdlLCBub3Qgd2hlbiB0aGUgY2FsbGJhY2sgaWRlbnRpdHkgY2hhbmdlcyBkdWUgdG9cbiAgLy8gcGFyZW50IHJlLXJlbmRlcnMgZnJvbSBwb2xsaW5nLlxuICBjb25zdCBvblNwYW5TZWxlY3RSZWYgPSB1c2VSZWYob25TcGFuU2VsZWN0KTtcbiAgb25TcGFuU2VsZWN0UmVmLmN1cnJlbnQgPSBvblNwYW5TZWxlY3Q7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXNvdXJjZSAmJlxuICAgICAgcmVzb3VyY2VJZCAmJlxuICAgICAgWydydW4nLCAnc3RlcCcsICdob29rJywgJ3NsZWVwJ10uaW5jbHVkZXMocmVzb3VyY2UpXG4gICAgKSB7XG4gICAgICBvblNwYW5TZWxlY3RSZWYuY3VycmVudCh7XG4gICAgICAgIHJlc291cmNlOiByZXNvdXJjZSBhcyAncnVuJyB8ICdzdGVwJyB8ICdob29rJyB8ICdzbGVlcCcsXG4gICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgIHJ1bklkLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbcmVzb3VyY2UsIHJlc291cmNlSWQsIHJ1bklkXSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBzbGVlcCBpcyBzdGlsbCBwZW5kaW5nIGFuZCBjYW4gYmUgd29rZW4gdXBcbiAgY29uc3QgY2FuV2FrZVVwID0gdXNlTWVtbygoKSA9PiB7XG4gICAgdm9pZCByYXdFdmVudHNMZW5ndGg7XG4gICAgaWYgKHJlc291cmNlICE9PSAnc2xlZXAnIHx8ICFyYXdFdmVudHMpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXTtcbiAgICBpZiAodGVybWluYWxTdGF0ZXMuaW5jbHVkZXMocnVuLnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBoYXNXYWl0Q3JlYXRlZCA9IHJhd0V2ZW50cy5zb21lKFxuICAgICAgKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJ1xuICAgICk7XG4gICAgaWYgKCFoYXNXYWl0Q3JlYXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGhhc1dhaXRDb21wbGV0ZWQgPSByYXdFdmVudHMuc29tZShcbiAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICAgICk7XG4gICAgcmV0dXJuICFoYXNXYWl0Q29tcGxldGVkO1xuICB9LCBbcmVzb3VyY2UsIHJhd0V2ZW50cywgcmF3RXZlbnRzTGVuZ3RoLCBydW4uc3RhdHVzXSk7XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBob29rIGNhbiBiZSByZXNvbHZlZFxuICBjb25zdCBjYW5SZXNvbHZlSG9vayA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHZvaWQgcmF3RXZlbnRzTGVuZ3RoO1xuICAgIGlmIChyZXNvdXJjZSAhPT0gJ2hvb2snIHx8ICFyYXdFdmVudHMgfHwgIXJlc291cmNlSWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgcmVzb2x2ZWQgdGhpcyBob29rIGluIHRoaXMgc2Vzc2lvblxuICAgIGlmIChyZXNvbHZlZEhvb2tJZHMuaGFzKHJlc291cmNlSWQpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCB0ZXJtaW5hbFN0YXRlcyA9IFsnY29tcGxldGVkJywgJ2ZhaWxlZCcsICdjYW5jZWxsZWQnXTtcbiAgICBpZiAodGVybWluYWxTdGF0ZXMuaW5jbHVkZXMocnVuLnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBoYXNIb29rRGlzcG9zZWQgPSByYXdFdmVudHMuc29tZShcbiAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnXG4gICAgKTtcbiAgICBpZiAoaGFzSG9va0Rpc3Bvc2VkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sIFtcbiAgICByZXNvdXJjZSxcbiAgICByZXNvdXJjZUlkLFxuICAgIHJhd0V2ZW50cyxcbiAgICByYXdFdmVudHNMZW5ndGgsXG4gICAgcnVuLnN0YXR1cyxcbiAgICByZXNvbHZlZEhvb2tJZHMsXG4gIF0pO1xuXG4gIGNvbnN0IGVycm9yID0gc3BhbkRldGFpbEVycm9yID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgbG9hZGluZyA9IHNwYW5EZXRhaWxMb2FkaW5nID8/IGZhbHNlO1xuXG4gIC8vIEdldCB0aGUgaG9vayB0b2tlbiBmb3IgcmVzb2x2aW5nIChwcmVmZXIgZmV0Y2hlZCBkYXRhLCB0aGVuIGhvb2tzIGFycmF5IGZhbGxiYWNrKVxuICBjb25zdCBob29rVG9rZW4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAocmVzb3VyY2UgIT09ICdob29rJyB8fCAhcmVzb3VyY2VJZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyAxLiBUcnkgdGhlIGV4dGVybmFsbHktZmV0Y2hlZCBkZXRhaWwgZGF0YSBmaXJzdFxuICAgIGlmIChpc0hvb2soc3BhbkRldGFpbERhdGEpICYmIHNwYW5EZXRhaWxEYXRhLnRva2VuKSB7XG4gICAgICByZXR1cm4gc3BhbkRldGFpbERhdGEudG9rZW47XG4gICAgfVxuICAgIC8vIDIuIFRyeSB0aGUgc3BhbidzIGlubGluZSBkYXRhIChyZWNvbnN0cnVjdGVkIGZyb20gaG9va19jcmVhdGVkIGV2ZW50KVxuICAgIGlmIChpc0hvb2soZGF0YSkgJiYgKGRhdGEgYXMgSG9vaykudG9rZW4pIHtcbiAgICAgIHJldHVybiAoZGF0YSBhcyBIb29rKS50b2tlbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW3Jlc291cmNlLCByZXNvdXJjZUlkLCBzcGFuRGV0YWlsRGF0YSwgZGF0YV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGVycm9yICYmIHNlbGVjdGVkU3BhbiAmJiByZXNvdXJjZSkge1xuICAgICAgdG9hc3QuZXJyb3IoYEZhaWxlZCB0byBsb2FkICR7cmVzb3VyY2V9IGRldGFpbHNgLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbZXJyb3IsIHJlc291cmNlLCBzZWxlY3RlZFNwYW5dKTtcblxuICBjb25zdCBoYW5kbGVXYWtlVXAgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKHN0b3BwaW5nU2xlZXAgfHwgIXJlc291cmNlSWQpIHJldHVybjtcbiAgICBpZiAoIW9uV2FrZVVwU2xlZXApIHtcbiAgICAgIHRvYXN0LmVycm9yKCdVbmFibGUgdG8gd2FrZSB1cCBzbGVlcCcsIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdObyB3YWtlLXVwIGhhbmRsZXIgcHJvdmlkZWQuJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzZXRTdG9wcGluZ1NsZWVwKHRydWUpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb25XYWtlVXBTbGVlcChydW4ucnVuSWQsIHJlc291cmNlSWQpO1xuICAgICAgaWYgKHJlc3VsdC5zdG9wcGVkQ291bnQgPiAwKSB7XG4gICAgICAgIHRvYXN0LnN1Y2Nlc3MoJ1J1biB3b2tlbiB1cCcsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdUaGUgc2xlZXAgY2FsbCBoYXMgYmVlbiBpbnRlcnJ1cHRlZCBhbmQgdGhlIHJ1biB3b2tlbiB1cC4nLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvYXN0LmluZm8oJ1NsZWVwIGFscmVhZHkgY29tcGxldGVkJywge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBzbGVlcCBjYWxsIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHdha2UgdXAgcnVuOicsIGVycik7XG4gICAgICB0b2FzdC5lcnJvcignRmFpbGVkIHRvIHdha2UgdXAgcnVuJywge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFN0b3BwaW5nU2xlZXAoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYW5kbGVSZXNvbHZlSG9vayA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChwYXlsb2FkOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAocmVzb2x2aW5nSG9vaykgcmV0dXJuO1xuICAgICAgaWYgKCFvblJlc29sdmVIb29rKSB7XG4gICAgICAgIHRvYXN0LmVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBob29rJywge1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTm8gcmVzb2x2ZSBoYW5kbGVyIHByb3ZpZGVkLicsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWhvb2tUb2tlbikge1xuICAgICAgICB0b2FzdC5lcnJvcignVW5hYmxlIHRvIHJlc29sdmUgaG9vaycsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdNaXNzaW5nIGhvb2sgdG9rZW4uIFRyeSByZWZyZXNoaW5nIHRoZSBydW4gZGF0YSBhbmQgcmV0cnkuJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0UmVzb2x2aW5nSG9vayh0cnVlKTtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gc3BhbkRldGFpbERhdGEgPz8gZGF0YTtcbiAgICAgICAgY29uc3QgaG9vayA9IGlzSG9vayhjYW5kaWRhdGUpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCBvblJlc29sdmVIb29rKGhvb2tUb2tlbiwgcGF5bG9hZCwgaG9vayk7XG4gICAgICAgIHRvYXN0LnN1Y2Nlc3MoJ0hvb2sgcmVzb2x2ZWQnLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGF5bG9hZCBoYXMgYmVlbiBzZW50IGFuZCB0aGUgaG9vayByZXNvbHZlZC4nLFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0U2hvd1Jlc29sdmVIb29rTW9kYWwoZmFsc2UpO1xuICAgICAgICAvLyBNYXJrIHRoaXMgaG9vayBhcyByZXNvbHZlZCBsb2NhbGx5IHNvIHRoZSBidXR0b24gaGlkZXMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHJlc291cmNlSWQpIHtcbiAgICAgICAgICBzZXRSZXNvbHZlZEhvb2tJZHMoKHByZXYpID0+IG5ldyBTZXQocHJldikuYWRkKHJlc291cmNlSWQpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGhvb2s6JywgZXJyKTtcbiAgICAgICAgdG9hc3QuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIGhvb2snLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldFJlc29sdmluZ0hvb2soZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW29uUmVzb2x2ZUhvb2ssIGhvb2tUb2tlbiwgcmVzb2x2aW5nSG9vaywgc3BhbkRldGFpbERhdGEsIGRhdGFdXG4gICk7XG5cbiAgLy8gUHJlZmVyIGV4dGVybmFsbHktZmV0Y2hlZCBkZXRhaWxzIHdoZW4gYXZhaWxhYmxlLiBGb3Igc2xlZXAgc3BhbnMsIHRoZVxuICAvLyBob3N0IGZldGNoZXMgZnVsbCBjb3JyZWxhdGVkIGV2ZW50cyAod2l0aERhdGE9dHJ1ZSkgYW5kIG1hdGVyaWFsaXplcyBhIHdhaXRcbiAgLy8gZW50aXR5LCBzbyB0aGlzIGluY2x1ZGVzIHJlc3VtZUF0L2NvbXBsZXRlZEF0IHdpdGhvdXQgYmxvYXRpbmcgdHJhY2UgcGF5bG9hZHMuXG4gIGNvbnN0IGRpc3BsYXlEYXRhID0gKHNwYW5EZXRhaWxEYXRhID8/IGRhdGEpIGFzXG4gICAgfCBXb3JrZmxvd1J1blxuICAgIHwgU3RlcFxuICAgIHwgSG9va1xuICAgIHwgRXZlbnQ7XG5cbiAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZGlzcGxheVJlY29yZCA9IGRpc3BsYXlEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGRpc3BsYXlTdGVwTmFtZSA9IGRpc3BsYXlSZWNvcmQuc3RlcE5hbWU7XG4gICAgY29uc3QgZGlzcGxheVdvcmtmbG93TmFtZSA9IGRpc3BsYXlSZWNvcmQud29ya2Zsb3dOYW1lO1xuICAgIGlmICh0eXBlb2YgZGlzcGxheVN0ZXBOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGRpc3BsYXlTdGVwTmFtZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwbGF5V29ya2Zsb3dOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGRpc3BsYXlXb3JrZmxvd05hbWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcnVuLndvcmtmbG93TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBydW4ud29ya2Zsb3dOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbZGlzcGxheURhdGEsIHJ1bi53b3JrZmxvd05hbWVdKTtcblxuICBpZiAoIXNlbGVjdGVkU3BhbiB8fCAhcmVzb3VyY2UgfHwgIXJlc291cmNlSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGhhc1BlbmRpbmdBY3Rpb25zID1cbiAgICAocmVzb3VyY2UgPT09ICdzbGVlcCcgJiYgY2FuV2FrZVVwKSB8fFxuICAgIChyZXNvdXJjZSA9PT0gJ2hvb2snICYmIGNhblJlc29sdmVIb29rKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgZmxleC1jb2xcIj5cbiAgICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyXG4gICAgICAgIHZhbHVlPXtcbiAgICAgICAgICBvbkRlY3J5cHQgPyB7IG9uRGVjcnlwdCwgaXNEZWNyeXB0aW5nLCBoYXNFbmNyeXB0ZWREYXRhIH0gOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHgtNCBwYi04XCI+XG4gICAgICAgICAge2hhc1BlbmRpbmdBY3Rpb25zICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWItNCByb3VuZGVkLWxnIGJvcmRlciBwLTJcIlxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1iLTIgcHgtMSB0ZXh0LVsxM3B4XSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBBY3Rpb25zXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgey8qIFdha2UgdXAgYnV0dG9uIGZvciBwZW5kaW5nIHNsZWVwIGNhbGxzICovfVxuICAgICAgICAgICAgICAgIHtyZXNvdXJjZSA9PT0gJ3NsZWVwJyAmJiBjYW5XYWtlVXAgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlV2FrZVVwfVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c3RvcHBpbmdTbGVlcH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgdHJhbnNpdGlvbi1jb2xvcnMnLFxuICAgICAgICAgICAgICAgICAgICAgIHN0b3BwaW5nU2xlZXBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ29wYWNpdHktNTAgY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnY3Vyc29yLXBvaW50ZXInXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWRzLWFtYmVyLTIwMCknLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtYW1iZXItOTAwKScsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxaYXAgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIHtzdG9wcGluZ1NsZWVwID8gJ1dha2luZyB1cC4uLicgOiAnV2FrZSBVcCBTbGVlcCd9XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgey8qIFJlc29sdmUgaG9vayBidXR0b24gZm9yIHBlbmRpbmcgaG9va3MgKi99XG4gICAgICAgICAgICAgICAge3Jlc291cmNlID09PSAnaG9vaycgJiYgY2FuUmVzb2x2ZUhvb2sgJiYgKFxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2hvd1Jlc29sdmVIb29rTW9kYWwodHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtyZXNvbHZpbmdIb29rfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goXG4gICAgICAgICAgICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHJvdW5kZWQtbWQgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgICAgICdkaXNhYmxlZDpvcGFjaXR5LTUwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2aW5nSG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAnb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcidcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZHMtZ3JheS0xMDAwKScsXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1iYWNrZ3JvdW5kLTEwMCknLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8U2VuZCBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZSBIb29rXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICA8QXR0cmlidXRlUGFuZWxcbiAgICAgICAgICAgIGRhdGE9e2Rpc3BsYXlEYXRhfVxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyPXttb2R1bGVTcGVjaWZpZXJ9XG4gICAgICAgICAgICBleHBpcmVkQXQ9e3J1bi5leHBpcmVkQXR9XG4gICAgICAgICAgICBpc0xvYWRpbmc9e2xvYWRpbmd9XG4gICAgICAgICAgICBlcnJvcj17ZXJyb3IgPz8gdW5kZWZpbmVkfVxuICAgICAgICAgICAgb25TdHJlYW1DbGljaz17b25TdHJlYW1DbGlja31cbiAgICAgICAgICAgIG9uUnVuQ2xpY2s9e29uUnVuQ2xpY2t9XG4gICAgICAgICAgICBvbkRlY3J5cHQ9e29uRGVjcnlwdH1cbiAgICAgICAgICAgIGlzRGVjcnlwdGluZz17aXNEZWNyeXB0aW5nfVxuICAgICAgICAgICAgcmVzb3VyY2U9e3Jlc291cmNlfVxuICAgICAgICAgIC8+XG5cbiAgICAgICAgICB7cmVzb3VyY2UgIT09ICdydW4nICYmIHJhd0V2ZW50cyAmJiAoXG4gICAgICAgICAgICA8RXZlbnRzTGlzdFxuICAgICAgICAgICAgICBldmVudHM9e3Jhd0V2ZW50c31cbiAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e2VuY3J5cHRpb25LZXl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9EZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuXG4gICAgICB7LyogUmVzb2x2ZSBIb29rIE1vZGFsICovfVxuICAgICAgPFJlc29sdmVIb29rTW9kYWxcbiAgICAgICAgaXNPcGVuPXtzaG93UmVzb2x2ZUhvb2tNb2RhbH1cbiAgICAgICAgb25DbG9zZT17KCkgPT4gc2V0U2hvd1Jlc29sdmVIb29rTW9kYWwoZmFsc2UpfVxuICAgICAgICBvblN1Ym1pdD17aGFuZGxlUmVzb2x2ZUhvb2t9XG4gICAgICAgIGlzU3VibWl0dGluZz17cmVzb2x2aW5nSG9va31cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import type { Event } from '@workflow/world';
1
+ import { type Event } from '@workflow/world';
2
2
  export declare function EventsList({ events, isLoading, error, onLoadEventData, encryptionKey, }: {
3
3
  events: Event[];
4
4
  isLoading?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA+Q7C,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA2CA"}
1
+ {"version":3,"file":"events-list.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/events-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA8PpE,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,SAAiB,EACjB,KAAK,EACL,eAAe,EACf,aAAa,GACd,EAAE;IACD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,6FAA6F;IAC7F,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B,2CA6CA"}
@@ -1,12 +1,12 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
- import { isExpiredMarker } from '../../lib/hydration';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { EVENT_DATA_REF_FIELDS } from '@workflow/world';
4
+ import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
5
+ import { hasEncryptedFields, isExpiredMarker } from '../../lib/hydration';
5
6
  import { ErrorCard } from '../ui/error-card';
6
7
  import { ErrorStackBlock, isStructuredErrorWithStack, } from '../ui/error-stack-block';
7
8
  import { Skeleton } from '../ui/skeleton';
8
- import { localMillisecondTime } from './attribute-panel';
9
- import { CopyableDataBlock } from './copyable-data-block';
9
+ import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
10
10
  import { DetailCard } from './detail-card';
11
11
  /**
12
12
  * Event types whose eventData contains an error field with a StructuredError.
@@ -36,17 +36,23 @@ function EventItem({ event, onLoadEventData, encryptionKey, }) {
36
36
  const [isLoading, setIsLoading] = useState(false);
37
37
  const [loadError, setLoadError] = useState(null);
38
38
  const wasExpandedRef = useRef(false);
39
+ /** Mirrors whether we have a fetched payload; avoids stale `loadedData` in load closure. */
40
+ const loadedDataRef = useRef(null);
39
41
  // Check if the event already has eventData from the store
40
42
  const existingData = 'eventData' in event && event.eventData != null ? event.eventData : null;
41
- const displayData = existingData ?? loadedData;
43
+ const mergedDisplay = loadedData ?? existingData;
42
44
  const canHaveData = DATA_EVENT_TYPES.has(event.eventType);
43
- const loadEventData = useCallback(async () => {
45
+ const loadEventData = useCallback(async (options) => {
44
46
  if (!onLoadEventData || !event.correlationId || !event.eventId)
45
47
  return;
48
+ if (!options?.force && loadedDataRef.current !== null) {
49
+ return;
50
+ }
46
51
  try {
47
52
  setIsLoading(true);
48
53
  setLoadError(null);
49
54
  const data = await onLoadEventData(event.correlationId, event.eventId);
55
+ loadedDataRef.current = data;
50
56
  setLoadedData(data);
51
57
  }
52
58
  catch (err) {
@@ -57,45 +63,46 @@ function EventItem({ event, onLoadEventData, encryptionKey, }) {
57
63
  }
58
64
  }, [onLoadEventData, event.correlationId, event.eventId]);
59
65
  const handleExpand = useCallback(async () => {
60
- if (existingData || loadedData !== null || isLoading)
66
+ if (isLoading)
61
67
  return;
62
68
  wasExpandedRef.current = true;
63
69
  await loadEventData();
64
- }, [existingData, loadedData, isLoading, loadEventData]);
70
+ }, [isLoading, loadEventData]);
65
71
  // When the encryption key changes and this event was previously expanded,
66
72
  // re-load the data so it gets decrypted
67
- useEffect(() => {
68
- if (encryptionKey && wasExpandedRef.current && loadedData !== null) {
69
- setLoadedData(null); // clear stale data
70
- loadEventData();
71
- }
72
- // eslint-disable-next-line react-hooks/exhaustive-deps
73
- }, [encryptionKey]);
73
+ useLayoutEffect(() => {
74
+ if (!encryptionKey || !wasExpandedRef.current)
75
+ return;
76
+ loadedDataRef.current = null;
77
+ setLoadedData(null);
78
+ void loadEventData({ force: true });
79
+ }, [encryptionKey, loadEventData]);
74
80
  const createdAt = new Date(event.createdAt);
75
- return (_jsxs(DetailCard, { summaryClassName: "text-base py-2", summary: _jsxs(_Fragment, { children: [_jsx("span", { className: "font-medium", style: { color: 'var(--ds-gray-1000)' }, children: event.eventType }), ' ', "-", ' ', _jsx("span", { style: { color: 'var(--ds-gray-700)' }, children: localMillisecondTime(createdAt.getTime()) })] }), onToggle: canHaveData
81
+ const createdAtTime = createdAt.toLocaleTimeString(undefined, {
82
+ hour: 'numeric',
83
+ minute: 'numeric',
84
+ second: 'numeric',
85
+ });
86
+ const displayPayload = isLoading ? loadedData : mergedDisplay;
87
+ return (_jsxs(DetailCard, { variant: "card", summaryClassName: "px-3 py-2", summary: _jsxs("div", { className: "flex w-full items-center justify-between gap-3", children: [_jsx("span", { className: "text-gray-1000 text-label-12 font-mono", children: event.eventType }), _jsx("span", { className: "shrink-0 text-label-13 text-gray-900", children: createdAtTime })] }), onToggle: canHaveData
76
88
  ? (open) => {
77
89
  if (open)
78
90
  handleExpand();
79
91
  }
80
- : undefined, children: [_jsxs("div", { className: "flex flex-col divide-y rounded-md border overflow-hidden", style: {
81
- borderColor: 'var(--ds-gray-300)',
82
- backgroundColor: 'var(--ds-gray-100)',
83
- }, children: [_jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("span", { className: "text-[14px]", style: { color: 'var(--ds-gray-700)' }, children: "eventId" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-[13px] font-mono", style: { color: 'var(--ds-gray-1000)' }, title: event.eventId, children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 px-2.5 py-1.5", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("span", { className: "text-[14px]", style: { color: 'var(--ds-gray-700)' }, children: "correlationId" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-[13px] font-mono", style: { color: 'var(--ds-gray-1000)' }, title: event.correlationId, children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "mt-2 rounded-md border p-3", style: {
84
- borderColor: 'var(--ds-gray-300)',
85
- }, children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayData != null && (_jsx("div", { className: "mt-2", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayData }) }))] }));
92
+ : undefined, children: [_jsxs("div", { className: "flex flex-col bg-background-200 [&:has(+_*)]:border-b [&:has(+_*)]:border-gray-alpha-400", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Event ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.eventId })] }), event.correlationId && (_jsxs("div", { className: "flex items-center justify-between gap-2 py-2 px-3", children: [_jsx("span", { className: "text-label-12 text-gray-900", children: "Correlation ID" }), _jsx("span", { className: "max-w-[70%] truncate text-right text-label-12 font-mono", children: event.correlationId })] }))] }), isLoading && (_jsxs("div", { className: "p-3", children: [_jsx(Skeleton, { className: "h-4 w-[35%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[90%]" }), _jsx(Skeleton, { className: "mt-2 h-4 w-[75%]" })] })), loadError && (_jsx(ErrorCard, { title: "Failed to load event data", details: loadError, className: "mt-2" })), displayPayload != null && (_jsx("div", { className: "[&>div]:border-none [&>div]:rounded-none", children: _jsx(EventDataBlock, { eventType: event.eventType, data: displayPayload }) }))] }));
86
93
  }
87
94
  /**
88
- * Check if an eventData object has only expired marker values in its serialized
89
- * sub-fields (result, input, output, metadata, payload). Non-serialized fields
90
- * like `resumeAt` or `reason` are ignored.
95
+ * Check if an eventData object has only expired marker values in ref/payload
96
+ * fields for this event type (see {@link EVENT_DATA_REF_FIELDS}). Other keys
97
+ * (e.g. `resumeAt`, `stepName`) are ignored.
91
98
  */
92
- function hasOnlyExpiredFields(data) {
99
+ function hasOnlyExpiredFields(data, eventType) {
93
100
  if (data === null || typeof data !== 'object' || Array.isArray(data)) {
94
101
  return false;
95
102
  }
96
103
  const record = data;
97
- const serializedKeys = ['result', 'input', 'output', 'metadata', 'payload'];
98
- const presentKeys = serializedKeys.filter((k) => k in record);
104
+ const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
105
+ const presentKeys = refKeys.filter((k) => k in record);
99
106
  return (presentKeys.length > 0 &&
100
107
  presentKeys.every((k) => isExpiredMarker(record[k])));
101
108
  }
@@ -107,13 +114,16 @@ function EventDataBlock({ eventType, data, }) {
107
114
  // Expired data — show a simple message instead of the raw stub.
108
115
  // Check both the top-level eventData and nested sub-fields (result, input, etc.)
109
116
  // since the server stubs each ref field independently.
110
- if (isExpiredMarker(data) || hasOnlyExpiredFields(data)) {
117
+ if (isExpiredMarker(data) || hasOnlyExpiredFields(data, eventType)) {
111
118
  return (_jsx("div", { className: "flex items-center gap-1.5 rounded-md border px-3 py-2 text-xs", style: {
112
119
  borderColor: 'var(--ds-gray-300)',
113
120
  backgroundColor: 'var(--ds-gray-100)',
114
121
  color: 'var(--ds-gray-700)',
115
122
  }, children: _jsx("span", { className: "font-medium", children: "Data expired" }) }));
116
123
  }
124
+ if (hasEncryptedFields({ eventType, eventData: data })) {
125
+ return _jsx(EncryptedDataBlock, {});
126
+ }
117
127
  // For error events (step_failed, step_retrying), the eventData has the shape
118
128
  // { error: StructuredError, stack?: string, ... }. Check both the top-level
119
129
  // value and the nested `error` field for a stack trace.
@@ -137,6 +147,10 @@ function EventDataBlock({ eventType, data, }) {
137
147
  export function EventsList({ events, isLoading = false, error, onLoadEventData, encryptionKey, }) {
138
148
  // Sort by createdAt
139
149
  const sortedEvents = useMemo(() => [...events].sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()), [events]);
140
- return (_jsxs("div", { className: "mt-2", style: { color: 'var(--ds-gray-1000)' }, children: [_jsxs("h3", { className: "text-heading-16 font-medium mt-4 mb-2", style: { color: 'var(--ds-gray-1000)' }, children: ["Events ", !isLoading && `(${sortedEvents.length})`] }), isLoading ? (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx(Skeleton, { className: "h-9 w-full rounded-md" }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" })] })) : null, !isLoading && !error && sortedEvents.length === 0 && (_jsx("div", { className: "text-sm", children: "No events found" })), sortedEvents.length > 0 && !error ? (_jsx("div", { className: "flex flex-col gap-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }, event.eventId))) })) : null] }));
150
+ const hasEvents = sortedEvents.length > 0 && !error;
151
+ if (!hasEvents && !isLoading) {
152
+ return _jsx(DetailCard, { summary: "Events", disabled: true });
153
+ }
154
+ return (_jsx(DetailCard, { summary: "Events", contentClassName: "mb-0", defaultOpen: true, children: isLoading ? (_jsx("div", { className: "flex flex-col -mx-4", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex items-center justify-between gap-3 bg-background-200 px-4 py-2", children: [_jsx(Skeleton, { className: "h-4 w-32 rounded" }), _jsx(Skeleton, { className: "h-3 w-16 rounded" })] }, i))) })) : (_jsx("div", { className: "flex flex-col -mx-4", children: sortedEvents.map((event) => (_jsx(EventItem, { event: event, onLoadEventData: onLoadEventData, encryptionKey: encryptionKey }, event.eventId))) })) }));
141
155
  }
142
- //# sourceMappingURL=events-list.js.map
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWxpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2V2ZW50cy1saXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLHFCQUFxQixFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBRXBFOztHQUVHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2YsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0NBQ2pCLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUMsRUFDakIsS0FBSyxFQUNMLGVBQWUsRUFDZixhQUFhLEdBU2Q7SUFDQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBaUIsSUFBSSxDQUFDLENBQUM7SUFDbkUsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyw0RkFBNEY7SUFDNUYsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUVuRCwwREFBMEQ7SUFDMUQsTUFBTSxZQUFZLEdBQ2hCLFdBQVcsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRSxNQUFNLGFBQWEsR0FBRyxVQUFVLElBQUksWUFBWSxDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFMUQsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUMvQixLQUFLLEVBQUUsT0FBNkIsRUFBRSxFQUFFO1FBQ3RDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3ZFLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDdEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBZSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZFLGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFlBQVksQ0FBQyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUMsRUFDRCxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FDdEQsQ0FBQztJQUVGLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUMxQyxJQUFJLFNBQVM7WUFBRSxPQUFPO1FBQ3RCLGNBQWMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQzlCLE1BQU0sYUFBYSxFQUFFLENBQUM7SUFDeEIsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFL0IsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUN4QyxlQUFlLENBQUMsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTztZQUFFLE9BQU87UUFDdEQsYUFBYSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLEtBQUssYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7UUFDNUQsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsU0FBUztRQUNqQixNQUFNLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUM7SUFFSCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBRTlELE9BQU8sQ0FDTCxNQUFDLFVBQVUsSUFDVCxPQUFPLEVBQUMsTUFBTSxFQUNkLGdCQUFnQixFQUFDLFdBQVcsRUFDNUIsT0FBTyxFQUNMLGVBQUssU0FBUyxFQUFDLGdEQUFnRCxhQUM3RCxlQUFNLFNBQVMsRUFBQyx3Q0FBd0MsWUFDckQsS0FBSyxDQUFDLFNBQVMsR0FDWCxFQUNQLGVBQU0sU0FBUyxFQUFDLHNDQUFzQyxZQUNuRCxhQUFhLEdBQ1QsSUFDSCxFQUVSLFFBQVEsRUFDTixXQUFXO1lBQ1QsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1AsSUFBSSxJQUFJO29CQUFFLFlBQVksRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDSCxDQUFDLENBQUMsU0FBUyxhQUlmLGVBQUssU0FBUyxFQUFDLDBGQUEwRixhQUN2RyxlQUFLLFNBQVMsRUFBQyxtREFBbUQsYUFDaEUsZUFBTSxTQUFTLEVBQUMsNkJBQTZCLHlCQUFnQixFQUM3RCxlQUFNLFNBQVMsRUFBQyx5REFBeUQsWUFDdEUsS0FBSyxDQUFDLE9BQU8sR0FDVCxJQUNILEVBQ0wsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUN0QixlQUFLLFNBQVMsRUFBQyxtREFBbUQsYUFDaEUsZUFBTSxTQUFTLEVBQUMsNkJBQTZCLCtCQUFzQixFQUNuRSxlQUFNLFNBQVMsRUFBQyx5REFBeUQsWUFDdEUsS0FBSyxDQUFDLGFBQWEsR0FDZixJQUNILENBQ1AsSUFDRyxFQUdMLFNBQVMsSUFBSSxDQUNaLGVBQUssU0FBUyxFQUFDLEtBQUssYUFDbEIsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGFBQWEsR0FBRyxFQUNwQyxLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDekMsS0FBQyxRQUFRLElBQUMsU0FBUyxFQUFDLGtCQUFrQixHQUFHLElBQ3JDLENBQ1AsRUFHQSxTQUFTLElBQUksQ0FDWixLQUFDLFNBQVMsSUFDUixLQUFLLEVBQUMsMkJBQTJCLEVBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQ2xCLFNBQVMsRUFBQyxNQUFNLEdBQ2hCLENBQ0gsRUFHQSxjQUFjLElBQUksSUFBSSxJQUFJLENBQ3pCLGNBQUssU0FBUyxFQUFDLDBDQUEwQyxZQUN2RCxLQUFDLGNBQWMsSUFBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsY0FBYyxHQUFJLEdBQ2hFLENBQ1AsSUFDVSxDQUNkLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQUMsSUFBYSxFQUFFLFNBQWlCO0lBQzVELElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLElBQStCLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQ0wsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3RCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYyxDQUFDLEVBQ3RCLFNBQVMsRUFDVCxJQUFJLEdBSUw7SUFDQyxnRUFBZ0U7SUFDaEUsaUZBQWlGO0lBQ2pGLHVEQUF1RDtJQUN2RCxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxPQUFPLENBQ0wsY0FDRSxTQUFTLEVBQUMsK0RBQStELEVBQ3pFLEtBQUssRUFBRTtnQkFDTCxXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxlQUFlLEVBQUUsb0JBQW9CO2dCQUNyQyxLQUFLLEVBQUUsb0JBQW9CO2FBQzVCLFlBRUQsZUFBTSxTQUFTLEVBQUMsYUFBYSw2QkFBb0IsR0FDN0MsQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEtBQUMsa0JBQWtCLEtBQUcsQ0FBQztJQUNoQyxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSx3REFBd0Q7SUFDeEQsSUFDRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksSUFBSSxJQUFJO1FBQ1osT0FBTyxJQUFJLEtBQUssUUFBUSxFQUN4QixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBK0IsQ0FBQztRQUUvQyw2REFBNkQ7UUFDN0QsSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLEtBQUMsZUFBZSxJQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxHQUFJLENBQUM7UUFDbEQsQ0FBQztRQUVELGlFQUFpRTtRQUNqRSxJQUFJLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFDLGVBQWUsSUFBQyxLQUFLLEVBQUUsTUFBTSxHQUFJLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsdUJBQXVCO0lBQ3ZCLE9BQU8sS0FBQyxpQkFBaUIsSUFBQyxJQUFJLEVBQUUsSUFBSSxHQUFJLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsRUFDekIsTUFBTSxFQUNOLFNBQVMsR0FBRyxLQUFLLEVBQ2pCLEtBQUssRUFDTCxlQUFlLEVBQ2YsYUFBYSxHQVdkO0lBQ0Msb0JBQW9CO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FDMUIsR0FBRyxFQUFFLENBQ0gsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDZCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNQLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQ3BFLEVBQ0gsQ0FBQyxNQUFNLENBQUMsQ0FDVCxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFFcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sS0FBQyxVQUFVLElBQUMsT0FBTyxFQUFDLFFBQVEsRUFBQyxRQUFRLFNBQUcsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTyxDQUNMLEtBQUMsVUFBVSxJQUFDLE9BQU8sRUFBQyxRQUFRLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxFQUFDLFdBQVcsa0JBQzdELFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDWCxjQUFLLFNBQVMsRUFBQyxxQkFBcUIsWUFDakMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDcEIsZUFFRSxTQUFTLEVBQUMscUVBQXFFLGFBRS9FLEtBQUMsUUFBUSxJQUFDLFNBQVMsRUFBQyxrQkFBa0IsR0FBRyxFQUN6QyxLQUFDLFFBQVEsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsS0FKcEMsQ0FBQyxDQUtGLENBQ1AsQ0FBQyxHQUNFLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixjQUFLLFNBQVMsRUFBQyxxQkFBcUIsWUFDakMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDM0IsS0FBQyxTQUFTLElBRVIsS0FBSyxFQUFFLEtBQUssRUFDWixlQUFlLEVBQUUsZUFBZSxFQUNoQyxhQUFhLEVBQUUsYUFBYSxJQUh2QixLQUFLLENBQUMsT0FBTyxDQUlsQixDQUNILENBQUMsR0FDRSxDQUNQLEdBQ1UsQ0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgRVZFTlRfREFUQV9SRUZfRklFTERTLCB0eXBlIEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBoYXNFbmNyeXB0ZWRGaWVsZHMsIGlzRXhwaXJlZE1hcmtlciB9IGZyb20gJy4uLy4uL2xpYi9oeWRyYXRpb24nO1xuaW1wb3J0IHsgRXJyb3JDYXJkIH0gZnJvbSAnLi4vdWkvZXJyb3ItY2FyZCc7XG5pbXBvcnQge1xuICBFcnJvclN0YWNrQmxvY2ssXG4gIGlzU3RydWN0dXJlZEVycm9yV2l0aFN0YWNrLFxufSBmcm9tICcuLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrLCBFbmNyeXB0ZWREYXRhQmxvY2sgfSBmcm9tICcuL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuaW1wb3J0IHsgRGV0YWlsQ2FyZCB9IGZyb20gJy4vZGV0YWlsLWNhcmQnO1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHdob3NlIGV2ZW50RGF0YSBjb250YWlucyBhbiBlcnJvciBmaWVsZCB3aXRoIGEgU3RydWN0dXJlZEVycm9yLlxuICovXG5jb25zdCBFUlJPUl9FVkVOVF9UWVBFUyA9IG5ldyBTZXQoWydzdGVwX2ZhaWxlZCcsICdzdGVwX3JldHJ5aW5nJ10pO1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgY2FycnkgdXNlci1zZXJpYWxpemVkIGRhdGEgaW4gdGhlaXIgZXZlbnREYXRhIGZpZWxkLlxuICovXG5jb25zdCBEQVRBX0VWRU5UX1RZUEVTID0gbmV3IFNldChbXG4gICdzdGVwX2NyZWF0ZWQnLFxuICAnc3RlcF9jb21wbGV0ZWQnLFxuICAnc3RlcF9mYWlsZWQnLFxuICAnc3RlcF9yZXRyeWluZycsXG4gICdob29rX2NyZWF0ZWQnLFxuICAnaG9va19yZWNlaXZlZCcsXG4gICdydW5fY3JlYXRlZCcsXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAnd2FpdF9jcmVhdGVkJyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbl0pO1xuXG4vKipcbiAqIEEgc2luZ2xlIGV2ZW50IHJvdyB0aGF0IGNhbiBsYXp5LWxvYWQgaXRzIGV2ZW50RGF0YSB3aGVuIGV4cGFuZGVkLlxuICovXG5mdW5jdGlvbiBFdmVudEl0ZW0oe1xuICBldmVudCxcbiAgb25Mb2FkRXZlbnREYXRhLFxuICBlbmNyeXB0aW9uS2V5LFxufToge1xuICBldmVudDogRXZlbnQ7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBXaGVuIHRoaXMgY2hhbmdlcyAoZS5nLiwgRGVjcnlwdCB3YXMgY2xpY2tlZCksIGludmFsaWRhdGUgY2FjaGVkIGRhdGEgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG59KSB7XG4gIGNvbnN0IFtsb2FkZWREYXRhLCBzZXRMb2FkZWREYXRhXSA9IHVzZVN0YXRlPHVua25vd24gfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0SXNMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2xvYWRFcnJvciwgc2V0TG9hZEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCB3YXNFeHBhbmRlZFJlZiA9IHVzZVJlZihmYWxzZSk7XG4gIC8qKiBNaXJyb3JzIHdoZXRoZXIgd2UgaGF2ZSBhIGZldGNoZWQgcGF5bG9hZDsgYXZvaWRzIHN0YWxlIGBsb2FkZWREYXRhYCBpbiBsb2FkIGNsb3N1cmUuICovXG4gIGNvbnN0IGxvYWRlZERhdGFSZWYgPSB1c2VSZWY8dW5rbm93biB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBldmVudCBhbHJlYWR5IGhhcyBldmVudERhdGEgZnJvbSB0aGUgc3RvcmVcbiAgY29uc3QgZXhpc3RpbmdEYXRhID1cbiAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJiBldmVudC5ldmVudERhdGEgIT0gbnVsbCA/IGV2ZW50LmV2ZW50RGF0YSA6IG51bGw7XG4gIGNvbnN0IG1lcmdlZERpc3BsYXkgPSBsb2FkZWREYXRhID8/IGV4aXN0aW5nRGF0YTtcbiAgY29uc3QgY2FuSGF2ZURhdGEgPSBEQVRBX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpO1xuXG4gIGNvbnN0IGxvYWRFdmVudERhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAob3B0aW9ucz86IHsgZm9yY2U/OiBib29sZWFuIH0pID0+IHtcbiAgICAgIGlmICghb25Mb2FkRXZlbnREYXRhIHx8ICFldmVudC5jb3JyZWxhdGlvbklkIHx8ICFldmVudC5ldmVudElkKSByZXR1cm47XG4gICAgICBpZiAoIW9wdGlvbnM/LmZvcmNlICYmIGxvYWRlZERhdGFSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0TG9hZEVycm9yKG51bGwpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgb25Mb2FkRXZlbnREYXRhKGV2ZW50LmNvcnJlbGF0aW9uSWQsIGV2ZW50LmV2ZW50SWQpO1xuICAgICAgICBsb2FkZWREYXRhUmVmLmN1cnJlbnQgPSBkYXRhO1xuICAgICAgICBzZXRMb2FkZWREYXRhKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNldExvYWRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtvbkxvYWRFdmVudERhdGEsIGV2ZW50LmNvcnJlbGF0aW9uSWQsIGV2ZW50LmV2ZW50SWRdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlRXhwYW5kID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcpIHJldHVybjtcbiAgICB3YXNFeHBhbmRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICBhd2FpdCBsb2FkRXZlbnREYXRhKCk7XG4gIH0sIFtpc0xvYWRpbmcsIGxvYWRFdmVudERhdGFdKTtcblxuICAvLyBXaGVuIHRoZSBlbmNyeXB0aW9uIGtleSBjaGFuZ2VzIGFuZCB0aGlzIGV2ZW50IHdhcyBwcmV2aW91c2x5IGV4cGFuZGVkLFxuICAvLyByZS1sb2FkIHRoZSBkYXRhIHNvIGl0IGdldHMgZGVjcnlwdGVkXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICF3YXNFeHBhbmRlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgbG9hZGVkRGF0YVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICBzZXRMb2FkZWREYXRhKG51bGwpO1xuICAgIHZvaWQgbG9hZEV2ZW50RGF0YSh7IGZvcmNlOiB0cnVlIH0pO1xuICB9LCBbZW5jcnlwdGlvbktleSwgbG9hZEV2ZW50RGF0YV0pO1xuXG4gIGNvbnN0IGNyZWF0ZWRBdCA9IG5ldyBEYXRlKGV2ZW50LmNyZWF0ZWRBdCk7XG4gIGNvbnN0IGNyZWF0ZWRBdFRpbWUgPSBjcmVhdGVkQXQudG9Mb2NhbGVUaW1lU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgfSk7XG5cbiAgY29uc3QgZGlzcGxheVBheWxvYWQgPSBpc0xvYWRpbmcgPyBsb2FkZWREYXRhIDogbWVyZ2VkRGlzcGxheTtcblxuICByZXR1cm4gKFxuICAgIDxEZXRhaWxDYXJkXG4gICAgICB2YXJpYW50PVwiY2FyZFwiXG4gICAgICBzdW1tYXJ5Q2xhc3NOYW1lPVwicHgtMyBweS0yXCJcbiAgICAgIHN1bW1hcnk9e1xuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktMTAwMCB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAge2V2ZW50LmV2ZW50VHlwZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic2hyaW5rLTAgdGV4dC1sYWJlbC0xMyB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICB7Y3JlYXRlZEF0VGltZX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgb25Ub2dnbGU9e1xuICAgICAgICBjYW5IYXZlRGF0YVxuICAgICAgICAgID8gKG9wZW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9wZW4pIGhhbmRsZUV4cGFuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgPlxuICAgICAgey8qIEV2ZW50IGF0dHJpYnV0ZXMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgYmctYmFja2dyb3VuZC0yMDAgWyY6aGFzKCtfKildOmJvcmRlci1iIFsmOmhhcygrXyopXTpib3JkZXItZ3JheS1hbHBoYS00MDBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcHktMiBweC0zXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+RXZlbnQgSUQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWF4LXctWzcwJV0gdHJ1bmNhdGUgdGV4dC1yaWdodCB0ZXh0LWxhYmVsLTEyIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAge2V2ZW50LmV2ZW50SWR9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge2V2ZW50LmNvcnJlbGF0aW9uSWQgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHB5LTIgcHgtM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xMiB0ZXh0LWdyYXktOTAwXCI+Q29ycmVsYXRpb24gSUQ8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgIHtldmVudC5jb3JyZWxhdGlvbklkfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBMb2FkaW5nIHN0YXRlICovfVxuICAgICAge2lzTG9hZGluZyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0zXCI+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtNCB3LVszNSVdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwibXQtMiBoLTQgdy1bOTAlXVwiIC8+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cIm10LTIgaC00IHctWzc1JV1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG5cbiAgICAgIHsvKiBFcnJvciBzdGF0ZSAqL31cbiAgICAgIHtsb2FkRXJyb3IgJiYgKFxuICAgICAgICA8RXJyb3JDYXJkXG4gICAgICAgICAgdGl0bGU9XCJGYWlsZWQgdG8gbG9hZCBldmVudCBkYXRhXCJcbiAgICAgICAgICBkZXRhaWxzPXtsb2FkRXJyb3J9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibXQtMlwiXG4gICAgICAgIC8+XG4gICAgICApfVxuXG4gICAgICB7LyogRXZlbnQgZGF0YSAqL31cbiAgICAgIHtkaXNwbGF5UGF5bG9hZCAhPSBudWxsICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJbJj5kaXZdOmJvcmRlci1ub25lIFsmPmRpdl06cm91bmRlZC1ub25lXCI+XG4gICAgICAgICAgPEV2ZW50RGF0YUJsb2NrIGV2ZW50VHlwZT17ZXZlbnQuZXZlbnRUeXBlfSBkYXRhPXtkaXNwbGF5UGF5bG9hZH0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvRGV0YWlsQ2FyZD5cbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBldmVudERhdGEgb2JqZWN0IGhhcyBvbmx5IGV4cGlyZWQgbWFya2VyIHZhbHVlcyBpbiByZWYvcGF5bG9hZFxuICogZmllbGRzIGZvciB0aGlzIGV2ZW50IHR5cGUgKHNlZSB7QGxpbmsgRVZFTlRfREFUQV9SRUZfRklFTERTfSkuIE90aGVyIGtleXNcbiAqIChlLmcuIGByZXN1bWVBdGAsIGBzdGVwTmFtZWApIGFyZSBpZ25vcmVkLlxuICovXG5mdW5jdGlvbiBoYXNPbmx5RXhwaXJlZEZpZWxkcyhkYXRhOiB1bmtub3duLCBldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gIGNvbnN0IHByZXNlbnRLZXlzID0gcmVmS2V5cy5maWx0ZXIoKGspID0+IGsgaW4gcmVjb3JkKTtcbiAgcmV0dXJuIChcbiAgICBwcmVzZW50S2V5cy5sZW5ndGggPiAwICYmXG4gICAgcHJlc2VudEtleXMuZXZlcnkoKGspID0+IGlzRXhwaXJlZE1hcmtlcihyZWNvcmRba10pKVxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgZXZlbnQgZGF0YSwgdXNpbmcgRXJyb3JTdGFja0Jsb2NrIGZvciBlcnJvciBldmVudHMgdGhhdCBjb250YWluXG4gKiBhIHN0cnVjdHVyZWQgZXJyb3Igd2l0aCBhIHN0YWNrIHRyYWNlLCBhbmQgQ29weWFibGVEYXRhQmxvY2sgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBFdmVudERhdGFCbG9jayh7XG4gIGV2ZW50VHlwZSxcbiAgZGF0YSxcbn06IHtcbiAgZXZlbnRUeXBlOiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG59KSB7XG4gIC8vIEV4cGlyZWQgZGF0YSDigJQgc2hvdyBhIHNpbXBsZSBtZXNzYWdlIGluc3RlYWQgb2YgdGhlIHJhdyBzdHViLlxuICAvLyBDaGVjayBib3RoIHRoZSB0b3AtbGV2ZWwgZXZlbnREYXRhIGFuZCBuZXN0ZWQgc3ViLWZpZWxkcyAocmVzdWx0LCBpbnB1dCwgZXRjLilcbiAgLy8gc2luY2UgdGhlIHNlcnZlciBzdHVicyBlYWNoIHJlZiBmaWVsZCBpbmRlcGVuZGVudGx5LlxuICBpZiAoaXNFeHBpcmVkTWFya2VyKGRhdGEpIHx8IGhhc09ubHlFeHBpcmVkRmllbGRzKGRhdGEsIGV2ZW50VHlwZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIHB4LTMgcHktMiB0ZXh0LXhzXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RGF0YSBleHBpcmVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIGlmIChoYXNFbmNyeXB0ZWRGaWVsZHMoeyBldmVudFR5cGUsIGV2ZW50RGF0YTogZGF0YSB9KSkge1xuICAgIHJldHVybiA8RW5jcnlwdGVkRGF0YUJsb2NrIC8+O1xuICB9XG5cbiAgLy8gRm9yIGVycm9yIGV2ZW50cyAoc3RlcF9mYWlsZWQsIHN0ZXBfcmV0cnlpbmcpLCB0aGUgZXZlbnREYXRhIGhhcyB0aGUgc2hhcGVcbiAgLy8geyBlcnJvcjogU3RydWN0dXJlZEVycm9yLCBzdGFjaz86IHN0cmluZywgLi4uIH0uIENoZWNrIGJvdGggdGhlIHRvcC1sZXZlbFxuICAvLyB2YWx1ZSBhbmQgdGhlIG5lc3RlZCBgZXJyb3JgIGZpZWxkIGZvciBhIHN0YWNrIHRyYWNlLlxuICBpZiAoXG4gICAgRVJST1JfRVZFTlRfVFlQRVMuaGFzKGV2ZW50VHlwZSkgJiZcbiAgICBkYXRhICE9IG51bGwgJiZcbiAgICB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCdcbiAgKSB7XG4gICAgY29uc3QgcmVjb3JkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIENoZWNrIHRoZSBuZXN0ZWQgYGVycm9yYCBmaWVsZCBmaXJzdCAodGhlIFN0cnVjdHVyZWRFcnJvcilcbiAgICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3JXaXRoU3RhY2socmVjb3JkLmVycm9yKSkge1xuICAgICAgcmV0dXJuIDxFcnJvclN0YWNrQmxvY2sgdmFsdWU9e3JlY29yZC5lcnJvcn0gLz47XG4gICAgfVxuXG4gICAgLy8gU29tZSBlcnJvciBmb3JtYXRzIHB1dCB0aGUgc3RhY2sgYXQgdGhlIHRvcCBsZXZlbCBvZiBldmVudERhdGFcbiAgICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3JXaXRoU3RhY2socmVjb3JkKSkge1xuICAgICAgcmV0dXJuIDxFcnJvclN0YWNrQmxvY2sgdmFsdWU9e3JlY29yZH0gLz47XG4gICAgfVxuICB9XG5cbiAgLy8gRm9yIG5vbi1lcnJvciBldmVudHMgb3IgZXJyb3JzIHdpdGhvdXQgYSBzdGFjaywgZmFsbCBiYWNrIHRvIHRoZVxuICAvLyBnZW5lcmljIEpTT04gdmlld2VyLlxuICByZXR1cm4gPENvcHlhYmxlRGF0YUJsb2NrIGRhdGE9e2RhdGF9IC8+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRXZlbnRzTGlzdCh7XG4gIGV2ZW50cyxcbiAgaXNMb2FkaW5nID0gZmFsc2UsXG4gIGVycm9yLFxuICBvbkxvYWRFdmVudERhdGEsXG4gIGVuY3J5cHRpb25LZXksXG59OiB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgZXJyb3I/OiBFcnJvciB8IG51bGw7XG4gIG9uTG9hZEV2ZW50RGF0YT86IChcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gIC8qKiBXaGVuIHByb3ZpZGVkLCBzaWduYWxzIHRoYXQgZGVjcnlwdGlvbiBpcyBhY3RpdmUgKHRyaWdnZXJzIHJlLWxvYWQgb2YgZXhwYW5kZWQgZXZlbnRzKSAqL1xuICBlbmNyeXB0aW9uS2V5PzogVWludDhBcnJheTtcbn0pIHtcbiAgLy8gU29ydCBieSBjcmVhdGVkQXRcbiAgY29uc3Qgc29ydGVkRXZlbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgWy4uLmV2ZW50c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+XG4gICAgICAgICAgbmV3IERhdGUoYS5jcmVhdGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuY3JlYXRlZEF0KS5nZXRUaW1lKClcbiAgICAgICksXG4gICAgW2V2ZW50c11cbiAgKTtcblxuICBjb25zdCBoYXNFdmVudHMgPSBzb3J0ZWRFdmVudHMubGVuZ3RoID4gMCAmJiAhZXJyb3I7XG5cbiAgaWYgKCFoYXNFdmVudHMgJiYgIWlzTG9hZGluZykge1xuICAgIHJldHVybiA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXZlbnRzXCIgZGlzYWJsZWQgLz47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFdmVudHNcIiBjb250ZW50Q2xhc3NOYW1lPVwibWItMFwiIGRlZmF1bHRPcGVuPlxuICAgICAge2lzTG9hZGluZyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIC1teC00XCI+XG4gICAgICAgICAge1swLCAxLCAyXS5tYXAoKGkpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgYmctYmFja2dyb3VuZC0yMDAgcHgtNCBweS0yXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtNCB3LTMyIHJvdW5kZWRcIiAvPlxuICAgICAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwiaC0zIHctMTYgcm91bmRlZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgLW14LTRcIj5cbiAgICAgICAgICB7c29ydGVkRXZlbnRzLm1hcCgoZXZlbnQpID0+IChcbiAgICAgICAgICAgIDxFdmVudEl0ZW1cbiAgICAgICAgICAgICAga2V5PXtldmVudC5ldmVudElkfVxuICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgIG9uTG9hZEV2ZW50RGF0YT17b25Mb2FkRXZlbnREYXRhfVxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5PXtlbmNyeXB0aW9uS2V5fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvRGV0YWlsQ2FyZD5cbiAgKTtcbn1cbiJdfQ==