@workflow/web-shared 5.0.0-beta.38 → 5.0.0-beta.39

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 (307) hide show
  1. package/README.md +3 -3
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +10 -10
  4. package/dist/components/index.d.ts +3 -5
  5. package/dist/components/index.d.ts.map +1 -1
  6. package/dist/components/index.js +3 -5
  7. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  8. package/dist/components/sidebar/attribute-panel.js +32 -8
  9. package/dist/components/sidebar/attributes-block.js +3 -3
  10. package/dist/components/sidebar/copyable-data-block.js +2 -2
  11. package/dist/components/sidebar/entity-detail-panel.js +3 -3
  12. package/dist/components/sidebar/events-list.js +2 -2
  13. package/dist/components/stream-viewer.js +2 -2
  14. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  15. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  16. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  17. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  18. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  19. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  20. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  21. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  22. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  23. package/dist/components/trace-viewer/components/event-list.js +47 -0
  24. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  27. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  28. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  29. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  30. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  31. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  32. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  33. package/dist/components/trace-viewer/components/minimap.js +337 -0
  34. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  35. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  36. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  37. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  38. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  39. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  40. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  41. package/dist/components/trace-viewer/components/timeline.js +321 -0
  42. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  44. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  45. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  46. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  47. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  48. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  50. package/dist/components/trace-viewer/context.d.ts +14 -182
  51. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  52. package/dist/components/trace-viewer/context.js +44 -351
  53. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  54. package/dist/components/trace-viewer/icons.js +15 -0
  55. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  56. package/dist/components/trace-viewer/search.js +134 -0
  57. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  58. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  59. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  60. package/dist/components/trace-viewer/types.d.ts +2 -211
  61. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  62. package/dist/components/trace-viewer/types.js +1 -1
  63. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/utils.js +430 -0
  65. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +3 -3
  66. package/dist/components/trace-viewer.d.ts.map +1 -0
  67. package/dist/components/trace-viewer.js +21 -0
  68. package/dist/components/ui/alert.js +2 -2
  69. package/dist/components/ui/button.d.ts +1 -1
  70. package/dist/components/ui/button.d.ts.map +1 -1
  71. package/dist/components/ui/button.js +3 -3
  72. package/dist/components/ui/card.d.ts.map +1 -1
  73. package/dist/components/ui/card.js +3 -3
  74. package/dist/components/ui/error-card.js +2 -2
  75. package/dist/components/ui/error-stack-block.js +4 -4
  76. package/dist/components/ui/kbd.js +3 -3
  77. package/dist/components/ui/timestamp-tooltip.js +3 -3
  78. package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
  79. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  80. package/dist/lib/trace-builder.d.ts +1 -1
  81. package/dist/lib/trace-builder.d.ts.map +1 -1
  82. package/dist/lib/trace-builder.js +1 -1
  83. package/dist/lib/trace-types.d.ts +54 -0
  84. package/dist/lib/trace-types.d.ts.map +1 -0
  85. package/dist/lib/trace-types.js +2 -0
  86. package/package.json +5 -5
  87. package/src/components/event-list-view.tsx +12 -9
  88. package/src/components/index.ts +3 -5
  89. package/src/components/sidebar/attribute-panel.tsx +46 -8
  90. package/src/components/sidebar/attributes-block.tsx +2 -2
  91. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  92. package/src/components/sidebar/entity-detail-panel.tsx +3 -3
  93. package/src/components/sidebar/events-list.tsx +1 -1
  94. package/src/components/stream-viewer.tsx +1 -1
  95. package/src/components/{new-trace-viewer → trace-viewer}/components/event-list.tsx +1 -1
  96. package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
  97. package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
  98. package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
  99. package/src/components/trace-viewer/context.tsx +63 -656
  100. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  101. package/src/components/trace-viewer/types.ts +2 -234
  102. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
  103. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
  104. package/src/components/ui/alert.tsx +1 -1
  105. package/src/components/ui/button.tsx +3 -3
  106. package/src/components/ui/card.tsx +2 -9
  107. package/src/components/ui/error-card.tsx +3 -3
  108. package/src/components/ui/error-stack-block.tsx +3 -3
  109. package/src/components/ui/kbd.tsx +2 -2
  110. package/src/components/ui/timestamp-tooltip.tsx +4 -4
  111. package/src/components/workflow-traces/trace-span-construction.ts +1 -1
  112. package/src/lib/trace-builder.ts +1 -1
  113. package/src/lib/trace-types.ts +56 -0
  114. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  115. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  116. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +0 -1
  117. package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
  118. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
  119. package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
  120. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
  121. package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
  122. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  123. package/dist/components/new-trace-viewer/components/event-list.js +0 -47
  124. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  125. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  126. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  127. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  128. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  129. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  130. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  131. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  132. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +0 -1
  133. package/dist/components/new-trace-viewer/components/minimap.js +0 -337
  134. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
  135. package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
  136. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
  137. package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
  138. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  139. package/dist/components/new-trace-viewer/components/split-pane.js +0 -41
  140. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  141. package/dist/components/new-trace-viewer/components/timeline.js +0 -321
  142. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
  143. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
  144. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
  145. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
  146. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
  147. package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
  148. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
  149. package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
  150. package/dist/components/new-trace-viewer/context.d.ts +0 -17
  151. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  152. package/dist/components/new-trace-viewer/context.js +0 -48
  153. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  154. package/dist/components/new-trace-viewer/icons.js +0 -15
  155. package/dist/components/new-trace-viewer/search.d.ts.map +0 -1
  156. package/dist/components/new-trace-viewer/search.js +0 -134
  157. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
  158. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  159. package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
  160. package/dist/components/new-trace-viewer/types.d.ts +0 -3
  161. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  162. package/dist/components/new-trace-viewer/types.js +0 -2
  163. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  164. package/dist/components/new-trace-viewer/utils.js +0 -430
  165. package/dist/components/run-trace-view.d.ts +0 -23
  166. package/dist/components/run-trace-view.d.ts.map +0 -1
  167. package/dist/components/run-trace-view.js +0 -11
  168. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  169. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  170. package/dist/components/trace-viewer/components/map.js +0 -162
  171. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  172. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  173. package/dist/components/trace-viewer/components/markers.js +0 -416
  174. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  175. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  176. package/dist/components/trace-viewer/components/node.js +0 -286
  177. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  178. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  179. package/dist/components/trace-viewer/components/search-input.js +0 -9
  180. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  181. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  182. package/dist/components/trace-viewer/components/search.js +0 -25
  183. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  184. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  185. package/dist/components/trace-viewer/components/span-content.js +0 -137
  186. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  187. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  188. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  189. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  190. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  191. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  192. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  193. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  194. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  195. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  196. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  197. package/dist/components/trace-viewer/components/ui.js +0 -39
  198. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  199. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  200. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  201. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  202. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  203. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  204. package/dist/components/trace-viewer/index.d.ts +0 -5
  205. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  206. package/dist/components/trace-viewer/index.js +0 -4
  207. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  208. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  209. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  210. package/dist/components/trace-viewer/util/constants.js +0 -9
  211. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  212. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  213. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  214. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  215. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  216. package/dist/components/trace-viewer/util/tree.js +0 -227
  217. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  218. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  219. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  220. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  221. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  222. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  223. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  224. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  225. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  226. package/dist/components/trace-viewer/worker.d.ts +0 -2
  227. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  228. package/dist/components/trace-viewer/worker.js +0 -109
  229. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  230. package/dist/components/trace-viewer-new.js +0 -21
  231. package/dist/components/workflow-trace-view.d.ts +0 -39
  232. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  233. package/dist/components/workflow-trace-view.js +0 -690
  234. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  235. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  236. package/dist/components/workflow-traces/trace-colors.js +0 -86
  237. package/src/components/new-trace-viewer/context.tsx +0 -93
  238. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
  239. package/src/components/new-trace-viewer/types.ts +0 -2
  240. package/src/components/run-trace-view.tsx +0 -80
  241. package/src/components/trace-viewer/components/map.tsx +0 -226
  242. package/src/components/trace-viewer/components/markers.tsx +0 -612
  243. package/src/components/trace-viewer/components/node.tsx +0 -506
  244. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  245. package/src/components/trace-viewer/components/search.tsx +0 -47
  246. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  247. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  248. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  249. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  250. package/src/components/trace-viewer/components/ui.tsx +0 -156
  251. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  252. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  253. package/src/components/trace-viewer/index.tsx +0 -4
  254. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  255. package/src/components/trace-viewer/util/constants.ts +0 -8
  256. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  257. package/src/components/trace-viewer/util/tree.ts +0 -277
  258. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  259. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  260. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  261. package/src/components/trace-viewer/worker.ts +0 -131
  262. package/src/components/workflow-trace-view.tsx +0 -1166
  263. package/src/components/workflow-traces/trace-colors.ts +0 -112
  264. package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  265. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.d.ts +0 -0
  266. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
  267. package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
  268. package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.d.ts +0 -0
  269. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  270. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  271. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +0 -0
  272. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  273. package/dist/components/{new-trace-viewer → trace-viewer}/components/minimap.d.ts +0 -0
  274. package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
  275. package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
  276. package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
  277. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
  278. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  279. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
  280. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  281. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
  282. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
  283. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
  284. package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  285. package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
  286. package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
  287. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
  288. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
  289. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
  290. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
  291. package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +0 -0
  292. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  293. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +1 -1
  294. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
  295. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  296. /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
  297. /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
  298. /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
  299. /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  300. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  301. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
  302. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
  303. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
  304. /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
  305. /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
  306. /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
  307. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -1,416 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { clsx } from 'clsx';
4
- import { useEffect, useMemo, useRef, useState } from 'react';
5
- import { useTraceViewer } from '../context';
6
- import styles from '../trace-viewer.module.css';
7
- import { MARKER_HEIGHT, ROW_HEIGHT, ROW_PADDING, TIMELINE_PADDING, } from '../util/constants';
8
- import { formatDurationForTimeline, formatTimeSelection, formatWallClockTime, } from '../util/timing';
9
- import { useImmediateStyle } from '../util/use-immediate-style';
10
- import { useTrackpadZoom } from '../util/use-trackpad-zoom';
11
- /**
12
- * Snap a raw duration to the nearest "nice" number in the 1-2-5 × 10^n
13
- * sequence (e.g. …, 0.5, 1, 2, 5, 10, 20, 50, 100, …).
14
- */
15
- function snapToNice(raw) {
16
- if (raw <= 0)
17
- return 1;
18
- const log10 = Math.floor(Math.log10(raw));
19
- const pow = 10 ** log10;
20
- const normalized = raw / pow;
21
- if (normalized <= 1.5)
22
- return pow;
23
- if (normalized <= 3.5)
24
- return 2 * pow;
25
- if (normalized <= 7.5)
26
- return 5 * pow;
27
- return 10 * pow;
28
- }
29
- export function Markers({ scale, isLive = false, }) {
30
- const { state: { root }, } = useTraceViewer();
31
- // Force a re-render every second when live to pick up new tick marks.
32
- // The markers container width is grown at 60fps by useLiveTick;
33
- // this interval only ensures the marker *labels* stay current.
34
- const [, forceMarkerUpdate] = useState(0);
35
- useEffect(() => {
36
- if (!isLive)
37
- return;
38
- const id = setInterval(() => forceMarkerUpdate((v) => v + 1), 1000);
39
- return () => clearInterval(id);
40
- }, [isLive]);
41
- const fullDuration = root.duration;
42
- // Calculate a marker interval that gives reasonable spacing at any zoom level.
43
- // We target ~50px per notch mark; labels appear on every Nth notch via labelSpacing.
44
- // When scale is <= 0 (e.g. the initial -1 sentinel), fall back to a safe default
45
- // to avoid generating an absurd number of markers.
46
- const effectiveScale = scale > 0 ? scale : fullDuration > 0 ? 1 / fullDuration : 1;
47
- const targetNotchPx = 50;
48
- let markerDuration = snapToNice(targetNotchPx / effectiveScale);
49
- markerDuration = Math.max(1, markerDuration);
50
- let markerWidth = markerDuration * effectiveScale;
51
- // Cap marker count to avoid creating too many DOM elements at extreme zoom
52
- // on very long traces. Only the visible portion is shown on screen anyway.
53
- const MAX_MARKERS = 1000;
54
- if (fullDuration / markerDuration > MAX_MARKERS) {
55
- markerDuration = snapToNice(fullDuration / MAX_MARKERS);
56
- markerWidth = markerDuration * effectiveScale;
57
- }
58
- const markerCount = Math.ceil(fullDuration / markerDuration);
59
- // How often labels should appear for markers, e.g. 3 === one label for every third marker
60
- const labelSpacing = Math.ceil(100 / markerWidth) || 1;
61
- return (_jsx("div", { className: styles.markersContainer, children: _jsx("div", { "aria-hidden": true, className: styles.markers, style: {
62
- width: Math.floor(root.duration * scale + 15),
63
- visibility: scale !== -1 ? 'visible' : 'hidden',
64
- '--marker-width': `${markerWidth}px`,
65
- }, children: new Array(markerCount).fill(null).map((_, i) => {
66
- const hasLabel = i % labelSpacing === 0;
67
- return (_jsx("span", { className: clsx(styles.marker, !hasLabel && styles.notch), children: hasLabel ? (_jsxs("span", { className: styles.markerLabel, children: [formatDurationForTimeline(markerDuration * i), _jsx("span", { className: styles.markerClockTime, children: formatWallClockTime(root.startTime + markerDuration * i) })] })) : null }, String(i)));
68
- }) }) }));
69
- }
70
- export function EventMarkers({ events, root, scale, }) {
71
- // Filter out events that should not show vertical lines (workflow-specific feature)
72
- const eventsWithVerticalLines = useMemo(() => events.filter((x) => x.event.showVerticalLine !== false), [events]);
73
- return (_jsx("div", { className: styles.eventMarkersContainer, children: _jsx("div", { "aria-hidden": true, className: styles.eventMarkers, style: {
74
- width: Math.floor(root.duration * scale),
75
- }, children: eventsWithVerticalLines.map((x) => {
76
- return (_jsx("span", { className: clsx(styles.eventMarker), style: {
77
- left: Math.floor((x.timestamp - root.startTime) * scale),
78
- ...(x.event.color && { borderLeftColor: x.event.color }),
79
- } }, x.key));
80
- }) }) }));
81
- }
82
- const HOVER_OVERSCAN = 2;
83
- export function CursorMarker({ memoCacheRef, timelineRef, root, spans, events, scale, dispatch, scrollSnapshotRef, }) {
84
- const hasEnteredRef = useRef(false);
85
- const spansRef = useRef(spans);
86
- spansRef.current = spans;
87
- const eventsRef = useRef(events);
88
- eventsRef.current = events;
89
- const labelRef = useRef(null);
90
- const { style: labelStyle, setStyle: setLabelStyle } = useImmediateStyle(labelRef);
91
- const labelTextRef = useRef(null);
92
- const ref = useRef(null);
93
- const { style, setStyle } = useImmediateStyle(ref);
94
- const rectRef = useRef(undefined);
95
- const selectionRef = useRef(null);
96
- const { style: selectionStyle, setStyle: setSelectionStyle } = useImmediateStyle(selectionRef);
97
- const xRef = useRef(0);
98
- useEffect(() => {
99
- const $timeline = timelineRef.current;
100
- if (!$timeline)
101
- return;
102
- let x = xRef.current;
103
- let xStart = 0;
104
- let isDragging = false;
105
- let isExternalDrag = false;
106
- let hasMoved = false;
107
- let isRightClick = false;
108
- let scrollX = 0;
109
- let scrollY = 0;
110
- const hoverStartT = Date.now() + 500;
111
- const updateRect = () => {
112
- if (rectRef.current)
113
- return;
114
- rectRef.current = $timeline.getBoundingClientRect();
115
- };
116
- const getRowFromY = (y) => {
117
- if (!rectRef.current)
118
- return 0;
119
- return ((y - MARKER_HEIGHT - TIMELINE_PADDING) / (ROW_HEIGHT + ROW_PADDING));
120
- };
121
- const removeHover = () => {
122
- const cache = memoCacheRef.current;
123
- // Remove hover styling from any elements that have it
124
- for (const span of spansRef.current) {
125
- if (!span.isHovered)
126
- continue;
127
- span.isHovered = false;
128
- cache.set(span.span.spanId, {});
129
- }
130
- dispatch({
131
- type: 'forceRender',
132
- });
133
- };
134
- let nextFrame = 0;
135
- const onFrame = () => {
136
- if (!hasEnteredRef.current)
137
- return;
138
- if (!rectRef.current)
139
- updateRect();
140
- const rect = rectRef.current;
141
- if (!rect)
142
- return;
143
- const { scrollLeft, scrollTop } = $timeline;
144
- const left = Math.max(0, Math.min(x + scrollLeft - rect.left - TIMELINE_PADDING, root.duration * scale));
145
- const leftStyle = `${left - scrollLeft + TIMELINE_PADDING}px`;
146
- setStyle('left', leftStyle);
147
- setLabelStyle('left', leftStyle);
148
- const t = root.startTime + left / scale;
149
- const labelT = t - root.startTime;
150
- if (labelT < 0 || labelT > root.duration) {
151
- labelTextRef.current?.removeAttribute('data-text');
152
- }
153
- else {
154
- labelTextRef.current?.setAttribute('data-text', formatTimeSelection(labelT));
155
- }
156
- if (isDragging) {
157
- const xDelta = x - xStart;
158
- const width = Math.abs(xDelta);
159
- if (!hasMoved) {
160
- if (width < 4)
161
- return;
162
- hasMoved = true;
163
- setSelectionStyle('display', 'flex');
164
- removeHover();
165
- }
166
- if (xDelta > 0) {
167
- setSelectionStyle('left', '');
168
- setSelectionStyle('right', '0');
169
- }
170
- else {
171
- setSelectionStyle('left', '0');
172
- setSelectionStyle('right', '');
173
- }
174
- setSelectionStyle('width', `${width}px`);
175
- const leftStart = Math.max(0, Math.min(xStart + scrollLeft - rect.left - TIMELINE_PADDING, root.duration * scale));
176
- const labelTStart = leftStart / scale;
177
- let t1;
178
- let t2;
179
- if (labelTStart < labelT) {
180
- t1 = labelTStart;
181
- t2 = labelT;
182
- }
183
- else {
184
- t1 = labelT;
185
- t2 = labelTStart;
186
- }
187
- selectionRef.current?.setAttribute('data-range', `${formatTimeSelection(t1)} — ${formatTimeSelection(t2)}`);
188
- selectionRef.current?.setAttribute('data-duration', `${formatTimeSelection(t2 - t1)} selected`);
189
- }
190
- if (Date.now() < hoverStartT) {
191
- nextFrame = requestAnimationFrame(onFrame);
192
- return;
193
- }
194
- if (scrollLeft !== scrollX || scrollTop !== scrollY) {
195
- scrollX = scrollLeft;
196
- scrollY = scrollTop;
197
- nextFrame = requestAnimationFrame(onFrame);
198
- return;
199
- }
200
- if (x - rect.left < 128) {
201
- labelTextRef.current?.setAttribute('data-align', 'left');
202
- }
203
- else if (x - rect.left > rect.width - 128) {
204
- labelTextRef.current?.setAttribute('data-align', 'right');
205
- }
206
- else {
207
- labelTextRef.current?.removeAttribute('data-align');
208
- }
209
- if (!hasMoved && !isExternalDrag) {
210
- const cache = memoCacheRef.current;
211
- // Span Hover
212
- const rowMin = getRowFromY(scrollTop) - HOVER_OVERSCAN;
213
- const rowMax = getRowFromY(scrollTop + rect.height) + HOVER_OVERSCAN;
214
- for (const span of spansRef.current) {
215
- const isHovered = span.row >= rowMin &&
216
- span.row <= rowMax &&
217
- t >= span.startTime &&
218
- t <= span.endTime;
219
- if (span.isHovered === isHovered)
220
- continue;
221
- span.isHovered = isHovered;
222
- cache.set(span.span.spanId, {});
223
- }
224
- // Event Hover — only show the nearest event when multiple overlap
225
- const eventSpreadPx = 12;
226
- const eventSpreadMs = eventSpreadPx / scale;
227
- let closestEvent = null;
228
- let closestDist = Infinity;
229
- for (const event of eventsRef.current) {
230
- const dist = Math.abs(event.timestamp - t);
231
- if (dist <= eventSpreadMs && dist < closestDist) {
232
- closestDist = dist;
233
- closestEvent = event;
234
- }
235
- }
236
- for (const event of eventsRef.current) {
237
- const isHovered = event === closestEvent;
238
- if (event.isHovered === isHovered)
239
- continue;
240
- event.isHovered = isHovered;
241
- const $event = event.ref?.current;
242
- if (!$event)
243
- continue;
244
- $event.setAttribute('data-hovered', String(isHovered));
245
- }
246
- dispatch({
247
- type: 'forceRender',
248
- });
249
- }
250
- };
251
- nextFrame = requestAnimationFrame(onFrame);
252
- const onPointerEnter = (event) => {
253
- if (event.pointerType !== 'mouse')
254
- return;
255
- hasEnteredRef.current = true;
256
- };
257
- const onPointerLeave = () => {
258
- if (!hasEnteredRef.current)
259
- return;
260
- hasEnteredRef.current = false;
261
- removeHover();
262
- };
263
- const onMouseMove = ({ clientX }) => {
264
- x = clientX;
265
- xRef.current = x;
266
- cancelAnimationFrame(nextFrame);
267
- nextFrame = requestAnimationFrame(onFrame);
268
- };
269
- const onContextMenu = (event) => {
270
- event.preventDefault();
271
- };
272
- const onMouseDown = (event) => {
273
- if (event.button === 2) {
274
- isRightClick = true;
275
- event.preventDefault();
276
- }
277
- else if (event.button !== 0) {
278
- return;
279
- }
280
- else {
281
- isRightClick = false;
282
- }
283
- if (timelineRef.current?.contains(event.target)) {
284
- xStart = x;
285
- isDragging = true;
286
- }
287
- else {
288
- isExternalDrag = true;
289
- requestAnimationFrame(removeHover);
290
- }
291
- };
292
- const onMouseUp = (event) => {
293
- isExternalDrag = false;
294
- if (!isDragging)
295
- return;
296
- isDragging = false;
297
- if (!hasMoved)
298
- return;
299
- hasMoved = false;
300
- setSelectionStyle('display', '');
301
- setSelectionStyle('left', '');
302
- setSelectionStyle('right', '');
303
- setSelectionStyle('width', '');
304
- event.preventDefault();
305
- event.stopImmediatePropagation();
306
- if (isRightClick) {
307
- isRightClick = false;
308
- return;
309
- }
310
- if (!rectRef.current)
311
- updateRect();
312
- const rect = rectRef.current;
313
- if (!rect)
314
- return;
315
- const { scrollLeft } = $timeline;
316
- const start = Math.max(0, Math.min((xStart + scrollLeft - rect.left - TIMELINE_PADDING) / scale, root.duration));
317
- const end = Math.max(0, Math.min((x + scrollLeft - rect.left - TIMELINE_PADDING) / scale, root.duration));
318
- dispatch({
319
- type: 'scaleToRange',
320
- t1: start + root.startTime,
321
- t2: end + root.startTime,
322
- });
323
- };
324
- const onKeyDown = (event) => {
325
- if (!isDragging)
326
- return;
327
- if (event.key !== 'Escape')
328
- return;
329
- isRightClick = true;
330
- onMouseUp(event);
331
- };
332
- const onWindowScroll = () => {
333
- rectRef.current = undefined;
334
- trackpadZoomRef.current = undefined;
335
- cancelAnimationFrame(nextFrame);
336
- nextFrame = requestAnimationFrame(onFrame);
337
- };
338
- const onScroll = () => {
339
- cancelAnimationFrame(nextFrame);
340
- nextFrame = requestAnimationFrame(onFrame);
341
- };
342
- const observer = new ResizeObserver(() => {
343
- // NOTE: I tried to use the entry from this to immediately set the rect,
344
- // but for some reason it has different dimensions than the one from
345
- // .getBoundingClientRect()
346
- rectRef.current = undefined;
347
- });
348
- observer.observe($timeline);
349
- window.addEventListener('mousemove', onMouseMove);
350
- $timeline.addEventListener('contextmenu', onContextMenu);
351
- window.addEventListener('mousedown', onMouseDown);
352
- window.addEventListener('mouseup', onMouseUp);
353
- window.addEventListener('blur', onMouseUp);
354
- window.addEventListener('keydown', onKeyDown, true);
355
- window.addEventListener('scroll', onWindowScroll);
356
- $timeline.addEventListener('scroll', onScroll);
357
- $timeline.addEventListener('pointerenter', onPointerEnter);
358
- $timeline.addEventListener('pointerleave', onPointerLeave);
359
- return () => {
360
- observer.disconnect();
361
- window.removeEventListener('mousemove', onMouseMove);
362
- $timeline.removeEventListener('contextmenu', onContextMenu);
363
- window.removeEventListener('mousedown', onMouseDown);
364
- window.removeEventListener('mouseup', onMouseUp);
365
- window.removeEventListener('blur', onMouseUp);
366
- window.removeEventListener('keydown', onKeyDown, true);
367
- window.removeEventListener('scroll', onWindowScroll);
368
- $timeline.removeEventListener('scroll', onScroll);
369
- $timeline.removeEventListener('pointerenter', onPointerEnter);
370
- $timeline.removeEventListener('pointerleave', onPointerLeave);
371
- cancelAnimationFrame(nextFrame);
372
- xRef.current = x;
373
- removeHover();
374
- };
375
- }, [
376
- dispatch,
377
- root,
378
- scale,
379
- setStyle,
380
- setLabelStyle,
381
- setSelectionStyle,
382
- memoCacheRef,
383
- timelineRef,
384
- scrollSnapshotRef,
385
- ]);
386
- const trackpadZoomRef = useRef(undefined);
387
- useTrackpadZoom((delta) => {
388
- const $timeline = timelineRef.current;
389
- if (!$timeline)
390
- return;
391
- rectRef.current ??= $timeline.getBoundingClientRect();
392
- const rect = rectRef.current;
393
- const anchorX = Math.max(0, Math.min(xRef.current - rect.left - TIMELINE_PADDING, rect.width - 2 * TIMELINE_PADDING));
394
- let anchorT = 0;
395
- let existing = trackpadZoomRef.current;
396
- if (existing?.anchorX === anchorX) {
397
- anchorT = existing.anchorT;
398
- }
399
- else {
400
- anchorT = ($timeline.scrollLeft + anchorX) / scale;
401
- existing = {
402
- anchorT,
403
- anchorX,
404
- };
405
- trackpadZoomRef.current = existing;
406
- }
407
- dispatch({
408
- type: 'trackpadScale',
409
- delta: delta / 64,
410
- anchorT,
411
- anchorX,
412
- });
413
- });
414
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: styles.cursorMarkerStickyParent, children: _jsx("div", { className: styles.cursorMarkerLabelContainer, ref: labelRef, style: labelStyle, children: _jsx("div", { className: styles.cursorMarkerLabel, ref: labelTextRef }) }) }), _jsx("div", { className: styles.cursorMarkerStickyParent, children: _jsx("div", { className: styles.cursorMarkerContainer, ref: ref, style: style, children: _jsx("div", { className: styles.cursorMarker, children: _jsx("div", { className: styles.cursorSelection, ref: selectionRef, style: selectionStyle }) }) }) })] }));
415
- }
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21hcmtlcnMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDN0QsT0FBTyxFQUEwQixjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxNQUFNLE1BQU0sNEJBQTRCLENBQUM7QUFRaEQsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLElBQUksR0FBRyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFFN0IsSUFBSSxVQUFVLElBQUksR0FBRztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ2xDLElBQUksVUFBVSxJQUFJ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QUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUVELFFBQVEsQ0FBQztZQUNQLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRTtZQUNqQixPQUFPO1lBQ1AsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUNMLDhCQUNFLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsWUFDN0MsY0FDRSxTQUFTLEVBQUUsTUFBTSxDQUFDLDBCQUEwQixFQUM1QyxHQUFHLEVBQUUsUUFBUSxFQUNiLEtBQUssRUFBRSxVQUFVLFlBRWpCLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsWUFBWSxHQUFJLEdBQzNELEdBQ0YsRUFDTixjQUFLLFNBQVMsRUFBRSxNQUFNLENBQUMsd0JBQXdCLFlBQzdDLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLFlBQ2xFLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLFlBQ2pDLGNBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQ2pDLEdBQUcsRUFBRSxZQUFZLEVBQ2pCLEtBQUssRUFBRSxjQUFjLEdBQ3JCLEdBQ0UsR0FDRixHQUNGLElBQ0wsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHR5cGUge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBEaXNwYXRjaCxcbiAgTXV0YWJsZVJlZk9iamVjdCxcbiAgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0eXBlIFRyYWNlVmlld2VyQWN0aW9uLCB1c2VUcmFjZVZpZXdlciB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuLi90cmFjZS12aWV3ZXIubW9kdWxlLmNzcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lbW9DYWNoZSxcbiAgUm9vdE5vZGUsXG4gIFNjcm9sbFNuYXBzaG90LFxuICBWaXNpYmxlU3BhbixcbiAgVmlzaWJsZVNwYW5FdmVudCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgTUFSS0VSX0hFSUdIVCxcbiAgUk9XX0hFSUdIVCxcbiAgUk9XX1BBRERJTkcsXG4gIFRJTUVMSU5FX1BBRERJTkcsXG59IGZyb20gJy4uL3V0aWwvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uRm9yVGltZWxpbmUsXG4gIGZvcm1hdFRpbWVTZWxlY3Rpb24sXG4gIGZvcm1hdFdhbGxDbG9ja1RpbWUsXG59IGZyb20gJy4uL3V0aWwvdGltaW5nJztcbmltcG9ydCB7IHVzZUltbWVkaWF0ZVN0eWxlIH0gZnJvbSAnLi4vdXRpbC91c2UtaW1tZWRpYXRlLXN0eWxlJztcbmltcG9ydCB7IHVzZVRyYWNrcGFkWm9vbSB9IGZyb20gJy4uL3V0aWwvdXNlLXRyYWNrcGFkLXpvb20nO1xuXG4vKipcbiAqIFNuYXAgYSByYXcgZHVyYXRpb24gdG8gdGhlIG5lYXJlc3QgXCJuaWNlXCIgbnVtYmVyIGluIHRoZSAxLTItNSDDlyAxMF5uXG4gKiBzZXF1ZW5jZSAoZS5nLiDigKYsIDAuNSwgMSwgMiwgNSwgMTAsIDIwLCA1MCwgMTAwLCDigKYpLlxuICovXG5mdW5jdGlvbiBzbmFwVG9OaWNlKHJhdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHJhdyA8PSAwKSByZXR1cm4gMTtcbiAgY29uc3QgbG9nMTAgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAocmF3KSk7XG4gIGNvbnN0IHBvdyA9IDEwICoqIGxvZzEwO1xuICBjb25zdCBub3JtYWxpemVkID0gcmF3IC8gcG93O1xuXG4gIGlmIChub3JtYWxpemVkIDw9IDEuNSkgcmV0dXJuIHBvdztcbiAgaWYgKG5vcm1hbGl6ZWQgPD0gMy41KSByZXR1cm4gMiAqIHBvdztcbiAgaWYgKG5vcm1hbGl6ZWQgPD0gNy41KSByZXR1cm4gNSAqIHBvdztcbiAgcmV0dXJuIDEwICogcG93O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTWFya2Vycyh7XG4gIHNjYWxlLFxuICBpc0xpdmUgPSBmYWxzZSxcbn06IHtcbiAgc2NhbGU6IG51bWJlcjtcbiAgaXNMaXZlPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgcm9vdCB9LFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcbiAgLy8gRm9yY2UgYSByZS1yZW5kZXIgZXZlcnkgc2Vjb25kIHdoZW4gbGl2ZSB0byBwaWNrIHVwIG5ldyB0aWNrIG1hcmtzLlxuICAvLyBUaGUgbWFya2VycyBjb250YWluZXIgd2lkdGggaXMgZ3Jvd24gYXQgNjBmcHMgYnkgdXNlTGl2ZVRpY2s7XG4gIC8vIHRoaXMgaW50ZXJ2YWwgb25seSBlbnN1cmVzIHRoZSBtYXJrZXIgKmxhYmVscyogc3RheSBjdXJyZW50LlxuICBjb25zdCBbLCBmb3JjZU1hcmtlclVwZGF0ZV0gPSB1c2VTdGF0ZSgwKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzTGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gc2V0SW50ZXJ2YWwoKCkgPT4gZm9yY2VNYXJrZXJVcGRhdGUoKHYpID0+IHYgKyAxKSwgMTAwMCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFySW50ZXJ2YWwoaWQpO1xuICB9LCBbaXNMaXZlXSk7XG5cbiAgY29uc3QgZnVsbER1cmF0aW9uID0gcm9vdC5kdXJhdGlvbjtcblxuICAvLyBDYWxjdWxhdGUgYSBtYXJrZXIgaW50ZXJ2YWwgdGhhdCBnaXZlcyByZWFzb25hYmxlIHNwYWNpbmcgYXQgYW55IHpvb20gbGV2ZWwuXG4gIC8vIFdlIHRhcmdldCB+NTBweCBwZXIgbm90Y2ggbWFyazsgbGFiZWxzIGFwcGVhciBvbiBldmVyeSBOdGggbm90Y2ggdmlhIGxhYmVsU3BhY2luZy5cbiAgLy8gV2hlbiBzY2FsZSBpcyA8PSAwIChlLmcuIHRoZSBpbml0aWFsIC0xIHNlbnRpbmVsKSwgZmFsbCBiYWNrIHRvIGEgc2FmZSBkZWZhdWx0XG4gIC8vIHRvIGF2b2lkIGdlbmVyYXRpbmcgYW4gYWJzdXJkIG51bWJlciBvZiBtYXJrZXJzLlxuICBjb25zdCBlZmZlY3RpdmVTY2FsZSA9XG4gICAgc2NhbGUgPiAwID8gc2NhbGUgOiBmdWxsRHVyYXRpb24gPiAwID8gMSAvIGZ1bGxEdXJhdGlvbiA6IDE7XG4gIGNvbnN0IHRhcmdldE5vdGNoUHggPSA1MDtcbiAgbGV0IG1hcmtlckR1cmF0aW9uID0gc25hcFRvTmljZSh0YXJnZXROb3RjaFB4IC8gZWZmZWN0aXZlU2NhbGUpO1xuICBtYXJrZXJEdXJhdGlvbiA9IE1hdGgubWF4KDEsIG1hcmtlckR1cmF0aW9uKTtcbiAgbGV0IG1hcmtlcldpZHRoID0gbWFya2VyRHVyYXRpb24gKiBlZmZlY3RpdmVTY2FsZTtcblxuICAvLyBDYXAgbWFya2VyIGNvdW50IHRvIGF2b2lkIGNyZWF0aW5nIHRvbyBtYW55IERPTSBlbGVtZW50cyBhdCBleHRyZW1lIHpvb21cbiAgLy8gb24gdmVyeSBsb25nIHRyYWNlcy4gIE9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBpcyBzaG93biBvbiBzY3JlZW4gYW55d2F5LlxuICBjb25zdCBNQVhfTUFSS0VSUyA9IDEwMDA7XG4gIGlmIChmdWxsRHVyYXRpb24gLyBtYXJrZXJEdXJhdGlvbiA+IE1BWF9NQVJLRVJTKSB7XG4gICAgbWFya2VyRHVyYXRpb24gPSBzbmFwVG9OaWNlKGZ1bGxEdXJhdGlvbiAvIE1BWF9NQVJLRVJTKTtcbiAgICBtYXJrZXJXaWR0aCA9IG1hcmtlckR1cmF0aW9uICogZWZmZWN0aXZlU2NhbGU7XG4gIH1cbiAgY29uc3QgbWFya2VyQ291bnQgPSBNYXRoLmNlaWwoZnVsbER1cmF0aW9uIC8gbWFya2VyRHVyYXRpb24pO1xuXG4gIC8vIEhvdyBvZnRlbiBsYWJlbHMgc2hvdWxkIGFwcGVhciBmb3IgbWFya2VycywgZS5nLiAzID09PSBvbmUgbGFiZWwgZm9yIGV2ZXJ5IHRoaXJkIG1hcmtlclxuICBjb25zdCBsYWJlbFNwYWNpbmcgPSBNYXRoLmNlaWwoMTAwIC8gbWFya2VyV2lkdGgpIHx8IDE7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLm1hcmtlcnNDb250YWluZXJ9PlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5tYXJrZXJzfVxuICAgICAgICBzdHlsZT17XG4gICAgICAgICAge1xuICAgICAgICAgICAgd2lkdGg6IE1hdGguZmxvb3Iocm9vdC5kdXJhdGlvbiAqIHNjYWxlICsgMTUpLFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogc2NhbGUgIT09IC0xID8gJ3Zpc2libGUnIDogJ2hpZGRlbicsXG4gICAgICAgICAgICAnLS1tYXJrZXItd2lkdGgnOiBgJHttYXJrZXJXaWR0aH1weGAsXG4gICAgICAgICAgfSBhcyBDU1NQcm9wZXJ0aWVzXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAge25ldyBBcnJheShtYXJrZXJDb3VudCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNMYWJlbCA9IGkgJSBsYWJlbFNwYWNpbmcgPT09IDA7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXMubWFya2VyLCAhaGFzTGFiZWwgJiYgc3R5bGVzLm5vdGNoKX1cbiAgICAgICAgICAgICAga2V5PXtTdHJpbmcoaSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtoYXNMYWJlbCA/IChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5tYXJrZXJMYWJlbH0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb25Gb3JUaW1lbGluZShtYXJrZXJEdXJhdGlvbiAqIGkpfVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubWFya2VyQ2xvY2tUaW1lfT5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1hdFdhbGxDbG9ja1RpbWUocm9vdC5zdGFydFRpbWUgKyBtYXJrZXJEdXJhdGlvbiAqIGkpfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50TWFya2Vycyh7XG4gIGV2ZW50cyxcbiAgcm9vdCxcbiAgc2NhbGUsXG59OiB7XG4gIGV2ZW50czogVmlzaWJsZVNwYW5FdmVudFtdO1xuICByb290OiBSb290Tm9kZTtcbiAgc2NhbGU6IG51bWJlcjtcbn0pOiBSZWFjdE5vZGUge1xuICAvLyBGaWx0ZXIgb3V0IGV2ZW50cyB0aGF0IHNob3VsZCBub3Qgc2hvdyB2ZXJ0aWNhbCBsaW5lcyAod29ya2Zsb3ctc3BlY2lmaWMgZmVhdHVyZSlcbiAgY29uc3QgZXZlbnRzV2l0aFZlcnRpY2FsTGluZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGV2ZW50cy5maWx0ZXIoKHgpID0+IHguZXZlbnQuc2hvd1ZlcnRpY2FsTGluZSAhPT0gZmFsc2UpLFxuICAgIFtldmVudHNdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmV2ZW50TWFya2Vyc0NvbnRhaW5lcn0+XG4gICAgICA8ZGl2XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmV2ZW50TWFya2Vyc31cbiAgICAgICAgc3R5bGU9e1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmZsb29yKHJvb3QuZHVyYXRpb24gKiBzY2FsZSksXG4gICAgICAgICAgfSBhcyBDU1NQcm9wZXJ0aWVzXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAge2V2ZW50c1dpdGhWZXJ0aWNhbExpbmVzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzLmV2ZW50TWFya2VyKX1cbiAgICAgICAgICAgICAga2V5PXt4LmtleX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBsZWZ0OiBNYXRoLmZsb29yKCh4LnRpbWVzdGFtcCAtIHJvb3Quc3RhcnRUaW1lKSAqIHNjYWxlKSxcbiAgICAgICAgICAgICAgICAuLi4oeC5ldmVudC5jb2xvciAmJiB7IGJvcmRlckxlZnRDb2xvcjogeC5ldmVudC5jb2xvciB9KSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgSE9WRVJfT1ZFUlNDQU4gPSAyO1xuXG5pbnRlcmZhY2UgVHJhY2twYWRab29tIHtcbiAgYW5jaG9yWDogbnVtYmVyO1xuICBhbmNob3JUOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDdXJzb3JNYXJrZXIoe1xuICBtZW1vQ2FjaGVSZWYsXG4gIHRpbWVsaW5lUmVmLFxuICByb290LFxuICBzcGFucyxcbiAgZXZlbnRzLFxuICBzY2FsZSxcbiAgZGlzcGF0Y2gsXG4gIHNjcm9sbFNuYXBzaG90UmVmLFxufToge1xuICBtZW1vQ2FjaGVSZWY6IE11dGFibGVSZWZPYmplY3Q8TWVtb0NhY2hlPjtcbiAgdGltZWxpbmVSZWY6IE11dGFibGVSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPjtcbiAgcm9vdDogUm9vdE5vZGU7XG4gIHNwYW5zOiBWaXNpYmxlU3BhbltdO1xuICBldmVudHM6IFZpc2libGVTcGFuRXZlbnRbXTtcbiAgc2NhbGU6IG51bWJlcjtcbiAgZGlzcGF0Y2g6IERpc3BhdGNoPFRyYWNlVmlld2VyQWN0aW9uPjtcbiAgc2Nyb2xsU25hcHNob3RSZWY6IE11dGFibGVSZWZPYmplY3Q8U2Nyb2xsU25hcHNob3QgfCB1bmRlZmluZWQ+O1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IGhhc0VudGVyZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBzcGFuc1JlZiA9IHVzZVJlZihzcGFucyk7XG4gIHNwYW5zUmVmLmN1cnJlbnQgPSBzcGFucztcbiAgY29uc3QgZXZlbnRzUmVmID0gdXNlUmVmKGV2ZW50cyk7XG4gIGV2ZW50c1JlZi5jdXJyZW50ID0gZXZlbnRzO1xuICBjb25zdCBsYWJlbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHsgc3R5bGU6IGxhYmVsU3R5bGUsIHNldFN0eWxlOiBzZXRMYWJlbFN0eWxlIH0gPVxuICAgIHVzZUltbWVkaWF0ZVN0eWxlKGxhYmVsUmVmKTtcbiAgY29uc3QgbGFiZWxUZXh0UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCB7IHN0eWxlLCBzZXRTdHlsZSB9ID0gdXNlSW1tZWRpYXRlU3R5bGUocmVmKTtcbiAgY29uc3QgcmVjdFJlZiA9IHVzZVJlZjxET01SZWN0Pih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHNlbGVjdGlvblJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHsgc3R5bGU6IHNlbGVjdGlvblN0eWxlLCBzZXRTdHlsZTogc2V0U2VsZWN0aW9uU3R5bGUgfSA9XG4gICAgdXNlSW1tZWRpYXRlU3R5bGUoc2VsZWN0aW9uUmVmKTtcblxuICBjb25zdCB4UmVmID0gdXNlUmVmKDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0ICR0aW1lbGluZSA9IHRpbWVsaW5lUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCEkdGltZWxpbmUpIHJldHVybjtcblxuICAgIGxldCB4ID0geFJlZi5jdXJyZW50O1xuICAgIGxldCB4U3RhcnQgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRXh0ZXJuYWxEcmFnID0gZmFsc2U7XG4gICAgbGV0IGhhc01vdmVkID0gZmFsc2U7XG4gICAgbGV0IGlzUmlnaHRDbGljayA9IGZhbHNlO1xuICAgIGxldCBzY3JvbGxYID0gMDtcbiAgICBsZXQgc2Nyb2xsWSA9IDA7XG4gICAgY29uc3QgaG92ZXJTdGFydFQgPSBEYXRlLm5vdygpICsgNTAwO1xuICAgIGNvbnN0IHVwZGF0ZVJlY3QgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAocmVjdFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICByZWN0UmVmLmN1cnJlbnQgPSAkdGltZWxpbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFJvd0Zyb21ZID0gKHk6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXJlY3RSZWYuY3VycmVudCkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoeSAtIE1BUktFUl9IRUlHSFQgLSBUSU1FTElORV9QQURESU5HKSAvIChST1dfSEVJR0hUICsgUk9XX1BBRERJTkcpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCByZW1vdmVIb3ZlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gbWVtb0NhY2hlUmVmLmN1cnJlbnQ7XG4gICAgICAvLyBSZW1vdmUgaG92ZXIgc3R5bGluZyBmcm9tIGFueSBlbGVtZW50cyB0aGF0IGhhdmUgaXRcbiAgICAgIGZvciAoY29uc3Qgc3BhbiBvZiBzcGFuc1JlZi5jdXJyZW50KSB7XG4gICAgICAgIGlmICghc3Bhbi5pc0hvdmVyZWQpIGNvbnRpbnVlO1xuICAgICAgICBzcGFuLmlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICBjYWNoZS5zZXQoc3Bhbi5zcGFuLnNwYW5JZCwge30pO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnZm9yY2VSZW5kZXInLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBuZXh0RnJhbWUgPSAwO1xuICAgIGNvbnN0IG9uRnJhbWUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWhhc0VudGVyZWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgaWYgKCFyZWN0UmVmLmN1cnJlbnQpIHVwZGF0ZVJlY3QoKTtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWN0UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXJlY3QpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AgfSA9ICR0aW1lbGluZTtcblxuICAgICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICB4ICsgc2Nyb2xsTGVmdCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgICAgcm9vdC5kdXJhdGlvbiAqIHNjYWxlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBsZWZ0U3R5bGUgPSBgJHtsZWZ0IC0gc2Nyb2xsTGVmdCArIFRJTUVMSU5FX1BBRERJTkd9cHhgO1xuICAgICAgc2V0U3R5bGUoJ2xlZnQnLCBsZWZ0U3R5bGUpO1xuICAgICAgc2V0TGFiZWxTdHlsZSgnbGVmdCcsIGxlZnRTdHlsZSk7XG5cbiAgICAgIGNvbnN0IHQgPSByb290LnN0YXJ0VGltZSArIGxlZnQgLyBzY2FsZTtcbiAgICAgIGNvbnN0IGxhYmVsVCA9IHQgLSByb290LnN0YXJ0VGltZTtcbiAgICAgIGlmIChsYWJlbFQgPCAwIHx8IGxhYmVsVCA+IHJvb3QuZHVyYXRpb24pIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10ZXh0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYWJlbFRleHRSZWYuY3VycmVudD8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICdkYXRhLXRleHQnLFxuICAgICAgICAgIGZvcm1hdFRpbWVTZWxlY3Rpb24obGFiZWxUKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICBjb25zdCB4RGVsdGEgPSB4IC0geFN0YXJ0O1xuICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKHhEZWx0YSk7XG4gICAgICAgIGlmICghaGFzTW92ZWQpIHtcbiAgICAgICAgICBpZiAod2lkdGggPCA0KSByZXR1cm47XG4gICAgICAgICAgaGFzTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgICAgICByZW1vdmVIb3ZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhEZWx0YSA+IDApIHtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgnbGVmdCcsICcnKTtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnMCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdsZWZ0JywgJzAnKTtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2VsZWN0aW9uU3R5bGUoJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcblxuICAgICAgICBjb25zdCBsZWZ0U3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgeFN0YXJ0ICsgc2Nyb2xsTGVmdCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgICAgICByb290LmR1cmF0aW9uICogc2NhbGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxhYmVsVFN0YXJ0ID0gbGVmdFN0YXJ0IC8gc2NhbGU7XG4gICAgICAgIGxldCB0MTogbnVtYmVyO1xuICAgICAgICBsZXQgdDI6IG51bWJlcjtcbiAgICAgICAgaWYgKGxhYmVsVFN0YXJ0IDwgbGFiZWxUKSB7XG4gICAgICAgICAgdDEgPSBsYWJlbFRTdGFydDtcbiAgICAgICAgICB0MiA9IGxhYmVsVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0MSA9IGxhYmVsVDtcbiAgICAgICAgICB0MiA9IGxhYmVsVFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGlvblJlZi5jdXJyZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2RhdGEtcmFuZ2UnLFxuICAgICAgICAgIGAke2Zvcm1hdFRpbWVTZWxlY3Rpb24odDEpfSDigJQgJHtmb3JtYXRUaW1lU2VsZWN0aW9uKHQyKX1gXG4gICAgICAgICk7XG4gICAgICAgIHNlbGVjdGlvblJlZi5jdXJyZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2RhdGEtZHVyYXRpb24nLFxuICAgICAgICAgIGAke2Zvcm1hdFRpbWVTZWxlY3Rpb24odDIgLSB0MSl9IHNlbGVjdGVkYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IGhvdmVyU3RhcnRUKSB7XG4gICAgICAgIG5leHRGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsWCB8fCBzY3JvbGxUb3AgIT09IHNjcm9sbFkpIHtcbiAgICAgICAgc2Nyb2xsWCA9IHNjcm9sbExlZnQ7XG4gICAgICAgIHNjcm9sbFkgPSBzY3JvbGxUb3A7XG4gICAgICAgIG5leHRGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoeCAtIHJlY3QubGVmdCA8IDEyOCkge1xuICAgICAgICBsYWJlbFRleHRSZWYuY3VycmVudD8uc2V0QXR0cmlidXRlKCdkYXRhLWFsaWduJywgJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoeCAtIHJlY3QubGVmdCA+IHJlY3Qud2lkdGggLSAxMjgpIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnNldEF0dHJpYnV0ZSgnZGF0YS1hbGlnbicsICdyaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hbGlnbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc01vdmVkICYmICFpc0V4dGVybmFsRHJhZykge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG1lbW9DYWNoZVJlZi5jdXJyZW50O1xuXG4gICAgICAgIC8vIFNwYW4gSG92ZXJcbiAgICAgICAgY29uc3Qgcm93TWluID0gZ2V0Um93RnJvbVkoc2Nyb2xsVG9wKSAtIEhPVkVSX09WRVJTQ0FOO1xuICAgICAgICBjb25zdCByb3dNYXggPSBnZXRSb3dGcm9tWShzY3JvbGxUb3AgKyByZWN0LmhlaWdodCkgKyBIT1ZFUl9PVkVSU0NBTjtcbiAgICAgICAgZm9yIChjb25zdCBzcGFuIG9mIHNwYW5zUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBjb25zdCBpc0hvdmVyZWQgPVxuICAgICAgICAgICAgc3Bhbi5yb3cgPj0gcm93TWluICYmXG4gICAgICAgICAgICBzcGFuLnJvdyA8PSByb3dNYXggJiZcbiAgICAgICAgICAgIHQgPj0gc3Bhbi5zdGFydFRpbWUgJiZcbiAgICAgICAgICAgIHQgPD0gc3Bhbi5lbmRUaW1lO1xuICAgICAgICAgIGlmIChzcGFuLmlzSG92ZXJlZCA9PT0gaXNIb3ZlcmVkKSBjb250aW51ZTtcbiAgICAgICAgICBzcGFuLmlzSG92ZXJlZCA9IGlzSG92ZXJlZDtcbiAgICAgICAgICBjYWNoZS5zZXQoc3Bhbi5zcGFuLnNwYW5JZCwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXZlbnQgSG92ZXIg4oCUIG9ubHkgc2hvdyB0aGUgbmVhcmVzdCBldmVudCB3aGVuIG11bHRpcGxlIG92ZXJsYXBcbiAgICAgICAgY29uc3QgZXZlbnRTcHJlYWRQeCA9IDEyO1xuICAgICAgICBjb25zdCBldmVudFNwcmVhZE1zID0gZXZlbnRTcHJlYWRQeCAvIHNjYWxlO1xuICAgICAgICBsZXQgY2xvc2VzdEV2ZW50OiAodHlwZW9mIGV2ZW50c1JlZi5jdXJyZW50KVtudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBjbG9zZXN0RGlzdCA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKGV2ZW50LnRpbWVzdGFtcCAtIHQpO1xuICAgICAgICAgIGlmIChkaXN0IDw9IGV2ZW50U3ByZWFkTXMgJiYgZGlzdCA8IGNsb3Nlc3REaXN0KSB7XG4gICAgICAgICAgICBjbG9zZXN0RGlzdCA9IGRpc3Q7XG4gICAgICAgICAgICBjbG9zZXN0RXZlbnQgPSBldmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHNSZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnN0IGlzSG92ZXJlZCA9IGV2ZW50ID09PSBjbG9zZXN0RXZlbnQ7XG4gICAgICAgICAgaWYgKGV2ZW50LmlzSG92ZXJlZCA9PT0gaXNIb3ZlcmVkKSBjb250aW51ZTtcbiAgICAgICAgICBldmVudC5pc0hvdmVyZWQgPSBpc0hvdmVyZWQ7XG4gICAgICAgICAgY29uc3QgJGV2ZW50ID0gZXZlbnQucmVmPy5jdXJyZW50O1xuICAgICAgICAgIGlmICghJGV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAkZXZlbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhvdmVyZWQnLCBTdHJpbmcoaXNIb3ZlcmVkKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ2ZvcmNlUmVuZGVyJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuZXh0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25GcmFtZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJFbnRlciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgIT09ICdtb3VzZScpIHJldHVybjtcbiAgICAgIGhhc0VudGVyZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBvblBvaW50ZXJMZWF2ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaGFzRW50ZXJlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBoYXNFbnRlcmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJlbW92ZUhvdmVyKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKHsgY2xpZW50WCB9OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICB4ID0gY2xpZW50WDtcbiAgICAgIHhSZWYuY3VycmVudCA9IHg7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgaXNSaWdodENsaWNrID0gdHJ1ZTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzUmlnaHRDbGljayA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVsaW5lUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgeFN0YXJ0ID0geDtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0V4dGVybmFsRHJhZyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW1vdmVIb3Zlcik7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvbk1vdXNlVXAgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpc0V4dGVybmFsRHJhZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKCFoYXNNb3ZlZCkgcmV0dXJuO1xuICAgICAgaGFzTW92ZWQgPSBmYWxzZTtcbiAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdkaXNwbGF5JywgJycpO1xuICAgICAgc2V0U2VsZWN0aW9uU3R5bGUoJ2xlZnQnLCAnJyk7XG4gICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnJyk7XG4gICAgICBzZXRTZWxlY3Rpb25TdHlsZSgnd2lkdGgnLCAnJyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKGlzUmlnaHRDbGljaykge1xuICAgICAgICBpc1JpZ2h0Q2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlY3RSZWYuY3VycmVudCkgdXBkYXRlUmVjdCgpO1xuICAgICAgY29uc3QgcmVjdCA9IHJlY3RSZWYuY3VycmVudDtcbiAgICAgIGlmICghcmVjdCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IHNjcm9sbExlZnQgfSA9ICR0aW1lbGluZTtcblxuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKHhTdGFydCArIHNjcm9sbExlZnQgLSByZWN0LmxlZnQgLSBUSU1FTElORV9QQURESU5HKSAvIHNjYWxlLFxuICAgICAgICAgIHJvb3QuZHVyYXRpb25cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICAoeCArIHNjcm9sbExlZnQgLSByZWN0LmxlZnQgLSBUSU1FTElORV9QQURESU5HKSAvIHNjYWxlLFxuICAgICAgICAgIHJvb3QuZHVyYXRpb25cbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnc2NhbGVUb1JhbmdlJyxcbiAgICAgICAgdDE6IHN0YXJ0ICsgcm9vdC5zdGFydFRpbWUsXG4gICAgICAgIHQyOiBlbmQgKyByb290LnN0YXJ0VGltZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHJldHVybjtcblxuICAgICAgaXNSaWdodENsaWNrID0gdHJ1ZTtcbiAgICAgIG9uTW91c2VVcChldmVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uV2luZG93U2Nyb2xsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcmVjdFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdHJhY2twYWRab29tUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG5leHRGcmFtZSk7XG4gICAgICBuZXh0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25GcmFtZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIC8vIE5PVEU6IEkgdHJpZWQgdG8gdXNlIHRoZSBlbnRyeSBmcm9tIHRoaXMgdG8gaW1tZWRpYXRlbHkgc2V0IHRoZSByZWN0LFxuICAgICAgLy8gYnV0IGZvciBzb21lIHJlYXNvbiBpdCBoYXMgZGlmZmVyZW50IGRpbWVuc2lvbnMgdGhhbiB0aGUgb25lIGZyb21cbiAgICAgIC8vIC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgcmVjdFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoJHRpbWVsaW5lKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgJHRpbWVsaW5lLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbk1vdXNlVXApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwpO1xuICAgICR0aW1lbGluZS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgJHRpbWVsaW5lLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIG9uUG9pbnRlckVudGVyKTtcbiAgICAkdGltZWxpbmUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25Qb2ludGVyTGVhdmUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAkdGltZWxpbmUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51KTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uTW91c2VVcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwpO1xuICAgICAgJHRpbWVsaW5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsKTtcbiAgICAgICR0aW1lbGluZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBvblBvaW50ZXJFbnRlcik7XG4gICAgICAkdGltZWxpbmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25Qb2ludGVyTGVhdmUpO1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobmV4dEZyYW1lKTtcbiAgICAgIHhSZWYuY3VycmVudCA9IHg7XG4gICAgICByZW1vdmVIb3ZlcigpO1xuICAgIH07XG4gIH0sIFtcbiAgICBkaXNwYXRjaCxcbiAgICByb290LFxuICAgIHNjYWxlLFxuICAgIHNldFN0eWxlLFxuICAgIHNldExhYmVsU3R5bGUsXG4gICAgc2V0U2VsZWN0aW9uU3R5bGUsXG4gICAgbWVtb0NhY2hlUmVmLFxuICAgIHRpbWVsaW5lUmVmLFxuICAgIHNjcm9sbFNuYXBzaG90UmVmLFxuICBdKTtcblxuICBjb25zdCB0cmFja3BhZFpvb21SZWYgPSB1c2VSZWY8VHJhY2twYWRab29tPih1bmRlZmluZWQpO1xuICB1c2VUcmFja3BhZFpvb20oKGRlbHRhKSA9PiB7XG4gICAgY29uc3QgJHRpbWVsaW5lID0gdGltZWxpbmVSZWYuY3VycmVudDtcbiAgICBpZiAoISR0aW1lbGluZSkgcmV0dXJuO1xuXG4gICAgcmVjdFJlZi5jdXJyZW50ID8/PSAkdGltZWxpbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcmVjdCA9IHJlY3RSZWYuY3VycmVudDtcbiAgICBjb25zdCBhbmNob3JYID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4oXG4gICAgICAgIHhSZWYuY3VycmVudCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgIHJlY3Qud2lkdGggLSAyICogVElNRUxJTkVfUEFERElOR1xuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgYW5jaG9yVCA9IDA7XG4gICAgbGV0IGV4aXN0aW5nID0gdHJhY2twYWRab29tUmVmLmN1cnJlbnQ7XG4gICAgaWYgKGV4aXN0aW5nPy5hbmNob3JYID09PSBhbmNob3JYKSB7XG4gICAgICBhbmNob3JUID0gZXhpc3RpbmcuYW5jaG9yVDtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5jaG9yVCA9ICgkdGltZWxpbmUuc2Nyb2xsTGVmdCArIGFuY2hvclgpIC8gc2NhbGU7XG4gICAgICBleGlzdGluZyA9IHtcbiAgICAgICAgYW5jaG9yVCxcbiAgICAgICAgYW5jaG9yWCxcbiAgICAgIH07XG4gICAgICB0cmFja3BhZFpvb21SZWYuY3VycmVudCA9IGV4aXN0aW5nO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICd0cmFja3BhZFNjYWxlJyxcbiAgICAgIGRlbHRhOiBkZWx0YSAvIDY0LFxuICAgICAgYW5jaG9yVCxcbiAgICAgIGFuY2hvclgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyU3RpY2t5UGFyZW50fT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmN1cnNvck1hcmtlckxhYmVsQ29udGFpbmVyfVxuICAgICAgICAgIHJlZj17bGFiZWxSZWZ9XG4gICAgICAgICAgc3R5bGU9e2xhYmVsU3R5bGV9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmN1cnNvck1hcmtlckxhYmVsfSByZWY9e2xhYmVsVGV4dFJlZn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyU3RpY2t5UGFyZW50fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jdXJzb3JNYXJrZXJDb250YWluZXJ9IHJlZj17cmVmfSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyfT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yU2VsZWN0aW9ufVxuICAgICAgICAgICAgICByZWY9e3NlbGVjdGlvblJlZn1cbiAgICAgICAgICAgICAgc3R5bGU9e3NlbGVjdGlvblN0eWxlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn1cbiJdfQ==
@@ -1,35 +0,0 @@
1
- import type { MutableRefObject, ReactNode } from 'react';
2
- import type { MemoCache, MemoCacheKey, RootNode, ScrollSnapshot, SpanNode, VisibleSpan, VisibleSpanEvent } from '../types';
3
- export declare const getSpanColorClassName: (node: SpanNode) => string;
4
- export declare const SpanNodes: import("react").MemoExoticComponent<({ root, scale, spans, isLive, scrollSnapshotRef, cache, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
5
- root: RootNode;
6
- scale: number;
7
- spans: VisibleSpan[];
8
- isLive?: boolean;
9
- scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;
10
- /** Not used in the body — exists solely to bust React.memo when the global memo cache changes. */
11
- cacheKey?: MemoCacheKey;
12
- cache: MemoCache;
13
- customSpanClassNameFunc?: (span: SpanNode) => string;
14
- customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
15
- }) => import("react/jsx-runtime").JSX.Element[]>;
16
- export declare const SpanComponent: import("react").MemoExoticComponent<({ node, root, scale, traceIsLive, scrollSnapshotRef, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
17
- node: VisibleSpan;
18
- root: RootNode;
19
- scale: number;
20
- traceIsLive?: boolean;
21
- scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;
22
- /** Not used in the body — exists solely to bust React.memo for this span. */
23
- cacheKey?: MemoCacheKey;
24
- customSpanClassNameFunc?: (span: SpanNode) => string;
25
- customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
26
- }) => ReactNode>;
27
- export declare const SpanEventComponent: import("react").MemoExoticComponent<({ event, node, root, scale, customSpanEventClassNameFunc, asBoundary, }: {
28
- event: VisibleSpanEvent;
29
- node: VisibleSpan;
30
- root: RootNode;
31
- scale: number;
32
- customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
33
- asBoundary?: boolean;
34
- }) => ReactNode>;
35
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/node.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAYlB,eAAO,MAAM,qBAAqB,GAAI,MAAM,QAAQ,KAAG,MAGtD,CAAC;AAoDF,eAAO,MAAM,SAAS,yJASnB;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,kGAAkG;IAClG,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,+CAcC,CAAC;AAuCH,eAAO,MAAM,aAAa,sJAQvB;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,KAAG,SAAS,CA4KX,CAAC;AAuBH,eAAO,MAAM,kBAAkB,gHAO5B;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,KAAG,SAAS,CA4HX,CAAC"}