@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,41 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Children, useCallback, useRef, useState, } from 'react';
4
- import { cn } from '../../../lib/cn';
5
- import { DraggableBorder } from './draggable-border';
6
- import { DEFAULT_START_PX, GUTTER_PX, MIN_PX, paneColTemplate, } from './pane-constants';
7
- import { useElementWidth } from './use-element-width';
8
- const SPLIT_PANE_START_ID = 'trace-split-start';
9
- export function SplitPane({ children, className, startHeader, endHeader, scrollContainerRef, }) {
10
- const parts = Children.toArray(children);
11
- if (parts.length !== 3) {
12
- throw new Error('SplitPane expects exactly three children');
13
- }
14
- const [start, end, endOverlay] = parts;
15
- const [startPx, setStartPx] = useState(DEFAULT_START_PX);
16
- const containerRef = useRef(null);
17
- const startRef = useRef(null);
18
- const containerWidth = useElementWidth(containerRef);
19
- const setContainerRef = useCallback((node) => {
20
- containerRef.current = node;
21
- if (scrollContainerRef) {
22
- scrollContainerRef.current = node;
23
- }
24
- }, [scrollContainerRef]);
25
- const clampPx = useCallback((px) => {
26
- const el = containerRef.current;
27
- if (!el)
28
- return px;
29
- const maxPx = el.getBoundingClientRect().width - MIN_PX - GUTTER_PX;
30
- return Math.min(maxPx, Math.max(MIN_PX, px));
31
- }, []);
32
- const handleWidthChange = useCallback((next) => setStartPx(clampPx(next)), [clampPx]);
33
- const handleReset = useCallback(() => setStartPx(clampPx(DEFAULT_START_PX)), [clampPx]);
34
- const effectiveStartPx = containerWidth > 0
35
- ? Math.max(MIN_PX, Math.min(containerWidth - MIN_PX - GUTTER_PX, startPx))
36
- : startPx;
37
- const colTemplate = paneColTemplate(effectiveStartPx);
38
- const maxStartPx = Math.max(MIN_PX, containerWidth > 0 ? containerWidth - MIN_PX - GUTTER_PX : startPx);
39
- return (_jsxs("div", { className: cn('relative flex flex-col h-full min-h-0', className), children: [_jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { children: startHeader }), _jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "h-full w-px bg-gray-alpha-400", "aria-hidden": true }) }), _jsx("div", { children: endHeader })] }), _jsxs("div", { ref: setContainerRef, className: "grid flex-1 min-h-0 overflow-x-hidden overflow-y-auto", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { ref: startRef, id: SPLIT_PANE_START_ID, className: "min-w-0", children: start }), _jsxs("div", { className: "relative z-20 isolate flex shrink-0 justify-center", children: [_jsx("span", { className: "pointer-events-none relative z-10 h-full w-px shrink-0 bg-gray-alpha-400", "aria-hidden": true }), _jsx(DraggableBorder, { element: startRef, position: "right", onWidthChange: handleWidthChange, onReset: handleReset, "aria-label": "Resize event list", "aria-controls": SPLIT_PANE_START_ID, "aria-valuemin": MIN_PX, "aria-valuemax": maxStartPx, "aria-valuenow": Math.min(Math.max(Math.round(effectiveStartPx), MIN_PX), maxStartPx) })] }), end] }), _jsxs("div", { className: "pointer-events-none absolute inset-x-0 bottom-3 z-[5] grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", {}), _jsx("div", {}), _jsx("div", { className: "flex min-w-0 items-center justify-between gap-3 pl-4 pr-3", children: endOverlay })] })] }));
40
- }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGxpdC1wYW5lLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUNMLFFBQVEsRUFHUixXQUFXLEVBQ1gsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsTUFBTSxFQUNOLGVBQWUsR0FDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztBQVVoRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQ3hCLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxrQkFBa0IsR0FDSDtJQUNmLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXZDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJ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LE9BQU8sRUFBRSxXQUFXLGdCQUNULG1CQUFtQixtQkFDZixtQkFBbUIsbUJBQ25CLE1BQU0sbUJBQ04sVUFBVSxtQkFDVixJQUFJLENBQUMsR0FBRyxDQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUMsRUFDOUMsVUFBVSxDQUNYLEdBQ0QsSUFDRSxFQUNMLEdBQUcsSUFDQSxFQUNOLGVBQ0UsU0FBUyxFQUFDLDREQUE0RCxFQUN0RSxLQUFLLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsYUFFM0MsZUFBTyxFQUNQLGVBQU8sRUFDUCxjQUFLLFNBQVMsRUFBQywyREFBMkQsWUFDdkUsVUFBVSxHQUNQLElBQ0YsSUFDRixDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQge1xuICBDaGlsZHJlbixcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHR5cGUgUmVmT2JqZWN0LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi9saWIvY24nO1xuaW1wb3J0IHsgRHJhZ2dhYmxlQm9yZGVyIH0gZnJvbSAnLi9kcmFnZ2FibGUtYm9yZGVyJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RBUlRfUFgsXG4gIEdVVFRFUl9QWCxcbiAgTUlOX1BYLFxuICBwYW5lQ29sVGVtcGxhdGUsXG59IGZyb20gJy4vcGFuZS1jb25zdGFudHMnO1xuaW1wb3J0IHsgdXNlRWxlbWVudFdpZHRoIH0gZnJvbSAnLi91c2UtZWxlbWVudC13aWR0aCc7XG5cbmNvbnN0IFNQTElUX1BBTkVfU1RBUlRfSUQgPSAndHJhY2Utc3BsaXQtc3RhcnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0UGFuZVByb3BzIHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICBzdGFydEhlYWRlcj86IFJlYWN0Tm9kZTtcbiAgZW5kSGVhZGVyPzogUmVhY3ROb2RlO1xuICBzY3JvbGxDb250YWluZXJSZWY/OiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNwbGl0UGFuZSh7XG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG4gIHN0YXJ0SGVhZGVyLFxuICBlbmRIZWFkZXIsXG4gIHNjcm9sbENvbnRhaW5lclJlZixcbn06IFNwbGl0UGFuZVByb3BzKSB7XG4gIGNvbnN0IHBhcnRzID0gQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbik7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwbGl0UGFuZSBleHBlY3RzIGV4YWN0bHkgdGhyZWUgY2hpbGRyZW4nKTtcbiAgfVxuICBjb25zdCBbc3RhcnQsIGVuZCwgZW5kT3ZlcmxheV0gPSBwYXJ0cztcblxuICBjb25zdCBbc3RhcnRQeCwgc2V0U3RhcnRQeF0gPSB1c2VTdGF0ZShERUZBVUxUX1NUQVJUX1BYKTtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgc3RhcnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBjb250YWluZXJXaWR0aCA9IHVzZUVsZW1lbnRXaWR0aChjb250YWluZXJSZWYpO1xuXG4gIGNvbnN0IHNldENvbnRhaW5lclJlZiA9IHVzZUNhbGxiYWNrKFxuICAgIChub2RlOiBIVE1MRGl2RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICAgIGNvbnRhaW5lclJlZi5jdXJyZW50ID0gbm9kZTtcbiAgICAgIGlmIChzY3JvbGxDb250YWluZXJSZWYpIHtcbiAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgfVxuICAgIH0sXG4gICAgW3Njcm9sbENvbnRhaW5lclJlZl1cbiAgKTtcblxuICBjb25zdCBjbGFtcFB4ID0gdXNlQ2FsbGJhY2soKHB4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBlbCA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybiBweDtcbiAgICBjb25zdCBtYXhQeCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gTUlOX1BYIC0gR1VUVEVSX1BYO1xuICAgIHJldHVybiBNYXRoLm1pbihtYXhQeCwgTWF0aC5tYXgoTUlOX1BYLCBweCkpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlV2lkdGhDaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dDogbnVtYmVyKSA9PiBzZXRTdGFydFB4KGNsYW1wUHgobmV4dCkpLFxuICAgIFtjbGFtcFB4XVxuICApO1xuICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUNhbGxiYWNrKFxuICAgICgpID0+IHNldFN0YXJ0UHgoY2xhbXBQeChERUZBVUxUX1NUQVJUX1BYKSksXG4gICAgW2NsYW1wUHhdXG4gICk7XG5cbiAgY29uc3QgZWZmZWN0aXZlU3RhcnRQeCA9XG4gICAgY29udGFpbmVyV2lkdGggPiAwXG4gICAgICA/IE1hdGgubWF4KE1JTl9QWCwgTWF0aC5taW4oY29udGFpbmVyV2lkdGggLSBNSU5fUFggLSBHVVRURVJfUFgsIHN0YXJ0UHgpKVxuICAgICAgOiBzdGFydFB4O1xuXG4gIGNvbnN0IGNvbFRlbXBsYXRlID0gcGFuZUNvbFRlbXBsYXRlKGVmZmVjdGl2ZVN0YXJ0UHgpO1xuXG4gIGNvbnN0IG1heFN0YXJ0UHggPSBNYXRoLm1heChcbiAgICBNSU5fUFgsXG4gICAgY29udGFpbmVyV2lkdGggPiAwID8gY29udGFpbmVyV2lkdGggLSBNSU5fUFggLSBHVVRURVJfUFggOiBzdGFydFB4XG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ3JlbGF0aXZlIGZsZXggZmxleC1jb2wgaC1mdWxsIG1pbi1oLTAnLCBjbGFzc05hbWUpfT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwic2hyaW5rLTAgZ3JpZFwiXG4gICAgICAgIHN0eWxlPXt7IGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGNvbFRlbXBsYXRlIH19XG4gICAgICA+XG4gICAgICAgIDxkaXY+e3N0YXJ0SGVhZGVyfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoLWZ1bGwgdy1weCBiZy1ncmF5LWFscGhhLTQwMFwiIGFyaWEtaGlkZGVuIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2PntlbmRIZWFkZXJ9PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXtzZXRDb250YWluZXJSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT1cImdyaWQgZmxleC0xIG1pbi1oLTAgb3ZlcmZsb3cteC1oaWRkZW4gb3ZlcmZsb3cteS1hdXRvXCJcbiAgICAgICAgc3R5bGU9e3sgZ3JpZFRlbXBsYXRlQ29sdW1uczogY29sVGVtcGxhdGUgfX1cbiAgICAgID5cbiAgICAgICAgPGRpdiByZWY9e3N0YXJ0UmVmfSBpZD17U1BMSVRfUEFORV9TVEFSVF9JRH0gY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHtzdGFydH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgei0yMCBpc29sYXRlIGZsZXggc2hyaW5rLTAganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSByZWxhdGl2ZSB6LTEwIGgtZnVsbCB3LXB4IHNocmluay0wIGJnLWdyYXktYWxwaGEtNDAwXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8RHJhZ2dhYmxlQm9yZGVyXG4gICAgICAgICAgICBlbGVtZW50PXtzdGFydFJlZn1cbiAgICAgICAgICAgIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgb25XaWR0aENoYW5nZT17aGFuZGxlV2lkdGhDaGFuZ2V9XG4gICAgICAgICAgICBvblJlc2V0PXtoYW5kbGVSZXNldH1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZXNpemUgZXZlbnQgbGlzdFwiXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPXtTUExJVF9QQU5FX1NUQVJUX0lEfVxuICAgICAgICAgICAgYXJpYS12YWx1ZW1pbj17TUlOX1BYfVxuICAgICAgICAgICAgYXJpYS12YWx1ZW1heD17bWF4U3RhcnRQeH1cbiAgICAgICAgICAgIGFyaWEtdmFsdWVub3c9e01hdGgubWluKFxuICAgICAgICAgICAgICBNYXRoLm1heChNYXRoLnJvdW5kKGVmZmVjdGl2ZVN0YXJ0UHgpLCBNSU5fUFgpLFxuICAgICAgICAgICAgICBtYXhTdGFydFB4XG4gICAgICAgICAgICApfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7ZW5kfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteC0wIGJvdHRvbS0zIHotWzVdIGdyaWRcIlxuICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2IC8+XG4gICAgICAgIDxkaXYgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMyBwbC00IHByLTNcIj5cbiAgICAgICAgICB7ZW5kT3ZlcmxheX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAetD,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAKV,UAAU,EACX,MAAM,UAAU,CAAC;AA0BlB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA0UtC,QAAA,MAAM,WAAW,yIASd;IACD,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,KAAG,SAAS,CAoJX,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAuGvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CAsIZ"}
@@ -1,321 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { ArrowLeft, ArrowRight } from 'lucide-react';
4
- import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
5
- import { cn } from '../../../lib/cn';
6
- import { formatDurationPrecise, getHighResInMs, } from '../../trace-viewer/util/timing';
7
- import { isSpanDimmedBySearch } from '../search';
8
- import { computeOffscreenMarkers, computeSpanDelta, computeSpanGaps, computeSpanMarkers, computeSpanSegments, getResourceColor, getSpanDurationMs, isSpanErrored, } from '../utils';
9
- import { cullCollidingMarkers, MarkerLayer, OffscreenMarkerIndicator, projectMarkers, } from './span-markers';
10
- import styles from './timeline.module.css';
11
- import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
12
- // ---------------------------------------------------------------------------
13
- // Constants
14
- // ---------------------------------------------------------------------------
15
- const TINY_BAR_BOX_SIZE_PX = 24;
16
- const TINY_BAR_WIDTH_PX = 4;
17
- export const TIMELINE_PADDING_PX = 16;
18
- const SEGMENT_CLASSES = {
19
- queued: 'bg-gray-400 border border-gray-500',
20
- pending: 'bg-gray-200 border border-gray-500',
21
- retrying: 'bg-gray-400 border border-gray-500',
22
- waiting: 'bg-gray-200 border border-gray-500',
23
- running: 'bg-blue-200 border border-blue-500',
24
- completed: 'bg-blue-200 border border-blue-500',
25
- failed: 'bg-red-200 border border-red-500',
26
- succeeded: 'bg-green-200 border border-green-500',
27
- sleeping: 'bg-gray-400 border border-gray-500',
28
- received: 'bg-blue-200 border border-blue-500',
29
- };
30
- const TIMELINE_INSET_STYLE = {
31
- left: TIMELINE_PADDING_PX,
32
- right: TIMELINE_PADDING_PX,
33
- };
34
- const STRIPED_SEGMENT_STATUSES = new Set([
35
- 'pending',
36
- 'running',
37
- 'received',
38
- ]);
39
- function AnimatedStripes({ status }) {
40
- return (_jsx("div", { "aria-hidden": true, className: status === 'pending' ? styles.pendingStripes : styles.runningStripes }));
41
- }
42
- /**
43
- * Compute the bar's geometry inside the timeline viewport. Percentages are
44
- * always in [0, 100] so we never emit CSS values that exceed browser layout
45
- * limits at extreme zoom.
46
- */
47
- function computeBarGeometry(startMs, endMs, viewStart, viewEnd, containerWidth) {
48
- const viewDuration = viewEnd - viewStart;
49
- const visibleStartMs = Math.max(startMs, viewStart);
50
- const visibleEndMs = Math.min(endMs, viewEnd);
51
- const visibleDurationMs = Math.max(0, visibleEndMs - visibleStartMs);
52
- const widthFrac = viewDuration > 0 ? visibleDurationMs / viewDuration : 0;
53
- const visiblePixelWidth = widthFrac * containerWidth;
54
- const isTiny = containerWidth > 0 && visiblePixelWidth < TINY_BAR_BOX_SIZE_PX;
55
- const extendsOffLeft = startMs < viewStart;
56
- const extendsOffRight = endMs > viewEnd;
57
- const mode = isTiny && (extendsOffLeft || extendsOffRight)
58
- ? { kind: 'arrow', direction: extendsOffRight ? 'right' : 'left' }
59
- : isTiny
60
- ? { kind: 'tiny' }
61
- : { kind: 'full' };
62
- return {
63
- mode,
64
- leftPct: viewDuration > 0
65
- ? ((visibleStartMs - viewStart) / viewDuration) * 100
66
- : 0,
67
- widthPct: widthFrac * 100,
68
- visibleStartMs,
69
- visibleEndMs,
70
- visiblePixelWidth,
71
- };
72
- }
73
- function getBarPositionStyle(geometry) {
74
- switch (geometry.mode.kind) {
75
- case 'arrow':
76
- return {
77
- left: geometry.mode.direction === 'right'
78
- ? `calc(100% - ${TINY_BAR_BOX_SIZE_PX}px)`
79
- : '0px',
80
- width: `${TINY_BAR_BOX_SIZE_PX}px`,
81
- };
82
- case 'tiny':
83
- return {
84
- left: `min(${geometry.leftPct}%, calc(100% - ${TINY_BAR_WIDTH_PX}px))`,
85
- width: `${TINY_BAR_WIDTH_PX}px`,
86
- };
87
- case 'full':
88
- return {
89
- left: `${geometry.leftPct}%`,
90
- width: `max(${geometry.widthPct}%, 4px)`,
91
- };
92
- }
93
- }
94
- /**
95
- * Project status segments onto the visible portion of a bar. Segments fully
96
- * outside the visible window are dropped; segments crossing the edge are
97
- * clipped to [0%, 100%] of the visible bar.
98
- */
99
- function projectSegments(segments, spanStartMs, spanDurationMs, geometry) {
100
- const visibleDurationMs = geometry.visibleEndMs - geometry.visibleStartMs;
101
- if (visibleDurationMs <= 0)
102
- return [];
103
- return segments.flatMap((seg) => {
104
- const segStartMs = spanStartMs + seg.startFraction * spanDurationMs;
105
- const segEndMs = spanStartMs + seg.endFraction * spanDurationMs;
106
- const startMs = Math.max(segStartMs, geometry.visibleStartMs);
107
- const endMs = Math.min(segEndMs, geometry.visibleEndMs);
108
- if (endMs <= startMs)
109
- return [];
110
- const widthFrac = (endMs - startMs) / visibleDurationMs;
111
- return [
112
- {
113
- status: seg.status,
114
- leftPct: ((startMs - geometry.visibleStartMs) / visibleDurationMs) * 100,
115
- widthPct: widthFrac * 100,
116
- pixelWidth: widthFrac * geometry.visiblePixelWidth,
117
- fullDurationMs: (seg.endFraction - seg.startFraction) * spanDurationMs,
118
- },
119
- ];
120
- });
121
- }
122
- // ---------------------------------------------------------------------------
123
- // Small render helpers
124
- // ---------------------------------------------------------------------------
125
- /** Estimated rendered width of a 10px-mono duration label (6px/glyph + padding). */
126
- function estimateLabelWidthPx(label) {
127
- return label.length * 6 + 12;
128
- }
129
- function DurationLabel({ label, className, }) {
130
- return (_jsx("span", { className: cn('pointer-events-none absolute inset-0 flex items-center justify-start overflow-hidden px-1 text-[10px] font-mono font-medium leading-none whitespace-nowrap text-left text-gray-1000 tabular-nums opacity-0 group-hover/timeline-row:opacity-100', className), children: label }));
131
- }
132
- function BoundaryArrow({ direction, }) {
133
- const Icon = direction === 'right' ? ArrowRight : ArrowLeft;
134
- return (_jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-[0.25rem]", children: _jsx(Icon, { className: "size-3 text-gray-900" }) }));
135
- }
136
- function PlainBar({ bg, border, label, }) {
137
- return (_jsx("div", { className: "relative h-6 w-full min-w-1 rounded-[0.25rem] border", style: { background: bg, borderColor: border }, children: label ? _jsx(DurationLabel, { label: label }) : null }));
138
- }
139
- function LeadInConnector({ leftPct, widthPct, label, }) {
140
- return (_jsxs("div", { className: "absolute top-1/2 h-6 -translate-y-1/2", style: {
141
- left: `calc(${leftPct}% + 0.5px)`,
142
- width: `calc(${widthPct}% - 1px)`,
143
- }, children: [_jsx("div", { className: "absolute left-0 top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500" }), _jsx("div", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-gray-500" }), label ? _jsx(DurationLabel, { label: label }) : null] }));
144
- }
145
- function SegmentBar({ segments, showLabels = true, }) {
146
- return (_jsx("div", { className: "relative h-6 w-full", children: segments.map((seg, i) => {
147
- if (seg.status === 'queued') {
148
- const leadInLabel = formatDurationPrecise(seg.fullDurationMs);
149
- const showLeadInLabel = showLabels &&
150
- seg.pixelWidth >= Math.max(40, estimateLabelWidthPx(leadInLabel));
151
- const isFullWidthQueued = segments.length === 1;
152
- return (_jsxs(Fragment, { children: [_jsx(LeadInConnector, { leftPct: seg.leftPct, widthPct: seg.widthPct, label: showLeadInLabel ? leadInLabel : null }), isFullWidthQueued ? (_jsx("div", { className: "absolute top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500", style: {
153
- left: `calc(${seg.leftPct + seg.widthPct}% - 1.5px)`,
154
- } })) : null] }, i));
155
- }
156
- const label = formatDurationPrecise(seg.fullDurationMs);
157
- // Only render the label when there's enough room for it without clipping.
158
- const showLabel = showLabels &&
159
- seg.pixelWidth >= Math.max(40, estimateLabelWidthPx(label));
160
- return (_jsxs("div", { className: cn('absolute h-full overflow-hidden rounded-[0.25rem]', SEGMENT_CLASSES[seg.status]), style: {
161
- // 1px gap between adjacent segments, distributed equally.
162
- left: `calc(${seg.leftPct}% + 0.5px)`,
163
- width: `calc(${seg.widthPct}% - 1px)`,
164
- minWidth: 1,
165
- }, children: [STRIPED_SEGMENT_STATUSES.has(seg.status) ? (_jsx(AnimatedStripes, { status: seg.status })) : null, showLabel ? _jsx(DurationLabel, { label: label }) : null] }, i));
166
- }) }));
167
- }
168
- // ---------------------------------------------------------------------------
169
- // TimelineBar
170
- // ---------------------------------------------------------------------------
171
- const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, onRevealTime, }) {
172
- const startMs = getHighResInMs(span.startTime);
173
- const endMs = getHighResInMs(span.endTime);
174
- const totalDurationMs = getSpanDurationMs(span);
175
- const geometry = useMemo(() => computeBarGeometry(startMs, endMs, viewStart, viewStart + viewDuration, containerWidth), [startMs, endMs, viewStart, viewDuration, containerWidth]);
176
- const baseSegments = useMemo(() => computeSpanSegments(span), [span]);
177
- const segments = useMemo(() => geometry.mode.kind === 'full'
178
- ? projectSegments(baseSegments, startMs, totalDurationMs, geometry)
179
- : [], [geometry, baseSegments, startMs, totalDurationMs]);
180
- const baseMarkers = useMemo(() => computeSpanMarkers(span), [span]);
181
- const markers = useMemo(() => geometry.mode.kind === 'full'
182
- ? cullCollidingMarkers(projectMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs), geometry.visiblePixelWidth)
183
- : [], [geometry, baseMarkers]);
184
- // Markers that fall outside the visible window (scrolled off while zoomed in)
185
- // — surfaced as edge indicators so they aren't silently lost.
186
- const offscreen = useMemo(() => geometry.mode.kind === 'full'
187
- ? computeOffscreenMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs)
188
- : { left: null, right: null }, [geometry, baseMarkers]);
189
- // Markers (visible or off-screen) move the duration label into the overlay,
190
- // so the in-bar segment label is suppressed.
191
- const hasMarkers = markers.length > 0 || offscreen.left !== null || offscreen.right !== null;
192
- const isErrored = isSpanErrored(span);
193
- const colors = getResourceColor(span.resource);
194
- const fallbackBg = isErrored
195
- ? (colors.errorBg ?? 'var(--ds-red-200)')
196
- : colors.bg;
197
- const fallbackBorder = isErrored
198
- ? (colors.errorBorder ?? 'var(--ds-red-500)')
199
- : colors.border;
200
- const totalLabel = formatDurationPrecise(totalDurationMs);
201
- const showTotalLabel = geometry.visiblePixelWidth >=
202
- Math.max(40, estimateLabelWidthPx(totalLabel));
203
- const handleClick = useCallback(() => {
204
- onSelect(span.spanId);
205
- }, [onSelect, span.spanId]);
206
- return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsxs("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: [_jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 overflow-hidden rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments, showLabels: !hasMarkers })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }), hasMarkers ? (_jsxs("div", { className: "pointer-events-none absolute top-1/2 h-6 -translate-y-1/2", style: getBarPositionStyle(geometry), children: [markers.length > 0 ? _jsx(MarkerLayer, { markers: markers }) : null, offscreen.left ? (_jsx(OffscreenMarkerIndicator, { direction: "left", count: offscreen.left.count, targetMs: offscreen.left.nearestMs, onReveal: onRevealTime })) : null, offscreen.right ? (_jsx(OffscreenMarkerIndicator, { direction: "right", count: offscreen.right.count, targetMs: offscreen.right.nearestMs, onReveal: onRevealTime })) : null, showTotalLabel ? (_jsx(DurationLabel, { label: totalLabel,
207
- // Shift clear of the left edge indicator so it isn't covered.
208
- className: offscreen.left ? 'pl-10' : undefined })) : null] })) : null] }) }));
209
- });
210
- export { TimelineBar };
211
- // ---------------------------------------------------------------------------
212
- // DeltaMeasureLine (Alt-key measurement overlays: the selected ↔ hovered
213
- // measurement, and the ambient consecutive-gap indicators shown without a
214
- // selection)
215
- // ---------------------------------------------------------------------------
216
- // Horizontal distance between the anchor bar's measured edge and the vertical
217
- // guide — also the width of the connector stub bridging the two.
218
- const MEASURE_GUIDE_OUTSET_PX = 4;
219
- const DeltaMeasureLine = memo(function DeltaMeasureLine({ delta, anchorRowIndex, hoveredRowIndex, timelineWidth, }) {
220
- // Both ends of the measurement align with the vertical middle of the bars
221
- // (bars are centered in their rows, so bar center == row center).
222
- const anchorCenterY = anchorRowIndex * ROW_HEIGHT_PX + ROW_HEIGHT_PX / 2;
223
- const lineY = hoveredRowIndex * ROW_HEIGHT_PX + ROW_HEIGHT_PX / 2;
224
- // Guide connecting the middle of the anchor bar down/up to the line, so
225
- // the measurement's origin stays legible when the rows are far apart.
226
- // It sits just outside the anchor bar's measured edge (so it doesn't blend
227
- // into the bar's border), joined to the bar by a short horizontal stub. The
228
- // line runs from the elbow corner (the guide's x) to the hovered span's
229
- // measured edge — pulled short of the edge arrow when the hovered span is
230
- // fully off-screen.
231
- const guideTop = Math.min(anchorCenterY, lineY);
232
- const guideBottom = Math.max(anchorCenterY, lineY);
233
- const anchorX = delta.anchorFrac * timelineWidth;
234
- const guideX = anchorX +
235
- (delta.anchorEdge === 'end'
236
- ? MEASURE_GUIDE_OUTSET_PX
237
- : -MEASURE_GUIDE_OUTSET_PX);
238
- const arrowClearance = delta.hoveredOffscreen === 'right'
239
- ? -(TINY_BAR_BOX_SIZE_PX + 4)
240
- : delta.hoveredOffscreen === 'left'
241
- ? TINY_BAR_BOX_SIZE_PX + 4
242
- : 0;
243
- const hoveredX = delta.hoveredFrac * timelineWidth + arrowClearance;
244
- const startX = Math.min(guideX, hoveredX);
245
- const endX = Math.max(guideX, hoveredX);
246
- const label = formatDurationPrecise(delta.deltaMs);
247
- const labelWidthPx = estimateLabelWidthPx(label);
248
- // Center the label on the line; when the line is too short, place it beside
249
- // the right endpoint, flipping left near the viewport's right edge.
250
- const labelPlacement = endX - startX >= labelWidthPx
251
- ? { left: (startX + endX) / 2, translate: '-translate-x-1/2' }
252
- : endX + 4 + labelWidthPx <= timelineWidth
253
- ? { left: endX + 4, translate: '' }
254
- : { left: startX - 4, translate: '-translate-x-full' };
255
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute h-px bg-amber-800", style: {
256
- left: Math.min(anchorX, guideX),
257
- width: MEASURE_GUIDE_OUTSET_PX,
258
- top: anchorCenterY,
259
- } }), _jsx("div", { className: "absolute w-px bg-amber-800", style: {
260
- left: guideX,
261
- top: guideTop,
262
- height: guideBottom - guideTop,
263
- } }), _jsx("div", { className: "absolute h-px bg-amber-800", style: { left: startX, width: Math.max(endX - startX, 1), top: lineY } }), _jsx("span", { className: cn('absolute -translate-y-1/2 font-mono text-[10px] font-medium leading-none tabular-nums whitespace-nowrap rounded-xs bg-background-100 px-1 py-0.5 text-amber-800', labelPlacement.translate), style: { left: labelPlacement.left, top: lineY }, children: label })] }));
264
- });
265
- // ---------------------------------------------------------------------------
266
- // TimelineHeader
267
- // ---------------------------------------------------------------------------
268
- export function TimelineHeader({ markers, hoverInfo, }) {
269
- return (_jsx("div", { className: "relative bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-end px-4 pb-1", children: _jsxs("div", { className: "relative h-full flex-1", children: [markers.map((m) => (_jsx("span", { className: "absolute bottom-1 font-mono text-xs font-normal leading-4 text-gray-900 whitespace-nowrap", style: { left: `${m.position * 100}%` }, children: m.label }, String(m.value)))), hoverInfo && (_jsx("span", { className: "absolute top-1 pointer-events-none z-10 font-mono text-[11px] leading-4 text-gray-1000 whitespace-nowrap bg-background-100 border border-gray-alpha-400 rounded px-1 -translate-x-1/2", style: { left: `${hoverInfo.fraction * 100}%` }, children: hoverInfo.label }))] }) }));
270
- }
271
- export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, onRevealTime, hover, altHeld = false, }) {
272
- const containerRef = useRef(null);
273
- const [containerWidth, setContainerWidth] = useState(0);
274
- const viewDuration = viewEnd - viewStart;
275
- const timelineWidth = Math.max(0, containerWidth - TIMELINE_PADDING_PX * 2);
276
- const { start, end } = useRowWindow(containerRef, spans.length, ROW_HEIGHT_PX);
277
- useEffect(() => {
278
- const el = containerRef.current;
279
- if (!el)
280
- return;
281
- const ro = new ResizeObserver(([entry]) => {
282
- setContainerWidth(entry.contentRect.width);
283
- });
284
- ro.observe(el);
285
- return () => ro.disconnect();
286
- }, []);
287
- // Each consecutive gap renders as a measurement from the earlier span's end
288
- // edge to the next span's start, in the same visual language as the
289
- // selected ↔ hovered measurement.
290
- const gapMeasurements = useMemo(() => computeSpanGaps(spans, viewStart, viewEnd).map((gap) => ({
291
- delta: {
292
- deltaMs: gap.gapMs,
293
- anchorFrac: gap.leftFrac,
294
- hoveredFrac: gap.rightFrac,
295
- anchorEdge: 'end',
296
- hoveredOffscreen: null,
297
- },
298
- anchorRowIndex: gap.rowIndex,
299
- hoveredRowIndex: gap.rowIndex + 1,
300
- })), [spans, viewStart, viewEnd]);
301
- // With a span selected, Alt+hover measures selected ↔ hovered instead of
302
- // showing the all-sibling-gaps overlay.
303
- const anchorIndex = useMemo(() => (selectedId ? spans.findIndex((s) => s.spanId === selectedId) : -1), [spans, selectedId]);
304
- const measurement = useMemo(() => {
305
- if (!altHeld || hover == null || hover.rowIndex === anchorIndex) {
306
- return null;
307
- }
308
- const anchorSpan = spans[anchorIndex];
309
- const hoveredSpan = spans[hover.rowIndex];
310
- if (!anchorSpan || !hoveredSpan)
311
- return null;
312
- const delta = computeSpanDelta(anchorSpan, hoveredSpan, viewStart, viewEnd);
313
- return delta
314
- ? { delta, anchorRowIndex: anchorIndex, hoveredRowIndex: hover.rowIndex }
315
- : null;
316
- }, [altHeld, anchorIndex, hover, spans, viewStart, viewEnd]);
317
- return (_jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", style: { minHeight: spans.length * ROW_HEIGHT_PX }, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers.map((marker) =>
318
- // Skip the "0s" origin marker since the left edge already implies it.
319
- Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, String(marker.value))) : null) }), hover != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hover.fraction * 100}%` } }) })), _jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect, onRevealTime: onRevealTime }, span.spanId))) }), altHeld && anchorIndex < 0 && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gapMeasurements.map((gap) => (_jsx(DeltaMeasureLine, { ...gap, timelineWidth: timelineWidth }, gap.anchorRowIndex))) })), measurement && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none z-20", style: TIMELINE_INSET_STYLE, children: _jsx(DeltaMeasureLine, { ...measurement, timelineWidth: timelineWidth }) }))] }));
320
- }
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdGltZWxpbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsY0FBYyxHQUNmLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUF5QixNQUFNLFdBQVcsQ0FBQztBQVN4RSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGFBQWEsR0FDZCxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCx3QkFBd0IsRUFDeEIsY0FBYyxHQUNmLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxNQUFNLE1BQU0sdUJBQXVCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvRCw4RUFBOEU7QUFDOUUsWUFBWTtBQUNaLDhFQUE4RTtBQUU5RSxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENB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LENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBBcnJvd0xlZnQsIEFycm93UmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBDU1NQcm9wZXJ0aWVzLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi8uLi9saWIvY24nO1xuaW1wb3J0IHtcbiAgZm9ybWF0RHVyYXRpb25QcmVjaXNlLFxuICBnZXRIaWdoUmVzSW5Ncyxcbn0gZnJvbSAnLi4vLi4vdHJhY2Utdmlld2VyL3V0aWwvdGltaW5nJztcbmltcG9ydCB7IGlzU3BhbkRpbW1lZEJ5U2VhcmNoLCB0eXBlIFNwYW5TZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9zZWFyY2gnO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICBPZmZzY3JlZW5NYXJrZXJzLFxuICBTZWdtZW50LFxuICBTZWdtZW50U3RhdHVzLFxuICBTcGFuRGVsdGEsXG4gIFRpbWVNYXJrZXIsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVPZmZzY3JlZW5NYXJrZXJzLFxuICBjb21wdXRlU3BhbkRlbHRhLFxuICBjb21wdXRlU3BhbkdhcHMsXG4gIGNvbXB1dGVTcGFuTWFya2VycyxcbiAgY29tcHV0ZVNwYW5TZWdtZW50cyxcbiAgZ2V0UmVzb3VyY2VDb2xvcixcbiAgZ2V0U3BhbkR1cmF0aW9uTXMsXG4gIGlzU3BhbkVycm9yZWQsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIGN1bGxDb2xsaWRpbmdNYXJrZXJzLFxuICBNYXJrZXJMYXllcixcbiAgT2Zmc2NyZWVuTWFya2VySW5kaWNhdG9yLFxuICBwcm9qZWN0TWFya2Vycyxcbn0gZnJvbSAnLi9zcGFuLW1hcmtlcnMnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RpbWVsaW5lLm1vZHVsZS5jc3MnO1xuaW1wb3J0IHsgUk9XX0hFSUdIVF9QWCwgdXNlUm93V2luZG93IH0gZnJvbSAnLi91c2Utcm93LXdpbmRvdyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVElOWV9CQVJfQk9YX1NJWkVfUFggPSAyNDtcbmNvbnN0IFRJTllfQkFSX1dJRFRIX1BYID0gNDtcbmV4cG9ydCBjb25zdCBUSU1FTElORV9QQURESU5HX1BYID0gMTY7XG5cbmNvbnN0IFNFR01FTlRfQ0xBU1NFUzogUmVjb3JkPFNlZ21lbnRTdGF0dXMsIHN0cmluZz4gPSB7XG4gIHF1ZXVlZDogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICBwZW5kaW5nOiAnYmctZ3JheS0yMDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJldHJ5aW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHdhaXRpbmc6ICdiZy1ncmF5LTIwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcnVubmluZzogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxuICBjb21wbGV0ZWQ6ICdiZy1ibHVlLTIwMCBib3JkZXIgYm9yZGVyLWJsdWUtNTAwJyxcbiAgZmFpbGVkOiAnYmctcmVkLTIwMCBib3JkZXIgYm9yZGVyLXJlZC01MDAnLFxuICBzdWNjZWVkZWQ6ICdiZy1ncmVlbi0yMDAgYm9yZGVyIGJvcmRlci1ncmVlbi01MDAnLFxuICBzbGVlcGluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICByZWNlaXZlZDogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxufTtcblxuY29uc3QgVElNRUxJTkVfSU5TRVRfU1RZTEU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGxlZnQ6IFRJTUVMSU5FX1BBRERJTkdfUFgsXG4gIHJpZ2h0OiBUSU1FTElORV9QQURESU5HX1BYLFxufTtcblxuY29uc3QgU1RSSVBFRF9TRUdNRU5UX1NUQVRVU0VTOiBSZWFkb25seVNldDxTZWdtZW50U3RhdHVzPiA9IG5ldyBTZXQoW1xuICAncGVuZGluZycsXG4gICdydW5uaW5nJyxcbiAgJ3JlY2VpdmVkJyxcbl0pO1xuXG5mdW5jdGlvbiBBbmltYXRlZFN0cmlwZXMoeyBzdGF0dXMgfTogeyBzdGF0dXM6IFNlZ21lbnRTdGF0dXMgfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW5cbiAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgIHN0YXR1cyA9PT0gJ3BlbmRpbmcnID8gc3R5bGVzLnBlbmRpbmdTdHJpcGVzIDogc3R5bGVzLnJ1bm5pbmdTdHJpcGVzXG4gICAgICB9XG4gICAgLz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCYXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEJhck1vZGUgPVxuICB8IHsga2luZDogJ2Fycm93JzsgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIH1cbiAgfCB7IGtpbmQ6ICd0aW55JyB9XG4gIHwgeyBraW5kOiAnZnVsbCcgfTtcblxuaW50ZXJmYWNlIEJhckdlb21ldHJ5IHtcbiAgbW9kZTogQmFyTW9kZTtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICB2aXNpYmxlU3RhcnRNczogbnVtYmVyO1xuICB2aXNpYmxlRW5kTXM6IG51bWJlcjtcbiAgdmlzaWJsZVBpeGVsV2lkdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBiYXIncyBnZW9tZXRyeSBpbnNpZGUgdGhlIHRpbWVsaW5lIHZpZXdwb3J0LiBQZXJjZW50YWdlcyBhcmVcbiAqIGFsd2F5cyBpbiBbMCwgMTAwXSBzbyB3ZSBuZXZlciBlbWl0IENTUyB2YWx1ZXMgdGhhdCBleGNlZWQgYnJvd3NlciBsYXlvdXRcbiAqIGxpbWl0cyBhdCBleHRyZW1lIHpvb20uXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVCYXJHZW9tZXRyeShcbiAgc3RhcnRNczogbnVtYmVyLFxuICBlbmRNczogbnVtYmVyLFxuICB2aWV3U3RhcnQ6IG51bWJlcixcbiAgdmlld0VuZDogbnVtYmVyLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyXG4pOiBCYXJHZW9tZXRyeSB7XG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGNvbnN0IHZpc2libGVTdGFydE1zID0gTWF0aC5tYXgoc3RhcnRNcywgdmlld1N0YXJ0KTtcbiAgY29uc3QgdmlzaWJsZUVuZE1zID0gTWF0aC5taW4oZW5kTXMsIHZpZXdFbmQpO1xuICBjb25zdCB2aXNpYmxlRHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIHZpc2libGVFbmRNcyAtIHZpc2libGVTdGFydE1zKTtcbiAgY29uc3Qgd2lkdGhGcmFjID0gdmlld0R1cmF0aW9uID4gMCA/IHZpc2libGVEdXJhdGlvbk1zIC8gdmlld0R1cmF0aW9uIDogMDtcbiAgY29uc3QgdmlzaWJsZVBpeGVsV2lkdGggPSB3aWR0aEZyYWMgKiBjb250YWluZXJXaWR0aDtcblxuICBjb25zdCBpc1RpbnkgPSBjb250YWluZXJXaWR0aCA+IDAgJiYgdmlzaWJsZVBpeGVsV2lkdGggPCBUSU5ZX0JBUl9CT1hfU0laRV9QWDtcbiAgY29uc3QgZXh0ZW5kc09mZkxlZnQgPSBzdGFydE1zIDwgdmlld1N0YXJ0O1xuICBjb25zdCBleHRlbmRzT2ZmUmlnaHQgPSBlbmRNcyA+IHZpZXdFbmQ7XG5cbiAgY29uc3QgbW9kZTogQmFyTW9kZSA9XG4gICAgaXNUaW55ICYmIChleHRlbmRzT2ZmTGVmdCB8fCBleHRlbmRzT2ZmUmlnaHQpXG4gICAgICA/IHsga2luZDogJ2Fycm93JywgZGlyZWN0aW9uOiBleHRlbmRzT2ZmUmlnaHQgPyAncmlnaHQnIDogJ2xlZnQnIH1cbiAgICAgIDogaXNUaW55XG4gICAgICAgID8geyBraW5kOiAndGlueScgfVxuICAgICAgICA6IHsga2luZDogJ2Z1bGwnIH07XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlLFxuICAgIGxlZnRQY3Q6XG4gICAgICB2aWV3RHVyYXRpb24gPiAwXG4gICAgICAgID8gKCh2aXNpYmxlU3RhcnRNcyAtIHZpZXdTdGFydCkgLyB2aWV3RHVyYXRpb24pICogMTAwXG4gICAgICAgIDogMCxcbiAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgIHZpc2libGVTdGFydE1zLFxuICAgIHZpc2libGVFbmRNcyxcbiAgICB2aXNpYmxlUGl4ZWxXaWR0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeTogQmFyR2VvbWV0cnkpOiB7XG4gIGxlZnQ6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbn0ge1xuICBzd2l0Y2ggKGdlb21ldHJ5Lm1vZGUua2luZCkge1xuICAgIGNhc2UgJ2Fycm93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6XG4gICAgICAgICAgZ2VvbWV0cnkubW9kZS5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgID8gYGNhbGMoMTAwJSAtICR7VElOWV9CQVJfQk9YX1NJWkVfUFh9cHgpYFxuICAgICAgICAgICAgOiAnMHB4JyxcbiAgICAgICAgd2lkdGg6IGAke1RJTllfQkFSX0JPWF9TSVpFX1BYfXB4YCxcbiAgICAgIH07XG4gICAgY2FzZSAndGlueSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBgbWluKCR7Z2VvbWV0cnkubGVmdFBjdH0lLCBjYWxjKDEwMCUgLSAke1RJTllfQkFSX1dJRFRIX1BYfXB4KSlgLFxuICAgICAgICB3aWR0aDogYCR7VElOWV9CQVJfV0lEVEhfUFh9cHhgLFxuICAgICAgfTtcbiAgICBjYXNlICdmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGAke2dlb21ldHJ5LmxlZnRQY3R9JWAsXG4gICAgICAgIHdpZHRoOiBgbWF4KCR7Z2VvbWV0cnkud2lkdGhQY3R9JSwgNHB4KWAsXG4gICAgICB9O1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VnbWVudCBwcm9qZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFZpc2libGVTZWdtZW50IHtcbiAgc3RhdHVzOiBTZWdtZW50U3RhdHVzO1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIHBpeGVsV2lkdGg6IG51bWJlcjtcbiAgZnVsbER1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IHN0YXR1cyBzZWdtZW50cyBvbnRvIHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgYSBiYXIuIFNlZ21lbnRzIGZ1bGx5XG4gKiBvdXRzaWRlIHRoZSB2aXNpYmxlIHdpbmRvdyBhcmUgZHJvcHBlZDsgc2VnbWVudHMgY3Jvc3NpbmcgdGhlIGVkZ2UgYXJlXG4gKiBjbGlwcGVkIHRvIFswJSwgMTAwJV0gb2YgdGhlIHZpc2libGUgYmFyLlxuICovXG5mdW5jdGlvbiBwcm9qZWN0U2VnbWVudHMoXG4gIHNlZ21lbnRzOiBTZWdtZW50W10sXG4gIHNwYW5TdGFydE1zOiBudW1iZXIsXG4gIHNwYW5EdXJhdGlvbk1zOiBudW1iZXIsXG4gIGdlb21ldHJ5OiBCYXJHZW9tZXRyeVxuKTogVmlzaWJsZVNlZ21lbnRbXSB7XG4gIGNvbnN0IHZpc2libGVEdXJhdGlvbk1zID0gZ2VvbWV0cnkudmlzaWJsZUVuZE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXM7XG4gIGlmICh2aXNpYmxlRHVyYXRpb25NcyA8PSAwKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHNlZ21lbnRzLmZsYXRNYXAoKHNlZykgPT4ge1xuICAgIGNvbnN0IHNlZ1N0YXJ0TXMgPSBzcGFuU3RhcnRNcyArIHNlZy5zdGFydEZyYWN0aW9uICogc3BhbkR1cmF0aW9uTXM7XG4gICAgY29uc3Qgc2VnRW5kTXMgPSBzcGFuU3RhcnRNcyArIHNlZy5lbmRGcmFjdGlvbiAqIHNwYW5EdXJhdGlvbk1zO1xuICAgIGNvbnN0IHN0YXJ0TXMgPSBNYXRoLm1heChzZWdTdGFydE1zLCBnZW9tZXRyeS52aXNpYmxlU3RhcnRNcyk7XG4gICAgY29uc3QgZW5kTXMgPSBNYXRoLm1pbihzZWdFbmRNcywgZ2VvbWV0cnkudmlzaWJsZUVuZE1zKTtcbiAgICBpZiAoZW5kTXMgPD0gc3RhcnRNcykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgd2lkdGhGcmFjID0gKGVuZE1zIC0gc3RhcnRNcykgLyB2aXNpYmxlRHVyYXRpb25NcztcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzdGF0dXM6IHNlZy5zdGF0dXMsXG4gICAgICAgIGxlZnRQY3Q6XG4gICAgICAgICAgKChzdGFydE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMpIC8gdmlzaWJsZUR1cmF0aW9uTXMpICogMTAwLFxuICAgICAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgICAgICBwaXhlbFdpZHRoOiB3aWR0aEZyYWMgKiBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aCxcbiAgICAgICAgZnVsbER1cmF0aW9uTXM6IChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb25NcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU21hbGwgcmVuZGVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogRXN0aW1hdGVkIHJlbmRlcmVkIHdpZHRoIG9mIGEgMTBweC1tb25vIGR1cmF0aW9uIGxhYmVsICg2cHgvZ2x5cGggKyBwYWRkaW5nKS4gKi9cbmZ1bmN0aW9uIGVzdGltYXRlTGFiZWxXaWR0aFB4KGxhYmVsOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGFiZWwubGVuZ3RoICogNiArIDEyO1xufVxuXG5mdW5jdGlvbiBEdXJhdGlvbkxhYmVsKHtcbiAgbGFiZWwsXG4gIGNsYXNzTmFtZSxcbn06IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBvdmVyZmxvdy1oaWRkZW4gcHgtMSB0ZXh0LVsxMHB4XSBmb250LW1vbm8gZm9udC1tZWRpdW0gbGVhZGluZy1ub25lIHdoaXRlc3BhY2Utbm93cmFwIHRleHQtbGVmdCB0ZXh0LWdyYXktMTAwMCB0YWJ1bGFyLW51bXMgb3BhY2l0eS0wIGdyb3VwLWhvdmVyL3RpbWVsaW5lLXJvdzpvcGFjaXR5LTEwMCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICB7bGFiZWx9XG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBCb3VuZGFyeUFycm93KHtcbiAgZGlyZWN0aW9uLFxufToge1xuICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgSWNvbiA9IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IEFycm93UmlnaHQgOiBBcnJvd0xlZnQ7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzAuMjVyZW1dXCI+XG4gICAgICA8SWNvbiBjbGFzc05hbWU9XCJzaXplLTMgdGV4dC1ncmF5LTkwMFwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFBsYWluQmFyKHtcbiAgYmcsXG4gIGJvcmRlcixcbiAgbGFiZWwsXG59OiB7XG4gIGJnOiBzdHJpbmc7XG4gIGJvcmRlcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGwgbWluLXctMSByb3VuZGVkLVswLjI1cmVtXSBib3JkZXJcIlxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogYmcsIGJvcmRlckNvbG9yOiBib3JkZXIgfX1cbiAgICA+XG4gICAgICB7bGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gTGVhZEluQ29ubmVjdG9yKHtcbiAgbGVmdFBjdCxcbiAgd2lkdGhQY3QsXG4gIGxhYmVsLFxufToge1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTYgLXRyYW5zbGF0ZS15LTEvMlwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBsZWZ0OiBgY2FsYygke2xlZnRQY3R9JSArIDAuNXB4KWAsXG4gICAgICAgIHdpZHRoOiBgY2FsYygke3dpZHRoUGN0fSUgLSAxcHgpYCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTEvMiBoLTQgdy1weCAtdHJhbnNsYXRlLXktMS8yIGJnLWdyYXktNTAwXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteC0wIHRvcC0xLzIgaC1weCAtdHJhbnNsYXRlLXktMS8yIGJnLWdyYXktNTAwXCIgLz5cbiAgICAgIHtsYWJlbCA/IDxEdXJhdGlvbkxhYmVsIGxhYmVsPXtsYWJlbH0gLz4gOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBTZWdtZW50QmFyKHtcbiAgc2VnbWVudHMsXG4gIHNob3dMYWJlbHMgPSB0cnVlLFxufToge1xuICBzZWdtZW50czogVmlzaWJsZVNlZ21lbnRbXTtcbiAgLyoqXG4gICAqIFdoZW4gZmFsc2UsIHNlZ21lbnQgZHVyYXRpb24gbGFiZWxzIGFyZSBzdXBwcmVzc2VkLiBVc2VkIHdoZW4gYSBzZXBhcmF0ZVxuICAgKiB0b3AgbGF5ZXIgKGUuZy4gdGhlIHJlc3VtcHRpb24tbWFya2VyIGR1cmF0aW9uIG92ZXJsYXkpIHJlbmRlcnMgdGhlIGxhYmVsXG4gICAqIGFib3ZlIHRoZSBtYXJrZXJzIGluc3RlYWQsIHNvIHdlIGRvbid0IGRyYXcgaXQgdHdpY2UuXG4gICAqL1xuICBzaG93TGFiZWxzPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC02IHctZnVsbFwiPlxuICAgICAge3NlZ21lbnRzLm1hcCgoc2VnLCBpKSA9PiB7XG4gICAgICAgIGlmIChzZWcuc3RhdHVzID09PSAncXVldWVkJykge1xuICAgICAgICAgIGNvbnN0IGxlYWRJbkxhYmVsID0gZm9ybWF0RHVyYXRpb25QcmVjaXNlKHNlZy5mdWxsRHVyYXRpb25Ncyk7XG4gICAgICAgICAgY29uc3Qgc2hvd0xlYWRJbkxhYmVsID1cbiAgICAgICAgICAgIHNob3dMYWJlbHMgJiZcbiAgICAgICAgICAgIHNlZy5waXhlbFdpZHRoID49IE1hdGgubWF4KDQwLCBlc3RpbWF0ZUxhYmVsV2lkdGhQeChsZWFkSW5MYWJlbCkpO1xuICAgICAgICAgIGNvbnN0IGlzRnVsbFdpZHRoUXVldWVkID0gc2VnbWVudHMubGVuZ3RoID09PSAxO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtpfT5cbiAgICAgICAgICAgICAgPExlYWRJbkNvbm5lY3RvclxuICAgICAgICAgICAgICAgIGxlZnRQY3Q9e3NlZy5sZWZ0UGN0fVxuICAgICAgICAgICAgICAgIHdpZHRoUGN0PXtzZWcud2lkdGhQY3R9XG4gICAgICAgICAgICAgICAgbGFiZWw9e3Nob3dMZWFkSW5MYWJlbCA/IGxlYWRJbkxhYmVsIDogbnVsbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAge2lzRnVsbFdpZHRoUXVldWVkID8gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgaC00IHctcHggLXRyYW5zbGF0ZS15LTEvMiBiZy1ncmF5LTUwMFwiXG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke3NlZy5sZWZ0UGN0ICsgc2VnLndpZHRoUGN0fSUgLSAxLjVweClgLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZm9ybWF0RHVyYXRpb25QcmVjaXNlKHNlZy5mdWxsRHVyYXRpb25Ncyk7XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyIHRoZSBsYWJlbCB3aGVuIHRoZXJlJ3MgZW5vdWdoIHJvb20gZm9yIGl0IHdpdGhvdXQgY2xpcHBpbmcuXG4gICAgICAgIGNvbnN0IHNob3dMYWJlbCA9XG4gICAgICAgICAgc2hvd0xhYmVscyAmJlxuICAgICAgICAgIHNlZy5waXhlbFdpZHRoID49IE1hdGgubWF4KDQwLCBlc3RpbWF0ZUxhYmVsV2lkdGhQeChsYWJlbCkpO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2Fic29sdXRlIGgtZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1bMC4yNXJlbV0nLFxuICAgICAgICAgICAgICBTRUdNRU5UX0NMQVNTRVNbc2VnLnN0YXR1c11cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAvLyAxcHggZ2FwIGJldHdlZW4gYWRqYWNlbnQgc2VnbWVudHMsIGRpc3RyaWJ1dGVkIGVxdWFsbHkuXG4gICAgICAgICAgICAgIGxlZnQ6IGBjYWxjKCR7c2VnLmxlZnRQY3R9JSArIDAuNXB4KWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke3NlZy53aWR0aFBjdH0lIC0gMXB4KWAsXG4gICAgICAgICAgICAgIG1pbldpZHRoOiAxLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7U1RSSVBFRF9TRUdNRU5UX1NUQVRVU0VTLmhhcyhzZWcuc3RhdHVzKSA/IChcbiAgICAgICAgICAgICAgPEFuaW1hdGVkU3RyaXBlcyBzdGF0dXM9e3NlZy5zdGF0dXN9IC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHtzaG93TGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lQmFyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVGltZWxpbmVCYXIgPSBtZW1vKGZ1bmN0aW9uIFRpbWVsaW5lQmFyKHtcbiAgc3BhbixcbiAgdmlld1N0YXJ0LFxuICB2aWV3RHVyYXRpb24sXG4gIGNvbnRhaW5lcldpZHRoLFxuICBpc1NlbGVjdGVkLFxuICBpc0RpbW1lZCxcbiAgb25TZWxlY3QsXG4gIG9uUmV2ZWFsVGltZSxcbn06IHtcbiAgc3BhbjogU3BhbjtcbiAgdmlld1N0YXJ0OiBudW1iZXI7XG4gIHZpZXdEdXJhdGlvbjogbnVtYmVyO1xuICBjb250YWluZXJXaWR0aDogbnVtYmVyO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBpc0RpbW1lZD86IGJvb2xlYW47XG4gIG9uU2VsZWN0OiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUmV2ZWFsVGltZT86ICh0aW1lTXM6IG51bWJlcikgPT4gdm9pZDtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gIGNvbnN0IHRvdGFsRHVyYXRpb25NcyA9IGdldFNwYW5EdXJhdGlvbk1zKHNwYW4pO1xuXG4gIGNvbnN0IGdlb21ldHJ5ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgY29tcHV0ZUJhckdlb21ldHJ5KFxuICAgICAgICBzdGFydE1zLFxuICAgICAgICBlbmRNcyxcbiAgICAgICAgdmlld1N0YXJ0LFxuICAgICAgICB2aWV3U3RhcnQgKyB2aWV3RHVyYXRpb24sXG4gICAgICAgIGNvbnRhaW5lcldpZHRoXG4gICAgICApLFxuICAgIFtzdGFydE1zLCBlbmRNcywgdmlld1N0YXJ0LCB2aWV3RHVyYXRpb24sIGNvbnRhaW5lcldpZHRoXVxuICApO1xuXG4gIGNvbnN0IGJhc2VTZWdtZW50cyA9IHVzZU1lbW8oKCkgPT4gY29tcHV0ZVNwYW5TZWdtZW50cyhzcGFuKSwgW3NwYW5dKTtcbiAgY29uc3Qgc2VnbWVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICdmdWxsJ1xuICAgICAgICA/IHByb2plY3RTZWdtZW50cyhiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25NcywgZ2VvbWV0cnkpXG4gICAgICAgIDogW10sXG4gICAgW2dlb21ldHJ5LCBiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25Nc11cbiAgKTtcblxuICBjb25zdCBiYXNlTWFya2VycyA9IHVzZU1lbW8oKCkgPT4gY29tcHV0ZVNwYW5NYXJrZXJzKHNwYW4pLCBbc3Bhbl0pO1xuICBjb25zdCBtYXJrZXJzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ2VvbWV0cnkubW9kZS5raW5kID09PSAnZnVsbCdcbiAgICAgICAgPyBjdWxsQ29sbGlkaW5nTWFya2VycyhcbiAgICAgICAgICAgIHByb2plY3RNYXJrZXJzKFxuICAgICAgICAgICAgICBiYXNlTWFya2VycyxcbiAgICAgICAgICAgICAgZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMsXG4gICAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVFbmRNc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVQaXhlbFdpZHRoXG4gICAgICAgICAgKVxuICAgICAgICA6IFtdLFxuICAgIFtnZW9tZXRyeSwgYmFzZU1hcmtlcnNdXG4gICk7XG5cbiAgLy8gTWFya2VycyB0aGF0IGZhbGwgb3V0c2lkZSB0aGUgdmlzaWJsZSB3aW5kb3cgKHNjcm9sbGVkIG9mZiB3aGlsZSB6b29tZWQgaW4pXG4gIC8vIOKAlCBzdXJmYWNlZCBhcyBlZGdlIGluZGljYXRvcnMgc28gdGhleSBhcmVuJ3Qgc2lsZW50bHkgbG9zdC5cbiAgY29uc3Qgb2Zmc2NyZWVuID0gdXNlTWVtbzxPZmZzY3JlZW5NYXJrZXJzPihcbiAgICAoKSA9PlxuICAgICAgZ2VvbWV0cnkubW9kZS5raW5kID09PSAnZnVsbCdcbiAgICAgICAgPyBjb21wdXRlT2Zmc2NyZWVuTWFya2VycyhcbiAgICAgICAgICAgIGJhc2VNYXJrZXJzLFxuICAgICAgICAgICAgZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMsXG4gICAgICAgICAgICBnZW9tZXRyeS52aXNpYmxlRW5kTXNcbiAgICAgICAgICApXG4gICAgICAgIDogeyBsZWZ0OiBudWxsLCByaWdodDogbnVsbCB9LFxuICAgIFtnZW9tZXRyeSwgYmFzZU1hcmtlcnNdXG4gICk7XG5cbiAgLy8gTWFya2VycyAodmlzaWJsZSBvciBvZmYtc2NyZWVuKSBtb3ZlIHRoZSBkdXJhdGlvbiBsYWJlbCBpbnRvIHRoZSBvdmVybGF5LFxuICAvLyBzbyB0aGUgaW4tYmFyIHNlZ21lbnQgbGFiZWwgaXMgc3VwcHJlc3NlZC5cbiAgY29uc3QgaGFzTWFya2VycyA9XG4gICAgbWFya2Vycy5sZW5ndGggPiAwIHx8IG9mZnNjcmVlbi5sZWZ0ICE9PSBudWxsIHx8IG9mZnNjcmVlbi5yaWdodCAhPT0gbnVsbDtcblxuICBjb25zdCBpc0Vycm9yZWQgPSBpc1NwYW5FcnJvcmVkKHNwYW4pO1xuICBjb25zdCBjb2xvcnMgPSBnZXRSZXNvdXJjZUNvbG9yKHNwYW4ucmVzb3VyY2UpO1xuICBjb25zdCBmYWxsYmFja0JnID0gaXNFcnJvcmVkXG4gICAgPyAoY29sb3JzLmVycm9yQmcgPz8gJ3ZhcigtLWRzLXJlZC0yMDApJylcbiAgICA6IGNvbG9ycy5iZztcbiAgY29uc3QgZmFsbGJhY2tCb3JkZXIgPSBpc0Vycm9yZWRcbiAgICA/IChjb2xvcnMuZXJyb3JCb3JkZXIgPz8gJ3ZhcigtLWRzLXJlZC01MDApJylcbiAgICA6IGNvbG9ycy5ib3JkZXI7XG5cbiAgY29uc3QgdG90YWxMYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZSh0b3RhbER1cmF0aW9uTXMpO1xuICBjb25zdCBzaG93VG90YWxMYWJlbCA9XG4gICAgZ2VvbWV0cnkudmlzaWJsZVBpeGVsV2lkdGggPj1cbiAgICBNYXRoLm1heCg0MCwgZXN0aW1hdGVMYWJlbFdpZHRoUHgodG90YWxMYWJlbCkpO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIG9uU2VsZWN0KHNwYW4uc3BhbklkKTtcbiAgfSwgW29uU2VsZWN0LCBzcGFuLnNwYW5JZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICBhcmlhLWV4cGFuZGVkPXtpc1NlbGVjdGVkfVxuICAgICAgYXJpYS1sZXZlbD17MX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncm91cC90aW1lbGluZS1yb3cgaC0xMCByZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBob3ZlcjpiZy1ncmF5LTEwMCBhcmlhLXNlbGVjdGVkOmJnLWdyYXktMTAwIGFyaWEtc2VsZWN0ZWQ6aG92ZXI6YmctZ3JheS0yMDAgdHJhbnNpdGlvbi1vcGFjaXR5JyxcbiAgICAgICAgaXNEaW1tZWQgJiYgJ29wYWNpdHktMzUnXG4gICAgICApfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTBcIiBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTYgLXRyYW5zbGF0ZS15LTEvMiBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1bMC4yNXJlbV1cIlxuICAgICAgICAgIHN0eWxlPXtnZXRCYXJQb3NpdGlvblN0eWxlKGdlb21ldHJ5KX1cbiAgICAgICAgPlxuICAgICAgICAgIHtnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICdhcnJvdycgPyAoXG4gICAgICAgICAgICA8Qm91bmRhcnlBcnJvdyBkaXJlY3Rpb249e2dlb21ldHJ5Lm1vZGUuZGlyZWN0aW9ufSAvPlxuICAgICAgICAgICkgOiBnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICd0aW55JyA/IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC02IHJvdW5kZWQtWzAuMjVyZW1dIGJvcmRlclwiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGZhbGxiYWNrQmcsIGJvcmRlckNvbG9yOiBmYWxsYmFja0JvcmRlciB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogc2VnbWVudHMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgIDxTZWdtZW50QmFyIHNlZ21lbnRzPXtzZWdtZW50c30gc2hvd0xhYmVscz17IWhhc01hcmtlcnN9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxQbGFpbkJhclxuICAgICAgICAgICAgICBiZz17ZmFsbGJhY2tCZ31cbiAgICAgICAgICAgICAgYm9yZGVyPXtmYWxsYmFja0JvcmRlcn1cbiAgICAgICAgICAgICAgbGFiZWw9e3Nob3dUb3RhbExhYmVsID8gdG90YWxMYWJlbCA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7LyogT3ZlcmxheSAobm90IGNsaXBwZWQpOiB0aWNrcywgb2ZmLXNjcmVlbiBpbmRpY2F0b3JzLCB0aGVuIHRoZSBkdXJhdGlvbiBsYWJlbCBvbiB0b3AuICovfVxuICAgICAgICB7aGFzTWFya2VycyA/IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHRvcC0xLzIgaC02IC10cmFuc2xhdGUteS0xLzJcIlxuICAgICAgICAgICAgc3R5bGU9e2dldEJhclBvc2l0aW9uU3R5bGUoZ2VvbWV0cnkpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHttYXJrZXJzLmxlbmd0aCA+IDAgPyA8TWFya2VyTGF5ZXIgbWFya2Vycz17bWFya2Vyc30gLz4gOiBudWxsfVxuICAgICAgICAgICAge29mZnNjcmVlbi5sZWZ0ID8gKFxuICAgICAgICAgICAgICA8T2Zmc2NyZWVuTWFya2VySW5kaWNhdG9yXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uPVwibGVmdFwiXG4gICAgICAgICAgICAgICAgY291bnQ9e29mZnNjcmVlbi5sZWZ0LmNvdW50fVxuICAgICAgICAgICAgICAgIHRhcmdldE1zPXtvZmZzY3JlZW4ubGVmdC5uZWFyZXN0TXN9XG4gICAgICAgICAgICAgICAgb25SZXZlYWw9e29uUmV2ZWFsVGltZX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAge29mZnNjcmVlbi5yaWdodCA/IChcbiAgICAgICAgICAgICAgPE9mZnNjcmVlbk1hcmtlckluZGljYXRvclxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICBjb3VudD17b2Zmc2NyZWVuLnJpZ2h0LmNvdW50fVxuICAgICAgICAgICAgICAgIHRhcmdldE1zPXtvZmZzY3JlZW4ucmlnaHQubmVhcmVzdE1zfVxuICAgICAgICAgICAgICAgIG9uUmV2ZWFsPXtvblJldmVhbFRpbWV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHtzaG93VG90YWxMYWJlbCA/IChcbiAgICAgICAgICAgICAgPER1cmF0aW9uTGFiZWxcbiAgICAgICAgICAgICAgICBsYWJlbD17dG90YWxMYWJlbH1cbiAgICAgICAgICAgICAgICAvLyBTaGlmdCBjbGVhciBvZiB0aGUgbGVmdCBlZGdlIGluZGljYXRvciBzbyBpdCBpc24ndCBjb3ZlcmVkLlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17b2Zmc2NyZWVuLmxlZnQgPyAncGwtMTAnIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59KTtcblxuZXhwb3J0IHsgVGltZWxpbmVCYXIgfTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZWx0YU1lYXN1cmVMaW5lIChBbHQta2V5IG1lYXN1cmVtZW50IG92ZXJsYXlzOiB0aGUgc2VsZWN0ZWQg4oaUIGhvdmVyZWRcbi8vIG1lYXN1cmVtZW50LCBhbmQgdGhlIGFtYmllbnQgY29uc2VjdXRpdmUtZ2FwIGluZGljYXRvcnMgc2hvd24gd2l0aG91dCBhXG4vLyBzZWxlY3Rpb24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSG9yaXpvbnRhbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhbmNob3IgYmFyJ3MgbWVhc3VyZWQgZWRnZSBhbmQgdGhlIHZlcnRpY2FsXG4vLyBndWlkZSDigJQgYWxzbyB0aGUgd2lkdGggb2YgdGhlIGNvbm5lY3RvciBzdHViIGJyaWRnaW5nIHRoZSB0d28uXG5jb25zdCBNRUFTVVJFX0dVSURFX09VVFNFVF9QWCA9IDQ7XG5cbmNvbnN0IERlbHRhTWVhc3VyZUxpbmUgPSBtZW1vKGZ1bmN0aW9uIERlbHRhTWVhc3VyZUxpbmUoe1xuICBkZWx0YSxcbiAgYW5jaG9yUm93SW5kZXgsXG4gIGhvdmVyZWRSb3dJbmRleCxcbiAgdGltZWxpbmVXaWR0aCxcbn06IHtcbiAgZGVsdGE6IFNwYW5EZWx0YTtcbiAgYW5jaG9yUm93SW5kZXg6IG51bWJlcjtcbiAgaG92ZXJlZFJvd0luZGV4OiBudW1iZXI7XG4gIHRpbWVsaW5lV2lkdGg6IG51bWJlcjtcbn0pIHtcbiAgLy8gQm90aCBlbmRzIG9mIHRoZSBtZWFzdXJlbWVudCBhbGlnbiB3aXRoIHRoZSB2ZXJ0aWNhbCBtaWRkbGUgb2YgdGhlIGJhcnNcbiAgLy8gKGJhcnMgYXJlIGNlbnRlcmVkIGluIHRoZWlyIHJvd3MsIHNvIGJhciBjZW50ZXIgPT0gcm93IGNlbnRlcikuXG4gIGNvbnN0IGFuY2hvckNlbnRlclkgPSBhbmNob3JSb3dJbmRleCAqIFJPV19IRUlHSFRfUFggKyBST1dfSEVJR0hUX1BYIC8gMjtcbiAgY29uc3QgbGluZVkgPSBob3ZlcmVkUm93SW5kZXggKiBST1dfSEVJR0hUX1BYICsgUk9XX0hFSUdIVF9QWCAvIDI7XG5cbiAgLy8gR3VpZGUgY29ubmVjdGluZyB0aGUgbWlkZGxlIG9mIHRoZSBhbmNob3IgYmFyIGRvd24vdXAgdG8gdGhlIGxpbmUsIHNvXG4gIC8vIHRoZSBtZWFzdXJlbWVudCdzIG9yaWdpbiBzdGF5cyBsZWdpYmxlIHdoZW4gdGhlIHJvd3MgYXJlIGZhciBhcGFydC5cbiAgLy8gSXQgc2l0cyBqdXN0IG91dHNpZGUgdGhlIGFuY2hvciBiYXIncyBtZWFzdXJlZCBlZGdlIChzbyBpdCBkb2Vzbid0IGJsZW5kXG4gIC8vIGludG8gdGhlIGJhcidzIGJvcmRlciksIGpvaW5lZCB0byB0aGUgYmFyIGJ5IGEgc2hvcnQgaG9yaXpvbnRhbCBzdHViLiBUaGVcbiAgLy8gbGluZSBydW5zIGZyb20gdGhlIGVsYm93IGNvcm5lciAodGhlIGd1aWRlJ3MgeCkgdG8gdGhlIGhvdmVyZWQgc3BhbidzXG4gIC8vIG1lYXN1cmVkIGVkZ2Ug4oCUIHB1bGxlZCBzaG9ydCBvZiB0aGUgZWRnZSBhcnJvdyB3aGVuIHRoZSBob3ZlcmVkIHNwYW4gaXNcbiAgLy8gZnVsbHkgb2ZmLXNjcmVlbi5cbiAgY29uc3QgZ3VpZGVUb3AgPSBNYXRoLm1pbihhbmNob3JDZW50ZXJZLCBsaW5lWSk7XG4gIGNvbnN0IGd1aWRlQm90dG9tID0gTWF0aC5tYXgoYW5jaG9yQ2VudGVyWSwgbGluZVkpO1xuICBjb25zdCBhbmNob3JYID0gZGVsdGEuYW5jaG9yRnJhYyAqIHRpbWVsaW5lV2lkdGg7XG4gIGNvbnN0IGd1aWRlWCA9XG4gICAgYW5jaG9yWCArXG4gICAgKGRlbHRhLmFuY2hvckVkZ2UgPT09ICdlbmQnXG4gICAgICA/IE1FQVNVUkVfR1VJREVfT1VUU0VUX1BYXG4gICAgICA6IC1NRUFTVVJFX0dVSURFX09VVFNFVF9QWCk7XG4gIGNvbnN0IGFycm93Q2xlYXJhbmNlID1cbiAgICBkZWx0YS5ob3ZlcmVkT2Zmc2NyZWVuID09PSAncmlnaHQnXG4gICAgICA/IC0oVElOWV9CQVJfQk9YX1NJWkVfUFggKyA0KVxuICAgICAgOiBkZWx0YS5ob3ZlcmVkT2Zmc2NyZWVuID09PSAnbGVmdCdcbiAgICAgICAgPyBUSU5ZX0JBUl9CT1hfU0laRV9QWCArIDRcbiAgICAgICAgOiAwO1xuICBjb25zdCBob3ZlcmVkWCA9IGRlbHRhLmhvdmVyZWRGcmFjICogdGltZWxpbmVXaWR0aCArIGFycm93Q2xlYXJhbmNlO1xuICBjb25zdCBzdGFydFggPSBNYXRoLm1pbihndWlkZVgsIGhvdmVyZWRYKTtcbiAgY29uc3QgZW5kWCA9IE1hdGgubWF4KGd1aWRlWCwgaG92ZXJlZFgpO1xuXG4gIGNvbnN0IGxhYmVsID0gZm9ybWF0RHVyYXRpb25QcmVjaXNlKGRlbHRhLmRlbHRhTXMpO1xuICBjb25zdCBsYWJlbFdpZHRoUHggPSBlc3RpbWF0ZUxhYmVsV2lkdGhQeChsYWJlbCk7XG4gIC8vIENlbnRlciB0aGUgbGFiZWwgb24gdGhlIGxpbmU7IHdoZW4gdGhlIGxpbmUgaXMgdG9vIHNob3J0LCBwbGFjZSBpdCBiZXNpZGVcbiAgLy8gdGhlIHJpZ2h0IGVuZHBvaW50LCBmbGlwcGluZyBsZWZ0IG5lYXIgdGhlIHZpZXdwb3J0J3MgcmlnaHQgZWRnZS5cbiAgY29uc3QgbGFiZWxQbGFjZW1lbnQgPVxuICAgIGVuZFggLSBzdGFydFggPj0gbGFiZWxXaWR0aFB4XG4gICAgICA/IHsgbGVmdDogKHN0YXJ0WCArIGVuZFgpIC8gMiwgdHJhbnNsYXRlOiAnLXRyYW5zbGF0ZS14LTEvMicgfVxuICAgICAgOiBlbmRYICsgNCArIGxhYmVsV2lkdGhQeCA8PSB0aW1lbGluZVdpZHRoXG4gICAgICAgID8geyBsZWZ0OiBlbmRYICsgNCwgdHJhbnNsYXRlOiAnJyB9XG4gICAgICAgIDogeyBsZWZ0OiBzdGFydFggLSA0LCB0cmFuc2xhdGU6ICctdHJhbnNsYXRlLXgtZnVsbCcgfTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGgtcHggYmctYW1iZXItODAwXCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBsZWZ0OiBNYXRoLm1pbihhbmNob3JYLCBndWlkZVgpLFxuICAgICAgICAgIHdpZHRoOiBNRUFTVVJFX0dVSURFX09VVFNFVF9QWCxcbiAgICAgICAgICB0b3A6IGFuY2hvckNlbnRlclksXG4gICAgICAgIH19XG4gICAgICAvPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB3LXB4IGJnLWFtYmVyLTgwMFwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgbGVmdDogZ3VpZGVYLFxuICAgICAgICAgIHRvcDogZ3VpZGVUb3AsXG4gICAgICAgICAgaGVpZ2h0OiBndWlkZUJvdHRvbSAtIGd1aWRlVG9wLFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaC1weCBiZy1hbWJlci04MDBcIlxuICAgICAgICBzdHlsZT17eyBsZWZ0OiBzdGFydFgsIHdpZHRoOiBNYXRoLm1heChlbmRYIC0gc3RhcnRYLCAxKSwgdG9wOiBsaW5lWSB9fVxuICAgICAgLz5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2Fic29sdXRlIC10cmFuc2xhdGUteS0xLzIgZm9udC1tb25vIHRleHQtWzEwcHhdIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB0YWJ1bGFyLW51bXMgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC14cyBiZy1iYWNrZ3JvdW5kLTEwMCBweC0xIHB5LTAuNSB0ZXh0LWFtYmVyLTgwMCcsXG4gICAgICAgICAgbGFiZWxQbGFjZW1lbnQudHJhbnNsYXRlXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7IGxlZnQ6IGxhYmVsUGxhY2VtZW50LmxlZnQsIHRvcDogbGluZVkgfX1cbiAgICAgID5cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9zcGFuPlxuICAgIDwvPlxuICApO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVIZWFkZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZWxpbmVIZWFkZXIoe1xuICBtYXJrZXJzLFxuICBob3ZlckluZm8sXG59OiB7XG4gIG1hcmtlcnM6IFRpbWVNYXJrZXJbXTtcbiAgaG92ZXJJbmZvPzogeyBmcmFjdGlvbjogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgaC0xMCBtaW4taC0xMCBmbGV4IGl0ZW1zLWVuZCBweC00IHBiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIGZsZXgtMVwiPlxuICAgICAgICB7bWFya2Vycy5tYXAoKG0pID0+IChcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PXtTdHJpbmcobS52YWx1ZSl9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMSBmb250LW1vbm8gdGV4dC14cyBmb250LW5vcm1hbCBsZWFkaW5nLTQgdGV4dC1ncmF5LTkwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHttLnBvc2l0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge20ubGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApKX1cbiAgICAgICAge2hvdmVySW5mbyAmJiAoXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xIHBvaW50ZXItZXZlbnRzLW5vbmUgei0xMCBmb250LW1vbm8gdGV4dC1bMTFweF0gbGVhZGluZy00IHRleHQtZ3JheS0xMDAwIHdoaXRlc3BhY2Utbm93cmFwIGJnLWJhY2tncm91bmQtMTAwIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgcm91bmRlZCBweC0xIC10cmFuc2xhdGUteC0xLzJcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7aG92ZXJJbmZvLmZyYWN0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2hvdmVySW5mby5sYWJlbH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZWxpbmVIb3ZlciB7XG4gIC8qKiBQb2ludGVyIHggYXMgYSBmcmFjdGlvbiBvZiB0aGUgdGltZWxpbmUncyBjb250ZW50IHdpZHRoLCBpbiBbMCwgMV0uICovXG4gIGZyYWN0aW9uOiBudW1iZXI7XG4gIC8qKiBSb3cgaW5kZXggdW5kZXIgdGhlIHBvaW50ZXI7IG1heSBiZSBwYXN0IHRoZSBsYXN0IHJvdyDigJQgbm90IHZhbGlkYXRlZC4gKi9cbiAgcm93SW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVsaW5lKHtcbiAgc3BhbnMsXG4gIHZpZXdTdGFydCxcbiAgdmlld0VuZCxcbiAgbWFya2VycyxcbiAgc2VsZWN0ZWRJZCxcbiAgc2VhcmNoUmVzdWx0LFxuICBvblNlbGVjdCxcbiAgb25SZXZlYWxUaW1lLFxuICBob3ZlcixcbiAgYWx0SGVsZCA9IGZhbHNlLFxufToge1xuICBzcGFuczogU3BhbltdO1xuICB2aWV3U3RhcnQ6IG51bWJlcjtcbiAgdmlld0VuZDogbnVtYmVyO1xuICBtYXJrZXJzOiBUaW1lTWFya2VyW107XG4gIHNlbGVjdGVkSWQ6IHN0cmluZyB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU3BhblNlYXJjaFJlc3VsdDtcbiAgb25TZWxlY3Q6IChzcGFuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25SZXZlYWxUaW1lPzogKHRpbWVNczogbnVtYmVyKSA9PiB2b2lkO1xuICBob3Zlcj86IFRpbWVsaW5lSG92ZXIgfCBudWxsO1xuICBhbHRIZWxkPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBbY29udGFpbmVyV2lkdGgsIHNldENvbnRhaW5lcldpZHRoXSA9IHVzZVN0YXRlKDApO1xuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBjb25zdCB0aW1lbGluZVdpZHRoID0gTWF0aC5tYXgoMCwgY29udGFpbmVyV2lkdGggLSBUSU1FTElORV9QQURESU5HX1BYICogMik7XG4gIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdXNlUm93V2luZG93KFxuICAgIGNvbnRhaW5lclJlZixcbiAgICBzcGFucy5sZW5ndGgsXG4gICAgUk9XX0hFSUdIVF9QWFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHtcbiAgICAgIHNldENvbnRhaW5lcldpZHRoKGVudHJ5LmNvbnRlbnRSZWN0LndpZHRoKTtcbiAgICB9KTtcbiAgICByby5vYnNlcnZlKGVsKTtcbiAgICByZXR1cm4gKCkgPT4gcm8uZGlzY29ubmVjdCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gRWFjaCBjb25zZWN1dGl2ZSBnYXAgcmVuZGVycyBhcyBhIG1lYXN1cmVtZW50IGZyb20gdGhlIGVhcmxpZXIgc3BhbidzIGVuZFxuICAvLyBlZGdlIHRvIHRoZSBuZXh0IHNwYW4ncyBzdGFydCwgaW4gdGhlIHNhbWUgdmlzdWFsIGxhbmd1YWdlIGFzIHRoZVxuICAvLyBzZWxlY3RlZCDihpQgaG92ZXJlZCBtZWFzdXJlbWVudC5cbiAgY29uc3QgZ2FwTWVhc3VyZW1lbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgY29tcHV0ZVNwYW5HYXBzKHNwYW5zLCB2aWV3U3RhcnQsIHZpZXdFbmQpLm1hcCgoZ2FwKSA9PiAoe1xuICAgICAgICBkZWx0YToge1xuICAgICAgICAgIGRlbHRhTXM6IGdhcC5nYXBNcyxcbiAgICAgICAgICBhbmNob3JGcmFjOiBnYXAubGVmdEZyYWMsXG4gICAgICAgICAgaG92ZXJlZEZyYWM6IGdhcC5yaWdodEZyYWMsXG4gICAgICAgICAgYW5jaG9yRWRnZTogJ2VuZCcsXG4gICAgICAgICAgaG92ZXJlZE9mZnNjcmVlbjogbnVsbCxcbiAgICAgICAgfSBzYXRpc2ZpZXMgU3BhbkRlbHRhLFxuICAgICAgICBhbmNob3JSb3dJbmRleDogZ2FwLnJvd0luZGV4LFxuICAgICAgICBob3ZlcmVkUm93SW5kZXg6IGdhcC5yb3dJbmRleCArIDEsXG4gICAgICB9KSksXG4gICAgW3NwYW5zLCB2aWV3U3RhcnQsIHZpZXdFbmRdXG4gICk7XG5cbiAgLy8gV2l0aCBhIHNwYW4gc2VsZWN0ZWQsIEFsdCtob3ZlciBtZWFzdXJlcyBzZWxlY3RlZCDihpQgaG92ZXJlZCBpbnN0ZWFkIG9mXG4gIC8vIHNob3dpbmcgdGhlIGFsbC1zaWJsaW5nLWdhcHMgb3ZlcmxheS5cbiAgY29uc3QgYW5jaG9ySW5kZXggPSB1c2VNZW1vKFxuICAgICgpID0+IChzZWxlY3RlZElkID8gc3BhbnMuZmluZEluZGV4KChzKSA9PiBzLnNwYW5JZCA9PT0gc2VsZWN0ZWRJZCkgOiAtMSksXG4gICAgW3NwYW5zLCBzZWxlY3RlZElkXVxuICApO1xuXG4gIGNvbnN0IG1lYXN1cmVtZW50ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFhbHRIZWxkIHx8IGhvdmVyID09IG51bGwgfHwgaG92ZXIucm93SW5kZXggPT09IGFuY2hvckluZGV4KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgYW5jaG9yU3BhbiA9IHNwYW5zW2FuY2hvckluZGV4XTtcbiAgICBjb25zdCBob3ZlcmVkU3BhbiA9IHNwYW5zW2hvdmVyLnJvd0luZGV4XTtcbiAgICBpZiAoIWFuY2hvclNwYW4gfHwgIWhvdmVyZWRTcGFuKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBkZWx0YSA9IGNvbXB1dGVTcGFuRGVsdGEoYW5jaG9yU3BhbiwgaG92ZXJlZFNwYW4sIHZpZXdTdGFydCwgdmlld0VuZCk7XG4gICAgcmV0dXJuIGRlbHRhXG4gICAgICA/IHsgZGVsdGEsIGFuY2hvclJvd0luZGV4OiBhbmNob3JJbmRleCwgaG92ZXJlZFJvd0luZGV4OiBob3Zlci5yb3dJbmRleCB9XG4gICAgICA6IG51bGw7XG4gIH0sIFthbHRIZWxkLCBhbmNob3JJbmRleCwgaG92ZXIsIHNwYW5zLCB2aWV3U3RhcnQsIHZpZXdFbmRdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIG92ZXJmbG93LWhpZGRlblwiXG4gICAgICBzdHlsZT17eyBtaW5IZWlnaHQ6IHNwYW5zLmxlbmd0aCAqIFJPV19IRUlHSFRfUFggfX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgPlxuICAgICAgICB7bWFya2Vycy5tYXAoKG1hcmtlcikgPT5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBcIjBzXCIgb3JpZ2luIG1hcmtlciBzaW5jZSB0aGUgbGVmdCBlZGdlIGFscmVhZHkgaW1wbGllcyBpdC5cbiAgICAgICAgICBNYXRoLmFicyhtYXJrZXIudmFsdWUpID4gMC4wMDAwMDEgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17U3RyaW5nKG1hcmtlci52YWx1ZSl9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0wIGJvdHRvbS0wIHctcHggYmctZ3JheS1hbHBoYS0zMDBcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHttYXJrZXIucG9zaXRpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2hvdmVyICE9IG51bGwgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIHBvaW50ZXItZXZlbnRzLW5vbmUgei0xMFwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgdy1weCBiZy1ncmF5LWFscGhhLTUwMFwiXG4gICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHtob3Zlci5mcmFjdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxkaXYgc3R5bGU9e3sgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWSgke3N0YXJ0ICogUk9XX0hFSUdIVF9QWH1weClgIH19PlxuICAgICAgICB7c3BhbnMuc2xpY2Uoc3RhcnQsIGVuZCkubWFwKChzcGFuKSA9PiAoXG4gICAgICAgICAgPFRpbWVsaW5lQmFyXG4gICAgICAgICAgICBrZXk9e3NwYW4uc3BhbklkfVxuICAgICAgICAgICAgc3Bhbj17c3Bhbn1cbiAgICAgICAgICAgIHZpZXdTdGFydD17dmlld1N0YXJ0fVxuICAgICAgICAgICAgdmlld0R1cmF0aW9uPXt2aWV3RHVyYXRpb259XG4gICAgICAgICAgICBjb250YWluZXJXaWR0aD17dGltZWxpbmVXaWR0aH1cbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e3NlbGVjdGVkSWQgPT09IHNwYW4uc3BhbklkfVxuICAgICAgICAgICAgaXNEaW1tZWQ9e2lzU3BhbkRpbW1lZEJ5U2VhcmNoKHNwYW4uc3BhbklkLCBzZWFyY2hSZXN1bHQpfVxuICAgICAgICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fVxuICAgICAgICAgICAgb25SZXZlYWxUaW1lPXtvblJldmVhbFRpbWV9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHthbHRIZWxkICYmIGFuY2hvckluZGV4IDwgMCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICAgID5cbiAgICAgICAgICB7Z2FwTWVhc3VyZW1lbnRzLm1hcCgoZ2FwKSA9PiAoXG4gICAgICAgICAgICA8RGVsdGFNZWFzdXJlTGluZVxuICAgICAgICAgICAgICBrZXk9e2dhcC5hbmNob3JSb3dJbmRleH1cbiAgICAgICAgICAgICAgey4uLmdhcH1cbiAgICAgICAgICAgICAgdGltZWxpbmVXaWR0aD17dGltZWxpbmVXaWR0aH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIHttZWFzdXJlbWVudCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lIHotMjBcIlxuICAgICAgICAgIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX1cbiAgICAgICAgPlxuICAgICAgICAgIDxEZWx0YU1lYXN1cmVMaW5lIHsuLi5tZWFzdXJlbWVudH0gdGltZWxpbmVXaWR0aD17dGltZWxpbmVXaWR0aH0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace-shortcut-helper.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/trace-shortcut-helper.tsx"],"names":[],"mappings":"AAwDA,wBAAgB,mBAAmB,CAAC,EAClC,gBAAgB,EAChB,aAAa,GACd,EAAE;IACD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB,kDAqDA"}
@@ -1,55 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { X } from 'lucide-react';
4
- import { useEffect, useState } from 'react';
5
- import { Kbd } from '../../ui/kbd';
6
- import styles from './trace-shortcut-helper.module.css';
7
- const DISMISSALS_KEY = 'workflow-step-shortcut-helper-dismissals';
8
- const DISMISSAL_LIMIT = 3;
9
- const HINT_ROTATION_MS = 8000;
10
- function getAltKeyLabel() {
11
- if (typeof navigator === 'undefined')
12
- return 'Alt';
13
- return navigator.platform.toLowerCase().includes('mac') ? 'Option' : 'Alt';
14
- }
15
- function readDismissals() {
16
- try {
17
- const dismissals = Number.parseInt(window.localStorage.getItem(DISMISSALS_KEY) ?? '0', 10);
18
- return Number.isNaN(dismissals) ? 0 : dismissals;
19
- }
20
- catch {
21
- return 0;
22
- }
23
- }
24
- function AltHint() {
25
- return (_jsxs(_Fragment, { children: ["Hold", _jsx(Kbd, { variant: "outline", size: "compact", className: "mx-1", children: getAltKeyLabel() }), "to see delta between spans"] }));
26
- }
27
- function NavHint() {
28
- return (_jsxs(_Fragment, { children: ["Use", _jsx(Kbd, { variant: "outline", size: "compact", className: "ml-1", children: "J" }), _jsx("span", { className: "mx-1", children: "/" }), _jsx(Kbd, { variant: "outline", size: "compact", className: "mr-1", children: "K" }), "to move between spans"] }));
29
- }
30
- export function TraceShortcutHelper({ hasMultipleSpans, reducedMotion, }) {
31
- const [visible, setVisible] = useState(false);
32
- const [index, setIndex] = useState(0);
33
- useEffect(() => {
34
- setVisible(readDismissals() < DISMISSAL_LIMIT);
35
- }, []);
36
- useEffect(() => {
37
- if (reducedMotion)
38
- return;
39
- const id = setInterval(() => {
40
- setIndex((i) => (i === 0 ? 1 : 0));
41
- }, HINT_ROTATION_MS);
42
- return () => clearInterval(id);
43
- }, [reducedMotion]);
44
- if (!visible || !hasMultipleSpans)
45
- return null;
46
- const dismiss = () => {
47
- try {
48
- window.localStorage.setItem(DISMISSALS_KEY, String(readDismissals() + 1));
49
- }
50
- catch { }
51
- setVisible(false);
52
- };
53
- return (_jsxs("div", { className: "group pointer-events-auto hidden h-8 w-fit items-center gap-1 text-xs leading-none text-gray-900 @min-[480px]:flex", children: [_jsx("span", { "aria-live": "polite", "aria-atomic": "true", className: "inline-flex items-center whitespace-nowrap", children: reducedMotion ? (_jsx(AltHint, {})) : (_jsx("span", { className: `inline-flex items-center ${styles.hint}`, children: index === 0 ? _jsx(AltHint, {}) : _jsx(NavHint, {}) }, index)) }), _jsx("button", { type: "button", className: "inline-flex h-5 w-5 items-center justify-center rounded text-muted-foreground opacity-0 transition-opacity hover:bg-accent hover:text-foreground group-hover:opacity-100 focus-visible:opacity-100 motion-reduce:transition-none", onClick: dismiss, "aria-label": "Dismiss trace shortcuts helper", children: _jsx(X, { className: "h-3 w-3" }) })] }));
54
- }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc2hvcnRjdXQtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL3RyYWNlLXNob3J0Y3V0LWhlbHBlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLE1BQU0sTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RCxNQUFNLGNBQWMsR0FBRywwQ0FBMEMsQ0FBQztBQUNsRSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFOUIsU0FBUyxjQUFjO0lBQ3JCLElBQUksT0FBTyxTQUFTLEtBQUssV0FBVztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ25ELE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzdFLENBQUM7QUFFRCxTQUFTLGNBQWM7SUFDckIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FDaEMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxFQUNsRCxFQUFFLENBQ0gsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDbkQsQ0FBQztJQUFDLE1BQU0sQ0FB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Q0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgWCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgS2JkIH0gZnJvbSAnLi4vLi4vdWkva2JkJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi90cmFjZS1zaG9ydGN1dC1oZWxwZXIubW9kdWxlLmNzcyc7XG5cbmNvbnN0IERJU01JU1NBTFNfS0VZID0gJ3dvcmtmbG93LXN0ZXAtc2hvcnRjdXQtaGVscGVyLWRpc21pc3NhbHMnO1xuY29uc3QgRElTTUlTU0FMX0xJTUlUID0gMztcbmNvbnN0IEhJTlRfUk9UQVRJT05fTVMgPSA4MDAwO1xuXG5mdW5jdGlvbiBnZXRBbHRLZXlMYWJlbCgpOiAnQWx0JyB8ICdPcHRpb24nIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ0FsdCc7XG4gIHJldHVybiBuYXZpZ2F0b3IucGxhdGZvcm0udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnbWFjJykgPyAnT3B0aW9uJyA6ICdBbHQnO1xufVxuXG5mdW5jdGlvbiByZWFkRGlzbWlzc2FscygpOiBudW1iZXIge1xuICB0cnkge1xuICAgIGNvbnN0IGRpc21pc3NhbHMgPSBOdW1iZXIucGFyc2VJbnQoXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oRElTTUlTU0FMU19LRVkpID8/ICcwJyxcbiAgICAgIDEwXG4gICAgKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRpc21pc3NhbHMpID8gMCA6IGRpc21pc3NhbHM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIEFsdEhpbnQoKSB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIEhvbGRcbiAgICAgIDxLYmQgdmFyaWFudD1cIm91dGxpbmVcIiBzaXplPVwiY29tcGFjdFwiIGNsYXNzTmFtZT1cIm14LTFcIj5cbiAgICAgICAge2dldEFsdEtleUxhYmVsKCl9XG4gICAgICA8L0tiZD5cbiAgICAgIHRvIHNlZSBkZWx0YSBiZXR3ZWVuIHNwYW5zXG4gICAgPC8+XG4gICk7XG59XG5cbmZ1bmN0aW9uIE5hdkhpbnQoKSB7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIFVzZVxuICAgICAgPEtiZCB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9XCJjb21wYWN0XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICBKXG4gICAgICA8L0tiZD5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14LTFcIj4vPC9zcGFuPlxuICAgICAgPEtiZCB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9XCJjb21wYWN0XCIgY2xhc3NOYW1lPVwibXItMVwiPlxuICAgICAgICBLXG4gICAgICA8L0tiZD5cbiAgICAgIHRvIG1vdmUgYmV0d2VlbiBzcGFuc1xuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVHJhY2VTaG9ydGN1dEhlbHBlcih7XG4gIGhhc011bHRpcGxlU3BhbnMsXG4gIHJlZHVjZWRNb3Rpb24sXG59OiB7XG4gIGhhc011bHRpcGxlU3BhbnM6IGJvb2xlYW47XG4gIHJlZHVjZWRNb3Rpb246IGJvb2xlYW47XG59KSB7XG4gIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2luZGV4LCBzZXRJbmRleF0gPSB1c2VTdGF0ZSgwKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNldFZpc2libGUocmVhZERpc21pc3NhbHMoKSA8IERJU01JU1NBTF9MSU1JVCk7XG4gIH0sIFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChyZWR1Y2VkTW90aW9uKSByZXR1cm47XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBzZXRJbmRleCgoaSkgPT4gKGkgPT09IDAgPyAxIDogMCkpO1xuICAgIH0sIEhJTlRfUk9UQVRJT05fTVMpO1xuICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKGlkKTtcbiAgfSwgW3JlZHVjZWRNb3Rpb25dKTtcblxuICBpZiAoIXZpc2libGUgfHwgIWhhc011bHRpcGxlU3BhbnMpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGRpc21pc3MgPSAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShESVNNSVNTQUxTX0tFWSwgU3RyaW5nKHJlYWREaXNtaXNzYWxzKCkgKyAxKSk7XG4gICAgfSBjYXRjaCB7fVxuICAgIHNldFZpc2libGUoZmFsc2UpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJncm91cCBwb2ludGVyLWV2ZW50cy1hdXRvIGhpZGRlbiBoLTggdy1maXQgaXRlbXMtY2VudGVyIGdhcC0xIHRleHQteHMgbGVhZGluZy1ub25lIHRleHQtZ3JheS05MDAgQG1pbi1bNDgwcHhdOmZsZXhcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICA+XG4gICAgICAgIHtyZWR1Y2VkTW90aW9uID8gKFxuICAgICAgICAgIDxBbHRIaW50IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2BpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgJHtzdHlsZXMuaGludH1gfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtpbmRleCA9PT0gMCA/IDxBbHRIaW50IC8+IDogPE5hdkhpbnQgLz59XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9zcGFuPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaC01IHctNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZCB0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS0wIHRyYW5zaXRpb24tb3BhY2l0eSBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1mb3JlZ3JvdW5kIGdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIGZvY3VzLXZpc2libGU6b3BhY2l0eS0xMDAgbW90aW9uLXJlZHVjZTp0cmFuc2l0aW9uLW5vbmVcIlxuICAgICAgICBvbkNsaWNrPXtkaXNtaXNzfVxuICAgICAgICBhcmlhLWxhYmVsPVwiRGlzbWlzcyB0cmFjZSBzaG9ydGN1dHMgaGVscGVyXCJcbiAgICAgID5cbiAgICAgICAgPFggY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"trace-viewer-skeleton.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx"],"names":[],"mappings":"AA0BA,wBAAgB,mBAAmB,4CAuFlC"}