sparkforensics-server 0.5.2 → 0.6.0

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 (232) hide show
  1. package/package.json +1 -1
  2. package/public/assets/AutoscalingChurn-CRA2Mb7F.js +1 -0
  3. package/public/assets/CacheUtilization-Bh9OY_V9.js +1 -0
  4. package/public/assets/{CachingOpportunity-D1NcHs0V.js → CachingOpportunity-oCiQwmTJ.js} +1 -1
  5. package/public/assets/{ColdStart-CdRJ9gD8.js → ColdStart-BJrtjfmn.js} +1 -1
  6. package/public/assets/ConfigAudit-DMvKxySP.js +1 -0
  7. package/public/assets/{CoreUsageArea-a--NTRGY.js → CoreUsageArea-REC2zsKw.js} +1 -1
  8. package/public/assets/Dashboard-BHZ76JCu.js +2 -0
  9. package/public/assets/DisclosureContext-OO7X1HAx.js +1 -0
  10. package/public/assets/{DuplicatePlanSubtree-dobXdz7E.js → DuplicatePlanSubtree-BgG-L-cK.js} +1 -1
  11. package/public/assets/ExecutorUtilization-D2KhSVbY.js +1 -0
  12. package/public/assets/{GcPressure-8-G2ri10.js → GcPressure-D1BTE8qh.js} +1 -1
  13. package/public/assets/{IncompleteRun-B91lky7a.js → IncompleteRun-DD40xUpy.js} +1 -1
  14. package/public/assets/{JobFailures-BsWvBMyJ.js → JobFailures-YwNzCF19.js} +1 -1
  15. package/public/assets/MemoryUtilization-9b8ee_3_.js +1 -0
  16. package/public/assets/{OverBroadcast-DdN8JIJH.js → OverBroadcast-CfctS8a8.js} +1 -1
  17. package/public/assets/{PartitionSizing-CY5HDYtp.js → PartitionSizing-VG8kBgG5.js} +1 -1
  18. package/public/assets/{PlanExplorer-DgHCDBD_.js → PlanExplorer-DmubTAOP.js} +1 -1
  19. package/public/assets/PlanGraphRoute-DctPZjS0.js +1 -0
  20. package/public/assets/RetryWaste-CnpM8bB7.js +1 -0
  21. package/public/assets/{ShuffleIO-MMnDESkF.js → ShuffleIO-D13vGmas.js} +1 -1
  22. package/public/assets/Skew-DlagstYP.js +1 -0
  23. package/public/assets/SlowHost-cSkLRZ_e.js +1 -0
  24. package/public/assets/{SmallFiles-BoK3R1Ex.js → SmallFiles-B-kERMcq.js} +1 -1
  25. package/public/assets/{SpeculationWaste-CnVxB5AJ.js → SpeculationWaste-DaysAzXO.js} +1 -1
  26. package/public/assets/Spill-H44Gz4US.js +1 -0
  27. package/public/assets/{StageFailed-mAhHU4l_.js → StageFailed-DCfii9h_.js} +1 -1
  28. package/public/assets/{StageFindingGroup-BEtPWcT0.js → StageFindingGroup-BXJ0Mj5n.js} +1 -1
  29. package/public/assets/{StageHeader-DJkYkrsU.js → StageHeader--oN2J-oD.js} +1 -1
  30. package/public/assets/StageShape-IZ80CZiJ.js +1 -0
  31. package/public/assets/{StageSlowness-BPRw-otN.js → StageSlowness--BRIaBc1.js} +1 -1
  32. package/public/assets/Straggler-Ctq0Df_o.js +1 -0
  33. package/public/assets/TaskFailures-Bks_gqhL.js +1 -0
  34. package/public/assets/{TinyTask-Bi84qU7n.js → TinyTask-BssfzGFB.js} +1 -1
  35. package/public/assets/{UnderBroadcast-DdQV7htE.js → UnderBroadcast-DsScrxc-.js} +1 -1
  36. package/public/assets/{finding-anchor-Cl6_5hfV.js → finding-anchor-BYW1oz5R.js} +1 -1
  37. package/public/assets/{impact-sort-CssZ6MT2.js → impact-sort-xzy0g-Vh.js} +1 -1
  38. package/public/assets/index-DhpRGMZc.css +2 -0
  39. package/public/assets/index-DwqkFUFk.js +14 -0
  40. package/public/assets/instrument-sans-latin-ext-wdth-normal-C5E2Gvlv.woff2 +0 -0
  41. package/public/assets/instrument-sans-latin-wdth-normal-BVScPF0l.woff2 +0 -0
  42. package/public/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  43. package/public/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  44. package/public/assets/react-vendor-DfpuPQZf.js +9 -0
  45. package/public/assets/{select-CQjNhprm.js → select-C8edjYTq.js} +1 -1
  46. package/public/assets/{usePagedRows-Dyl6T8Ok.js → usePagedRows-CsuUFeYx.js} +1 -1
  47. package/public/assets/useRecentFiles-BvkKo3JN.js +11 -0
  48. package/public/assets/{useSortMode-Dhvit8dt.js → useSortMode-joX71BZN.js} +1 -1
  49. package/public/docs/404.html +3 -7
  50. package/public/docs/assets/{app.eYTPqTeq.js → app.CnWL6bKV.js} +1 -1
  51. package/public/docs/assets/chunks/@localSearchIndexroot.tE5pz54z.js +1 -0
  52. package/public/docs/assets/chunks/{VPLocalSearchBox.DsZrQKQR.js → VPLocalSearchBox.C0IBKeRQ.js} +1 -1
  53. package/public/docs/assets/chunks/{theme.DsTNE2pE.js → theme.BH-2HuRf.js} +2 -2
  54. package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.CQgn1t_M.js} +1 -1
  55. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.wulOueeB.js +1 -0
  56. package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.wj6Et6UD.js → contributor-guide_architecture_detector-contract.md.N4hhenrA.js} +1 -1
  57. package/public/docs/assets/{contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.js → contributor-guide_architecture_detector-contract_threshold-tables.md.Dp3c40rx.js} +1 -1
  58. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.DfvbqEUu.js +1 -0
  59. package/public/docs/assets/{contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.lean.js → contributor-guide_architecture_impact-estimation.md.DfvbqEUu.lean.js} +1 -1
  60. package/public/docs/assets/{contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.js → contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.Cwm1jHmn.js} +1 -1
  61. package/public/docs/assets/{contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.BUucRc0A.lean.js → contributor-guide_architecture_impact-estimation_caveats-tuning-and-coverage.md.Cwm1jHmn.lean.js} +1 -1
  62. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.js → contributor-guide_architecture_worker-protocol_cli-and-mcp.md.BX1XnFbq.js} +1 -1
  63. package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.js → contributor-guide_architecture_worker-protocol_evidence-report.md.CiQl1MLb.js} +1 -1
  64. package/public/docs/assets/{contributor-guide_development-setup.md.D9bu4j_c.js → contributor-guide_development-setup.md.DQdzera7.js} +1 -1
  65. package/public/docs/assets/instrument-sans-latin-ext-wdth-normal.C5E2Gvlv.woff2 +0 -0
  66. package/public/docs/assets/instrument-sans-latin-wdth-normal.BVScPF0l.woff2 +0 -0
  67. package/public/docs/assets/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2 +0 -0
  68. package/public/docs/assets/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2 +0 -0
  69. package/public/docs/assets/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2 +0 -0
  70. package/public/docs/assets/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2 +0 -0
  71. package/public/docs/assets/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2 +0 -0
  72. package/public/docs/assets/style.CyK9Ss73.css +1 -0
  73. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.BEepbDDL.js +24 -0
  74. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.BEepbDDL.lean.js +1 -0
  75. package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.js} +1 -1
  76. package/public/docs/assets/user-guide_understanding-findings.md.3C7KCEZO.js +1 -0
  77. package/public/docs/contributor-guide/architecture/board-widgets/caching-and-memory.html +6 -10
  78. package/public/docs/contributor-guide/architecture/board-widgets/plan-advisor.html +4 -8
  79. package/public/docs/contributor-guide/architecture/board-widgets/visual-system-and-templating.html +6 -10
  80. package/public/docs/contributor-guide/architecture/board-widgets.html +4 -8
  81. package/public/docs/contributor-guide/architecture/detector-contract/plan-attribution.html +4 -8
  82. package/public/docs/contributor-guide/architecture/detector-contract/threshold-tables.html +6 -10
  83. package/public/docs/contributor-guide/architecture/detector-contract.html +6 -10
  84. package/public/docs/contributor-guide/architecture/drill-down/plan-graph.html +4 -8
  85. package/public/docs/contributor-guide/architecture/drill-down.html +4 -8
  86. package/public/docs/contributor-guide/architecture/impact-estimation/caveats-tuning-and-coverage.html +6 -10
  87. package/public/docs/contributor-guide/architecture/impact-estimation/stage-union-rollup.html +4 -8
  88. package/public/docs/contributor-guide/architecture/impact-estimation.html +6 -10
  89. package/public/docs/contributor-guide/architecture/index.html +4 -8
  90. package/public/docs/contributor-guide/architecture/overview.html +4 -8
  91. package/public/docs/contributor-guide/architecture/state-and-history/history-server-intake.html +4 -8
  92. package/public/docs/contributor-guide/architecture/state-and-history/run-comparison-internals.html +4 -8
  93. package/public/docs/contributor-guide/architecture/state-and-history.html +4 -8
  94. package/public/docs/contributor-guide/architecture/widget-rendering/findings-tab.html +4 -8
  95. package/public/docs/contributor-guide/architecture/widget-rendering/investigation-routing.html +4 -8
  96. package/public/docs/contributor-guide/architecture/widget-rendering/list-sort-mode.html +4 -8
  97. package/public/docs/contributor-guide/architecture/widget-rendering/reference-section.html +4 -8
  98. package/public/docs/contributor-guide/architecture/widget-rendering/row-expand-contract.html +4 -8
  99. package/public/docs/contributor-guide/architecture/widget-rendering.html +4 -8
  100. package/public/docs/contributor-guide/architecture/worker-protocol/cli-and-mcp.html +6 -10
  101. package/public/docs/contributor-guide/architecture/worker-protocol/core-and-event-validation.html +4 -8
  102. package/public/docs/contributor-guide/architecture/worker-protocol/evidence-availability.html +4 -8
  103. package/public/docs/contributor-guide/architecture/worker-protocol/evidence-report.html +6 -10
  104. package/public/docs/contributor-guide/architecture/worker-protocol.html +4 -8
  105. package/public/docs/contributor-guide/contributing.html +4 -8
  106. package/public/docs/contributor-guide/development-setup.html +6 -10
  107. package/public/docs/contributor-guide/testing.html +4 -8
  108. package/public/docs/favicon.svg +2 -2
  109. package/public/docs/hashmap.json +1 -1
  110. package/public/docs/index.html +4 -8
  111. package/public/docs/tuning-reference/anti-patterns.html +4 -8
  112. package/public/docs/tuning-reference/aqe.html +4 -8
  113. package/public/docs/tuning-reference/bottleneck-broadcast-sizing.html +4 -8
  114. package/public/docs/tuning-reference/bottleneck-cold-start.html +4 -8
  115. package/public/docs/tuning-reference/bottleneck-duplicate-plan-subtree.html +4 -8
  116. package/public/docs/tuning-reference/bottleneck-failures.html +4 -8
  117. package/public/docs/tuning-reference/bottleneck-gc.html +4 -8
  118. package/public/docs/tuning-reference/bottleneck-job-failure-rate.html +4 -8
  119. package/public/docs/tuning-reference/bottleneck-memory-utilization.html +4 -8
  120. package/public/docs/tuning-reference/bottleneck-retry-waste.html +4 -8
  121. package/public/docs/tuning-reference/bottleneck-shuffle.html +4 -8
  122. package/public/docs/tuning-reference/bottleneck-skew.html +4 -8
  123. package/public/docs/tuning-reference/bottleneck-slow-host.html +4 -8
  124. package/public/docs/tuning-reference/bottleneck-small-files.html +4 -8
  125. package/public/docs/tuning-reference/bottleneck-spill.html +4 -8
  126. package/public/docs/tuning-reference/bottleneck-straggler.html +4 -8
  127. package/public/docs/tuning-reference/bottleneck-tiny-tasks.html +4 -8
  128. package/public/docs/tuning-reference/bottleneck-utilization.html +4 -8
  129. package/public/docs/tuning-reference/caching.html +4 -8
  130. package/public/docs/tuning-reference/cluster-config.html +4 -8
  131. package/public/docs/tuning-reference/config.html +4 -8
  132. package/public/docs/tuning-reference/data-formats.html +4 -8
  133. package/public/docs/tuning-reference/index.html +5 -9
  134. package/public/docs/tuning-reference/intro.html +4 -8
  135. package/public/docs/tuning-reference/joins.html +4 -8
  136. package/public/docs/tuning-reference/memory-model.html +4 -8
  137. package/public/docs/tuning-reference/metrics.html +4 -8
  138. package/public/docs/tuning-reference/partitioning.html +4 -8
  139. package/public/docs/tuning-reference/pyspark.html +4 -8
  140. package/public/docs/tuning-reference/shuffle.html +4 -8
  141. package/public/docs/tuning-reference/spark-architecture.html +4 -8
  142. package/public/docs/tuning-reference/table-formats.html +4 -8
  143. package/public/docs/user-guide/alternative-log-retrieval/managed-platforms.html +4 -8
  144. package/public/docs/user-guide/alternative-log-retrieval/ssh-bastion.html +4 -8
  145. package/public/docs/user-guide/alternative-log-retrieval.html +4 -8
  146. package/public/docs/user-guide/getting-started/ci-and-automation.html +9 -12
  147. package/public/docs/user-guide/getting-started/reading-the-dashboard.html +4 -8
  148. package/public/docs/user-guide/getting-started/regression-metric-keys.html +4 -8
  149. package/public/docs/user-guide/getting-started/tuning-thresholds.html +4 -8
  150. package/public/docs/user-guide/getting-started.html +4 -8
  151. package/public/docs/user-guide/mcp-tools/compare-runs.html +4 -8
  152. package/public/docs/user-guide/mcp-tools/diagnose-run.html +4 -8
  153. package/public/docs/user-guide/mcp-tools/evaluate-budgets.html +4 -8
  154. package/public/docs/user-guide/mcp-tools/get-finding-documentation.html +4 -8
  155. package/public/docs/user-guide/mcp-tools/get-finding-evidence.html +4 -8
  156. package/public/docs/user-guide/mcp-tools/get-reference-doc.html +4 -8
  157. package/public/docs/user-guide/mcp-tools/get-run-summary.html +6 -10
  158. package/public/docs/user-guide/mcp-tools/list-runs.html +4 -8
  159. package/public/docs/user-guide/mcp-tools.html +4 -8
  160. package/public/docs/user-guide/run-comparison/how-stages-are-matched.html +4 -8
  161. package/public/docs/user-guide/run-comparison.html +4 -8
  162. package/public/docs/user-guide/understanding-findings.html +6 -10
  163. package/public/export-template.html +46 -46
  164. package/public/favicon.svg +2 -2
  165. package/public/index.html +4 -7
  166. package/vendor-core/allocation.js +105 -20
  167. package/vendor-core/api-merge-writes.js +1 -0
  168. package/vendor-core/core-source-hash.txt +1 -1
  169. package/vendor-core/delta-log-paths.js +10 -1
  170. package/vendor-core/detectors.js +73 -38
  171. package/vendor-core/docs-content/detection/mem.md +1 -1
  172. package/vendor-core/docs-content/detection/skew.md +2 -1
  173. package/vendor-core/docs-content/detection/util.md +6 -2
  174. package/vendor-core/efficiency-model.js +22 -14
  175. package/vendor-core/finding-presentation.js +13 -6
  176. package/vendor-core/finding-types.js +21 -10
  177. package/vendor-core/impact-model.js +2 -2
  178. package/vendor-core/remediation.js +10 -5
  179. package/vendor-core/run-output.js +14 -3
  180. package/vendor-core/types.js +12 -2
  181. package/vendor-core/wall-clock.js +8 -0
  182. package/vendor-core/wasted-core-hours.js +12 -11
  183. package/vendor-core/write-targets.js +32 -0
  184. package/public/assets/AutoscalingChurn-8t3U3isq.js +0 -1
  185. package/public/assets/CacheUtilization-CJs9tTum.js +0 -1
  186. package/public/assets/ConfigAudit-B5Gbe5js.js +0 -1
  187. package/public/assets/Dashboard-C1hNeX49.js +0 -2
  188. package/public/assets/DisclosureContext-ZpE6CkHx.js +0 -1
  189. package/public/assets/ExecutorUtilization-D9grwi7t.js +0 -1
  190. package/public/assets/MemoryUtilization-BM5schZI.js +0 -1
  191. package/public/assets/PlanGraphRoute-DH3KJb8j.js +0 -1
  192. package/public/assets/RetryWaste-DOnE9vGF.js +0 -1
  193. package/public/assets/Skew-BmZZJ5ms.js +0 -1
  194. package/public/assets/SlowHost-CsJzfEqo.js +0 -1
  195. package/public/assets/Spill-BhNicyBy.js +0 -1
  196. package/public/assets/StageShape-BDxRknLp.js +0 -1
  197. package/public/assets/Straggler-CZCbnOWP.js +0 -1
  198. package/public/assets/TaskFailures-C57YcLFQ.js +0 -1
  199. package/public/assets/index-2h_TgUAb.css +0 -2
  200. package/public/assets/index-B-03mG7K.js +0 -14
  201. package/public/assets/react-vendor-DEdfrRTJ.js +0 -9
  202. package/public/assets/useRecentFiles-XZEnLlal.js +0 -11
  203. package/public/docs/assets/chunks/@localSearchIndexroot.u_e5bQz4.js +0 -1
  204. package/public/docs/assets/contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.js +0 -1
  205. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.CZv_ZGOp.js +0 -1
  206. package/public/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  207. package/public/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  208. package/public/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  209. package/public/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  210. package/public/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  211. package/public/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  212. package/public/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  213. package/public/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  214. package/public/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  215. package/public/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  216. package/public/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  217. package/public/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  218. package/public/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  219. package/public/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  220. package/public/docs/assets/style.tmDhD3c8.css +0 -1
  221. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.OUQqw3mI.js +0 -23
  222. package/public/docs/assets/user-guide_getting-started_ci-and-automation.md.OUQqw3mI.lean.js +0 -1
  223. package/public/docs/assets/user-guide_understanding-findings.md.C9YRruMT.js +0 -1
  224. /package/public/docs/assets/{contributor-guide_architecture_board-widgets_caching-and-memory.md.8bH1HnZp.lean.js → contributor-guide_architecture_board-widgets_caching-and-memory.md.CQgn1t_M.lean.js} +0 -0
  225. /package/public/docs/assets/{contributor-guide_architecture_board-widgets_visual-system-and-templating.md.DYgUpIJB.lean.js → contributor-guide_architecture_board-widgets_visual-system-and-templating.md.wulOueeB.lean.js} +0 -0
  226. /package/public/docs/assets/{contributor-guide_architecture_detector-contract.md.wj6Et6UD.lean.js → contributor-guide_architecture_detector-contract.md.N4hhenrA.lean.js} +0 -0
  227. /package/public/docs/assets/{contributor-guide_architecture_detector-contract_threshold-tables.md.CKjWG56Y.lean.js → contributor-guide_architecture_detector-contract_threshold-tables.md.Dp3c40rx.lean.js} +0 -0
  228. /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_cli-and-mcp.md.DC1YqXBp.lean.js → contributor-guide_architecture_worker-protocol_cli-and-mcp.md.BX1XnFbq.lean.js} +0 -0
  229. /package/public/docs/assets/{contributor-guide_architecture_worker-protocol_evidence-report.md.DVGZOWvW.lean.js → contributor-guide_architecture_worker-protocol_evidence-report.md.CiQl1MLb.lean.js} +0 -0
  230. /package/public/docs/assets/{contributor-guide_development-setup.md.D9bu4j_c.lean.js → contributor-guide_development-setup.md.DQdzera7.lean.js} +0 -0
  231. /package/public/docs/assets/{user-guide_mcp-tools_get-run-summary.md.DpxZ4ZNp.lean.js → user-guide_mcp-tools_get-run-summary.md.EhaIsele.lean.js} +0 -0
  232. /package/public/docs/assets/{user-guide_understanding-findings.md.C9YRruMT.lean.js → user-guide_understanding-findings.md.3C7KCEZO.lean.js} +0 -0
@@ -0,0 +1,14 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./PlanGraphRoute-DctPZjS0.js","./rolldown-runtime-hePW80VL.js","./charts-vendor-0VMaLVLN.js","./react-vendor-DfpuPQZf.js","./plan-graph-vendor-BYl-AzN5.js","./plan-graph-vendor-DLioOiRN.css","./DisclosureContext-OO7X1HAx.js","./useRecentFiles-BvkKo3JN.js","./impact-sort-xzy0g-Vh.js","./Dashboard-BHZ76JCu.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{M as t,j as n}from"./charts-vendor-0VMaLVLN.js";import{$ as r,J as i,Q as a,X as o,Y as s,Z as c,at as l,et as u,it as d,lt as f,ot as p,st as m}from"./react-vendor-DfpuPQZf.js";import{$ as h,A as g,B as _,Ct as v,D as y,Dt as b,F as x,G as S,H as C,I as w,K as T,M as E,O as ee,Ot as D,R as O,T as k,Tt as A,U as te,V as ne,W as j,X as re,Z as M,_t as ie,a as ae,at as oe,b as se,bt as N,c as ce,ct as le,dt as ue,ft as de,gt as fe,ht as pe,it as me,j as P,k as he,mt as ge,nt as _e,pt as ve,st as F,t as ye,ut as be,vt as xe,w as Se,wt as Ce,xt as I,yt as L}from"./DisclosureContext-OO7X1HAx.js";import{p as we}from"./plan-graph-vendor-BYl-AzN5.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var R=e(t(),1),Te=f(),z=we(),Ee=D(`group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none cursor-pointer focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:cursor-default disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:cursor-default aria-disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,{variants:{variant:{default:`bg-accent-soft text-accent hover:bg-[color-mix(in_oklch,var(--accent-soft),var(--accent)_12%)] aria-expanded:bg-accent-soft`,outline:`border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,secondary:`bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground`,ghost:`hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50`,destructive:`bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40`,link:`text-primary underline-offset-4 hover:underline`,soft:`bg-accent-soft text-accent hover:bg-[color-mix(in_oklch,var(--accent-soft),var(--accent)_12%)] aria-expanded:bg-accent-soft`},size:{default:`h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,xs:`h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5`,lg:`h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2`,icon:`size-8`,"icon-xs":`size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg`,"icon-lg":`size-9`}},defaultVariants:{variant:`default`,size:`default`}});function B({className:e,variant:t=`default`,size:n=`default`,...r}){return(0,z.jsx)(m,{"data-slot":`button`,className:b(Ee({variant:t,size:n,className:e})),...r})}function De({className:e,children:t,value:n,...r}){return(0,z.jsxs)(p,{value:n,"data-slot":`progress`,className:b(`flex flex-wrap gap-3`,e),...r,children:[t,(0,z.jsx)(Oe,{children:(0,z.jsx)(ke,{})})]})}function Oe({className:e,...t}){return(0,z.jsx)(l,{className:b(`relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted`,e),"data-slot":`progress-track`,...t})}function ke({className:e,...t}){return(0,z.jsx)(d,{"data-slot":`progress-indicator`,className:b(`h-full bg-primary transition-all`,e),...t})}var Ae=(0,R.createContext)(null);function je({children:e}){let t=I(e=>e.theme);return(0,R.useEffect)(()=>{if(t===`light`?document.documentElement.setAttribute(`data-theme`,`light`):document.documentElement.removeAttribute(`data-theme`),typeof window<`u`){try{window.localStorage.setItem(`shuffle-works-theme`,t)}catch{}try{window.localStorage.setItem(`vitepress-theme-appearance`,t)}catch{}}},[t]),(0,z.jsx)(Ae.Provider,{value:{theme:t,toggle:()=>N.getState().setTheme(t===`dark`?`light`:`dark`)},children:e})}function Me(){let e=(0,R.useContext)(Ae);if(!e)throw Error(`useTheme outside ThemeProvider`);return e}var Ne=e(n(),1);function Pe(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var Fe=e=>{switch(e){case`success`:return Re;case`info`:return Be;case`warning`:return ze;case`error`:return Ve;default:return null}},Ie=Array(12).fill(0),Le=({visible:e,className:t})=>R.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},R.createElement(`div`,{className:`sonner-spinner`},Ie.map((e,t)=>R.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),Re=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),ze=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),Be=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),Ve=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`,"aria-hidden":`true`},R.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),He=R.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`},R.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),R.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),Ue=()=>{let[e,t]=R.useState(document.hidden);return R.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e},We=1,Ge=100,Ke=e=>typeof e?.id==`number`||e?.id?.length>0?e.id:We++,V=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),this.getActiveToasts().forEach(t=>e(t)),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e],this.trimHistory()},this.trimHistory=()=>{let e=this.toasts.length-Ge;e<=0||(this.toasts=this.toasts.filter(t=>e>0&&this.dismissedToasts.has(t.id)?(this.dismissedToasts.delete(t.id),e--,!1):!0))},this.create=e=>{let{message:t,...n}=e,r=Ke(e),i=this.pendingDismissals.get(r);i!==void 0&&(cancelAnimationFrame(i),this.pendingDismissals.delete(r),this.dismissedToasts.delete(r));let a=this.dismissedToasts.has(r),o=e.dismissible===void 0||e.dismissible;return a&&(this.dismissedToasts.delete(r),this.toasts=this.toasts.filter(e=>e.id!==r)),!a&&this.toasts.find(e=>e.id===r)?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:o,title:t}):n):this.addToast({title:t,...n,dismissible:o,id:r}),r},this.dismiss=e=>{if(e==null)return this.getActiveToasts().forEach(e=>{this.dismissedToasts.add(e.id),this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e;this.dismissedToasts.add(e);let t=this.pendingDismissals.get(e);return t!==void 0&&cancelAnimationFrame(t),this.pendingDismissals.set(e,requestAnimationFrame(()=>{this.pendingDismissals.delete(e),this.subscribers.forEach(t=>t({id:e,dismiss:!0}))})),e},this.message=(e,t)=>this.create({...t,message:e,type:void 0}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],R.isValidElement(e))i=!1,this.create({id:n,type:`default`,message:e});else if(Je(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!R.isValidElement(r)?r:{message:r};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),s=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:s}:Object.assign(n,{unwrap:s})},this.custom=(e,t)=>{let n=Ke(t);return this.create({...t,jsx:e(n),id:n,type:void 0}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set,this.pendingDismissals=new Map}},qe=(e,t)=>V.message(e,t),Je=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,Ye=Object.assign(qe,{success:V.success,info:V.info,warning:V.warning,error:V.error,custom:V.custom,message:V.message,promise:V.promise,dismiss:V.dismiss,loading:V.loading},{getHistory:()=>V.toasts,getToasts:()=>V.getActiveToasts()});Pe(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--normal-text);background:var(--normal-bg);border:1px solid var(--normal-border);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{-webkit-user-select:none;user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function Xe(e){return e.label!==void 0}var Ze=3,Qe=`24px`,$e=`16px`,et=4e3,tt=356,nt=14,rt=45,it=200;function at(...e){return e.filter(Boolean).join(` `)}function ot(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var st=e=>{let{invert:t,toast:n,unstyled:r,interacting:i,setHeights:a,visibleToasts:o,heights:s,index:c,toasts:l,expanded:u,removeToast:d,defaultRichColors:f,closeButton:p,style:m,cancelButtonStyle:h,actionButtonStyle:g,className:_=``,descriptionClassName:v=``,duration:y,position:b,gap:x,expandByDefault:S,classNames:C,icons:w,closeButtonAriaLabel:T=`Close toast`}=e,[E,ee]=R.useState(null),[D,O]=R.useState(null),[k,A]=R.useState(!1),[te,ne]=R.useState(!1),[j,re]=R.useState(!1),[M,ie]=R.useState(!1),[ae,oe]=R.useState(!1),[se,N]=R.useState(0),[ce,le]=R.useState(0),ue=R.useRef(n.duration||y||et),de=R.useRef(null),fe=R.useRef(null),pe=c===0,me=c+1<=o,P=n.type,he=P??`default`,ge=n.dismissible!==!1,_e=n.className||``,ve=n.descriptionClassName||``,F=R.useMemo(()=>s.findIndex(e=>e.toastId===n.id)||0,[s,n.id]),ye=R.useMemo(()=>n.closeButton??p,[n.closeButton,p]),be=R.useMemo(()=>n.duration||y||et,[n.duration,y]),xe=R.useRef(0),Se=R.useRef(0),Ce=R.useRef(0),I=R.useRef(null),[L,we]=b.split(`-`),Te=R.useMemo(()=>s.reduce((e,t,n)=>n>=F?e:e+t.height,0),[s,F]),z=Ue(),Ee=R.useMemo(()=>e.swipeDirections??ot(b),[e.swipeDirections,b]),B=n.invert||t,De=P===`loading`;Se.current=R.useMemo(()=>F*x+Te,[F,Te]),R.useEffect(()=>{ue.current=be},[be]),R.useEffect(()=>{A(!0)},[]),R.useEffect(()=>{let e=fe.current;if(e){let t=e.getBoundingClientRect().height;return le(t),a(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>a(e=>e.filter(e=>e.toastId!==n.id))}},[a,n.id]),R.useLayoutEffect(()=>{if(!k)return;let e=fe.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,le(r),a(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[k,n.title,n.description,a,n.id,n.jsx,n.action,n.cancel]);let Oe=R.useCallback(()=>{ne(!0),N(Se.current),a(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{d(n)},it)},[n,d,a,Se]);R.useEffect(()=>{if(n.promise&&P===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return u||i||z?(()=>{if(Ce.current<xe.current){let e=new Date().getTime()-xe.current;ue.current-=e}Ce.current=new Date().getTime()})():ue.current!==1/0&&(xe.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),Oe()},ue.current)),()=>clearTimeout(e)},[u,i,n,P,z,Oe]),R.useEffect(()=>{n.delete&&(Oe(),n.onDismiss==null||n.onDismiss.call(n,n))},[Oe,n.delete]);function ke(){return w?.loading?R.createElement(`div`,{className:at(C?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":P===`loading`},w.loading):R.createElement(Le,{className:at(C?.loader,n?.classNames?.loader),visible:P===`loading`})}let Ae=n.icon||w?.[P]||Fe(P);return R.createElement(`li`,{tabIndex:0,ref:fe,className:at(_,_e,C?.toast,n?.classNames?.toast,C?.[he],n?.classNames?.[he]),"data-sonner-toast":``,"data-rich-colors":n.richColors??f,"data-styled":!(n.jsx||n.unstyled||r),"data-mounted":k,"data-promise":!!n.promise,"data-swiped":ae,"data-removed":te,"data-visible":me,"data-y-position":L,"data-x-position":we,"data-index":c,"data-front":pe,"data-swiping":j,"data-dismissible":ge,"data-type":P,"data-invert":B,"data-swipe-out":M,"data-swipe-direction":D,"data-expanded":!!(u||S&&k),"data-testid":n.testId,style:{"--index":c,"--toasts-before":c,"--z-index":l.length-c,"--offset":`${te?se:Se.current}px`,"--initial-height":S?`auto`:`${ce}px`,...m,...n.style},onDragEnd:()=>{re(!1),ee(null),I.current=null},onPointerDown:e=>{e.button!==2&&!De&&ge&&(de.current=new Date,N(Se.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(re(!0),I.current={x:e.clientX,y:e.clientY}))},onPointerUp:()=>{if(M||!ge)return;I.current=null;let e=Number(fe.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(fe.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-de.current?.getTime(),i=E===`x`?e:t,a=Math.abs(i)/r;if((E===`x`?Ee.includes(e>0?`right`:`left`):Ee.includes(t>0?`bottom`:`top`))&&(Math.abs(i)>=rt||a>.11)){N(Se.current),n.onDismiss==null||n.onDismiss.call(n,n),O(E===`x`?e>0?`right`:`left`:t>0?`down`:`up`),Oe(),ie(!0);return}var o,s;(o=fe.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=fe.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`),oe(!1),re(!1),ee(null)},onPointerMove:e=>{var t,n;if(!I.current||!ge||window.getSelection()?.toString().length>0)return;let r=e.clientY-I.current.y,i=e.clientX-I.current.x;!E&&(Math.abs(i)>1||Math.abs(r)>1)&&ee(Math.abs(i)>Math.abs(r)?`x`:`y`);let a={x:0,y:0},o=e=>1/(1.5+Math.abs(e)/20);if(E===`y`){if(Ee.includes(`top`)||Ee.includes(`bottom`)){if(Ee.includes(`top`)&&r<0||Ee.includes(`bottom`)&&r>0)a.y=r;else{let e=r*o(r);a.y=Math.abs(e)<Math.abs(r)?e:r}}}else if(E===`x`&&(Ee.includes(`left`)||Ee.includes(`right`))){if(Ee.includes(`left`)&&i<0||Ee.includes(`right`)&&i>0)a.x=i;else{let e=i*o(i);a.x=Math.abs(e)<Math.abs(i)?e:i}}(Math.abs(a.x)>0||Math.abs(a.y)>0)&&oe(!0),(t=fe.current)==null||t.style.setProperty(`--swipe-amount-x`,`${a.x}px`),(n=fe.current)==null||n.style.setProperty(`--swipe-amount-y`,`${a.y}px`)}},ye&&!n.jsx&&P!==`loading`?R.createElement(`button`,{"aria-label":T,"data-disabled":De,"data-close-button":!0,onClick:De||!ge?()=>{}:()=>{Oe(),n.onDismiss==null||n.onDismiss.call(n,n)},className:at(C?.closeButton,n?.classNames?.closeButton)},w?.close??He):null,(P||n.icon||n.promise)&&n.icon!==null&&(w?.[P]!==null||n.icon)?R.createElement(`div`,{"data-icon":``,className:at(C?.icon,n?.classNames?.icon)},P===`loading`?n.icon||ke():n.promise?ke():null,P===`loading`?null:Ae):null,R.createElement(`div`,{"data-content":``,className:at(C?.content,n?.classNames?.content)},R.createElement(`div`,{"data-title":``,className:at(C?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?R.createElement(`div`,{"data-description":``,className:at(v,ve,C?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),R.isValidElement(n.cancel)?n.cancel:n.cancel&&Xe(n.cancel)?R.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||h,onClick:e=>{Xe(n.cancel)&&ge&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),Oe())},className:at(C?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,R.isValidElement(n.action)?n.action:n.action&&Xe(n.action)?R.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||g,onClick:e=>{Xe(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&Oe())},className:at(C?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function ct(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function lt(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?$e:Qe;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var ut=R.forwardRef(function(e,t){let{id:n,invert:r,position:i=`bottom-right`,hotkey:a=[`altKey`,`KeyT`],expand:o,closeButton:s,className:c,offset:l,mobileOffset:u,theme:d=`light`,richColors:f,duration:p,style:m,visibleToasts:h=Ze,toastOptions:g,dir:_=ct(),gap:v=nt,icons:y,customAriaLabel:b,containerAriaLabel:x=`Notifications`}=e,[S,C]=R.useState([]),w=R.useMemo(()=>n?S.filter(e=>e.toasterId===n):S.filter(e=>!e.toasterId),[S,n]),T=R.useMemo(()=>Array.from(new Set([i].concat(w.filter(e=>e.position).map(e=>e.position)))),[w,i]),[E,ee]=R.useState([]),[D,O]=R.useState(!1),[k,A]=R.useState(!1),[te,ne]=R.useState(d===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:d),j=R.useRef(null),re=a.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),M=R.useRef(null),ie=R.useRef(!1),ae=R.useCallback(e=>{C(t=>(t.find(t=>t.id===e.id)?.delete||V.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return R.useEffect(()=>V.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{C(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{Ne.flushSync(()=>{C(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[]),R.useEffect(()=>{if(d!==`system`){ne(d);return}if(d===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?ne(`dark`):ne(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{ne(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{ne(e?`dark`:`light`)}catch(e){console.error(e)}})}},[d]),R.useEffect(()=>{S.length<=1&&O(!1)},[S]),R.useEffect(()=>{let e=e=>{if(a.length>0&&a.every(t=>e[t]||e.code===t)){var t;O(!0),(t=j.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===j.current||j.current?.contains(document.activeElement))&&O(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[a]),R.useEffect(()=>{if(j.current)return()=>{M.current&&(M.current.focus({preventScroll:!0}),M.current=null,ie.current=!1)}},[j.current]),R.createElement(`section`,{ref:t,"aria-label":b??`${x} ${re}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0,"data-react-aria-top-layer":!0},T.map((t,n)=>{let[i,a]=t.split(`-`);return w.length?R.createElement(`ol`,{key:t,dir:_===`auto`?ct():_,tabIndex:-1,ref:j,className:c,"data-sonner-toaster":!0,"data-sonner-theme":te,"data-y-position":i,"data-x-position":a,style:{"--front-toast-height":`${E[0]?.height||0}px`,"--width":`${tt}px`,"--gap":`${v}px`,...m,...lt(l,u)},onBlur:e=>{ie.current&&!e.currentTarget.contains(e.relatedTarget)&&(ie.current=!1,M.current&&=(M.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||ie.current||(ie.current=!0,M.current=e.relatedTarget)},onMouseEnter:()=>O(!0),onMouseMove:()=>O(!0),onMouseLeave:()=>{k||O(!1)},onDragEnd:()=>O(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||A(!0)},onPointerUp:()=>A(!1)},w.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>R.createElement(st,{key:n.id,icons:y,index:i,toast:n,defaultRichColors:f,duration:g?.duration??p,className:g?.className,descriptionClassName:g?.descriptionClassName,invert:r,visibleToasts:h,closeButton:g?.closeButton??s,interacting:k,position:t,style:g?.style,unstyled:g?.unstyled,classNames:g?.classNames,cancelButtonStyle:g?.cancelButtonStyle,actionButtonStyle:g?.actionButtonStyle,closeButtonAriaLabel:g?.closeButtonAriaLabel,removeToast:ae,toasts:w.filter(e=>e.position==n.position),heights:E.filter(e=>e.position==n.position),setHeights:ee,expandByDefault:o,gap:v,expanded:D,swipeDirections:e.swipeDirections}))):null}))}),dt={name:`activity`,size:24,node:[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]};dt.node;var ft=L(dt),pt={name:`arrow-right`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]};pt.node;var mt=L(pt),ht={name:`book-open`,size:24,node:[[`path`,{d:`M12 5v16`,key:`1f6ucr`}],[`path`,{d:`M20.001 19A2 2 0 0022 17V5a2 2 0 00-1.999-2L16 3.002A5 5 0 0012 5a5 5 0 00-4-2H4a2 2 0 00-2 2v12a2 2 0 001.999 2H8a5 5 0 014 2 5 5 0 014-2z`,key:`1fyvmf`}]]};ht.node;var gt=L(ht),_t={name:`bot`,size:24,node:[[`path`,{d:`M12 8V4H8`,key:`hb8ula`}],[`rect`,{width:`16`,height:`12`,x:`4`,y:`8`,rx:`2`,key:`enze0r`}],[`path`,{d:`M2 14h2`,key:`vft8re`}],[`path`,{d:`M20 14h2`,key:`4cs60a`}],[`path`,{d:`M15 13v2`,key:`1xurst`}],[`path`,{d:`M9 13v2`,key:`rq6x2g`}]]};_t.node;var vt=L(_t),yt={name:`circle-check`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m16 9-5.5 5.5L8 12`,key:`xofnsj`}]],aliases:[`check-circle-2`]};yt.node;var bt=L(yt),xt={name:`git-compare-arrows`,size:24,node:[[`circle`,{cx:`5`,cy:`6`,r:`3`,key:`1qnov2`}],[`path`,{d:`M12 6h5a2 2 0 0 1 2 2v7`,key:`1yj91y`}],[`path`,{d:`m15 9-3-3 3-3`,key:`1lwv8l`}],[`circle`,{cx:`19`,cy:`18`,r:`3`,key:`1qljk2`}],[`path`,{d:`M12 18H7a2 2 0 0 1-2-2V9`,key:`16sdep`}],[`path`,{d:`m9 15 3 3-3 3`,key:`1m3kbl`}]]};xt.node;var St=L(xt),Ct={name:`info`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]};Ct.node;var wt=L(Ct),Tt={name:`loader-circle`,size:24,node:[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]],aliases:[`loader-2`]};Tt.node;var Et=L(Tt),Dt={name:`moon`,size:24,node:[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]};Dt.node;var Ot=L(Dt),kt={name:`octagon-x`,size:24,node:[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]],aliases:[`x-octagon`]};kt.node;var At=L(kt),jt={name:`server`,size:24,node:[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]};jt.node;var Mt=L(jt),Nt={name:`shield-check`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]};Nt.node;var Pt=L(Nt),Ft={name:`sun`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]};Ft.node;var It=L(Ft),Lt={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};Lt.node;var Rt=L(Lt),zt={name:`upload`,size:24,node:[[`path`,{d:`M12 3v12`,key:`1x0j5s`}],[`path`,{d:`m17 8-5-5-5 5`,key:`7q97r8`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}]]};zt.node;var Bt=L(zt),Vt={name:`workflow`,size:24,node:[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`,key:`by2w9f`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`,key:`xkn7yn`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`,key:`1cgmvn`}]]};Vt.node;var Ht=L(Vt),Ut={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};Ut.node;var Wt=L(Ut),Gt=({...e})=>{let{theme:t}=Me();return(0,z.jsx)(ut,{theme:t,className:`toaster group`,icons:{success:(0,z.jsx)(bt,{className:`size-4`}),info:(0,z.jsx)(wt,{className:`size-4`}),warning:(0,z.jsx)(Rt,{className:`size-4`}),error:(0,z.jsx)(At,{className:`size-4`}),loading:(0,z.jsx)(Et,{className:`size-4 animate-spin`})},style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`},toastOptions:{classNames:{toast:`cn-toast`}},...e})};function Kt(e,t,n){switch(e.type){case`progress`:t.onProgress?.(e);break;case`app`:t.onApp?.(e.data);break;case`stage`:t.onStage?.(e.data);break;case`sql`:t.onSql?.(e.data);break;case`sqlPlan`:t.onSqlPlan?.(e.data);break;case`executor`:t.onExecutor?.(e.data);break;case`job`:t.onJob?.(e.data);break;case`runAggregates`:t.onRunAggregates?.(e.data);break;case`stageExecutorMetrics`:t.onStageExecutorMetrics?.(e.data);break;case`stageSpeculationWaste`:t.onStageSpeculationWaste?.(e.data);break;case`stageLateAttemptWork`:t.onStageLateAttemptWork?.(e.data);break;case`done`:{let{skippedLines:n,unreadableSqlExecutions:r}=e;t.onDone?.(r?{skippedLines:n,unreadableSqlExecutions:r}:{skippedLines:n});break}case`error`:t.onError?.(e);break;case`taskData`:{let t=n?.get(e.reqId);t&&(t.resolve({metrics:e.metrics,fieldNames:e.fieldNames}),n.delete(e.reqId));break}}}function qt(){let e=null,t=new Map,n=0,r={};function i(){e=new Worker(new URL(new URL(`parser-worker-CA5RxqKc.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),e.onmessage=({data:e})=>Kt(e,r,t),e.onerror=e=>{r.onError?.(`Worker crashed: ${e.message}`),u()}}function a(t,n){r=n,i(),e.postMessage({type:`parse`,file:t})}function o(t,n){r=n,i(),e.postMessage({type:`parseFromUrl`,request:t})}function s(t,n){r=n,i(),e.postMessage({type:`parseFiles`,files:t})}function c(r){return new Promise((i,a)=>{let o=String(n++);t.set(o,{resolve:i,reject:a}),e.postMessage({type:`getTaskData`,stageId:r,reqId:o})})}async function l(e){return await Promise.all(e.map(e=>c(e).then(t=>({stageId:e,...t}))))}function u(){e?.terminate(),e=null;for(let{reject:e}of t.values())e(Error(`Worker terminated`));t.clear()}return{startParse:a,startParseFromUrl:o,startParseFiles:s,requestTaskData:c,prefetchFlaggedStages:l,terminate:u}}function Jt(e,t){let n=t;e.skippedLines=n?.skippedLines??0,n?.unreadableSqlExecutions?e.unreadableSqlExecutions=n.unreadableSqlExecutions:delete e.unreadableSqlExecutions}function Yt(e,{onProgress:t,onDone:n,onError:r}){return{onProgress:t,onApp(t){e.app=t},onStage(t){let n=t;e.stages.set(n.id,n)},onSql(t){let n=t;e.sql.set(n.id,t);for(let t of n.stageIds??[]){let r=e.stages.get(t);r&&(r.sqlExecutionId=n.id)}},onSqlPlan(t){let n=t,r=e.sql.get(n.executionId);r&&(r.planTree=n.planTree)},onExecutor(t){let n=t;n.kind===`added`?e.executors.added.push(n):e.executors.removed.push(n)},onJob(t){let n=t;e.jobs.set(n.id,n)},onRunAggregates(t){e.runAggregates=t},onStageExecutorMetrics(t){if(!(t instanceof Map))return;let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.executorMetrics=r)}},onStageSpeculationWaste(t){let n=t;for(let[t,r]of n){let n=e.stages.get(t);n&&(n.speculationWasteMs=r.speculationWasteMs,n.speculationWastedAttempts=r.speculationWastedAttempts)}},onDone(t){Jt(e,t),n?.(t)},onStageLateAttemptWork(t){for(let[n,r]of t){let t=e.stages.get(n);t&&(t.lateAttemptWork=r)}},onError:r}}function Xt(e){let t=e.length;if(t===0)return 0;let n=t>>1;return t%2==1?e[n]:(e[n-1]+e[n])/2}function Zt(e,t,{dedupe:n=!1}={}){if(!e)return;let r=n?new Set:null,i=[{node:e,parent:null}];for(;i.length>0;){let{node:e,parent:n}=i.pop();if(r){if(r.has(e))continue;r.add(e)}t(e,n);let a=e.children??[];for(let t=a.length-1;t>=0;t--)i.push({node:a[t],parent:e})}}function Qt(e){for(let t of e.metrics??[]){if(t.metricType===`timing`)return t.value;if(t.metricType===`nsTiming`)return t.value/1e6}for(let t of e.metrics??[])if(/time/i.test(t.name)&&typeof t.value==`number`)return t.value;return null}function $t(e){let t=[],n=new Map,r=new Map;if(!e)return{segments:t,segOf:n,segmentTopology:r};let i=1,a=0;return Zt(e,(e,o)=>{let s;if(!o)s=0,r.set(s,{parentIndex:null,depth:0,traversalOrder:a++});else if(o.exchangeRole===`read`){let e=n.get(o);s=i++,r.set(s,{parentIndex:e,depth:r.get(e).depth+1,traversalOrder:a++})}else s=n.get(o);n.set(e,s),(t[s]??=[]).push(e)},{dedupe:!0}),{segments:t,segOf:n,segmentTopology:r}}function en(e,t,n,r){let i=e.filter(Boolean).map((e,t)=>({i:t,nodes:e,...r.get(t)})).sort((e,t)=>t.depth-e.depth||e.traversalOrder-t.traversalOrder),a=[...n].map(e=>({id:e,s:t.get(e)})).filter(e=>!!e.s).sort((e,t)=>e.s.submittedAt-t.s.submittedAt),o=Math.min(i.length,a.length),s=[];for(let e=0;e<o;e++)s.push({segmentIndex:i[e].i,stageId:a[e].id,nodes:i[e].nodes,stage:a[e].s});return{orderedSegments:i,orderedStages:a,pairs:s}}function tn(e,t,n){let r=new Map,i=e,a=0;for(;i!=null;)r.set(i,a++),i=n.get(i)?.parentIndex??null;for(i=t,a=0;i!=null;){let e=r.get(i);if(e!=null)return e+a;i=n.get(i)?.parentIndex??null,a++}return 1/0}function nn(e,t,n,r){let i=t,a=r,{orderedSegments:o,pairs:s}=en(e,i,n,a),c=new Map(s.map(e=>[e.segmentIndex,e.stageId])),l=s.map(e=>e.segmentIndex);if(l.length===0)return c;for(let{i:e}of o){if(c.has(e))continue;let t=l[0],n=tn(e,t,a);for(let r of l){let i=tn(e,r,a);i<n&&(n=i,t=r)}c.set(e,c.get(t))}return c}function rn(e){let t=new Map;for(let{nodes:n,stage:r}of e){let{submittedAt:e,completedAt:i}=r,a=Math.max(0,i-e),o=n.map(Qt),s=o.reduce((e,t)=>e+(t??0),0);n.forEach((e,r)=>{let i=s>0?a*((o[r]??0)/s):a/n.length;t.set(e,i)})}return t}function an(e,t,n){let r=n?.stageIds??[];if(!e||r.length===0)return new Map;let{segments:i,segmentTopology:a}=$t(e),{pairs:o}=en(i,t,r,a);return rn(o)}function on(e,t,n){let r=n?.stageIds??[],i=new Map;if(!e||r.length===0)return i;let{segments:a,segmentTopology:o}=$t(e),{pairs:s}=en(a,t,r,o),c=rn(s);for(let{nodes:e}of s){let t=new Set(e);for(let n of e){let e=new Set;function r(n){if(e.has(n))return 0;e.add(n);let i=c.get(n)??0;for(let e of n.children??[])t.has(e)&&(i+=r(e));return i}i.set(n,r(n))}}return i}function sn(e,t){let n=[];for(let r of t.values())r.sqlExecutionId===e&&n.push(r.id);return n}var cn=[`serializefromobject`,`deserializetoobject`,`mapelements`,`mappartitions`,`inputadapter`,`columnartorow`,`rowtocolumnar`,`union`];function ln(e){let t=(e??``).toLowerCase();return t.startsWith(`scan`)?`scan`:t.includes(`exchange`)?`exchange`:t.includes(`join`)?`join`:t.includes(`aggregate`)?`aggregate`:t.startsWith(`sort`)?`sort`:t.startsWith(`filter`)?`filter`:t===`adaptivesparkplan`?`aqe`:cn.some(e=>t.startsWith(e))||t.startsWith(`wholestagecodegen`)?`boilerplate`:`transform`}function un(e){return e.exchangeRole!==void 0||ln(e.name)===`exchange`}function dn(e){return e===`BroadcastExchange`}function fn(e,t){if(!t||t===e)return``;let n=(e??``).toLowerCase(),r=e=>e.replace(/#\d+/g,``);if(cn.some(e=>n.startsWith(e))||n===`adaptivesparkplan`)return``;if(n.startsWith(`wholestagecodegen`)){let t=e.match(/\((\d+)\)/);return t?`codegen #${t[1]}`:``}if(n.includes(`exchange`)){let e=t.match(/Exchange\s+(\w+partitioning)\(([^)]+)\)/i);if(e){let t=e[1].toLowerCase().startsWith(`hash`)?`hash`:`range`,n=r(e[2]).split(`,`).map(e=>e.trim()),i=/^\d+$/.test(n[n.length-1])?n.pop():null;return`${t}(${n.map(e=>e.replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,`↑`).replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,`↓`).trim()).slice(0,3).join(`, `)}${i?`, ${i}`:``})`}let n=t.match(/Exchange\s+(\w+)/);return n?n[1]:``}if(n.startsWith(`sort`)&&!n.includes(`merge`)){let e=t.match(/Sort\s+\[([^\]]+)\]/);if(e)return r(e[1]).split(`,`).map(e=>e.trim().replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,`↑`).replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,`↓`)).slice(0,4).join(`, `)}if(n.includes(`join`)){let e=t.match(/Join\s+\[([^\]]*)\][^,]*,\s*\[[^\]]*\][^,]*,\s*(\w+)/i);if(e){let t=r(e[1]).split(`,`)[0].trim();return t?`${t} ${e[2]}`:e[2]}}if(n.includes(`aggregate`)){let e=t.match(/functions=\[([^\]]+)\]/);if(e){let t=[...new Set(e[1].split(`,`).map(e=>(e.trim().match(/^(\w+)\(/)?.[1]??``).replace(/^partial_/,``)))].filter(Boolean);return t.slice(0,5).join(`, `)+(t.length>5?` +${t.length-5}`:``)}}if(n.startsWith(`filter`)){let e=t.match(/Filter\s+(.+)/s);if(e){let t=r(e[1]).trim().replace(/^\((.+)\)$/s,`$1`);return t.length>70?t.slice(0,70)+`…`:t}}if(n.startsWith(`project`)){let e=t.match(/Project\s+\[([^\]]+)\]/);if(e){let t=r(e[1]).split(`,`).map(e=>e.trim());return t.length<=3?t.join(`, `):`${t.length} columns`}return``}if(n.startsWith(`scan`)){if(n.includes(`existingrdd`)){let t=F(e);if(t!==e)return t}let t=e.match(/Scan\s+(\S+)/);return t?t[1]:``}let i=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r(t).replace(RegExp(`^${i}\\s*`,`i`),``).trim();return a.length>80?a.slice(0,80)+`…`:a}function pn(e){let{value:t,metricType:n}=e;return typeof t==`string`?t:n===`size`?M(t):n===`timing`?h(t):n===`nsTiming`?h(t/1e6):t.toLocaleString(`en-US`)}function mn(e){return!e||e.length===0?``:pn([`number of output rows`,`size of files read`,`spill size`,`duration`].map(t=>e.find(e=>e.name===t)).find(Boolean)??e[0])}function hn(e,t,n,r,i=`exclusive`){if(!e||!n)return null;let a=sn(r,t.stages);if(!a.length)return null;let o=new Map;for(let e of a){let n=t.stages.get(e);n&&o.set(e,{submittedAt:n.submittedAt,completedAt:n.completedAt})}return i===`inclusive`?on(e,o,{...n,stageIds:a}):an(e,o,{...n,stageIds:a})}function gn(e){return e.trim().replace(/#\w+$/,``)}function _n(e){return e.replace(/^\[|\]$/g,``).split(`,`).map(gn).filter(Boolean)}function vn(e){let t=[],n=0,r=0;for(let i=0;i<e.length;i++)e[i]===`(`?n++:e[i]===`)`?n--:e[i]===`,`&&n===0&&(t.push(e.slice(r,i).trim()),r=i+1);return t.push(e.slice(r).trim()),t.filter(Boolean)}function yn(e,t){e.warnings.push({type:`crossJoin`,detail:`${t} detected: this can cause severe data explosion.`})}function bn(e,t){e.warnings.push({type:`longFilterCondition`,detail:`Filter condition is ${t} characters: consider simplifying or pushing the filter down closer to the scan.`})}function xn(e,t){return/_delta_log/.test(e)||/_delta_log/.test(t)||/DeltaLogFileIndex/i.test(e+t)||/checkpointMetadata#|sidecar#|commitInfo#/.test(e+t)}function Sn(e,t){let n=null,r=null,i=e.match(/^Scan\s+(parquet|orc|csv|json)\s+(spark_catalog\.\S+)$/i);if(!i&&!/FileScan/i.test(t)&&!t.includes(`JDBCRelation`))return null;if(i)n=i[1].toLowerCase(),r=i[2];else{let e=t.match(/FileScan\s+(parquet|orc|csv|json)\s+(spark_catalog\.[^[\s]+)\[/i);e&&(n=e[1].toLowerCase(),r=e[2])}if(r)return/PreparedDeltaFileIndex/i.test(t)&&(n=`delta`),`${n}:${r.replace(/^spark_catalog\./,``)}`;if(xn(e,t))return null;let a=t.match(/FileScan\s+(parquet|orc|csv|json)\b/i);if(a){let e=t.match(/Location:[^[]*\[([^\]]+)\]/);return e?`${a[1].toLowerCase()}:${F(e[1].split(`,`)[0].trim())}`:null}if(/JDBCRelation/.test(t)){let e=Cn(t).match(/\bFROM\s+(\(|[A-Za-z_][\w.]*)/i);return!e||e[1]===`(`?null:`jdbc:${e[1].toLowerCase()}`}return null}function Cn(e){let t=e.match(/JDBCRelation\(([\s\S]+?)\)\s*(?:SPARK_GEN_SUBQ_\d+\)?)?\s*\[numPartitions/),n=e.match(/JDBCRelation\(\(([\s\S]+?)\)\s*SPARK_GEN_SUBQ/);return(n?n[1]:t?t[1]:``).replace(/\s+/g,` `).trim()}function wn(e,t,n){let r=Sn(e,t);if(!r)return!1;let i=r.indexOf(`:`),a=r.slice(0,i),o=r.slice(i+1);if(a===`jdbc`)return n.scans.push({path:o,format:a,projectedColumns:[],pushedFilters:[],sql:Cn(t)}),!0;let s=t.match(/FileScan\s+\w+\s+(\[[^\]]*\])/i)??t.match(/(\[[^\]]*\])/),c=t.match(/PushedFilters:\s*\[([^\]]*)\]/);return n.scans.push({path:o,format:a,projectedColumns:s?_n(s[1]):[],pushedFilters:c&&c[1]?c[1].split(`,`).map(e=>e.trim()).filter(Boolean):[]}),!0}function Tn(e,t,n){let r=t.match(/^(SortMergeJoin|BroadcastHashJoin|ShuffledHashJoin|BroadcastNestedLoopJoin)\s+(\[[^\]]*\]),\s*(\[[^\]]*\]),\s*(\w+)/);return r?(n.joins.push({joinType:r[1],leftKeys:_n(r[2]),rightKeys:_n(r[3])}),/^Cross$/i.test(r[4])&&yn(n,`Cross join`),!0):!1}function En(e,t,n){let r=t.match(/(?:Object)?HashAggregate\(keys=(\[[^\]]*\]),\s*functions=(\[[\s\S]*\])\)/);if(!r)return!1;let i=r[2].replace(/^\[|\]$/g,``);if(/\bpartial_/.test(i))return!0;let a=vn(i).map(e=>e.replace(/#\w+/g,``).trim()).filter(Boolean).slice(0,8),o=_n(r[1]);return(o.length||a.length)&&n.aggs.push({groupByKeys:o,aggregations:a}),!0}function Dn(e,t){let n=e.match(/hashpartitioning\((.+?),\s*(\d+)\)/i),r=e.match(/rangepartitioning\((.+?),\s*(\d+)\)/i);if(n)t.exchanges.push({partitioning:`hash`,keys:vn(n[1]).map(e=>gn(e.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,``))).filter(Boolean),numPartitions:parseInt(n[2],10)});else if(r)t.exchanges.push({partitioning:`range`,keys:vn(r[1]).map(e=>gn(e.replace(/\s+(ASC|DESC)(\s+NULLS\s+\w+)?/i,``))).filter(Boolean),numPartitions:parseInt(r[2],10)});else if(/RoundRobinPartitioning/i.test(e)){let n=e.match(/RoundRobinPartitioning\((\d+)\)/i);t.exchanges.push({partitioning:`roundrobin`,keys:[],numPartitions:n?parseInt(n[1],10):0})}else/SinglePartition/i.test(e)&&t.exchanges.push({partitioning:`single`,keys:[],numPartitions:1})}function On(e){let t={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]};return e&&Zt(e,e=>{let n=e.name??``,r=e.detail??``;if(/CartesianProduct/i.test(n)||/CartesianProduct/i.test(r))yn(t,`CartesianProduct`);else if(!wn(n,r,t)&&!(/Join/i.test(n)&&Tn(n,r,t))&&!(/Aggregate/i.test(n)&&En(n,r,t))){if(e.exchangeRole===`read`)Dn(r,t);else if(/^Filter/i.test(n)){let e=r.match(/^Filter\s+([\s\S]+)/);e&&e[1].trim().length>1e3&&bn(t,e[1].trim().length)}}},{dedupe:!0}),t}function kn(e){if(!e)return null;let t=e.name??``,n=e.detail??``,r={scans:[],joins:[],aggs:[],exchanges:[],warnings:[]},i=null;if(/CartesianProduct/i.test(t)||/CartesianProduct/i.test(n))i=`cartesian`,yn(r,`CartesianProduct`);else if(wn(t,n,r))i=`scan`;else if(/Join/i.test(t)&&Tn(t,n,r))i=`join`;else if(/Aggregate/i.test(t)&&En(t,n,r))i=`agg`;else if(un(e))i=`exchange`,Dn(n,r);else if(/^Filter/i.test(t)){i=`filter`;let e=n.match(/^Filter\s+([\s\S]+)/);e&&e[1].trim().length>1e3&&bn(r,e[1].trim().length)}let a=r.scans[0]?`scan`:r.joins[0]?`join`:r.aggs[0]?`agg`:r.exchanges[0]||i===`exchange`&&e.exchangeRole!==`write`?`exchange`:null,o=r.scans[0]??r.joins[0]??r.aggs[0]??r.exchanges[0]??null,s=r.warnings[0]??null;return!i||(i===`agg`||i===`filter`)&&!a&&!s?null:{kind:a,warning:s,...o??{}}}function An(e,t){let n=t.reduce((e,t)=>e+(t.totalCores??0),0);if(n<=0){let r=e.resources?.executor?.cores??null;n=r==null?0:t.length*r}return n}function jn(e){let t=[...e].sort((e,t)=>e.time-t.time||e.delta-t.delta),n=0,r=0;for(let e of t)n+=e.delta,n>r&&(r=n);return r}function Mn(e,t,n){let r=new Map,i=[];for(let e of t){let t=e.totalCores??0;r.set(e.executorId,t),i.push({time:e.timestamp,delta:t})}for(let e of n){let t=r.get(e.executorId)??0;i.push({time:e.timestamp,delta:-t})}let a=jn(i);if(a>0)return a;let o=Nn(t,n),s=e.resources?.executor?.cores??null;return s==null?0:o*s}function Nn(e,t){return jn([...e.map(e=>({time:e.timestamp,delta:1})),...t.map(e=>({time:e.timestamp,delta:-1}))])}function Pn(e){if(e==null)return null;let t=String(e).trim().toLowerCase().match(/^([\d.]+)\s*([kmgt]?)(b?)$/);if(!t)return null;let n=parseFloat(t[1]);if(!Number.isFinite(n))return null;switch(t[2]){case`k`:return Math.round(n/1024);case`g`:return Math.round(n*1024);case`t`:return Math.round(n*1024*1024);case`m`:return Math.round(n);default:return t[3]===`b`?Math.round(n/1048576):Math.round(n)}}var Fn=36e5,In=1e3,Ln=1024,Rn=384,zn=.1;function Bn(e){let t=null,n=e=>{typeof e==`number`&&Number.isFinite(e)&&e>0&&(t==null||e>t)&&(t=e)};n(e.app?.startTime),n(e.app?.endTime);for(let t of e.stages.values())n(t.submittedAt),n(t.completedAt);for(let t of[...e.executors.added,...e.executors.removed])n(t.timestamp);return t}var Vn=1024;function Hn(e){let t=e?.config;if(t==null)return null;let n=e=>t[e]==null?void 0:Pn(t[e]),r=n(`spark.executor.memory`)??(t[`spark.executor.memory`]==null?Vn:null);if(r==null)return null;let i=n(`spark.executor.memoryOverhead`);if(i===void 0&&(i=n(`spark.yarn.executor.memoryOverhead`)),i===void 0){let e=Number.parseFloat(t[`spark.executor.memoryOverheadFactor`]??``);i=Math.max(Rn,Math.round(r*(Number.isFinite(e)&&e>0?e:zn)))}let a=String(t[`spark.memory.offHeap.enabled`]).toLowerCase()===`true`?n(`spark.memory.offHeap.size`)??0:0,o=n(`spark.executor.pyspark.memory`)??0;return i===null||a===null||o===null?null:r+i+a+o}function Un(e){let t=e?.config?.[`spark.dynamicAllocation.enabled`];return t==null?null:t.trim().toLowerCase()===`true`?`on`:`off`}function Wn(e){let t=Un(e.app),n=Gn(e);if(n.length===0)return{coreHours:null,memoryGbHours:null,dynamicAllocation:t,executorsPeak:null,executorsMean:null,executorCores:null,executorSeconds:null};let r=e.app?.endTime??Bn(e),i=Hn(e.app),a=0,o=0,s=0,c=!0,l=new Set;for(let{start:e,end:t,cores:r}of n){let n=t-e;s+=n,r==null?c=!1:(a+=r*n,l.add(r)),o+=(i??0)*n}let u=e.app?.startTime,d=r!=null&&u!=null?r-u:0,f=n.flatMap(e=>e.removedAt==null?[]:[{executorId:e.executorId,timestamp:e.removedAt}]);return{coreHours:c?a/Fn:null,memoryGbHours:i==null?null:o/Ln/Fn,dynamicAllocation:t,executorsPeak:Nn(n.map(e=>({executorId:e.executorId,timestamp:e.start})),f),executorsMean:d>0?s/d:null,executorCores:c&&l.size===1?[...l][0]:null,executorSeconds:s/In}}function Gn(e){let t=new Map;for(let n of e.executors.removed){let e=t.get(n.executorId);e?e.push(n.timestamp):t.set(n.executorId,[n.timestamp])}let n=e.app?.endTime??Bn(e),r=Number.parseInt(e.app?.config?.[`spark.executor.cores`]??``,10),i=[],a=new Set;for(let o of e.executors.added){if(a.has(o.executorId))continue;a.add(o.executorId);let e=(t.get(o.executorId)??[]).filter(e=>e>=o.timestamp).sort((e,t)=>e-t)[0]??null;i.push({executorId:o.executorId,start:o.timestamp,end:Math.max(o.timestamp,e??n??o.timestamp),removedAt:e,cores:o.totalCores!=null&&o.totalCores>0?o.totalCores:Number.isFinite(r)?r:null})}return i}function Kn(e){let{coreHours:t}=Wn(e);return t!=null&&t>0?t*Fn:null}function qn(e,t){if(Kn(e)==null)return null;let n=0;for(let{start:r,end:i,cores:a}of Gn(e))for(let[e,o]of t)n+=(a??0)*Math.max(0,Math.min(i,o)-Math.max(r,e));return n}var Jn=new Set([`RACK_LOCAL`,`ANY`]),Yn=5,Xn=10,Zn={totalTasks:null,nonLocalTasks:null,ratio:null,topStages:[]};function Qn(e,{minTasksPerStage:t=Xn,topN:n=Yn}={}){if(!Array.isArray(e)||e.length===0)return Zn;let r=0,i=0,a=[];for(let n of e){let e=n?.localityStats;if(!Array.isArray(e)||e.length===0)continue;let o=0,s=0;for(let{locality:t,count:n}of e)Number.isFinite(n)&&(o+=n,Jn.has(t)&&(s+=n));r+=o,i+=s,o>=t&&a.push({stageId:n.id,nonLocalTasks:s,taskCount:o,ratio:s/o})}if(r===0)return Zn;let o=a.sort((e,t)=>t.nonLocalTasks-e.nonLocalTasks).slice(0,n);return{totalTasks:r,nonLocalTasks:i,ratio:i/r,topStages:o}}function $n(e){return(e.completedAt??0)-(e.submittedAt??0)}function er(e){let t=$n(e);return t>0?(e.executorRunTime??0)/t:0}function tr(e){let t=[...e.values()].filter(e=>$n(e)>0),n=new Map;for(let e of t)n.set(e.id,0);if(t.length===0)return n;let r=[];for(let e of t){let t=er(e);r.push({time:e.submittedAt??0,id:e.id,weight:t,isStart:!0}),r.push({time:e.completedAt??0,id:e.id,weight:t,isStart:!1})}r.sort((e,t)=>e.time-t.time);let i=new Map,a=r[0].time,o=0;for(;o<r.length;){let e=r[o].time;if(e>a&&i.size>0){let t=e-a,r=0;for(let e of i.values())r+=e;for(let[e,a]of i){let o=r>0?a/r:1/i.size;n.set(e,(n.get(e)??0)+t*o)}}for(;o<r.length&&r[o].time===e;){let e=r[o];e.isStart?i.set(e.id,e.weight):i.delete(e.id),o++}a=e}return n}function nr(e){let t=tr(e),n=new Map;for(let r of e.values()){let e=$n(r);if(e<=0)continue;let i=t.get(r.id)??0;n.set(r.id,Math.min(1,i/e))}return n}function rr(e,t){let n=e.taskDurationMax??0;if(t<=0)return n;let r=e.executorRunTime??0;return Math.max(n,r/t)}function ir(e,t,n){let r=Math.max(0,$n(t)-n);return Math.min(e,r)}function ar(e,t){let n=nr(e),r=new Map;for(let i of e.values()){let e=n.get(i.id);e!==void 0&&r.set(i.id,{gate:e,ceiling:rr(i,t),coreWorkFloor:t>0?(i.executorRunTime??0)/t:0})}return r}var or=.999;function sr(e,t){if(e.tailReplayRecoveryMs!=null)return e.tailReplayRecoveryMs;let n=e.stragglerExcessMs??0,r=e.peakConcurrentTasks??0;return n<=0||r<=0?t:Math.max(t,n/r)}function cr(e,t){return Math.max(t,e.stragglerExcessMs??0)}function lr(e){let t=e.taskDurationP50??0;return!((e.stragglerCount??0)>0)||e.longestNonStragglerMs==null?t:Math.max(t,e.longestNonStragglerMs)}function ur(e,t,n,r,{shortensLongestTask:i=!1,removedCoreWorkMs:a=0,longestTaskAfterFixMs:o=0}={}){let s=n.get(t),c=r.get(t);if(!s||!c)return null;let l=s.executorRunTime??0,u=a>0&&l>0?c.coreWorkFloor*Math.max(0,1-a/l):c.coreWorkFloor,d=ir(e,s,i?Math.max((s.taskDurationMax??0)-e,o,u):c.ceiling);return c.gate>=or?{basis:`serial`,wallClock:{low:d,high:d}}:{basis:`contended`,wallClock:{low:d*c.gate,high:d}}}function dr(e,t,n,r){let i=[],a=[];for(let o of e){let e=ur(t.get(o)??0,o,n,r);if(!e)continue;i.push(e);let s=n.get(o);a.push([s.submittedAt??0,s.completedAt??0])}if(i.length===0)return null;let o=i.reduce((e,t)=>e+t.wallClock.high,0),s=i.reduce((e,t)=>e+t.wallClock.low,0),c=j(a).reduce((e,[t,n])=>e+(n-t),0),l=Math.min(o,c),u=Math.min(s,c);return{basis:i.every(e=>e.basis===`serial`)?`serial`:`contended`,wallClock:{low:u,high:l}}}var fr=.005,pr=.02,mr={warnPct:fr,critPct:pr};function hr(e){if(e?.startTime==null||e?.endTime==null)return null;let t=e.endTime-e.startTime;return t>0?t:null}function gr(e,t,n){let r=hr(t);if(r==null)return e;for(let t of e){if(t.type===`partitionSizing`&&t.rule===`maxPartitionTooBig`)continue;let e=t.impactEstimate?.wallClock?.high;if(e==null)continue;let i=e/r,{warnPct:a,critPct:o}=n?.(t.type)??mr;t.impactBand=i>=o?`critical`:i>=a?`warning`:`info`}return e}function _r(e,t){let n=e.sqlExecutionId;if(n==null)return[];let r=t.get(n)?.planTree??null;if(!r)return[];let i=[];return(function t(n){n.stageIds?.includes(e.id)&&i.push(n);for(let e of n.children??[])t(e)})(r),i}var vr=/^(?:\*\(\d+\)\s*)?(?:PythonRDD|BatchEvalPython|ArrowEvalPython|ArrowAggregatePython|ArrowWindowPython|\w+InPandas|\w+InArrow)\w*\b/,yr=/PythonRDD/,br=/org\.apache\.spark\.api\.python\./;function xr(e,t){return yr.test(e.name??``)||br.test(e.details??``)?!0:_r(e,t).some(e=>vr.test(e.name??``))}var Sr=125e6,Cr=2e8;function wr(e){let t=(Array.isArray(e.executorStats)?e.executorStats:[]).reduce((e,t)=>e+(t.totalDuration??0),0),n=e.taskCount??0,r=(e.completedAt??0)-(e.submittedAt??0),i=t-(e.executorRunTime??0);return t<=0||n<=0||r<=0||i<=0?null:{perTaskMs:i/n,concurrency:t/r}}function Tr(e){let t=Array.isArray(e.executorStats)?e.executorStats.length:0;return Math.max(1,t)}function Er(e){let t=e.fetchWaitTime,n=e.executorRunTime??0,r=(e.completedAt??0)-(e.submittedAt??0);return typeof t!=`number`||n<=0||r<=0?null:t/(n/r)}function Dr(e){let t=e.retryWasteMs??0,n=e.wastedAttempts??0,r=Array.isArray(e.retryTaskSamples)?e.retryTaskSamples:[];if(t<=0||n<=0||r.length<n)return t;let i=r.reduce((e,t)=>Math.max(e,(t.attemptNumber??0)+1),1),a=Math.max(1,e.peakConcurrentTasks??1);return Math.min(t,Math.max(i*t/n,t/a))}var Or=134217728,kr=125e6,Ar=15e3,jr=125e6,Mr=.01;function Nr(e,t=new Map){let n=e.executorRunTime??0,r=oe(e.executorCpuTime??0);return n<=0||r<=0||xr(e,t)?!1:r/n<Mr}var Pr={shortensLongestTask:!0};function H(e,t){return t?{basis:`resourceOnly`,wallClock:null,estimateMethod:e,rawWaste:t}:{basis:`informational`,wallClock:null,estimateMethod:e}}function Fr(){return H(`none`)}function Ir(e,t,n,r,i,a){let o=ur(e,t,n.stages,n.occupancy,a);return o?{basis:o.basis,wallClock:o.wallClock,estimateMethod:r,rawWaste:i}:H(r,i)}function Lr(e,t,n,r,i){let a=dr(e,t,n.stages,n.occupancy);return a?{basis:a.basis,wallClock:a.wallClock,estimateMethod:r,rawWaste:i}:null}function Rr(e,t,n){let r=e>0?{value:e,unit:`ms`}:void 0;if(!t||t.length===0)return H(`modeled`,r);let i=e/t.length;return Lr(t,new Map(t.map(e=>[e,i])),n,`modeled`,r)??H(`modeled`,r)}var zr=new Set([`gc`,`retryWaste`,`speculationWaste`]);function Br(e,t){if(t.coreTimeMs!==void 0)return t.coreTimeMs;let n=t.rawWaste;return!n||!zr.has(e.type)?null:{low:n.value,high:n.value}}function Vr(e){return e.flatMap(e=>[e,...[e.earlierAttempts,e.lateAttemptWork].filter(e=>e!=null).map(({durationMs:t,...n})=>({id:e.id,...n,submittedAt:0,completedAt:t??void 0}))])}function Hr(e){let t=0;for(let n of e)typeof n.executorCpuTime==`number`&&Number.isFinite(n.executorCpuTime)&&n.executorCpuTime>0&&(t+=n.executorCpuTime);return t>0?oe(t):null}function Ur(e,t=0){let n=3735928559^t,r=1103547991^t;for(let t=0;t<e.length;t++){let i=e.charCodeAt(t);n=Math.imul(n^i,2654435761),r=Math.imul(r^i,1597334677)}return n=Math.imul(n^n>>>16,2246822507)^Math.imul(r^r>>>13,3266489909),r=Math.imul(r^r>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),(4294967296*(2097151&r)+(n>>>0)).toString(16)}function U(e,t=null){return{kind:`conf`,key:e,direction:`increase`,suggested:t}}function W(e,t=null){return{kind:`conf`,key:e,direction:`decrease`,suggested:t}}function Wr(e,t=null){return{kind:`conf`,key:e,direction:`set`,suggested:t}}function Gr(e){return{kind:`code`,hint:e}}var Kr=`[redacted]`;function qr(e){return e.className?e.className:e.lossReason?e.reason?`${e.reason}: ${e.lossReason}`:e.lossReason:e.reason}var Jr=/^\s*(?:at \S.*|\.\.\.(?: \d+ more)?)$/,Yr=/^((?:Caused by: |Suppressed: )?[\w$]+(?:\.[\w$]+)+)(?::.*)?$/;function Xr(e){let t=[];for(let n of e.split(`
3
+ `)){if(Jr.test(n)){t.push(n);continue}let e=Yr.exec(n.trim());e&&t.push(e[1])}return t.join(`
4
+ `)}function Zr(e){return{...e,message:e.message==null?null:Kr,stackExcerpt:e.stackExcerpt==null?null:Xr(e.stackExcerpt)}}function Qr(e){let t=e.className??e.reason??`Unknown failure`,n=[e.message,e.lossReason].filter(e=>e!=null).join(` · `);return n?`${t}: ${n}`:t}var G=1048576,K=1024*G,$r=1024*K;function ei(e){let[t,n]=[[`GB`,K],[`MB`,G],[`KB`,1024]].find(([,t])=>e>=t)??[`bytes`,1];return`${Math.round(e/n*10)/10} ${t}`}function ti(e,t){let{taskCount:n,spillDiskMax:r=0,spillMemMax:i=0,spillDiskP50:a=0,spillMemP50:o=0}=e;if(n===1){if(r>=t.singleTaskDiskGiB*K||i>=t.singleTaskMemGiB*K)return{magnitude:`severe`}}else{let e=n>0?r/n:0;if(r>=t.highDiskGiB*K||e>=t.highTaskDiskMB*G||i>=t.highMemGiB*K)return{magnitude:`high`};if(r>=t.medDiskMB*G||i>=t.medMemGiB*K)return{magnitude:`medium`}}if(n>=t.skewMinTasks){if(a>0&&r/a>t.skewRatio&&r>=t.skewDiskFloorMB*G)return{magnitude:`high`};if(o>0&&i/o>t.skewRatio&&i>=t.skewMemFloorMB*G)return{magnitude:`medium`}}return null}function ni(e){return!Array.isArray(e)||e.length===0?null:[...e].sort((e,t)=>t.count-e.count)[0].reason}function ri(e,t){let n=new Set;for(let t of e)for(let e of t.stageIds??[])n.add(e);return n.size>0?[...n].sort((e,t)=>e-t):t}function ii(e,t={}){let{includeDetail:n=!1,normalizeDetail:r=e=>e}=t,i=new WeakMap,a=[];function o(e,t){a.push(e);let s=e.exchangeRole===`read`?e.children[0]:null,c=s?s.children:e.children??[],l=s?s.metrics:e.metrics,u=c.map(e=>o(e,!1)),d=1+u.reduce((e,t)=>e+t.size,0),f=(l??[]).map(e=>e.name).sort().join(`,`),p=u.map(e=>Ur(e.fingerprint)).join(`,`),m={size:d,fingerprint:t&&n?`${e.name}[${f}]<${r(e.detail??``)}>{${p}}`:`${e.name}[${f}]{${p}}`};return i.set(e,m),m}return o(e,!0),{shapeOf:i,allNodes:a}}function ai(e){let t=e.replace(/#\d+L?/g,``).replace(/,?\s*plan_id=\d+/g,``).replace(/\[codegen id\s*:\s*\d+\]/gi,`[codegen id]`).replace(/\bBuild(Left|Right)\b/g,`BuildSide`);return t=t.replace(/(?<![A-Za-z_])([A-Za-z_][\w.]*)\s*=\s*([A-Za-z_][\w.]*)/g,(e,t,n)=>{let[r,i]=[t,n].sort();return`${r} = ${i}`}),t}var oi=/Join/i,si=new WeakMap;function ci(e){let t=si.get(e);return t===void 0&&(t=Sn(e.name??``,e.detail??``),si.set(e,t)),t}function li(e){return oi.test(e)?`join`:e===`Union`?`union`:null}function ui(e){let t=[],n=[];function r(e){n.push(e);let i=(e.children??[]).map(r);n.pop();let a=(e.metrics??[]).map(e=>e.name).sort().join(`,`),o=i.map(e=>Ur(e.fingerprint)).join(`,`),s=`${e.name}[${a}]{${o}}`,c=new Map,l=ci(e);if(l){let t=(e.metrics??[]).find(e=>e.name===yi);c.set(l,(c.get(l)??0)+(t?t.value:0))}for(let e of i)for(let[t,n]of e.leafRelationBytes)c.set(t,(c.get(t)??0)+n);let u=li(e.name??``);return u&&t.push({node:e,operator:u,fingerprint:`${e.name}[${a}]<${ai(e.detail??``)}>{${o}}`,leafRelationBytes:new Map(c),ancestorNodes:n.slice()}),{fingerprint:s,leafRelationBytes:c}}return r(e),t}function di(e){let t=null;return Zt(e,e=>{t||=ci(e)}),t}function fi(e,{minSubtreeSize:t,minOccurrences:n}){let{shapeOf:r,allNodes:i}=ii(e),a=i.filter(e=>r.get(e).size>=t&&e.exchangeRole!==`write`),o=new Map;for(let e of a){let t=r.get(e).fingerprint;o.has(t)||o.set(t,[]),o.get(t).push(e)}let s=[...o.values()].filter(e=>e.length>=n).sort((e,t)=>r.get(t[0]).size-r.get(e[0]).size),c=new WeakSet,l=e=>{c.add(e);for(let t of e.children??[])l(t)},u=[];for(let e of s){let t=e.filter(e=>!c.has(e));if(!(t.length<n)){for(let e of t)l(e);u.push({rootName:t[0].name,subtreeSize:r.get(t[0]).size,occurrences:t.length,isExchangeRoot:un(t[0]),sampleRelation:di(t[0]),groupIndex:u.length,nodes:t})}}return u}function pi(e){let t=e=>{let t=[];return Zt(e,e=>t.push(e.detail??``)),t},n=e=>ai(e).replace(/\b(\w+QueryStage)\s+\d+/g,`$1`),r=t(e[0]),i=[];for(let a of e.slice(1)){let e=t(a);if(e.length!==r.length)return!1;for(let t=0;t<r.length;t++)if(e[t]!==r[t]&&(i[t]??=n(r[t]),n(e[t])!==i[t]))return!1}return!0}function mi(e){return e.exchangeRole!==`write`&&!e.name.startsWith(`WholeStageCodegen`)}function hi(e){let t=new Map;for(let n of e)if(mi(n))for(let e of n.stageIds??[])t.set(e,(t.get(e)??0)+1);return t}function gi(e,t){let n={};for(let[r,i]of hi(e))n[r]=i/(t.get(r)??i);return n}function _i(e,t,n){return e<=n.minSubtreeSize&&t<=n.minOccurrences?`low`:e>=n.minSubtreeSize*2||t>=n.minOccurrences+2?`high`:`medium`}var vi=`number of files read`,yi=`size of files read`,bi=`number of written files`,xi=`written output`;function Si(e){let t=(e.metrics??[]).find(e=>e.name===`data size`);if(t)return t.value;let n=0;for(let t of e.children??[])n+=Si(t);return n}function Ci(e){if((e.metrics??[]).find(e=>e.name===`data size`))return[e];let t=[];for(let n of e.children??[])t.push(...Ci(n));return t}function wi(e){if(e.length<3)return null;let t=Xt(e.map(e=>e.value).sort((e,t)=>e-t));if(t<=0)return null;let n=e.reduce((e,t)=>t.value>e.value?t:e);return{key:n.key,ratio:n.value/t,value:n.value}}function Ti(){return Sa.map(e=>({type:e.type,version:e.version??1,scope:e.scope,thresholds:e.thresholds,docAnchor:e.docAnchor}))}function Ei(e,t){let{taskCount:n,taskDurationP50:r,taskDurationP95:i,taskDurationMax:a}=e;return r===0?null:(n??0)>=t?{ratio:i/r,metric:`P95/median`}:{ratio:a/r,metric:`max/median`}}function Di(e,t,n){return t==null||e>=t*n}function Oi(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0),i=hr(t.app);return i!=null&&r>0&&r<i*n}function ki(e,t,n){return{wasteMs:sr(e,t),removedCoreWorkMs:cr(e,t),longestTaskAfterFixMs:n}}function Ai(e,t){let n=e.taskDurationP50??0;return ki(e,Math.max(0,t?(e.taskDurationP95??0)-n:(e.taskDurationMax??0)-n),lr(e))}function ji(e){let t=lr(e);return ki(e,Math.max(0,(e.taskDurationMax??0)-t),t)}function Mi(e,t,n){return{...Ir(e.wasteMs,t,n,`measured`,{value:e.wasteMs,unit:`ms`},{...Pr,removedCoreWorkMs:e.removedCoreWorkMs,longestTaskAfterFixMs:e.longestTaskAfterFixMs}),coreTimeMs:{low:e.removedCoreWorkMs,high:e.removedCoreWorkMs}}}function Ni(e,t,n){return Mi(e,t,n.impact).wallClock?.high??e.wasteMs}function Pi(e,t){if(t===`spark.sql.shuffle.partitions`)return`200`;if(t===`spark.sql.autoBroadcastJoinThreshold`)return String(10*G);let n=/^(\d+)\.(\d+)/.exec(e?.sparkVersion??``);if(n==null)return;let[r,i]=[Number(n[1]),Number(n[2])];if(t===`spark.sql.adaptive.enabled`)return r>3||r===3&&i>=2?`true`:`false`;if(t===`spark.sql.adaptive.skewJoin.enabled`||t===`spark.sql.adaptive.coalescePartitions.enabled`)return r>=3?`true`:void 0}function Fi(e,t){return(e?.config?.[t]??Pi(e,t))?.trim()}function Ii(e,t,n){let r=Fi(e,t);return typeof n==`boolean`?r?.toLowerCase()===String(n):r===n}function Li(e,t,n){return Ii(e,t,n)?[]:[Wr(t,n)]}function Ri(e,t,n,r,i){return e?{text:i,remediation:[]}:{text:r,remediation:[Wr(t,n)]}}var zi=`salt the key or repartition on a better key`;function Bi(e){return e.shuffleReadBytes>0&&e.shuffleReadBytes>=e.inputBytes?`shuffle`:e.inputBytes>0?`input`:`other`}function Vi(e){let t=/^(\d+)\./.exec(e?.sparkVersion??``);return t!=null&&Number(t[1])<3}function Hi(e,t,n){if(n||e.shuffleReadBytes>0&&e.shuffleReadBytes>=e.inputBytes){let n=!1;return Zt(e.sqlExecutionId==null?null:t.sql.get(e.sqlExecutionId)?.planTree,e=>{Ui.has(e.name)&&(n=!0)}),n?`shuffleJoin`:`other`}return e.inputBytes>0?`inputScan`:`other`}var Ui=new Set([`SortMergeJoin`,`ShuffledHashJoin`]);function Wi(e,t,n=!1){let r=Hi(e,t,n);return r===`inputScan`?{origin:r,text:`the stage reads uneven input files: compact small files or split large ones (lower spark.sql.files.maxPartitionBytes)`,remediation:[W(`spark.sql.files.maxPartitionBytes`)]}:r===`other`?{origin:r,text:zi,remediation:[Gr(zi)]}:Vi(t.app)?{origin:`other`,text:zi,remediation:[Gr(zi)]}:{origin:r,...Gi(t.app)}}function Gi(e){let t=`spark.sql.adaptive.skewJoin.enabled`;if(Ii(e,`spark.sql.adaptive.enabled`,!1))return{text:`AQE is off, so enable it (spark.sql.adaptive.enabled) for skew-join handling to apply; otherwise ${zi}`,remediation:[Wr(`spark.sql.adaptive.enabled`,!0),...Li(e,t,!0)]};let n=Ri(Ii(e,t,!0),t,!0,`for join-driven skew, enable AQE skew-join handling (${t}); otherwise ${zi}`,`AQE skew-join handling is already on, so ${zi}`);return n.remediation.length===0?{...n,remediation:[Gr(zi)]}:n}function Ki(e,t,n){let r=`spark.dynamicAllocation.enabled`;return Ri(e.resources?.dynamicAllocationEnabled===!0||Ii(e,r,!0),r,!0,t,n)}function qi(e,t,n){let r=Ki(e,t,n);return r.remediation.length>0?{...r,remediation:[...r.remediation,W(`spark.executor.instances`)]}:Number.parseInt(e.config?.[`spark.dynamicAllocation.minExecutors`]??``,10)>0?{text:`${n} by lowering spark.dynamicAllocation.maxExecutors and spark.dynamicAllocation.minExecutors`,remediation:[W(`spark.dynamicAllocation.maxExecutors`),W(`spark.dynamicAllocation.minExecutors`)]}:{text:`${n} by lowering spark.dynamicAllocation.maxExecutors`,remediation:[W(`spark.dynamicAllocation.maxExecutors`)]}}function Ji(e){let t=Fi(e,`spark.sql.shuffle.partitions`);return t!=null&&/^\d+$/.test(t)?Number(t):null}function Yi(e,t){let n=Ji(t),r=Math.ceil(e.shuffleReadBytes/Or),i=Math.max(1,e.taskCount),a=`raise`;return e.shuffleReadBytes/i<=134217728?a=`sufficient`:n!=null&&e.taskCount<n&&Ii(t,`spark.sql.adaptive.enabled`,!0)&&Ii(t,`spark.sql.adaptive.coalescePartitions.enabled`,!0)?a=`aqeCoalesced`:n!=null&&n>=r&&(a=`ownPartitioning`),{partitions:a,count:n,needed:r}}var Xi=`spark.sql.adaptive.advisoryPartitionSizeInBytes`;function Zi(e,t){let{partitions:n,count:r,needed:i}=Yi(e,t);return n===`aqeCoalesced`?{partitions:n,text:`AQE coalesced the shuffle into ${e.taskCount} tasks (from ${r} configured partitions): lower ${Xi} so each partition is smaller`,remediation:[W(Xi)]}:n===`ownPartitioning`?{partitions:n,text:`spark.sql.shuffle.partitions is already ${r}, so raise this stage's own partition count (its repartition(n) or RDD parallelism) so each partition is smaller`,remediation:[]}:{partitions:n,text:`raise spark.sql.shuffle.partitions so each partition is smaller`,remediation:[U(`spark.sql.shuffle.partitions`,r==null?null:i)]}}function Qi(e){let t=/^(-?\d+(?:\.\d+)?)\s*([kmgt]?)b?$/i.exec(e?.trim()??``);return t==null?null:t[2]===``?Number(t[1]):Number(t[1])*1024**(`kmgt`.indexOf(t[2].toLowerCase())+1)}function $i(e){let t=Fi(e,`spark.sql.autoBroadcastJoinThreshold`);return t!=null&&/^-\d+$/.test(t)?-1:Qi(t)}function ea(e){return e?.resources?.dynamicAllocationEnabled===!1||e?.config?.[`spark.dynamicAllocation.enabled`]?.trim().toLowerCase()===`false`}var ta={rddInfo:`This ratio is a point-in-time storage snapshot from stage-submission events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`,blockUpdates:`This ratio is the RDD's peak cache residency rebuilt from block-update events, not a runtime read-count. Confirm against the Spark UI's Storage tab before acting.`};function na(e){return e<10?`low`:e>=50?`high`:`medium`}function ra({id:e,name:t}){return`RDD ${t?t.length>40?`${t.slice(0,40)}...`:t:e}`}function ia(e,t,n){let r=Math.round(t*100),i=100-r;return{type:`cacheUtilization`,variant:`partialCache`,stageId:null,rddId:e.id,rddName:e.name||`RDD ${e.id}`,impactBand:n,metric:`cachedRatio`,value:r,confidence:na(e.numPartitions),validationRequired:ta[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`${ra(e)} is ${i}% evicted from cache (${r}% of partitions cached): increase executor memory or reduce the cached dataset size.`,remediation:[U(`spark.executor.memory`)]}}function aa(e,t,n){let r=Math.round(t*100);return{type:`cacheUtilization`,variant:`diskSpillover`,stageId:null,rddId:e.id,rddName:e.name||`RDD ${e.id}`,impactBand:n,metric:`diskRatio`,value:r,confidence:na(e.numPartitions),validationRequired:ta[e.storageSource??`rddInfo`],memorySize:e.memorySize,diskSize:e.diskSize,numCachedPartitions:e.numCachedPartitions,numPartitions:e.numPartitions,recommendation:`${ra(e)} is ${r}% spilled to disk despite requesting MEMORY_AND_DISK: executor memory may be too small for it.`,remediation:[U(`spark.executor.memory`)]}}function oa(e,t){return{type:`cacheUtilization`,variant:`storageUnobserved`,stageId:null,impactBand:`info`,metric:`persistedRdds`,value:e,dataUnavailable:!0,recommendation:`${e===1?`1 persisted RDD has`:`${e} persisted RDDs have`} no cache-storage evidence in this log, so eviction and disk spillover can't be checked: Spark 2.3+ records cached sizes only as block updates, which need spark.eventLog.logBlockUpdates.enabled=true.`,remediation:Li(t,`spark.eventLog.logBlockUpdates.enabled`,!0)}}function sa(e,t,n){for(let[r,i]of Object.entries(n)){if(!Object.hasOwn(t,r))throw Error(`Detector ${e} has no threshold "${r}".`);let n=t[r];if(!(Array.isArray(n)?Array.isArray(i)&&i.length===n.length:typeof i==`number`))throw Error(`Threshold ${e}.${r} must have the same shape as its default.`)}return Object.freeze({...t,...n})}function ca(e,t,n){let r=Object.freeze({...t.thresholds}),i=n(r);return{...t,scope:e,thresholds:r,withThresholds:e=>e&&Object.keys(e).length>0?n(sa(t.type,r,e)):i}}function q(e){return ca(`stage`,e,t=>(n,r)=>e.detect(n,r,t))}function la(e){return ca(`sql`,e,t=>(n,r)=>e.detect(n,r,t))}function ua(e){return ca(`app`,e,t=>n=>e.detect(n,t))}function da(e){return ca(`config`,e,t=>n=>e.detect(n,t))}function fa(e,t){return e<=t*1.5?`low`:e>=t*5?`high`:`medium`}function pa(e,t,n){return n===`high`?e<=t.warnPct100*1.5?`low`:e>=t.warnPct100*3?`high`:`medium`:e>=t.lowInfoPct100*.66?`low`:e<=t.lowInfoPct100*.2?`high`:`medium`}function ma(e,t,n){return e<t*1.5?`low`:e>=n?`high`:`medium`}function ha(e,t){return e<=t*1.5?`low`:e>=t*4?`high`:`medium`}function ga(e,t,n){let r=t>0?e/(n*t):1/0;return r<=1.5?`low`:r>=3?`high`:`medium`}function _a(e,t,n){let r={low:0,medium:1,high:2},i=e<n.warnRatio*1.5?`low`:e>=n.critRatio?`high`:`medium`,a=t<n.minTasks*2?`low`:t>=n.minTasks*4?`high`:`medium`;return r[i]<=r[a]?i:a}function va(e,t,n){return e<=t*1.5?`low`:e>=n?`high`:`medium`}function ya(e,t){return e<=t?`low`:e>=t*3?`high`:`medium`}function ba(e){return`Checked only on stages with at least ${e/1e3}s of executor run time.`}var xa=`This event log never recorded an ApplicationEnd event: the capture stopped before the run finished (a job still running, a rotated log, or a cut-short capture), so every figure on this board covers only what was captured.`,Sa=[q({type:`skew`,order:30,fixEffort:`code`,version:1,emits:[`skew`],docAnchor:`#bottleneck-skew`,thresholds:{ratioWarn:3,minTasksForP95:20,floorPctWarn:fr},detect(e,t,n){let r=Ei(e,n.minTasksForP95);if(r===null)return null;let{ratio:i,metric:a}=r;if(i<=n.ratioWarn||!Di(Ni(Ai(e,a===`P95/median`),e.id,t),hr(t.app),n.floorPctWarn))return null;let o=Math.round(i*10)/10,s=Wi(e,t);return{type:`skew`,stageId:e.id,origin:s.origin,impactBand:`warning`,metric:a,value:o,confidence:fa(i,n.ratioWarn),validationRequired:`Flagged only when it costs at least ${pe(n.floorPctWarn)} of run time.`,recommendation:`Task duration ratio (${a}) is ${o}×: ${s.text}.`,remediation:s.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?Mi(Ai(n,e.metric===`P95/median`),e.stageId,t):null}}),q({type:`stageShape`,order:35,fixEffort:`code`,version:2,emits:[`stageShape`],docAnchor:`#bottleneck-stage-shape`,thresholds:{pRatioMax:.5,oiRatioMax:10,skewWarn:3,stageShareMin:.5,lowParallelismFloorPct:.005,taskStageSkewFloorPct:.005},detect(e,t,n){let r=[],i=(e.executorStats??[]).length*(t.app?.resources?.executor?.cores??1),a=(e.completedAt??0)-(e.submittedAt??0);if(i>0&&!Oi(e,t,n.lowParallelismFloorPct)){let t=e.taskCount/i;t<n.pRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`lowParallelism`,metric:`pRatio`,value:Math.round(t*100)/100,totalCores:i,recommendation:`This stage runs ${e.taskCount} ${e.taskCount===1?`task`:`tasks`} across ~${i} cores: it is under-parallelized and leaves cluster capacity idle.`})}if(e.inputBytes>0){let t=e.outputBytes/e.inputBytes;t>n.oiRatioMax&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`dataExplosion`,metric:`oiRatio`,value:Math.round(t*10)/10,recommendation:`This stage outputs ${Math.round(t)}× its input volume: check for an exploding join or a cross product.`})}if(a>0&&e.taskCount>1&&e.taskDurationP50>0&&!Oi(e,t,n.taskStageSkewFloorPct)){let t=e.taskDurationMax/a,o=e.taskDurationMax/e.taskDurationP50;t>n.stageShareMin&&o>n.skewWarn&&r.push({type:`stageShape`,stageId:e.id,impactBand:`info`,rule:`taskStageSkew`,metric:`taskStageSkew`,value:Math.round(t*100)/100,totalCores:i,recommendation:`The longest task ran for ${Math.round(t*100)}% of this stage's wall-clock, ${Math.round(o*10)/10}× the median task: a single straggler is gating the whole stage.`})}return r},estimate(e,t){let n=t.stages.get(e.stageId);if(!n)return null;if(e.rule===`lowParallelism`){let t=(n.completedAt??0)-(n.submittedAt??0);return H(`measured`,{value:Math.max(0,(e.totalCores??0)-(n.taskCount??0))*t,unit:`coreMs`,idle:!0})}if(e.rule===`dataExplosion`)return H(`measured`,{value:Math.max(0,(n.outputBytes??0)-(n.inputBytes??0)),unit:`bytes`});if(e.rule===`taskStageSkew`){let t=e.totalCores??0,r=n.taskCount??0;return H(`measured`,{value:Math.max(0,Math.min(t,r)-1)*Math.max(0,(n.taskDurationMax??0)-(n.taskDurationP50??0)),unit:`coreMs`,idle:!0})}return null}}),q({type:`shuffle`,order:20,fixEffort:`config`,version:1,emits:[`shuffle`],docAnchor:`#bottleneck-shuffle`,thresholds:{minBytes:50*G,stageFloorPct:.005},detect(e,t,n){let r=e.shuffleReadBytes;if(r<=n.minBytes||Oi(e,t,n.stageFloorPct))return null;let{partitions:i,count:a}=Yi(e,t.app),o=M(r/Math.max(1,e.taskCount)),s=i===`sufficient`?{text:`its ${e.taskCount} tasks already read about ${o} each, so more partitions will not help: consider a broadcast join for the smaller side`,remediation:[]}:i===`aqeCoalesced`?{text:`AQE coalesced it into ${e.taskCount} tasks (from ${a} configured partitions): consider lowering ${Xi} or adding a broadcast join`,remediation:[W(Xi)]}:i===`ownPartitioning`?{text:`spark.sql.shuffle.partitions is already ${a}, so consider raising this stage's own partition count (its repartition(n) or RDD parallelism) or adding a broadcast join`,remediation:[]}:{text:`consider increasing spark.sql.shuffle.partitions or adding a broadcast join`,remediation:[U(`spark.sql.shuffle.partitions`)]};return{type:`shuffle`,stageId:e.id,impactBand:`info`,partitions:i,metric:`shuffleReadBytes`,value:r,recommendation:`${M(r)} shuffled in this stage: ${s.text}.`,remediation:s.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.shuffleReadBytes??0,i=r/(Sr*Tr(n))*1e3,a=Er(n);return Ir(a==null?i:Math.min(i,a),e.stageId,t,a!=null&&a<i?`measured`:`modeled`,{value:r,unit:`bytes`})}}),q({type:`partitionSizing`,order:22,fixEffort:`config`,version:1,emits:[`partitionSizing`],docAnchor:`#bottleneck-partition-sizing`,thresholds:{skewRatio:5,skewFloorBytes:256*G,lowParTotalBytes:K,lowParMaxTasks:7,maxPartBytes:5*K},detect(e,t,n){let r=[],{shuffleReadP50:i,shuffleReadMax:a,shuffleReadBytes:o,taskCount:s}=e;if(a>n.skewRatio*i&&a>n.skewFloorBytes){let n=i>0?`${Math.round(a/i*10)/10}× the median (${M(i)})`:`far larger than the median, which is effectively empty`,o=Wi(e,t,!0);r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`shufflePartitionSkew`,origin:o.origin,metric:`shuffleReadMax`,value:a,recommendation:`The largest shuffle partition (${M(a)}) is ${n}: ${o.text}.`,remediation:o.remediation})}if(o>=n.lowParTotalBytes&&s<=n.lowParMaxTasks){let n=Zi(e,t.app);r.push({type:`partitionSizing`,stageId:e.id,impactBand:`warning`,rule:`lowShuffleParallelism`,partitions:n.partitions,metric:`taskCount`,value:s,recommendation:`${Math.round(o/K*10)/10} GB of shuffle spread over only ${s} tasks: ${n.text}.`,remediation:n.remediation})}return a>=n.maxPartBytes&&r.push({type:`partitionSizing`,stageId:e.id,impactBand:`critical`,rule:`maxPartitionTooBig`,metric:`shuffleReadMax`,value:a,recommendation:`A single shuffle partition (${M(a)}) exceeds 5 GB: this will OOM or spill heavily. Repartition to break it up before this stage.`}),r},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=0,i=0;if(e.rule===`maxPartitionTooBig`)r=(n.shuffleReadMax??0)/Sr*1e3;else if(e.rule===`shufflePartitionSkew`)r=Math.max(0,(n.shuffleReadMax??0)-(n.shuffleReadP50??0))/Sr*1e3;else if(e.rule===`lowShuffleParallelism`){let e=Math.ceil((n.shuffleReadBytes??0)/Or),t=n.taskCount??0;if(e>t&&t>0){r=Math.max(0,(n.completedAt??0)-(n.submittedAt??0))*(1-t/e);let a=n.taskDurationMax??0;i=a*t/e,a>0&&(r=Math.min(r,a-i))}}else return null;return Ir(r,e.stageId,t,`modeled`,{value:r,unit:`ms`},e.rule===`lowShuffleParallelism`?{...Pr,longestTaskAfterFixMs:i}:void 0)}}),q({type:`spill`,order:10,fixEffort:`code`,version:1,emits:[`spill`],docAnchor:`#bottleneck-spill`,thresholds:{singleTaskDiskGiB:1,singleTaskMemGiB:4,highDiskGiB:1,highTaskDiskMB:512,highMemGiB:4,medDiskMB:256,medMemGiB:1,skewRatio:5,skewDiskFloorMB:128,skewMemFloorMB:256,skewMinTasks:10,stageFloorPct:.005},detect(e,t,n){if(e.memoryBytesSpilled===0||Oi(e,t,n.stageFloorPct))return null;let r=e.spillClassification,i=r===`skew`||r===`volume`,a=ti(e,n),o=Bi(e),s=o===`shuffle`;return{type:`spill`,stageId:e.id,impactBand:`warning`,reads:o,spillMagnitude:a?.magnitude,metric:`memoryBytesSpilled`,value:e.memoryBytesSpilled,confidence:i?`medium`:`low`,validationRequired:i?`Spill cause is inferred from the share of tasks that spilled: confirm against per-task spill metrics in the Spark UI.`:`Spill cause could not be classified: inspect per-task spill metrics in the Spark UI before acting.`,recommendation:r===`skew`?`${M(e.memoryBytesSpilled)} spilled, skew-driven: fix task skew first; adding memory will not help.`:s?`${M(e.memoryBytesSpilled)} spilled: raise spark.sql.shuffle.partitions or increase executor memory.`:`${M(e.memoryBytesSpilled)} spilled: this stage reads no shuffle, so increase executor memory or process less data per task.`,remediation:r===`skew`?[]:[...s?[U(`spark.sql.shuffle.partitions`)]:[],U(`spark.executor.memory`)]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.diskBytesSpilled??0;return Ir(r/(Cr*Tr(n))*1e3,e.stageId,t,`modeled`,{value:r,unit:`bytes`})}}),q({type:`gc`,order:50,fixEffort:`config`,version:1,emits:[`gc`],docAnchor:`#bottleneck-gc`,thresholds:{warnPct100:10,lowInfoPct100:5,minRunTimeMs:1e4,lowInfoFloorPct:.005},detect(e,t,n){let r=e.gcPct;if((e.executorRunTime??0)>=n.minRunTimeMs&&r>n.warnPct100){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,impactBand:`warning`,metric:`gcPct`,value:t,confidence:pa(r,n,`high`),validationRequired:ba(n.minRunTimeMs),recommendation:`GC consumed ${t}% of executor run time: reduce object creation, use primitive types, avoid UDFs, increase executor memory.`,remediation:[U(`spark.executor.memory`)]}}if((e.executorRunTime??0)>=n.minRunTimeMs&&r<n.lowInfoPct100&&!Oi(e,t,n.lowInfoFloorPct)){let t=Math.round(r*10)/10;return{type:`gc`,stageId:e.id,direction:`low`,impactBand:`info`,metric:`gcPct`,value:t,confidence:pa(r,n,`low`),validationRequired:ba(n.minRunTimeMs),recommendation:`GC consumed only ${t}% of executor run time: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`,remediation:[W(`spark.executor.memory`)]}}return null},estimate(e,t){if(e.direction===`low`)return H(`none`);if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=(n.completedAt??0)-(n.submittedAt??0),i=n.executorRunTime??0,a=n.jvmGCTime??0,o={value:a,unit:`coreMs`};return i<=0||r<=0?H(`modeled`,o):Ir(a/(i/r),e.stageId,t,`modeled`,o)}}),q({type:`slowHost`,order:60,fixEffort:`config`,version:1,emits:[`slowHost`],docAnchor:`#bottleneck-slow-host`,thresholds:{minHosts:3,minTasks:15,ratioWarn:2,minShare:.2,shareWarn:.75,taskShareWarn:.5,ratioTiers:[1.33,1.78,3.16,10],floorMs:1e3,floorBytes:64*G,stageFloorPct:.005},detect(e,t,n){let r=e.hostStats??[],i=e.executorStats??[];if(r.length<n.minHosts&&i.length<n.minHosts||e.taskCount<n.minTasks||Oi(e,t,n.stageFloorPct))return null;let a=[],o=Ri(Ii(t.app,`spark.speculation`,!0),`spark.speculation`,!0,`check what it was running, and consider enabling spark.speculation to relaunch a lagging task automatically`,`check what it was running; speculation is already on, so a lagging task there is already relaunched`);if(r.length>=n.minHosts){let t=r.map(e=>({host:e.host,taskCount:e.taskCount,mean:e.totalDuration/e.taskCount})),i=Xt([...t].map(e=>e.mean).sort((e,t)=>e-t));if(i>0)for(let r of t){let t=r.mean/i,s=r.taskCount/e.taskCount;t<n.ratioWarn||s<n.minShare||r.mean<n.floorMs||a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,metric:`hostMeanRatio`,value:Math.round(t*10)/10,hostMeanMs:r.mean,host:r.host,hostTaskShare:Math.round(s*100)/100,recommendation:`${r.host} may just hold data locality for its tasks or carry one heavy stage, not necessarily a hardware fault: ${o.text}.`,remediation:o.remediation})}let s=r.reduce((e,t)=>e+t.totalDuration,0);if(s>0)for(let t of r){let r=t.totalDuration/s,i=t.taskCount/e.taskCount;r>=n.shareWarn&&i>=n.taskShareWarn&&a.push({type:`slowHost`,stageId:e.id,impactBand:`warning`,variant:`durationShare`,metric:`hostDurationShare`,value:Math.round(r*100)/100,hostMeanMs:t.totalDuration/t.taskCount,host:t.host,hostTaskShare:Math.round(i*100)/100,recommendation:`${t.host} is doing ${Math.round(r*100)}% of this stage's total task time: check for data locality or partition assignment skewing work onto one node.`})}}let s=e.executorStats??[],c=n.ratioTiers,l=e=>e>=c[3]?`critical`:e>=c[1]?`warning`:e>=c[0]?`info`:null,u=n.floorMs,d=n.floorBytes,f=[{dimension:`taskTime`,floor:u,samples:s.filter(e=>e.taskCount>0).map(e=>({key:e.executorId,value:e.totalDuration/e.taskCount}))},{dimension:`inputBytes`,floor:d,samples:s.map(e=>({key:e.executorId,value:e.inputBytes??0}))},{dimension:`shuffleBytes`,floor:d,samples:s.map(e=>({key:e.executorId,value:(e.shuffleReadBytes??0)+(e.shuffleWriteBytes??0)}))}],p=e.executorMetrics instanceof Map?e.executorMetrics:null;p&&p.size>=3&&f.push({dimension:`storageMemory`,floor:d,samples:[...p.entries()].map(([e,t])=>({key:e,value:(t.onHeapStorageMemory??0)+(t.offHeapStorageMemory??0)}))});for(let t of f){let n=wi(t.samples);if(!n||n.value<t.floor)continue;let r=l(n.ratio);if(!r)continue;let i=t.dimension===`taskTime`?`info`:r;a.push({type:`slowHost`,stageId:e.id,impactBand:i,variant:`multiDim`,dimension:t.dimension,metric:`execMaxMedianRatio`,value:Math.round(n.ratio*10)/10,execMaxValue:n.value,executorId:n.key,recommendation:`Executor ${n.key}'s ${ne[t.dimension]} is ${Math.round(n.ratio*10)/10}× the median: investigate uneven partition assignment or a degraded executor.`})}return a},estimate(e,t){let n=e.metric===`hostMeanRatio`||e.variant===`durationShare`?e.hostMeanMs:e.variant===`multiDim`&&e.dimension===`taskTime`?e.execMaxValue:null;if(n==null)return H(`none`);if(e.stageId==null)return null;let r=t.stages.get(e.stageId);if(!r)return null;let i=Math.max(0,n-(r.taskDurationP50??0));return Ir(i,e.stageId,t,`measured`,{value:i,unit:`ms`})}}),q({type:`stageSlowness`,order:65,fixEffort:`code`,version:2,emits:[`stageSlowness`],docAnchor:`#bottleneck-stage-slowness`,thresholds:{infoMin:15},suppressedBy:`slowHost`,detect(e,t,n){let r=(e.completedAt??0)-(e.submittedAt??0);if(!(r>0))return null;let i=r/6e4,a=i>=n.infoMin?`info`:null;if(!a)return null;let o=Math.round(i*10)/10,s=Bi(e),c=s===`shuffle`?`This stage ran ${o} minutes with no more specific cause flagged: often a partition-count problem, raise parallelism via spark.sql.shuffle.partitions or spark.default.parallelism, or check for a large per-task data volume driving heavy shuffle and spill.`:s===`input`?`This stage ran ${o} minutes with no more specific cause flagged and reads mostly input files: often too few or too uneven input partitions, so check input file sizes and lower spark.sql.files.maxPartitionBytes, or look for a large per-task data volume driving heavy spill.`:`This stage ran ${o} minutes with no more specific cause flagged and reads neither shuffle nor input files: check what it computes and for a large per-task data volume driving heavy spill.`;return{type:`stageSlowness`,stageId:e.id,impactBand:a,metric:`stageDurationMinutes`,value:o,reads:s,recommendation:c,remediation:s===`shuffle`?[U(`spark.sql.shuffle.partitions`),U(`spark.default.parallelism`)]:s===`input`?[W(`spark.sql.files.maxPartitionBytes`)]:[]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;if(t.totalCores<=0)return H(`modeled`);let r=(n.inputBytes??0)+(n.shuffleReadBytes??0),i=typeof n.taskActiveMs==`number`?n.taskActiveMs:Math.max(0,(n.completedAt??0)-(n.submittedAt??0)),a=n.taskCount??0,o=r<=0&&Nr(n,t.sql)?0:i*Math.max(0,1-a/t.totalCores);return Ir(o,e.stageId,t,`modeled`,{value:o,unit:`ms`},Pr)}}),q({type:`stageFailed`,order:42,fixEffort:`code`,version:1,emits:[`stageFailed`],docAnchor:`#bottleneck-failures`,thresholds:{},detect(e){return e.stageFailureReason==null?null:{type:`stageFailed`,stageId:e.id,impactBand:`critical`,variant:`stageFailure`,metric:`stageFailureReason`,valueText:e.stageFailureReason,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,failedTaskDetails:e.failedTaskSamples??[],recommendation:`This stage attempt failed outright. Inspect the driver log for the failure reason and the job that triggered it.`}},estimate:Fr}),q({type:`failures`,order:40,fixEffort:`code`,version:2,emits:[`failures`],docAnchor:`#bottleneck-failures`,thresholds:{minTasks:10,warnRate:.05,critRate:.2},detect(e,t,n){if(e.taskCount<n.minTasks||!e.failedTasks)return null;let r=e.failedTasks/e.taskCount;if(r<=n.warnRate)return null;let i=Math.round(r*1e3)/10,a=ni(e.failureReasons),o=e.failureGroups??[],s=o.find(e=>e.reason===a),c=(s?qr(s):null)??a,l=o.slice(0,5),u=l.reduce((e,t)=>e+t.count,0);return{type:`failures`,stageId:e.id,impactBand:r>n.critRate?`critical`:`warning`,metric:`failureRate`,value:i,failedTasks:e.failedTasks,dominantReason:a,dominantError:c,failureGroups:l,otherFailedTasks:Math.max(0,e.failedTasks-u),recommendation:`${i}% of tasks failed${c?` (dominant error: ${c})`:``}: investigate driver logs for executor instability or data-driven errors.`}},estimate:Fr}),q({type:`straggler`,order:70,fixEffort:`code`,version:1,emits:[`straggler`],docAnchor:`#bottleneck-straggler`,thresholds:{minTasks:10,shareWarn:.05,shareWarnAtFloor:.025,warnPct:.1,critPct:.2,floorPctWarn:fr,floorPctCrit:pr},detect(e,t,n){if(e.taskCount<n.minTasks)return null;let r=hr(t.app);if(Oi(e,t,n.floorPctWarn))return null;let i=(e.stragglerCount??0)/e.taskCount,a=(e.speculativeTasks??0)>0;if(!a&&i<=n.shareWarnAtFloor)return null;let o=a?e.speculativeTasks/e.taskCount:0,s=Ni(ji(e),e.id,t),c=Di(s,r,n.floorPctWarn),l=Di(s,r,n.floorPctCrit),u=i>n.shareWarn||i>n.shareWarnAtFloor&&r!=null&&c;if(!a&&!u)return null;let d=o>=n.critPct&&l?`critical`:o>=n.warnPct&&c?`warning`:`info`,f=a&&!(S[u&&c?`warning`:`info`]<S[d]),p=f?e.speculativeTasks:Math.round(i*100),m=f?`${p} speculative attempt${p===1?``:`s`} discarded`:`${p}% of tasks straggled`,h=Wi(e,t);return{type:`straggler`,stageId:e.id,impactBand:`info`,origin:h.origin,metric:f?`speculativeTasks`:`stragglerShare`,value:p,unit:f?`count`:`pct`,speculativeTasks:e.speculativeTasks??0,stragglerCount:e.stragglerCount??0,confidence:f?ma(o,n.warnPct,n.critPct):ma(i,n.shareWarn,n.critPct),validationRequired:`Warning needs at least ${pe(n.floorPctWarn)} of run time at stake, critical ${pe(n.floorPctCrit)}.`,recommendation:`${m}: rule out a GC pause or a slow shuffle fetch before assuming a hardware issue; if uneven data is the cause, ${h.text}.`,remediation:h.remediation}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);return n?Mi(ji(n),e.stageId,t):null}}),q({type:`speculationWaste`,order:71,fixEffort:`config`,version:1,emits:[`speculationWaste`],docAnchor:`#bottleneck-speculation-waste`,thresholds:{minWasted:5,minWasteMs:6e4},detect(e,t,n){let r=e.speculationWastedAttempts??0,i=e.speculationWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`speculationWaste`,stageId:e.id,impactBand:`warning`,metric:`speculationWasteMs`,value:i,confidence:ha(i,n.minWasteMs),recommendation:`Speculative execution discarded ${Math.round(i/1e3)}s of executor time in this stage: if task durations are naturally variable rather than genuine stragglers, consider tuning spark.speculation.multiplier/quantile.`,remediation:[U(`spark.speculation.multiplier`),U(`spark.speculation.quantile`)]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.speculationWasteMs??0;return Ir(r,e.stageId,t,`measured`,{value:r,unit:`ms`})}}),q({type:`retryWaste`,order:45,fixEffort:`code`,version:1,emits:[`retryWaste`],docAnchor:`#bottleneck-retry-waste`,thresholds:{minWasted:3,minWasteMs:3e4},detect(e,t,n){let r=e.wastedAttempts??0,i=e.retryWasteMs??0;return r<n.minWasted||i<n.minWasteMs?null:{type:`retryWaste`,stageId:e.id,impactBand:`warning`,metric:`retryWasteMs`,value:i,numTasks:e.taskCount,memoryBytesSpilled:e.memoryBytesSpilled,retriedTaskDetails:e.retryTaskSamples??[],recommendation:`Retried task attempts wasted ${Math.round(i/1e3)}s of executor time (${r} attempt${r===1?``:`s`}) even though the stage completed: investigate executor loss or fetch failures.`,extended:`${r} task attempts were superseded by a later retry, wasting ${Math.round(i/1e3)}s of executor time. Common causes: executor loss (OOM-kill, node death) or shuffle FetchFailed forcing a stage-map recompute. Check driver logs for the dominant reason (see the Failures widget) even if the final failure rate looks low; retries hide the true cost.`}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.retryWasteMs??0,i=Dr(n);return Ir(i,e.stageId,t,i===r?`measured`:`modeled`,{value:r,unit:`ms`})}}),q({type:`tinyTask`,order:80,fixEffort:`code`,version:1,emits:[`tinyTask`],docAnchor:`#bottleneck-tiny-tasks`,thresholds:{minTasks:100,maxP50:500,maxP95:1e3,stageFloorPct:.005},detect(e,t,n){if(e.taskCount<n.minTasks||Oi(e,t,n.stageFloorPct)||e.taskDurationP50>n.maxP50||e.taskDurationP95>n.maxP95)return null;let r=Math.max(1,Math.round(e.taskCount/10)),i=Bi(e),a=i===`shuffle`?`lower spark.sql.shuffle.partitions or .coalesce(${r})`:`.coalesce(${r})`;return{type:`tinyTask`,stageId:e.id,impactBand:`info`,reads:i,metric:`taskDurationP50`,value:Math.round(e.taskDurationP50),recommendation:`Many small tasks (${e.taskCount}, P50 ${Math.round(e.taskDurationP50)}ms): scheduler overhead may dominate. Try ${a}.`,remediation:i===`shuffle`?[W(`spark.sql.shuffle.partitions`)]:[]}},estimate(e,t){if(e.stageId==null)return null;let n=t.stages.get(e.stageId);if(!n)return null;let r=n.taskCount??0,i=Math.max(0,r-Math.round(r/10)),a=wr(n);if(a){let n=i*a.perTaskMs/Math.max(1,a.concurrency);return Ir(n,e.stageId,t,`measured`,{value:n,unit:`ms`})}let o=i*50;return Ir(o,e.stageId,t,`modeled`,{value:o,unit:`ms`})}}),ua({type:`incompleteRun`,order:5,fixEffort:`code`,version:1,emits:[`incompleteRun`],thresholds:{},detect(e){return!e.app||e.app.startTime==null||e.app.endTime!=null?null:{type:`incompleteRun`,stageId:null,impactBand:`warning`,metric:`applicationEnd`,valueText:`missing`,recommendation:xa}},estimate:Fr}),ua({type:`coldStart`,order:90,fixEffort:`code`,version:1,emits:[`coldStart`],docAnchor:`#bottleneck-cold-start`,thresholds:{gapSeconds:30},detect(e,t){let{app:n,stages:r,executorsAdded:i,executorsRemoved:a}=e;if(!n||n.startTime==null||r.size===0)return null;let o=1/0;for(let e of r.values())e.submittedAt>0&&e.submittedAt<o&&(o=e.submittedAt);if(!Number.isFinite(o))return null;let s=new Map;for(let e of a)s.set(e.executorId,e.timestamp);let c=1/0;for(let e of i)if(e.timestamp>0){if(e.timestamp<=o){let t=s.get(e.executorId);if(t==null||t>o)return null}else e.timestamp<c&&(c=e.timestamp)}if(!Number.isFinite(c))return null;let l=(c-o)/1e3;if(l<=t.gapSeconds)return null;let u=Math.round(l);return{type:`coldStart`,stageId:null,impactBand:`warning`,dynamicAllocation:ea(e.app)?`off`:`on`,metric:`startupGapSeconds`,value:u,recommendation:`The first stage waited ${u}s for an executor to become available: keep a warm pool of idle executors, or if using dynamic allocation, raise the minimum/initial executor count so it doesn't scale up from zero.`,remediation:ea(e.app)?[]:[U(`spark.dynamicAllocation.minExecutors`),U(`spark.dynamicAllocation.initialExecutors`)]}},estimate(e){if(typeof e.value!=`number`)return null;let t=e.value*1e3;return{basis:`serial`,wallClock:{low:t,high:t},estimateMethod:`measured`}}}),ua({type:`utilization`,order:100,fixEffort:`config`,version:1,emits:[`utilization`],docAnchor:`#bottleneck-utilization`,thresholds:{minUtil:.6},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a}=e;if(!n||r.length===0||n.startTime==null||n.endTime==null)return null;let o=n.endTime-n.startTime;if(o<=0)return null;let s=Kn({app:n,stages:e.stages,executors:{added:r,removed:i}});if(s==null)return null;let c=Mn(n,r,i),l=(a?.busyCoreMs??0)/s;if(l>=t.minUtil)return null;let u=Hr(e.stages.values()),d=u==null?null:Math.round(u/s*100),f=Math.round(l*100),p=qi(n,`consider either reducing cluster size (spark.executor.instances) or enabling dynamic allocation`,`dynamic allocation is already on, so consider reducing cluster size`);return{type:`utilization`,stageId:null,impactBand:`info`,metric:`avgUtilization`,value:f,utilizationFraction:l,appDurationMs:o,totalCores:c,allocatedCoreMs:s,cpuUtilizationPct:d,recommendation:`Average executor utilization was only ${f}%: ${p.text}.`,remediation:p.remediation}},estimate(e){let t=e.utilizationFraction,n=e.allocatedCoreMs;if(t==null||n==null)return H(`measured`);let r=(1-t)*n;return{...H(`measured`,{value:r/T,unit:`coreHours`,idle:!0}),idleCoreTimeMs:{low:r,high:r}}}}),ua({type:`memoryUtilization`,order:102,fixEffort:`config`,version:1,emits:[`memoryUtilization`],docAnchor:`#bottleneck-memory-utilization`,thresholds:{idleCoreWarn:.5,bandTooSmall:.95,bandTooHigh:.7,wasteBufferMultiplier:1.5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i,runAggregates:a,stages:o}=e,s=[];if(n?.startTime==null||n?.endTime==null)return s;let c=n.endTime-n.startTime;if(c<=0)return s;let l=Nn(r,i),u=n.resources?.executor?.memoryMB??null,d=a?.busyCoreMs,f={app:n,stages:o,executors:{added:r,removed:i}},p=Kn(f);if(d!=null&&p!=null){let e=1-d/p;if(e>t.idleCoreWarn){let t=Math.round(e*100),{memoryGbHours:r}=Wn(f),i=qi(n,`either reduce cluster size (spark.executor.instances) or enable dynamic allocation`,`dynamic allocation is already on, so reduce cluster size`);s.push({type:`memoryUtilization`,variant:`idleCores`,stageId:null,impactBand:`warning`,metric:`idleCoreRate`,value:t,idleRateFraction:e,allocatedMBSeconds:r==null?null:r*1024*3600,recommendation:`${t}% of available core-time ran no task: ${i.text}.`,remediation:i.remediation})}}let m=new Map;for(let e of o.values()){let t=e.executorMetrics;if(t instanceof Map)for(let[e,n]of t){let t=n?.jvmHeapMemory??0;t>(m.get(e)??0)&&m.set(e,t)}}if(m.size===0){let e=`spark.eventLog.logStageExecutorMetrics`,t=Ri(Ii(n,e,!0),e,!0,`Per-executor memory usage requires ${e}=true: not enabled for this run.`,`Per-executor memory usage is missing from this log even though executor metrics logging is on for this run.`);s.push({type:`memoryUtilization`,variant:`memoryBand`,stageId:null,impactBand:`info`,metric:`memoryBand`,dataUnavailable:!0,recommendation:t.text,remediation:t.remediation})}else if(u!=null&&u>0){let e=u*1024*1024;for(let[n,r]of m){let i=r/e;i>t.bandTooSmall?s.push({type:`memoryUtilization`,variant:`memoryBand`,rule:`heapNearCapacity`,stageId:null,executorId:n,impactBand:`warning`,metric:`heapUsedRatio`,value:Math.round(i*100),recommendation:`Executor ${n} peaked at ${Math.round(i*100)}% of allocated heap: memory may be too small; raise spark.executor.memory to avoid OOM/spill.`,remediation:[U(`spark.executor.memory`)]}):i<t.bandTooHigh&&s.push({type:`memoryUtilization`,variant:`memoryBand`,rule:`heapOverProvisioned`,stageId:null,executorId:n,impactBand:`info`,metric:`heapUsedRatio`,value:Math.round(i*100),allocatedBytes:e,heap:r,appDurationMs:c,recommendation:`Executor ${n} used only ${Math.round(i*100)}% of allocated heap: memory may be over-provisioned; consider reducing spark.executor.memory for cost savings.`,remediation:[W(`spark.executor.memory`)]})}}if(u!=null&&l>0){let e=l*u*(c/1e3),n=0;for(let e of o.values())n+=e.executorRunTime??0;let r=n/1e3*u,i=e-r;if(i>t.wasteBufferMultiplier*r){let e=Math.round(i);s.push({type:`memoryUtilization`,variant:`wasteModel`,stageId:null,impactBand:`info`,metric:`wastedMBSeconds`,value:e,confidence:ga(i,r,t.wasteBufferMultiplier),validationRequired:`Memory-waste estimate uses allocated-vs-used memory-time and a ${t.wasteBufferMultiplier}x buffer: confirm against the Spark UI before acting.`,recommendation:`Allocated executor memory sat largely idle over the run (~${e.toLocaleString(`en-US`)} MB-seconds wasted): review spark.executor.memory and executor count.`,remediation:[W(`spark.executor.memory`)]})}}return s},estimate(e){if(e.variant===`wasteModel`&&typeof e.value==`number`)return H(`measured`,{value:e.value,unit:`mbSeconds`});if(e.variant===`idleCores`){let t=e.idleRateFraction,n=e.allocatedMBSeconds;return t!=null&&n!=null?H(`modeled`,{value:t*n,unit:`mbSeconds`}):H(`modeled`)}if(e.variant===`memoryBand`&&e.rule===`heapOverProvisioned`){let t=e.allocatedBytes,n=e.heap,r=e.appDurationMs;if(t!=null&&n!=null&&r!=null)return H(`modeled`,{value:(t-n)/1048576*(r/1e3),unit:`mbSeconds`})}return H(`modeled`)}}),ua({type:`cacheUtilization`,order:103,fixEffort:`code`,version:2,emits:[`cacheUtilization`],docAnchor:`#bottleneck-cache-utilization`,thresholds:{cachedRatioWarn:.5,cachedRatioInfo:.9,diskRatioWarn:.4,diskRatioInfo:.15},detect(e,t){let n=e.app?.rddInfo;if(!(n instanceof Map))return null;let r=[],i=0,a=String(e.app?.config?.[`spark.eventLog.logBlockUpdates.enabled`]).toLowerCase()===`true`,o=/^(\d+)\.(\d+)/.exec(e.app?.sparkVersion??``),s=o==null||Number(o[1])<2||Number(o[1])===2&&Number(o[2])<3,c=a||s||(e.app?.rddBlockUpdates??0)>0;for(let e of n.values()){let n=e.storageLevel??{};if((n.useMemory||n.useDisk)&&(i++,(e.numCachedPartitions??0)>0)){if(c=!0,(e.numPartitions??0)>0){let n=e.numCachedPartitions/e.numPartitions;n<t.cachedRatioWarn?r.push(ia(e,n,`warning`)):n<t.cachedRatioInfo&&r.push(ia(e,n,`info`))}if(n.useMemory&&n.useDisk){let n=(e.memorySize??0)+(e.diskSize??0);if(n>0){let i=(e.diskSize??0)/n;i>t.diskRatioWarn?r.push(aa(e,i,`warning`)):i>t.diskRatioInfo&&r.push(aa(e,i,`info`))}}}}return i>0&&!c&&r.push(oa(i,e.app)),r},estimate(e){if(e.dataUnavailable)return H(`none`);let t=e.memorySize??0,n=e.diskSize??0,r=e.numCachedPartitions??0,i=e.numPartitions??0,a=Math.max(0,i-r),o=t+n;return H(`modeled`,{value:((r>0?o/r*a:0)+n)/jr*1e3,unit:`ms`})}}),ua({type:`coreLocality`,order:103,fixEffort:`config`,version:1,emits:[`coreLocality`],docAnchor:`#bottleneck-core-locality`,thresholds:{minTasks:50,warnRatio:.15,critRatio:.35},detect(e,t){let{totalTasks:n,nonLocalTasks:r,ratio:i}=Qn([...e.stages.values()]);if(n==null||n<t.minTasks||i<t.warnRatio)return null;let a=Math.round(i*100);return{type:`coreLocality`,stageId:null,impactBand:i>=t.critRatio?`critical`:`warning`,metric:`nonLocalRatio`,value:a,nonLocalTaskCount:r,confidence:_a(i,n,t),validationRequired:`Flagged when at least ${pe(t.warnRatio)} of tasks run non-local (critical at ${pe(t.critRatio)}), on runs of ${t.minTasks}+ tasks.`,recommendation:`${a}% of tasks (${r}) ran without process- or node-local data placement: check executor/data colocation.`}},estimate(e){return H(`modeled`,{value:(e.nonLocalTaskCount??0)*20,unit:`coreMs`})}}),ua({type:`autoscalingChurn`,order:103,fixEffort:`config`,version:1,emits:[`autoscalingChurn`],docAnchor:`#bottleneck-autoscaling-churn`,thresholds:{shortLivedMs:12e4,warningPct:.3,criticalPct:.6,minExecutors:5},detect(e,t){let{app:n,executorsAdded:r,executorsRemoved:i}=e;if(!n||r.length===0||n.endTime==null||r.length<t.minExecutors)return null;let a=new Map;for(let e of i)a.set(e.executorId,e.timestamp);let o=0;for(let e of r)(a.has(e.executorId)?a.get(e.executorId):n.endTime)-e.timestamp<t.shortLivedMs&&o++;let s=o/r.length,c=s>t.criticalPct?`critical`:s>t.warningPct?`warning`:null;if(!c)return null;let l=Math.round(s*100),u=ea(n);return{type:`autoscalingChurn`,stageId:null,impactBand:c,metric:`shortLivedExecutorPct`,value:l,shortLivedExecutorCount:o,confidence:va(s,t.warningPct,t.criticalPct),dynamicAllocation:u?`off`:`on`,recommendation:u?`${l}% of executors ran for under 2 minutes before being removed: dynamic allocation is off, so the churn comes from executors lost or preempted, not from autoscaling bounds; check the cluster manager's preemption and executor-loss logs.`:`${l}% of executors ran for under 2 minutes before being removed: this looks like wasteful re-provisioning rather than normal scale-down; consider raising spark.dynamicAllocation.executorIdleTimeout or widening the minExecutors/maxExecutors bounds to reduce flapping.`,remediation:u?[]:[U(`spark.dynamicAllocation.executorIdleTimeout`),W(`spark.dynamicAllocation.minExecutors`),U(`spark.dynamicAllocation.maxExecutors`)]}},estimate(e){return H(`modeled`,{value:(e.shortLivedExecutorCount??0)*Ar/36e5,unit:`coreHours`})}}),ua({type:`cachingOpportunity`,order:105,fixEffort:`code`,version:1,emits:[`cachingOpportunity`],docAnchor:`#bottleneck-caching-opportunity`,thresholds:{minExecutions:2},detect(e,t){let n=e.sql;if(!(n instanceof Map)||n.size===0)return null;let r=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=new Map;Zt(e.planTree,e=>{let n=ci(e);if(!n)return;let r=(e.metrics??[]).find(e=>e.name===yi);t.set(n,(t.get(n)??0)+(r?r.value:0))});for(let[n,i]of t){let t=r.get(n);if(!t){let e=n.indexOf(`:`);t={format:n.slice(0,e),relation:n.slice(e+1),executionIds:new Set,executionBytes:new Map},r.set(n,t)}t.executionIds.add(e.id),t.executionBytes.set(e.id,(t.executionBytes.get(e.id)??0)+i)}}let i=new Map;for(let e of n.values()){if(!e.planTree)continue;let t=ui(e.planTree),n=new Map(t.map(e=>[e.node,e.fingerprint])),r=new Map;for(let e of t){let t=r.get(e.fingerprint);t||(t={operator:e.operator,node:e.node,leafRelationBytes:new Map,ancestorFingerprints:new Set(e.ancestorNodes.map(e=>n.get(e)).filter(e=>!!e))},r.set(e.fingerprint,t));for(let[n,r]of e.leafRelationBytes)t.leafRelationBytes.set(n,(t.leafRelationBytes.get(n)??0)+r)}for(let[t,n]of r){let r=i.get(t);r||(r={operator:n.operator,exampleNode:n.node,executionIds:new Set,executionBytes:new Map,ancestorFingerprints:new Set,leafRelationRids:new Set},i.set(t,r)),r.executionIds.add(e.id);let a=[...n.leafRelationBytes.values()].reduce((e,t)=>e+t,0);r.executionBytes.set(e.id,(r.executionBytes.get(e.id)??0)+a);for(let e of n.ancestorFingerprints)r.ancestorFingerprints.add(e);for(let e of n.leafRelationBytes.keys())r.leafRelationRids.add(e)}}let a=e=>i.has(e)&&i.get(e).executionIds.size>=t.minExecutions,o=new Map;for(let[e,n]of i){if(!a(e)){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!0});continue}let r=[...n.ancestorFingerprints].filter(a).map(e=>i.get(e));if(r.length===0){o.set(e,{finalExecutionIds:n.executionIds,suppressed:!1});continue}let s=new Set(r.flatMap(e=>[...e.executionIds])),c=new Set([...n.executionIds].filter(e=>!s.has(e)));c.size===0||c.size<t.minExecutions?o.set(e,{finalExecutionIds:c,suppressed:!0}):o.set(e,{finalExecutionIds:c,suppressed:!1})}let s=e=>e.slice(e.indexOf(`:`)+1),c={join:[`joined`,`join`],union:[`unioned`,`union`]},l=[],u=new Map;for(let[e,n]of i){let r=o.get(e);if(r.suppressed)continue;let i=[...r.finalExecutionIds].sort((e,t)=>e-t),a=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),d=[...n.leafRelationRids].sort();if(d.length===0)continue;let f=d.map(e=>{let t=e.indexOf(`:`);return{relation:e.slice(t+1),format:e.slice(0,t)}}),[p,m]=c[n.operator],h=d.map(s).join(` ${m} `),g=i.length,_=a>=128*G?`${p[0].toUpperCase()}${p.slice(1)} result read by ${g} queries (~${M(a)}): cache/persist the ${p} DataFrame so it is computed once.`:`${p[0].toUpperCase()}${p.slice(1)} result read by ${g} queries: cache the ${p} DataFrame, or reconsider whether it needs to be recomputed each time.`;l.push({type:`cachingOpportunity`,variant:`composite`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:g,format:`derived`,relations:f,operator:n.operator,relation:h,executionIds:i,totalReadBytes:a,confidence:ya(g,t.minExecutions),validationRequired:`Composite reuse is inferred from a structural plan-shape match (operator + normalized join/filter condition + child shapes) across SQL executions; confirm these executions truly compute the same join/union before caching.`,recommendation:_});for(let e of d){u.has(e)||u.set(e,new Set);for(let t of i)u.get(e).add(t)}}for(let[e,n]of r){let r=u.get(e),i=r?[...n.executionIds].filter(e=>!r.has(e)):[...n.executionIds];if(i.length<t.minExecutions)continue;let a=i.length,o=i.reduce((e,t)=>e+(n.executionBytes.get(t)??0),0),s=o>=128*G?`Read by ${a} queries (~${M(o)}): cache/persist the shared DataFrame so it is scanned once.`:`Read by ${a} queries: cache the shared DataFrame, or broadcast it if it is a small join lookup.`;l.push({type:`cachingOpportunity`,stageId:null,impactBand:`info`,metric:`executionReuse`,value:a,relation:n.relation,format:n.format,executionIds:i.sort((e,t)=>e-t),totalReadBytes:o,confidence:ya(a,t.minExecutions),validationRequired:`Relation-reuse is inferred from the pre-AQE plan scan identity across SQL executions; confirm the reads are the same data and cacheable within one session before acting.`,recommendation:s})}return l},estimate(e){return H(`modeled`,{value:(e.totalReadBytes??0)/jr*1e3,unit:`ms`})}}),ua({type:`jobFailureRate`,order:110,fixEffort:`code`,version:1,emits:[`jobFailureRate`],docAnchor:`#bottleneck-job-failure-rate`,thresholds:{infoRate:.1,warnRate:.3,critRate:.5},detect(e,t){let{jobs:n,stages:r}=e,i=(n?[...n.values()]:[]).filter(e=>e.result!=null);if(i.length===0)return null;let a=i.filter(e=>e.succeeded===!1),o=a.length,s=o/i.length;if(s<t.infoRate)return null;let c=0,l=0;for(let e of r.values())c+=e.taskCount??0,l+=e.failedTasks??0;let u=c>0?l/c:0,d=a.filter(e=>e.submissionTime!=null&&e.completionTime!=null),f=d.length>0?d.reduce((e,t)=>e+(t.completionTime-t.submissionTime),0)/d.length:0,p=i.length;return{type:`jobFailureRate`,stageId:null,impactBand:s>=t.critRate?`critical`:s>=t.warnRate?`warning`:`info`,metric:`jobFailureRate`,value:Math.round(s*1e3)/10,failedJobs:o,totalJobs:p,failedTasks:l,totalTasks:c,avgJobDurationMs:f,taskFailureRate:Math.round(u*1e3)/10,recommendation:`${o} of ${p} jobs never recovered: inspect the driver log for the failed job(s) and the stage failures that triggered them.`}},estimate(e){return H(`modeled`,{value:(e.failedJobs??0)*(e.avgJobDurationMs??0)/36e5,unit:`coreHours`})}}),da({type:`configAudit`,order:120,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-shuffle-service`,thresholds:{},property:`spark.shuffle.service.enabled`,detect(e){let t=e.app?.resources??null;return t?.dynamicAllocationEnabled===!0&&t?.shuffleServiceEnabled===!1?{type:`configAudit`,property:`spark.shuffle.service.enabled`,impactBand:`warning`,metric:`config`,valueText:`false`,recommendation:`Dynamic allocation is on but the external shuffle service is off: set spark.shuffle.service.enabled=true so shuffle data survives executor removal.`,remediation:Li(e.app,`spark.shuffle.service.enabled`,!0)}:null},estimate:Fr}),da({type:`configAudit`,order:121,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-autoscale-bounds`,thresholds:{},property:`spark.dynamicAllocation.maxExecutors`,detect(e){let t=e.app,n=t?.config??{};if((t?.resources??null)?.dynamicAllocationEnabled!==!0)return null;let r=n[`spark.dynamicAllocation.minExecutors`]==null?null:parseInt(n[`spark.dynamicAllocation.minExecutors`],10),i=n[`spark.dynamicAllocation.maxExecutors`]==null?null:parseInt(n[`spark.dynamicAllocation.maxExecutors`],10);return r!=null&&i!=null&&r>i?{type:`configAudit`,property:`spark.dynamicAllocation.minExecutors`,impactBand:`critical`,metric:`config`,valueText:`${r} > ${i}`,recommendation:`spark.dynamicAllocation.minExecutors (${r}) exceeds maxExecutors (${i}): set min ≤ max.`,remediation:[W(`spark.dynamicAllocation.minExecutors`,i)]}:i==null?{type:`configAudit`,property:`spark.dynamicAllocation.maxExecutors`,impactBand:`info`,metric:`config`,valueText:`(unset)`,recommendation:`Dynamic allocation is on with no upper bound: set spark.dynamicAllocation.maxExecutors to cap cluster growth.`,remediation:[Wr(`spark.dynamicAllocation.maxExecutors`)]}:null},estimate:Fr}),da({type:`configAudit`,order:122,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-serializer`,thresholds:{},property:`spark.serializer`,detect(e){let t=e.app,n=t?.config??{},r=t?.resources??null;if(Object.keys(n).length===0)return null;let i=r?.serializer??n[`spark.serializer`]??null;return typeof i==`string`&&/kryo/i.test(i)?null:{type:`configAudit`,property:`spark.serializer`,impactBand:`info`,metric:`config`,valueText:i??`(default JavaSerializer)`,recommendation:`Current serializer is ${i??`the default JavaSerializer`}: consider spark.serializer=org.apache.spark.serializer.KryoSerializer for faster, smaller buffers.`,remediation:Li(t,`spark.serializer`,`org.apache.spark.serializer.KryoSerializer`)}},estimate:Fr}),da({type:`configAudit`,order:123,fixEffort:`config`,version:1,inScorecard:!1,emits:[`configAudit`],docAnchor:`#config-memory-overhead`,thresholds:{floorMB:384,floorPct:.1},property:`spark.executor.memoryOverhead`,detect(e,t){let n=e.app?.resources??null,r=n?.executor?.memoryMB??null,i=n?.executor?.memoryOverheadMB??null;if(r==null||i==null)return null;let a=Math.max(t.floorMB,Math.round(r*t.floorPct));return i>=a?null:{type:`configAudit`,property:`spark.executor.memoryOverhead`,impactBand:`info`,metric:`config`,valueText:`${i} MiB`,recommendation:`Executor memoryOverhead (${i} MiB) is below Spark's default floor of ${a} MiB (max of 384 MiB or 10% of executor memory): raise it to avoid off-heap OOM-kills.`,remediation:[U(`spark.executor.memoryOverhead`,`${a}m`)]}},estimate:Fr}),la({type:`duplicatePlanSubtree`,order:130,fixEffort:`code`,version:2,emits:[`duplicatePlanSubtree`],docAnchor:`#bottleneck-duplicate-plan-subtree`,thresholds:{minSubtreeSize:3,minOccurrences:2,stageFloorPct:.005},detect(e,t,n){if(!e.planTree)return null;let r=fi(e.planTree,n);if(r.length===0)return null;let i=sn(e.id,t.stages),a=[];Zt(e.planTree,e=>a.push(e));let o=hi(a),s=hr(t.app),c=r.map(r=>{let a=[];for(let e of r.nodes)Zt(e,e=>a.push(e));let c=ri(a,i),l=0;for(let e of c){let n=t.stages.get(e);n&&(l+=Math.max(0,(n.completedAt??0)-(n.submittedAt??0)))}if(s!=null&&l>0&&l<s*n.stageFloorPct)return null;let u=pi(r.nodes),d=gi(a,o),f=a.map(e=>e.id).filter(Boolean),p=te({...r,value:r.occurrences}),m=u?``:` ${_}`;return{type:`duplicatePlanSubtree`,executionId:e.id,stageIds:c,planNodeIds:f,stageShares:d,occurrencesIdentical:u,impactBand:u&&Object.keys(d).length>0?`warning`:`info`,metric:`subtreeOccurrences`,value:r.occurrences,rootName:r.rootName,subtreeSize:r.subtreeSize,sampleRelation:r.sampleRelation,groupIndex:r.groupIndex,confidence:u?_i(r.subtreeSize,r.occurrences,n):`low`,validationRequired:`Matching compares operator and metric names only, not literals or expression IDs: confirm the repeat in the Spark UI SQL tab before acting.`,recommendation:(r.isExchangeRoot?`${p}: this looks like a possible missed exchange reuse; check whether the same shuffle could be computed once and reused.`:`${p}: consider caching/persisting the shared computation or check for a duplicated query branch.`)+m}}).filter(e=>e!==null);return c.length>0?c:null},estimate(e,t){let n=e.stageIds;if(!n||n.length===0)return null;let r=typeof e.value==`number`?e.value:0;if(r<2||e.occurrencesIdentical===!1)return H(`none`);let i=e.stageShares??null,a=(r-1)/r,o=new Map;for(let e of n){let n=t.stages.get(e),r=i?i[e]??0:1;if(n&&r>0){let t=n.taskActiveMs??Math.max(0,(n.completedAt??0)-(n.submittedAt??0));o.set(e,t*r*a)}}if(o.size===0)return H(`none`);let s={value:[...o.values()].reduce((e,t)=>e+t,0),unit:`ms`};return Lr([...o.keys()],o,t,`measured`,s)??H(`measured`,s)}}),la({type:`smallFiles`,order:131,fixEffort:`config`,version:2,emits:[`smallFiles`],docAnchor:`#bottleneck-small-files`,thresholds:{minFiles:100,maxAvgFileSizeMB:3},detect(e,t,n){if(!e.planTree)return null;let{minFiles:r,maxAvgFileSizeMB:i}=n,a=[];if(Zt(e.planTree,e=>{let t=e.metrics??[],n=e=>t.find(t=>t.name===e),o=(t,n,o)=>{if(!t||!n||!(t.value>r))return;let s=n.value/t.value;s<i*G&&a.push({direction:o,fileCount:t.value,avgBytes:s,nodeName:e.name,node:e})};o(n(vi),n(yi),`read`),o(n(bi),n(xi),`write`)}),a.length===0)return null;let o=sn(e.id,t.stages);return a.map(t=>{let n=ri([t.node],o),r=t.node.id?[t.node.id]:[];return{type:`smallFiles`,executionId:e.id,stageIds:n,planNodeIds:r,impactBand:`warning`,metric:`avgFileSizeBytes`,value:Math.round(t.avgBytes),fileCount:t.fileCount,direction:t.direction,nodeName:t.nodeName,recommendation:t.direction===`read`?`${t.fileCount} small files were read at ${F(t.nodeName)}: consider compacting the upstream output so fewer, larger files are produced.`:`${t.fileCount} small files were written at ${F(t.nodeName)}: repartition or coalesce before writing to raise the average file size.`}})},estimate(e,t){let n=(e.fileCount??0)*10,r=e.stageIds,i=1;if(e.direction===`read`)for(let e of r??[])i=Math.max(i,t.stages.get(e)?.peakConcurrentTasks??1);return Rr(n/i,r,t)}}),la({type:`broadcastSizing`,order:132,fixEffort:`config`,version:2,emits:[`overBroadcast`,`underBroadcast`],docAnchor:`#bottleneck-broadcast-sizing`,thresholds:{broadcastTiers:[10*G,100*G,K,5*K],comparisonTiers:[10*K,300*K,$r],overBroadcastBytes:K},detect(e,t,n){if(!e.planTree)return null;let{broadcastTiers:r,comparisonTiers:i,overBroadcastBytes:a}=n,o=sn(e.id,t.stages),s=[];return Zt(e.planTree,n=>{if(n.name===`SortMergeJoin`&&(n.children??[]).length===2){let[a,c]=n.children,l=Si(a),u=Si(c),d=Math.min(l,u),f=Math.max(l,u);if(d>0&&(d<r[0]||d<r[1]&&f>i[0]||d<r[2]&&f>i[1]||d<r[3]&&f>i[2])){let n=[...Ci(a),...Ci(c)],r=$i(t.app),i=r!=null&&r<0?`disabled`:r!=null&&r>d?`notLimiting`:`limits`;s.push({type:`underBroadcast`,executionId:e.id,stageIds:ri(n,o),planNodeIds:n.map(e=>e.id).filter(Boolean),impactBand:`info`,metric:`smallerSideBytes`,value:d,largerSideBytes:f,broadcastThreshold:i,recommendation:i===`notLimiting`?`The smaller input to this Sort Merge Join (${M(d)}) is under the effective spark.sql.autoBroadcastJoinThreshold (${M(r)}) yet was not broadcast (the larger side is ${M(f)}), so the threshold is not what stopped it: missing table statistics or a join type that cannot broadcast usually is. Consider a broadcast() hint or collecting statistics (ANALYZE TABLE).`:`The smaller input to this Sort Merge Join (${M(d)}) is well under the broadcast threshold relative to the larger side (${M(f)}): this could have been a broadcast join. Consider a broadcast() hint or raising spark.sql.autoBroadcastJoinThreshold.`,remediation:i===`notLimiting`?[]:[U(`spark.sql.autoBroadcastJoinThreshold`)]})}}if(dn(n.name)){let r=(n.metrics??[]).find(e=>e.name===`data size`);if(r&&r.value>a){let i=(n.children??[])[0],c=$i(t.app),l=c!=null&&c<0,u=l||c!=null&&r.value>c,d=l?`disabled`:u?`notLimiting`:`limits`;s.push({type:`overBroadcast`,executionId:e.id,stageIds:ri(i?[i]:[],o),planNodeIds:[n.id].filter(Boolean),impactBand:`warning`,metric:`broadcastBytes`,value:r.value,broadcastThreshold:d,recommendation:l?`This broadcast (${M(r.value)}) exceeds the ${ei(a)} threshold: automatic broadcast is already disabled, so remove the broadcast() hint that forced it.`:u?`This broadcast (${M(r.value)}) exceeds the ${ei(a)} threshold: spark.sql.autoBroadcastJoinThreshold (${M(c)}) is below it, so a broadcast() hint forced it: remove the hint.`:`This broadcast (${M(r.value)}) exceeds the ${ei(a)} threshold: check for a misapplied broadcast hint or a misconfigured spark.sql.autoBroadcastJoinThreshold.`,remediation:u?[]:[W(`spark.sql.autoBroadcastJoinThreshold`)]})}}}),s.length?s:null},estimate(e,t){return Rr((e.value??0)/kr*1e3,e.stageIds,t)}})],Ca=(()=>{let e=new Map;for(let t of Sa)for(let n of t.emits)e.has(n)||e.set(n,t);return e})(),wa=Sa;function Ta(e,t){return t?.[e.type]}function Ea(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((e,n)=>e===t[n]):e===t}function Da(e,t){let n={};for(let[r,i]of Object.entries(Ta(e,t)??{})){if(!Object.hasOwn(e.thresholds,r))continue;let t=e.thresholds[r];Ea(i,t)||(n[r]={value:i,default:t})}return Object.keys(n).length>0?n:null}function Oa(e,t){let n=Da(e,t),r=e.suppressedBy?wa.find(t=>t.type===e.suppressedBy):void 0,i=r?Da(r,t):null;if(!r||!i)return n;let a=Object.fromEntries(Object.entries(i).map(([e,t])=>[`${r.type}.${e}`,t]));return{...n,...a}}function ka(e,t){let n=Ca.get(e);return n?Oa(n,t):null}function Aa(e){let t={};for(let n of wa){let r=Da(n,e);r&&(t[n.type]=r)}return Object.keys(t).length>0?t:null}function ja(e,t){let n=Ta(e,t);return n?{...e.thresholds,...n}:e.thresholds}function Ma(e){return Ti().map((t,n)=>{let r=wa[n],i=Da(r,e);return i?{...t,thresholds:ja(r,e),tunedThresholds:i}:t})}function Na(e){return Array.isArray(e)?`[${e.join(`, `)}]`:String(e)}function Pa(e){return Object.entries(e).map(([e,{value:t,default:n}])=>`${e} ${Na(t)} (default ${Na(n)})`).join(`, `)}function Fa(e){return`${Object.entries(e).map(([e,t])=>`${e} ${Pa(t)}`).join(`; `)}. Findings from these detectors are marked, and their impact estimates are uncalibrated: the estimates are calibrated against the default thresholds.`}function Ia(e,t){let n=`Produced with tuned thresholds: ${Pa(e)}.`;return t?`${n} Impact estimates are calibrated against the default thresholds, so this finding's estimate is unvalidated.`:n}function La(e){throw Error(`Unreachable case: ${JSON.stringify(e)}`)}function Ra(e,t){for(let n of e){let e=Ca.get(n.type)?.estimate(n,t);e&&(n.impactEstimate={...e,coreTimeMs:Br(n,e)})}return Ba(e),e}var za=[`skew`,`straggler`];function Ba(e){let t=new Set,n=e.filter(e=>e.stageId!=null&&e.impactEstimate?.coreTimeMs!=null&&za.includes(e.type)).sort((e,t)=>za.indexOf(e.type)-za.indexOf(t.type));for(let e of n)t.has(e.stageId)?e.impactEstimate.coreTimeMs=null:t.add(e.stageId)}var Va=Sa;function Ha(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,`0`)}var Ua=[`host`,`executorId`,`rule`,`variant`,`dimension`,`direction`,`nodeName`,`rootName`,`subtreeSize`,`groupIndex`,`largerSideBytes`,`rddId`,`relation`,`format`,`operator`,`executionIds`],Wa=new Map(Object.entries({skew:[],stageShape:[`rule`],shuffle:[],partitionSizing:[`rule`],spill:[],gc:[`direction`],slowHost:[`host`,`executorId`,`variant`,`dimension`],stageSlowness:[],stageFailed:[`variant`],failures:[],straggler:[],speculationWaste:[],retryWaste:[],tinyTask:[],incompleteRun:[],coldStart:[],utilization:[],memoryUtilization:[`executorId`,`variant`],cacheUtilization:[`variant`,`rddId`],coreLocality:[],autoscalingChurn:[],cachingOpportunity:[`variant`,`relation`,`format`,`operator`,`executionIds`],jobFailureRate:[],configAudit:[],duplicatePlanSubtree:[`rootName`,`subtreeSize`,`groupIndex`],smallFiles:[`direction`,`nodeName`],underBroadcast:[`largerSideBytes`],overBroadcast:[]}).map(([e,t])=>[e,new Set(t)]));function Ga(e){return e.stageId==null?`executionId`in e?e.executionId:e.type===`configAudit`?e.property:``:e.stageId}function Ka(e){let t=e,n=Wa.get(e.type),r=Ua.map(e=>{let r=n?.has(e)?t[e]:void 0;return Array.isArray(r)?r.join(`,`):r??``}).join(`|`);return Ha(`${e.type}|${Ga(e)}|${e.metric??``}|${e.value??e.valueText??``}|${r}`)}function qa(e){return`This overlaps with the ${e} finding on this stage: both measure the same slow-task tail, so don't add their recoverable-time figures together.`}function Ja(e){let t=new Set(e.filter(e=>e.type===`skew`&&e.stageId!=null).map(e=>e.stageId));if(t.size===0)return;let n=new Set(e.filter(e=>e.type===`straggler`&&e.stageId!=null).map(e=>e.stageId)),r=new Set([...t].filter(e=>n.has(e)));if(r.size!==0)for(let t of e){if(t.stageId==null||!r.has(t.stageId))continue;let e=t.type===`skew`?qa(`straggler`):t.type===`straggler`?qa(`skew`):null;e&&(t.validationRequired=[t.validationRequired,e].filter(Boolean).join(` `))}}function Ya(e,t,n,r=null){if(!n)return;let i=t.version??1;for(let a of Array.isArray(n)?n:[n]){if(!a)continue;let n={...a,docAnchor:a.docAnchor??t.docAnchor,detectorVersion:i};r&&(n.tunedThresholds=r);let o=Ka(n);e.some(e=>e.id===o)||e.push({...n,id:o})}}function Xa(e){for(let t of e){if(!t.tunedThresholds)continue;let e=t.impactEstimate!=null&&t.impactEstimate.basis!==`informational`,n=Ia(t.tunedThresholds,e);t.validationRequired=t.validationRequired?`${t.validationRequired} ${n}`:n}}function Za(e,t){let n=Ca.get(e);if(!n)return null;let{floorPctWarn:r,floorPctCrit:i}=ja(n,t);return{warnPct:typeof r==`number`?r:fr,critPct:typeof i==`number`?i:pr}}function Qa(e){let t=new Map;for(let n of Va){if(!n.suppressedBy)continue;let r=new Set(Va.filter(e=>e.type===n.suppressedBy).flatMap(e=>e.emits));for(let i of n.emits){let n=t.get(i)??new Set;for(let t of e)r.has(t.type)&&t.stageId!=null&&n.add(t.stageId);t.set(i,n)}}return t.size===0?e:e.filter(e=>e.stageId==null||!t.get(e.type)?.has(e.stageId))}function $a(e,t,n,r,i,a=new Map,o=null,{thresholds:s}={}){let c=Mn(e??{},n,r),l={stages:t,totalCores:c,sql:a,occupancy:ar(t,c)},u={app:e,jobs:i,executorsAdded:n,executorsRemoved:r,runAggregates:o,impact:l,stages:t,sql:a},d=[];for(let e of Va){if(e.inScorecard===!1)continue;let t=Ta(e,s),n=Oa(e,s);switch(e.scope){case`stage`:{let r=e.withThresholds(t);for(let t of u.stages.values())Ya(d,e,r(t,u),n);break}case`sql`:{let r=e.withThresholds(t);for(let t of u.sql.values())Ya(d,e,r(t,u),n);break}case`app`:Ya(d,e,e.withThresholds(t)(u),n);break;case`config`:Ya(d,e,e.withThresholds(t)(u),n);break;default:La(e)}}let f=Qa(d);return Ra(f,l),Xa(f),gr(f,e,s?e=>Za(e,s):void 0),Ja(f),f.sort((e,t)=>S[e.impactBand]-S[t.impactBand]),f}var eo=new WeakMap;function to(e){let t=[];for(let n of Va)n.scope===`config`&&Ya(t,n,n.withThresholds()({app:e}));return Ra(t,{stages:new Map,occupancy:new Map,totalCores:0}),gr(t,e),t.map(e=>({...e,stageId:e.stageId??null}))}function no(e){if(e===null)return to(e);let t=eo.get(e);if(t)return t.slice();let n=to(e);return eo.set(e,n),n.slice()}var ro=`sparkforensics`,io=`recentFiles`,ao=10,oo=0;function so(){let e=Date.now();return e>oo?(oo=e,e):++oo}function co(){return typeof window<`u`&&`showOpenFilePicker`in window}function lo(e){e.objectStoreNames.contains(io)&&e.deleteObjectStore(io),e.createObjectStore(io,{keyPath:`id`})}function uo(e,t,n){return`${e}::${t}::${n}`}function fo(){return new Promise((e,t)=>{let n=indexedDB.open(ro,1);n.onupgradeneeded=()=>lo(n.result),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function po(e,t){return e.transaction(io,t).objectStore(io)}function mo(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}async function ho({handle:e,name:t,size:n,lastModified:r,appName:i=null,issueCount:a=null}){let o=await fo();try{let s={id:uo(t,n,r),name:t,size:n,lastModified:r,handle:e,appName:i,issueCount:a,lastOpenedAt:so()};await mo(po(o,`readwrite`).put(s));let c=await mo(po(o,`readonly`).getAll());if(c.length>ao){c.sort((e,t)=>e.lastOpenedAt-t.lastOpenedAt);let e=c.slice(0,c.length-ao);for(let t of e)await mo(po(o,`readwrite`).delete(t.id))}return s}finally{o.close()}}async function go(){let e=await fo();try{return(await mo(po(e,`readonly`).getAll())).sort((e,t)=>t.lastOpenedAt-e.lastOpenedAt)}finally{e.close()}}async function _o(e){let t=await fo();try{let n=await mo(po(t,`readonly`).get(e));if(!n)return;n.lastOpenedAt=so(),await mo(po(t,`readwrite`).put(n))}finally{t.close()}}async function vo(e){let t=await fo();try{await mo(po(t,`readwrite`).delete(e))}finally{t.close()}}async function yo(e){let t=await fo();try{let n=await mo(po(t,`readonly`).get(e));return n?n.handle:null}finally{t.close()}}async function bo(e,t=`read`){if(!e)return!1;let n=e,r={mode:t};return await n.queryPermission(r)===`granted`||await n.requestPermission(r)===`granted`}var xo=new Set([`local-server-unavailable`,`upstream-unreachable`,`application-not-found`,`access-or-upstream-failure`,`invalid-event-log`]),So=[/^application_\d+_\d+$/,/^local-\d+$/,/^app-[A-Za-z0-9][A-Za-z0-9._-]*$/,/^spark-[A-Za-z0-9][A-Za-z0-9._~-]*$/,/^driver-\d+$/],Co=/^(?!\.{1,2}$)[A-Za-z0-9][A-Za-z0-9._~-]*$/;function wo(e){return typeof e==`string`?e.trim():``}function To(e){let t=wo(e);if(!t||t.includes(`?`)||t.includes(`#`))return null;let n;try{n=new URL(t)}catch{return null}return n.protocol!==`http:`&&n.protocol!==`https:`||n.username||n.password||n.search||n.hash?null:(n.pathname=`${n.pathname.replace(/\/+$/,``)}/`,n.toString())}function Eo(e){return So.some(t=>t.test(e))}function Do(e){return Co.test(e)}function Oo({baseUrl:e=``,appId:t=``,attemptId:n=``}={}){let r=To(e),i=wo(t),a=wo(n),o={baseUrl:r?null:`Enter an absolute HTTP(S) base URL without credentials, query, or fragment.`,appId:Eo(i)?null:`Enter a supported Spark application ID.`,attemptId:!a||Do(a)?null:`Enter a URL-path-safe attempt ID.`};return o.baseUrl||o.appId||o.attemptId?{request:null,errors:o}:{request:{baseUrl:r,appId:i,attemptId:a||null},errors:o}}function ko(e){return e?.request!=null}function Ao(e){return typeof e==`string`&&xo.has(e)}var jo={A:`Baseline`,B:`Candidate`},J={current:null},Mo={current:null};function No(e={}){let t=e.makeClient??qt,n=(0,R.useCallback)(async e=>{let t=N.getState().taskDataCache.get(e);if(t)return t;let n=await J.current.requestTaskData(e);return N.getState().setTaskData(e,n),n},[]),r=(0,R.useCallback)(async(e=0)=>{let t=N.getState().appModel,n=A(t,{skippedLines:e}),r=$a(t.app,t.stages,t.executors.added,t.executors.removed,t.jobs,t.sql,t.runAggregates);N.getState().setFindings(r,no(t.app),n),N.getState().setSkippedLines(e),N.getState().setStatus(`ready`);let i=[...new Set(r.map(e=>e.stageId).filter(e=>e!=null))],a=await J.current.prefetchFlaggedStages(i);for(let{stageId:e,metrics:t,fieldNames:n}of a)N.getState().setTaskData(e,{metrics:t,fieldNames:n});let o=Mo.current;if(o?.handle){let e=new Set(r.map(e=>e.stageId??`app:${e.type}`)).size;await ho({handle:o.handle,name:o.name,size:o.size,lastModified:o.lastModified,appName:t.app?.name??null,issueCount:e})}},[]),i=(0,R.useCallback)(()=>{let e=N.getState();e.activeFileId!=null&&e.appModel.app&&e.sessionCache.set(e.activeFileId,Ce(e.appModel,e.catalog,e.taskDataCache))},[]),a=(0,R.useCallback)(e=>(J.current?.terminate(),N.getState().resetModel(),N.getState().setStatus(`parsing`),N.getState().setActiveFile(null),Mo.current=null,J.current=t(),Yt(N.getState().appModel,{onProgress:e=>N.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>{r(e?.skippedLines??0)},onError:t=>{e?e(t):N.getState().setError(String(t?.message??t))}})),[t,r]),o=(0,R.useCallback)((e,t)=>{let n=a(),r=t?.id??uo(e.name,e.size,e.lastModified);N.getState().setActiveFile(r),t?.handle&&(Mo.current={handle:t.handle,name:e.name,size:e.size,lastModified:e.lastModified}),J.current.startParse(e,n)},[a]),s=(0,R.useCallback)(e=>{let t=a();J.current.startParseFiles(Array.from(e),t)},[a]),c=(0,R.useCallback)((e,t)=>{let n=a(e=>{if(N.getState().setShsParsing(!1),e?.source===`shs`&&Ao(e.code)){N.getState().resetModel(),t(e);return}N.getState().setError(String(e?.message??e))});N.getState().setShsParsing(!0),J.current.startParseFromUrl(e,n)},[a]),l=(0,R.useCallback)(()=>{i(),J.current?.terminate(),N.getState().resetModel(),N.getState().setStatus(`idle`)},[i]),u=(0,R.useCallback)(()=>{J.current?.terminate(),J.current=null,Mo.current=null,N.getState().resetModel(),N.getState().setActiveFile(null),N.getState().setStatus(`idle`)},[]),d=(0,R.useCallback)(async(e,t)=>{let n=N.getState();if(e===n.activeFileId)return`noop`;let r=n.sessionCache.get(e);if(r){i(),J.current?.terminate(),J.current=null;let t=v(n.appModel,n.taskDataCache,r);return N.getState().setFindings(t,no(n.appModel.app)),N.getState().setActiveFile(e),N.getState().setStatus(`ready`),await _o(e),`restored`}let a=t??await yo(e);if(!a||!await bo(a))return`gone`;let s;try{s=await a.getFile()}catch(t){return t instanceof DOMException&&(t.name===`NotFoundError`||t.name===`NotAllowedError`)&&(await vo(e).catch(()=>{}),n.sessionCache.delete(e)),`gone`}return i(),o(s,{handle:a,id:e}),`started`},[o,i]),f=(0,R.useCallback)((e,t)=>{let n=N.getState().sessionCache,r=n.get(e),i=n.get(t);return!r||!i?null:{baseline:{label:be(e),snapshot:r},candidate:{label:be(t),snapshot:i}}},[]),p=(0,R.useCallback)(async(e,t)=>{if(e.kind===`file`)return{start:t=>J.current.startParse(e.file,t)};if(e.kind===`folder`)return{start:t=>J.current.startParseFiles(e.files,t)};if(e.kind===`url`)return{start:t=>J.current.startParseFromUrl(e.request,t)};if(e.kind===`cached`)return null;let n=e.handle??await yo(e.id);if(!n)return N.getState().setError(`${jo[t]}: this recent file is no longer available.`),null;if(!await bo(n))return N.getState().setError(`${jo[t]}: permission to read this file was denied.`),null;let r;try{r=await n.getFile()}catch{return N.getState().setError(`${jo[t]}: this recent file could not be read.`),null}return{start:e=>J.current.startParse(r,e)}},[]),m=(0,R.useCallback)((e,t=0)=>{let n=N.getState().appModel;N.getState().setEvidenceAvailability(A(n,{skippedLines:t}));let r=N.getState().appModel,i=$a(r.app,r.stages,r.executors.added,r.executors.removed,r.jobs,r.sql,r.runAggregates);N.getState().sessionCache.set(e,Ce(r,i,N.getState().taskDataCache))},[]),h=(0,R.useCallback)((e,n)=>{let r=(e,t)=>{J.current?.terminate(),N.getState().setCompareLoad(null),N.getState().setComparisonActive(!1);let n=t?.message??String(t);N.getState().setError(`${jo[e]}: ${n}`)},i=async(e,n,i)=>{J.current?.terminate(),N.getState().resetModel(),N.getState().setActiveFile(e.id),N.getState().setCompareLoad({current:n===`A`?1:2}),J.current=t();let a=await p(e,n);if(!a){J.current?.terminate(),N.getState().setCompareLoad(null),N.getState().setComparisonActive(!1);return}let o=Yt(N.getState().appModel,{onProgress:e=>N.getState().setParse({pct:e.pct??0,lines:e.linesProcessed??0,etaMs:e.etaMs??null}),onDone:e=>i(e?.skippedLines??0),onError:e=>r(n,e)});a.start(o)},a=(e,t,n)=>{if(e.kind===`cached`){if(!N.getState().sessionCache.has(e.id)){N.getState().setError(`${jo[t]}: this run is no longer loaded. Load its event log again.`);return}n();return}i(e,t,t=>{m(e.id,t),n()})};a(e,`A`,()=>{a(n,`B`,()=>{N.getState().setCompareLoad(null),N.getState().setActiveFile(null),N.getState().setCompareSeed(null),N.getState().openComparison(e.id,n.id)})})},[t,p,m]),g=(0,R.useCallback)(()=>{let e=N.getState(),t=e.activeFileId;t!=null&&e.appModel.app&&(l(),N.getState().setCompareSeed({id:t,label:be(t)}))},[l]);return{startLoad:o,startLoadFolder:s,startLoadFromUrl:c,resetToDropZone:l,cancelParse:u,getTaskData:n,pickRecent:d,prepareComparison:f,startCompareLoad:h,drillIntoRun:(0,R.useCallback)(e=>{let t=N.getState(),n=t.sessionCache.get(e);if(!n)return;J.current?.terminate(),J.current=null;let r=v(t.appModel,t.taskDataCache,n);N.getState().setFindings(r,no(t.appModel.app)),N.getState().setActiveFile(e),N.getState().setStatus(`ready`),N.getState().setComparisonActive(!1)},[]),compareWithAnotherRun:g}}function Po(e){let t=[...e.values()].filter(e=>e.submittedAt!=null&&e.completedAt!=null).map(e=>[e.submittedAt,e.completedAt]);return j(t)}function Fo(e,t){let n=e?.startTime??0,r=[...t.values()].filter(e=>e.submittedAt!=null&&e.completedAt!=null).map(e=>[e.submittedAt,e.completedAt]),i=e?.endTime??null??(r.length>0?r.reduce((e,t)=>Math.max(e,t[1]),-1/0):n),a=Math.max(0,i-n);if(r.length===0)return{total:a,startup:a,stagesActive:0,gaps:0,idle:0};let o=j(r),s=o.reduce((e,[t,n])=>e+(n-t),0),c=o[0][0],l=Math.max(0,c-n),u=0;for(let e=1;e<o.length;e++)u+=o[e][0]-o[e-1][1];let d=o[o.length-1][1],f=Math.max(0,i-d);return{total:a,startup:l,stagesActive:s,gaps:u,idle:f}}function Io(e){return String(e).toLowerCase().replace(/\b[0-9a-f]{8,}\b/g,`#`).replace(/\d+/g,`#`).replace(/\s+/g,` `).trim()}function Lo(e,t){if(!e)return null;function n(e){let r=(e.children??[]).map(n).sort();return Ur(JSON.stringify([Io(e.name??``),t(e.detail??``),r]))}return n(e)}function Ro(e,t,n,r){let i=e.sqlExecutionId;if(i==null)return``;let a=t.sql.get(i)?.planTree??null;if(!a)return``;let o=(r??_r(e,t.sql)).map(e=>JSON.stringify([Io(e.name??``),n(e.detail??``)]));return o.length===0?Lo(a,n)??``:Ur(JSON.stringify(o.sort()))}function zo(e,t,n,r){return Io(e.name??``)+`§`+Ro(e,t,n,r)}function Bo(e,t,n=()=>!0){let r=new Map;for(let[i,a]of e.stages){if(!n(i))continue;let e=t(a,i),o=r.get(e);o?o.push(i):r.set(e,[i])}return r}function Vo(e,t){let n=[],r=new Set;for(let i of[...e.keys()].sort()){let a=t.get(i);if(!a)continue;let o=e.get(i);if(o.length!==a.length)continue;let s=[...o].sort((e,t)=>e-t),c=[...a].sort((e,t)=>e-t);for(let e=0;e<s.length;e++)n.push({identity:i,baseId:s[e],candId:c[e]});r.add(i)}return{pairs:n,matchedIdentities:r}}var Ho=1e6;function Uo(e,t,n,r,i,a){if(e===0||t===0)return{pairs:[],bounded:!1};let o=e*t>Ho,s=100+Math.ceil(Math.abs(e-t)/2),c=new Int32Array(e),l=new Int32Array(e);for(let n=0;n<e;n++){let r=Math.floor(n*t/e);c[n]=o?Math.max(0,r-s):0,l[n]=o?Math.min(t-1,r+s):t-1}let u=Array(e),d=(n,r)=>{for(;;){if(n>=e||r>=t)return 0;if(r<c[n])r=c[n];else if(r>l[n])n++;else return u[n][r-c[n]]}},f=n;for(let t=e-1;t>=0;t--){let e=new Int32Array(l[t]-c[t]+1);u[t]=e;for(let n=l[t];n>=c[t];n--){let i=Math.max(d(t+1,n),n+1<=l[t]?e[n+1-c[t]]:d(t+1,n+1)),a=f(t,n);a>=r&&(i=Math.max(i,a+d(t+1,n+1))),e[n-c[t]]=i}}let p=[],m=0,h=0;for(;m<e&&h<t;){if(h<c[m]){h=c[m];continue}if(h>l[m]){m++;continue}let e=u[m][h-c[m]],t=f(m,h);if(t>=r&&t+d(m+1,h+1)===e){p.push([m,h]),m++,h++;continue}let n=d(m+1,h)===e,o=d(m,h+1)===e;n&&o?i(m)>=a(h)?m++:h++:n?m++:h++}return{pairs:p,bounded:o}}var Wo=/^(WholeStageCodegen|InputAdapter|ColumnarToRow|RowToColumnar)\b/,Go=e=>Wo.test(e.name??``);function Ko(e){let t=new Set;for(let n of e.matchAll(/([A-Za-z_][\w$.]*)#\d+L?/g))t.add(n[1]);return[...t].sort()}function qo(e){let t=new Set(e.filter(e=>!Go(e)));if(t.size===0)return null;let n=new Map,r=new Set,i=e=>{let n=[];for(let o of e.children??[])t.has(o)?(n.push(a(o)),r.add(o)):n.push(...i(o));return n},a=e=>{let t=n.get(e);return t===void 0&&(t=Ur(JSON.stringify([Io(e.name??``),Ko(e.detail??``),i(e).sort()])),n.set(e,t)),t};for(let e of t)a(e);let o=[...t].filter(e=>!r.has(e)).map(a).sort();return Ur(JSON.stringify(o))}var Jo=/[^A-Za-z0-9_.$]+/;function Yo(e,t,n){let r=new Set,i=e=>{for(let t of e.split(Jo))t&&r.add(t)};i(Io(e??``));for(let e of t)Go(e)||(i(Io(e.name??``)),i(n(e.detail??``)));return[...r].sort()}function Xo(e,t){if(e.length===0&&t.length===0)return 1;let n=0,r=0,i=0;for(;n<e.length&&r<t.length;)e[n]===t[r]?(i++,n++,r++):e[n]<t[r]?n++:r++;return i/(e.length+t.length-i)}var Zo=[{name:`fileCounts`,apply:e=>e.replace(/FileIndex\(\d+ paths\)/g,`FileIndex(n paths)`)},{name:`dates`,apply:e=>e.replace(/\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?)?/g,`DATE`)},{name:`inLists`,apply:e=>e.replace(/\bIN \([^()]*\)/g,`IN (...)`).replace(/\bINSET [^()]*?(?=\))/g,`INSET ...`)},{name:`stagingDirs`,apply:e=>e.replace(/\/([A-Za-z0-9]{6,8})(?=\/)/g,(e,t)=>/[A-Z]/.test(t)&&/[a-z]/.test(t)||/[A-Za-z]/.test(t)&&/\d/.test(t)?`/TMP`:e)}],Qo=`NORMALIZED`;function $o(e){if(!e||e.length===0)return[];if(e.length>16)throw Error(`At most 16 normalize patterns are accepted, got ${e.length}.`);return e.map(e=>{if(typeof e!=`string`||e.length===0)throw Error(`A normalize pattern must be a non-empty string.`);if(e.length>200)throw Error(`Normalize pattern "${e.slice(0,40)}..." is ${e.length} characters; the limit is 200.`);let t;try{t=new RegExp(e,`g`)}catch(t){throw Error(`Normalize pattern "${e}" is not a valid regular expression: ${t.message}`)}if(t.test(``))throw Error(`Normalize pattern "${e}" matches the empty string.`);return t.lastIndex=0,t})}function es(e=[]){return t=>{let n=t;for(let t of e)n=n.replace(t,Qo);n=ai(n);for(let e of Zo)n=e.apply(n);return n}}function ts(e,t,n,r){return zo(e,t,n,r)}function ns(e){return/^(Scan|BatchScan)\b/.test(e.name??``)||/FileScan|JDBCRelation/.test(e.detail??``)}function rs(e,t,n=_r(e,t)){let r=0;for(let e of n){if(!ns(e))continue;let t=e.name??``,n=e.detail??``;if(Sn(t,n)!==null||!xn(t,n))return!1;r++}return r>0}var is=[`executorRunTime`,`executorCpuTime`,`memoryBytesSpilled`,`diskBytesSpilled`,`inputBytes`,`outputBytes`,`shuffleReadBytes`,`shuffleWriteBytes`],as=.55,os=.5,ss=1e6,cs=25e4;function ls(e,t){let n=0,r=!1;for(let i of e){let e=i[t];typeof e==`number`&&Number.isFinite(e)&&(n+=e,r=!0)}return r?n:null}function us(e){let t=Vr([e]);return{executorRunTime:ls(t,`executorRunTime`),executorCpuTime:Hr(t),memoryBytesSpilled:ls(t,`memoryBytesSpilled`),diskBytesSpilled:ls(t,`diskBytesSpilled`),inputBytes:ls(t,`inputBytes`),outputBytes:ls(t,`outputBytes`),shuffleReadBytes:ls(t,`shuffleReadBytes`),shuffleWriteBytes:ls(t,`shuffleWriteBytes`)}}function ds(e,t){let n={};for(let r of is){let[i,a]=[e[r],t[r]];n[r]={baseline:i,candidate:a,delta:i!=null&&a!=null?a-i:null}}return n}function fs(e){let t={};for(let n of is){let r=0,i=!1;for(let t of e)t[n]!=null&&(r+=t[n],i=!0);t[n]=i?r:null}return t}var ps=(e,t)=>e-t,ms=/^(java|javax|jdk|sun|scala|py4j|org\.apache|io\.delta|io\.netty|com\.sun)\b/;function hs(e){let t=[];for(let n of(e??``).split(`
5
+ `)){let e=n.trim().replace(/:\d+\)$/,`)`);e&&!ms.test(e)&&t.push(e)}return t}var gs=(e,t)=>[...new Set(t(e).replace(/\S*\/([^/\s]+)/g,`$1`).split(/[^A-Za-z0-9_.$]+/).filter(Boolean))].sort();function _s(e){let t=[],n=new Set;return(function e(r){if(!/^(WholeStageCodegen|InputAdapter|ColumnarToRow)\b/.test(r.name??``)){t.push(Io(r.name??``));for(let e of Ko(r.detail??``))n.add(`@${e}`)}for(let t of r.children??[])e(t)})(e),[...t,...n].sort()}function vs(e,t,n,r){let i=e=>{let t=new Int32Array(e.length);return e.forEach((e,n)=>{let i=r.get(e);i===void 0&&(i=r.size,r.set(e,i)),t[n]=i}),t.sort()},a=new Map,o=new Set,s=new Map,c=new Map,l=new Map;for(let[n,r]of e.stages){let i=_r(r,e.sql);if(a.set(n,i),rs(r,e.sql,i)){o.add(n);continue}s.set(n,ts(r,e,t,i)),c.set(n,qo(i));let u=r.sqlExecutionId??null,d=l.get(u);d?d.push(n):l.set(u,[n])}let u=(r,a)=>{a.sort(ps);let o=r===null?null:e.sql.get(r)?.planTree??null,s=o?_s(o):a.map(t=>c.get(t)??`n:${Io(e.stages.get(t).name??``)}`).sort(),l=[...new Set(a.flatMap(t=>hs(e.stages.get(t).details)))].sort(),u=r===null?[]:gs(e.sql.get(r)?.description??``,t),d=JSON.stringify([s,l,u]),f=n.get(d);return f===void 0&&(f=n.size,n.set(d,f)),{id:r,stageIds:a,structure:i(s),frames:i(l),description:i(u),signature:f}},d=[...l.keys()].filter(e=>e!==null).sort(ps).map(e=>u(e,l.get(e))),f=l.get(null);return{snap:e,nodesOf:a,bookkeeping:o,exactKey:s,structuralKey:c,executions:d,pseudo:f?u(null,f):null}}var ys=4,bs=2,xs=1;function Ss(e,t){let n=ys*Xo(e.structure,t.structure),r=ys;return e.frames.length>0&&t.frames.length>0&&(n+=bs*Xo(e.frames,t.frames),r+=bs),e.description.length>0&&t.description.length>0&&(n+=xs*Xo(e.description,t.description),r+=xs),Math.round(1e3*n/r)}function Cs(e,t,n,r,i,a){let o=n.id===null,s=new Set(n.stageIds),c=new Set(r.stageIds),l=[],u=(e,t,n,r)=>{l.push({baseId:e,candId:t,quality:n,score:r}),s.delete(e),c.delete(t)},d=(e,t,n)=>{let r=t.get(n);return r||(r=Yo(e.snap.stages.get(n).name,e.nodesOf.get(n),a),t.set(n,r)),r},f=(n,r)=>Xo(d(e,i.base,n),d(t,i.cand,r)),p=(e,t)=>{let n=new Map;for(let r of[...e].sort(ps)){let e=t(r);if(e===null)continue;let i=n.get(e);i?i.push(r):n.set(e,[r])}return n},m=(e,t,n,r)=>{let i=p(s,e),a=p(c,t);for(let e of[...i.keys()].sort()){let t=a.get(e);if(!t)continue;let o=i.get(e);for(let e=0;e<Math.min(o.length,t.length);e++)u(o[e],t[e],n,r(o[e],t[e]))}},h=(e,t)=>Io(a(e.snap.stages.get(t).details??``));m(t=>e.exactKey.get(t)+(o?`§${h(e,t)}`:``),e=>t.exactKey.get(e)+(o?`§${h(t,e)}`:``),`exact`,()=>1),m(t=>e.structuralKey.get(t)??null,e=>t.structuralKey.get(e)??null,`structural`,f);let g=(e,t)=>[...t].filter(t=>e.structuralKey.get(t)!=null).sort(ps),_=g(e,s),v=g(t,c);if(_.length*v.length<=cs){let e=[];for(let t of _)for(let n of v){let r=f(t,n);r>=.6&&e.push({baseId:t,candId:n,score:r})}e.sort((e,t)=>t.score-e.score||e.baseId+e.candId-(t.baseId+t.candId)||e.baseId-t.baseId);for(let{baseId:t,candId:n,score:r}of e)s.has(t)&&c.has(n)&&u(t,n,`aligned`,r)}let y=e=>t=>e.structuralKey.get(t)==null?Io(e.snap.stages.get(t).name??``):null;return m(y(e),y(t),`aligned`,()=>os),{pairs:l,leftBase:[...s].sort(ps),leftCand:[...c].sort(ps)}}function ws(e,t,n={}){let r=es(n.normalizePath),i=new Map,a=new Map,o=vs(e,r,i,a),s=vs(t,r,i,a),c=e=>new Set(e.executions.map(e=>e.signature)).size,l=c(o)*c(s)<=ss,u=new Map,d=(e,t)=>{if(e.signature===t.signature)return 1e3;if(!l)return Ss(e,t);let n=e.signature*i.size+t.signature,r=u.get(n);return r===void 0&&(r=Ss(e,t),u.set(n,r)),r},f=Uo(o.executions.length,s.executions.length,(e,t)=>d(o.executions[e],s.executions[t]),Math.round(1e3*as),e=>o.executions[e].id,e=>s.executions[e].id),p=Math.min(o.executions.length,s.executions.length),m=p>0?f.pairs.length/p:null,h=m===null||m>=.5,g=[];if(h){for(let[e,t]of f.pairs)g.push([o.executions[e],s.executions[t]]);o.pseudo&&s.pseudo&&g.push([o.pseudo,s.pseudo])}let _=new Map,v=new Map,y=(e,t,n)=>{let r=e.get(n);return r||(r=us(t.stages.get(n)),e.set(n,r)),r},b=(n,r)=>r.map(r=>n===`base`?y(_,e,r):y(v,t,r)),x={base:new Map,cand:new Map},S=[],C=[];for(let[n,i]of g){let a=Cs(o,s,n,i,x,r);for(let{baseId:n,candId:r,quality:i,score:o}of a.pairs)S.push({pairId:`b${n}-c${r}`,baseStageIds:[n],candStageIds:[r],quality:i,score:o,deltas:ds(y(_,e,n),y(v,t,r))});a.leftBase.length+a.leftCand.length>0&&n.id!==null&&i.id!==null&&n.stageIds.length!==i.stageIds.length&&C.push({baseExecutionId:n.id,candExecutionId:i.id,baseStageIds:a.leftBase,candStageIds:a.leftCand,deltas:ds(fs(b(`base`,a.leftBase)),fs(b(`cand`,a.leftCand)))})}S.sort((e,t)=>e.baseStageIds[0]-t.baseStageIds[0]||e.candStageIds[0]-t.candStageIds[0]),C.sort((e,t)=>e.baseExecutionId-t.baseExecutionId||e.candExecutionId-t.candExecutionId);let w=new Set(S.flatMap(e=>e.baseStageIds)),T=new Set(S.flatMap(e=>e.candStageIds)),E=new Set(C.flatMap(e=>e.baseStageIds)),ee=new Set(C.flatMap(e=>e.candStageIds)),D=(e,t,n,r)=>[...e.stages.keys()].filter(e=>!t.has(e)&&!n.has(e)&&!r.has(e)).sort(ps),O=0,k=0,A=(e,t,n,r,i)=>{for(let a of t.stages.keys()){if(n.has(a))continue;let o=y(e,t,a).executorRunTime??0;O+=o,(r.has(a)||i.has(a))&&(k+=o)}};return A(_,e,o.bookkeeping,w,E),A(v,t,s.bookkeeping,T,ee),{pairs:S,unmatched:{baseStageIds:D(e,o.bookkeeping,w,E),candStageIds:D(t,s.bookkeeping,T,ee)},replanned:C,bookkeepingStageIds:{baseStageIds:[...o.bookkeeping].sort(ps),candStageIds:[...s.bookkeeping].sort(ps)},runtimeCoverage:O>0?k/O:null,executionAlignment:{baseExecutions:o.executions.length,candExecutions:s.executions.length,pairedExecutions:f.pairs.length,bounded:f.bounded,agreement:m,accepted:h}}}var Ts=new Set([`stageFailed`,`jobFailureRate`]);function Es(e){let t=e.split(`
6
+ `)[0].trim();return t.length===0?null:t.length>240?`${t.slice(0,237).trimEnd()}...`:t}function Ds(e){return typeof e==`string`?e:null}function Os(e,t){let n=[...e.values()].filter(e=>e.result!=null),r=n.filter(e=>e.succeeded===!1).sort((e,t)=>e.id-t.id),i=new Set(r.flatMap(e=>e.stageIds)),a=t.filter(e=>e.type===`stageFailed`).sort((e,t)=>Number(i.has(t.stageId))-Number(i.has(e.stageId)))[0],o=a?.valueText??r.map(e=>Ds(e.exception)).find(e=>e!=null)??null;return{failedJobs:r.length,totalJobs:n.length,failedJobStageIds:i,reason:r.length>0&&o!=null?Es(o):null,reasonStageId:a?.stageId??null}}function ks(e,t){return t.reason==null?!1:e.type===`stageFailed`?Es(e.valueText)===t.reason:e.type===`jobFailureRate`&&t.failedJobs===1&&(t.reasonStageId==null||t.failedJobStageIds.has(t.reasonStageId))}var As=`No stage in this log recorded an end, so the stage checks had nothing to measure.`,js=`The log has no end-of-run record, so the core usage, memory and executor churn checks had no run length to measure.`;function Ms(e){return[...e.values()].some(e=>e.submittedAt!=null&&e.completedAt!=null)}function Ns(e){return`dataUnavailable`in e&&e.dataUnavailable===!0||!w(e)}var Ps=new Set([`utilization`,`memoryUtilization`,`autoscalingChurn`]),Fs=new Set(Ti().filter(e=>e.scope===`stage`).map(e=>e.type));function Is(e){return e.some(e=>e.type===`incompleteRun`)}function Ls(e,t){let n=new Set;t&&n.add(As),Is(e)&&n.add(js);for(let t of e)Ns(t)&&t.recommendation&&n.add(t.recommendation);return[...n]}function Rs(e,t){return Os(e.jobs,t).failedJobs>0||t.some(w)?!1:Ls(t,!Ms(e.stages)).length===0}function zs(e,t){let n=!Ms(e),r=Is(t),i=new Map;for(let e of t)Ns(e)&&(i.get(e.type)||i.set(e.type,e.recommendation??null));let a=e=>i.get(e)||(n&&Fs.has(e)?As:r&&Ps.has(e)?js:i.has(e)?`The log lacked the data this check needs.`:null);return{isNotRun:e=>a(e)!=null,notRunReason:a}}function Bs(e){let{failedJobs:t,totalJobs:n}=Os(e.jobs,e.catalog);return{failedJobs:t,totalJobs:n,incomplete:Is(e.catalog)}}function Vs(e,t){return zo(e,t,ai)}function Hs(e,t){let n=Bo(e,t=>Vs(t,e)),r=Bo(t,e=>Vs(e,t)),i=new Set;for(let e of[n,r])for(let[t,n]of e)n.length>1&&i.add(t);let{pairs:a,matchedIdentities:o}=Vo(n,r),s=e.stages.size+t.stages.size;return{pairs:a,matchedIdentities:o,collisionIdentities:i,coverage:s===0?1:2*a.length/s}}function Us(e){if(e.length===0)return null;let t=[...e].sort((e,t)=>e-t),n=Math.ceil(.95*t.length)-1;return t[Math.min(t.length-1,Math.max(0,n))]}function Ws(e,t){let n=0,r=!1;for(let i of e){let e=i[t];Number.isFinite(e)&&(n+=e,r=!0)}return{sum:n,present:r}}function Gs(e){let t=(e.completedAt??0)-(e.submittedAt??0);return t>0&&Number.isFinite(e.taskDurationMax)?e.taskDurationMax/t:null}function Ks(e){let t=[];for(let n of e){let e=Gs(n);e!=null&&t.push(e)}return t}var qs=new Set([`inputBytes`,`outputBytes`,`taskCount`,`executorsAdded`]);function Js(e,t,n){if(t==null||n==null)return`unavailable`;if(qs.has(e))return n===t?`unchanged`:`neutral`;let r=n-t;return r<0?`improvement`:r>0?`regression`:`unchanged`}function Ys(e,t,n,r,i={}){let a=Js(e,n,r);return{key:e,label:t,baseline:n,candidate:r,delta:n==null||r==null?null:r-n,direction:a,...i}}function Xs(e,t){let n=[],r=e=>Vr([...e.stages.values()]);n.push(Ys(`wallClock`,`Wall-clock duration`,Fo(e.app,e.stages).total,Fo(t.app,t.stages).total));let i=Ws(r(e),`memoryBytesSpilled`),a=Ws(r(t),`memoryBytesSpilled`);n.push(Ys(`shuffleSpill`,`Memory spill`,i.present?i.sum:null,a.present?a.sum:null,{unavailableReason:i.present&&a.present?void 0:`No memory-spill data recorded for a run`}));let o=Us(Ks([...e.stages.values()])),s=Us(Ks([...t.stages.values()]));n.push(Ys(`taskSkew`,`Task skew (p95)`,o,s,{unavailableReason:o!=null&&s!=null?void 0:`No stage had measurable duration for a run`}));let c=Ws(r(e),`taskCount`),l=Ws(r(t),`taskCount`),u=Ws(r(e),`failedTasks`),d=Ws(r(t),`failedTasks`),f=c.present&&c.sum>0&&u.present?u.sum/c.sum:null,p=l.present&&l.sum>0&&d.present?d.sum/l.sum:null;n.push(Ys(`failedTaskRate`,`Failed-task rate`,f,p,{unavailableReason:f!=null&&p!=null?void 0:`No task or failure counts recorded for a run`}));let m=(i,a,o,s)=>{let c=Ws(r(e),o),l=Ws(r(t),o);n.push(Ys(i,a,c.present?c.sum:null,l.present?l.sum:null,{unavailableReason:c.present&&l.present?void 0:s}))};m(`diskSpill`,`Disk spill`,`diskBytesSpilled`,`No disk-spill data recorded for a run`),m(`gcTime`,`GC time`,`jvmGCTime`,`No GC-time data recorded for a run`),m(`inputBytes`,`Input read`,`inputBytes`,`No input-bytes data recorded for a run`),m(`outputBytes`,`Output written`,`outputBytes`,`No output-bytes data recorded for a run`),m(`executorRunTime`,`Executor run-time`,`executorRunTime`,`No executor run-time recorded for a run`),m(`taskCount`,`Task count`,`taskCount`,`No task counts recorded for a run`);let h=e=>Array.isArray(e.executors?.added)?e.executors.added.length:null,g=h(e),_=h(t);n.push(Ys(`executorsAdded`,`Executors added`,g,_,{unavailableReason:g!=null&&_!=null?void 0:`No executor events recorded for a run`}));let v=e=>Hr(r(e)),y=v(e),b=v(t);n.push(Ys(`executorCpuTime`,`Executor CPU time`,y,b,{unavailableReason:y!=null&&b!=null?void 0:`No executor CPU time recorded for a run`}));let x=e=>e.executors?Wn(e).coreHours:null,S=x(e),C=x(t);return n.push(Ys(`allocatedCoreHours`,`Allocated core-hours`,S,C,{unavailableReason:S!=null&&C!=null?void 0:`No executor lifecycle or core count recorded for a run`})),n}function Zs(e,t){let n=e=>{let t=new Map;for(let n of e.catalog){let r=`rule`in n&&typeof n.rule==`string`?n.rule:n.type,i=n.impactBand??`unknown`,a=`${r}§${i}`,o=t.get(a)??{rule:r,type:n.type,impactBand:i,count:0,stages:new Set};o.count++;let s=n.stageId==null?null:e.stages.get(n.stageId);s?.name&&o.stages.add(s.name),t.set(a,o)}return t},r=n(e),i=n(t),a=[],o=[];for(let e of[...new Set([...r.keys(),...i.keys()])].sort()){let t=r.get(e),n=i.get(e),s=t?.count??0,c=n?.count??0;if(c===s)continue;let l=n??t,u=c>s?n:t,d={rule:l.rule,type:l.type,impactBand:l.impactBand,baseCount:s,candCount:c,delta:c-s,stages:[...u.stages].sort()};(c>s?a:o).push(d)}return{introduced:a,resolved:o}}function Qs(e,t){return e?.name!=null&&t?.name!=null&&e.name!==t.name}function $s(e,t,n){return n.map(n=>{let r=n.baseStageIds[0],i=n.candStageIds[0],a=e.stages.get(r),o=Gs(a),s=Gs(t.stages.get(i));return{pairId:n.pairId,name:Io(a.name??``),baseId:r,candId:i,baseline:o,candidate:s,delta:o!=null&&s!=null?s-o:null}}).sort((e,t)=>e.name<t.name?-1:e.name>t.name?1:e.baseId-t.baseId)}function ec(e){let t=e=>Number.isFinite(e)?e:null,n=(e.completedAt??0)-(e.submittedAt??0);return{duration:n>0?n:null,memoryBytesSpilled:t(e.memoryBytesSpilled),diskBytesSpilled:t(e.diskBytesSpilled),jvmGCTime:t(e.jvmGCTime),inputBytes:t(e.inputBytes),outputBytes:t(e.outputBytes),executorRunTime:t(e.executorRunTime),taskCount:t(e.taskCount),failedTasks:t(e.failedTasks)}}function tc(e){return[...e.stages].map(([e,t])=>({id:e,name:t.name??`Stage ${e}`,metrics:ec(t)}))}var nc=.9;function rc(e,t,n={}){let r=e.snapshot,i=t.snapshot,a=Hs(r,i),o=ws(r,i,{normalizePath:$o(n.normalizePath)}),s=o.runtimeCoverage,c=Qs(r.app,i.app),l=s===null,u=s!==null&&s<nc,d=l?`insufficient`:c||u?`low`:`ok`,f=s===null?``:`${Math.floor(s*100)}%`,p=l?`${c?`Run names differ and no`:`No`} executor run time was recorded in either run, so there is no work to compare.`:c&&u?`Run names differ and only ${f} of executor run time is in matched stages, so deltas may compare different work.`:c?`Run names differ, so deltas may compare different work.`:u?`Only ${f} of executor run time is in matched stages, so per-stage rows mostly compare unrelated work.`:null;return{baselineLabel:e.label,candidateLabel:t.label,confidence:d,reason:p,matchedCoverage:a.coverage,comparisonSchemaVersion:1,runtimeCoverage:s,stagePairs:o.pairs,unmatched:o.unmatched,replanned:o.replanned,bookkeepingStageIds:o.bookkeepingStageIds,executionAlignment:o.executionAlignment,metrics:Xs(r,i),findings:Zs(r,i),stageSkew:$s(r,i,o.pairs),baseStages:tc(r),candStages:tc(i),jobOutcomes:{baseline:Bs(r),candidate:Bs(i)}}}function ic({entries:e,activeId:t=null,onPick:n,onRemove:r}){return e.length?(0,z.jsx)(`ul`,{className:`flex flex-col gap-0.5`,children:e.map(e=>{let i=e.appName||e.name,a=e.issueCount==null?``:` · ${e.issueCount} issue${e.issueCount===1?``:`s`}`;return(0,z.jsxs)(`li`,{className:b(`flex items-center gap-1 rounded-md`,e.id===t&&`bg-accent-soft`),children:[(0,z.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable flex min-w-0 flex-1 cursor-pointer flex-col items-start gap-0.5 rounded-md px-1.5 py-1 text-left hover:bg-muted`,onClick:()=>n?.(e.id),children:[(0,z.jsx)(`span`,{className:`w-full truncate text-sm font-medium`,children:i}),(0,z.jsxs)(`span`,{className:`recent-entry-meta w-full truncate text-muted-foreground`,children:[e.name,` · `,M(e.size),a]})]}),(0,z.jsx)(B,{type:`button`,variant:`ghost`,size:`icon`,className:`tap-target-comfortable`,"aria-label":`Remove from recent files`,onClick:()=>r?.(e.id),children:(0,z.jsx)(Wt,{"aria-hidden":`true`})})]},e.id)})}):(0,z.jsx)(`p`,{className:`px-1.5 py-1 text-sm text-muted-foreground`,children:`No recent files yet`})}var ac=`sample-run`;function oc(e,t){let n=e=>e.match(/(\d+)|(\D+)/g)??[e],r=n(e),i=n(t),a=Math.max(r.length,i.length);for(let e=0;e<a;e++){let t=r[e]??``,n=i[e]??``;if(t===n)continue;let a=Number(t),o=Number(n);return!Number.isNaN(a)&&!Number.isNaN(o)?a-o:t<n?-1:1}return 0}function sc(e){let t=e.filter(e=>!e.toLowerCase().startsWith(`appstatus`)).filter(e=>/^events_\d+_/.test(e)),n=e=>parseInt(e.match(/^events_(\d+)_/)[1],10),r=t.filter(e=>e.endsWith(`.compact`)).map(n),i=r.length>0?Math.max(...r):-1,a=t.filter(e=>{let t=n(e);return e.endsWith(`.compact`)?t===i:t>i}).sort(oc),o=a.map(n);for(let e=1;e<o.length;e++)if(o[e]!==o[e-1]+1)throw Error(`Rolling event-log directory is missing file(s) between index ${o[e-1]} and ${o[e]}.`);return a}var cc={baseUrl:`shuffle-works-shs-base-url`,appId:`shuffle-works-shs-app-id`,attemptId:`shuffle-works-shs-attempt-id`};function lc(e){if(typeof window>`u`)return``;try{return window.localStorage.getItem(cc[e])??``}catch{return``}}var uc=`sample-runs/sample-run.ndjson.gz`,dc=`docs/user-guide/getting-started.html#local-server-mode`,fc={"local-server-unavailable":`The local server is unavailable. Start local-server mode, then try again.`,"upstream-unreachable":`The History Server could not be reached. Check the address and try again.`,"application-not-found":`The requested application was not found. Check the application and attempt IDs.`,"access-or-upstream-failure":`The History Server could not provide this event log. Check access and try again.`,"invalid-event-log":`The response did not contain a supported event log. Choose a local file or try another application.`};async function pc(e){let t=e.createReader(),n=[];for(;;){let e=await new Promise((e,n)=>t.readEntries(e,n));if(e.length===0)break;n.push(...e)}let r=n.filter(e=>e.isFile);return Promise.all(r.map(e=>new Promise((t,n)=>e.file(t,n))))}function mc({onPick:e,compact:t=!1}={}){let{startLoad:n,startLoadFolder:r,startLoadFromUrl:i,pickRecent:a}=No(),o=I(e=>e.shsParsing),s=(0,R.useRef)(null),c=(0,R.useRef)(null),[l,u]=(0,R.useState)(!1),[d,f]=(0,R.useState)([]),[p,m]=(0,R.useState)(()=>lc(`baseUrl`)),[h,_]=(0,R.useState)(()=>lc(`appId`)),[v,y]=(0,R.useState)(()=>lc(`attemptId`)),[x,S]=(0,R.useState)(!1),[C,w]=(0,R.useState)(!1),[T,E]=(0,R.useState)(!1),[ee,D]=(0,R.useState)(!1),[O,k]=(0,R.useState)({baseUrl:!1,appId:!1,attemptId:!1}),[A,te]=(0,R.useState)(null),ne=(0,R.useRef)(null),[j,re]=(0,R.useState)(!1),M=Oo({baseUrl:p,appId:h,attemptId:v}),ae=T||o,oe=x||o;(0,R.useEffect)(()=>{A&&ne.current?.focus()},[A]),(0,R.useEffect)(()=>{if(t)return;let e=new AbortController,n=setTimeout(()=>e.abort(),800);return fetch(`/shs-proxy`,{signal:e.signal}).then(e=>{e.status===400&&D(!0)}).catch(()=>{}).finally(()=>clearTimeout(n)),()=>{clearTimeout(n),e.abort()}},[t]);let se=(0,R.useCallback)(()=>{go().then(e=>f(e)).catch(()=>f([]))},[]);(0,R.useEffect)(()=>{se()},[se]);let ce=(0,R.useCallback)(async()=>{re(!0);try{let t=await fetch(uc);if(!t.ok)throw Error(`HTTP ${t.status}`);let r=await t.blob(),i=new File([r],`sample-run.ndjson.gz`,{type:`application/gzip`});e?e({kind:`file`,id:uo(i.name,i.size,i.lastModified),label:i.name,file:i}):n(i,{id:ac})}catch{N.getState().setError(`Could not load the sample run. Check your connection and try again, or choose a file below.`)}finally{re(!1)}},[n,e]),le=(0,R.useCallback)(async()=>{if(co()){let t;try{[t]=await window.showOpenFilePicker()}catch{return}try{let r=await t.getFile();e?e({kind:`file`,id:uo(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t})}catch{N.getState().setError(`Could not read the selected file.`)}return}s.current?.click()},[n,e]),ue=(0,R.useCallback)(t=>{let n=t.map(e=>e.name);if(!n.some(e=>/^events_\d+_/.test(e))){N.getState().setError(`This isn't a Spark rolling event-log directory. Choose file to load a single event log.`);return}let i;try{i=sc(n)}catch(e){N.getState().setError(e.message);return}let a=new Map(t.map(e=>[e.name,e])),o=i.map(e=>a.get(e));if(e){let t=o[0];e({kind:`folder`,id:`folder:${t?.name??i[0]}`,label:`${o.length}-file rolling log`,files:o});return}r(o)},[r,e]),de=(0,R.useCallback)(t=>{let r=t.target.files?.[0];r&&(e?e({kind:`file`,id:uo(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r)),t.target.value=``},[n,e]),fe=(0,R.useCallback)(e=>{let t=Array.from(e.target.files??[]);t.length&&ue(t),e.target.value=``},[ue]),pe=(0,R.useCallback)(async t=>{let r=t.dataTransfer.files[0],i=t.dataTransfer.items?.[0],a=i?.webkitGetAsEntry?.();if(a&&a.isDirectory){try{let e=await pc(a);ue(e)}catch{N.getState().setError(`Could not read the dropped folder.`)}return}if(co()&&i?.getAsFileSystemHandle)try{let t=await i.getAsFileSystemHandle();if(t&&t.kind===`file`){let r=await t.getFile();e?e({kind:`file`,id:uo(r.name,r.size,r.lastModified),label:r.name,file:r,handle:t}):n(r,{handle:t});return}}catch{N.getState().setError(`Could not read the selected file.`);return}r&&(e?e({kind:`file`,id:uo(r.name,r.size,r.lastModified),label:r.name,file:r}):n(r))},[n,ue,e]),me=(0,R.useCallback)(e=>{e.preventDefault(),u(!1),pe(e)},[pe]),P=(0,R.useCallback)(async t=>{let n=d.find(e=>e.id===t);if(e){e({kind:`recent`,id:t,label:n?.appName||n?.name||t,handle:n?.handle});return}let r=await a(t,n?.handle);(r===`restored`||r===`gone`)&&se()},[d,a,se,e]),he=(0,R.useCallback)(e=>{let t=d.find(t=>t.id===e);vo(e).catch(()=>{}).finally(se),t&&Ye(`Removed "${t.appName||t.name}" from recent files`,{action:{label:`Undo`,onClick:()=>{ho(t).catch(()=>{}).finally(se)}}})},[d,se]),ge=(0,R.useCallback)((e,t)=>{if(e===`baseUrl`&&m(t),e===`appId`&&_(t),e===`attemptId`&&y(t),te(null),typeof window<`u`)try{window.localStorage.setItem(cc[e],t)}catch{}},[]),_e=(0,R.useCallback)(e=>{k(t=>({...t,[e]:!0}))},[]),ve=(0,R.useCallback)(t=>{t.preventDefault(),k({baseUrl:!0,appId:!0,attemptId:!0}),te(null);let n=M.request;if(ko(M)&&n){if(e){let t=n.attemptId?`${n.appId}/${n.attemptId}`:n.appId;e({kind:`url`,id:t,label:t,request:n});return}i(n,e=>{te({code:e.code,message:e.message})})}},[M,i,e]),F=e=>O[e]?M.errors[e]:null,ye=(0,z.jsxs)(`section`,{className:`landing-history-server w-full text-left`,children:[(0,z.jsxs)(`button`,{type:`button`,className:`drop-zone-disclosure tap-target-comfortable flex w-full cursor-pointer items-center justify-between px-3 py-2 text-left text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":ae,"aria-controls":`shs-fetch-panel`,onClick:()=>E(e=>!e),children:[`Fetch from Spark History Server`,ae?(0,z.jsx)(ie,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,z.jsx)(xe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),ae?(0,z.jsxs)(`div`,{id:`shs-fetch-panel`,className:`drop-zone-subpanel mt-3 p-4`,children:[(0,z.jsx)(`p`,{className:`mb-3 text-sm text-muted-foreground`,children:`Requires local-server mode and a History Server reachable from this machine.`}),(0,z.jsxs)(`form`,{onSubmit:ve,className:`flex flex-col gap-3`,children:[(0,z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-3`,children:[(0,z.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Base URL`,(0,z.jsx)(`input`,{type:`text`,value:p,onChange:e=>ge(`baseUrl`,e.target.value),onBlur:()=>_e(`baseUrl`),placeholder:`http://history-server:18080`,"aria-label":`Spark History Server base URL`,"aria-invalid":!!F(`baseUrl`),"aria-describedby":F(`baseUrl`)?`shs-base-url-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),F(`baseUrl`)?(0,z.jsx)(`span`,{id:`shs-base-url-error`,className:`text-destructive`,children:F(`baseUrl`)}):null]}),(0,z.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Application ID`,(0,z.jsx)(`input`,{type:`text`,value:h,onChange:e=>ge(`appId`,e.target.value),onBlur:()=>_e(`appId`),placeholder:`application_1234567890_0001`,"aria-label":`Application ID`,"aria-invalid":!!F(`appId`),"aria-describedby":F(`appId`)?`shs-app-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),F(`appId`)?(0,z.jsx)(`span`,{id:`shs-app-id-error`,className:`text-destructive`,children:F(`appId`)}):null]}),(0,z.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs text-muted-foreground`,children:[`Attempt ID (optional)`,(0,z.jsx)(`input`,{type:`text`,value:v,onChange:e=>ge(`attemptId`,e.target.value),onBlur:()=>_e(`attemptId`),placeholder:`2`,"aria-label":`Attempt ID (optional)`,"aria-invalid":!!F(`attemptId`),"aria-describedby":F(`attemptId`)?`shs-attempt-id-error`:void 0,className:`tap-target-input rounded-md border border-input bg-card px-2 py-1 font-mono text-sm text-foreground`}),F(`attemptId`)?(0,z.jsx)(`span`,{id:`shs-attempt-id-error`,className:`text-destructive`,children:F(`attemptId`)}):null]})]}),o?(0,z.jsx)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:`Fetching event log…`}):null,A?(0,z.jsxs)(`p`,{ref:ne,role:`alert`,tabIndex:-1,className:`text-sm text-destructive`,children:[fc[A.code],` `,`Edit the fields, review `,(0,z.jsx)(`a`,{href:dc,target:`_blank`,rel:`noopener noreferrer`,className:`tap-target-comfortable text-primary underline-offset-4 hover:underline`,children:`Local-server setup`}),`, or choose a local file.`,A.message?(0,z.jsx)(`span`,{"data-testid":`shs-error-detail`,className:`mt-1 block`,children:A.message}):null]}):null,(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,z.jsx)(B,{type:`submit`,className:`tap-target-comfortable`,disabled:!ko(M)||o,children:`Fetch`}),(0,z.jsx)(`span`,{className:`font-mono text-[11px] text-muted-foreground`,children:`Application IDs: application_…, local-…, app-…, spark-…, or driver-…`})]})]})]}):null]});return(0,z.jsxs)(`div`,{"data-testid":`drop-zone`,role:`region`,"aria-label":`Drop Spark event log file here`,className:b(`drop-zone-panel mx-auto flex w-full flex-col items-center justify-center gap-6 p-6 text-center`,t?`max-w-full`:`landing-drop-zone max-w-none p-6 sm:p-8`,l&&`is-drag-over`),onDragOver:e=>{e.preventDefault(),u(!0)},onDragLeave:()=>u(!1),onDrop:me,children:[(0,z.jsx)(`span`,{className:`drop-zone-icon`,"aria-hidden":`true`,children:(0,z.jsx)(Bt,{className:`size-5`})}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`drop-zone-title font-heading`,children:`Choose a Spark event log`}),(0,z.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:`Drop an event log file here, or choose a file below.`}),(0,z.jsx)(`p`,{className:`drop-zone-formats mx-auto mt-2 max-w-xl text-muted-foreground`,children:`Accepts a Spark event log file: newline-delimited JSON, one event per line, optionally gzip/Zstandard/LZ4/Snappy-compressed, or the .zip a Spark History Server download returns.`})]}),(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center justify-center gap-2`,children:[(0,z.jsx)(B,{type:`button`,className:`tap-target-comfortable`,onClick:()=>void le(),children:`Choose file`}),t?null:(0,z.jsx)(B,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>void ce(),disabled:j,children:j?`Loading sample…`:`Try a sample run`})]}),t?null:(0,z.jsxs)(`section`,{className:`w-full max-w-2xl text-left`,children:[(0,z.jsxs)(`button`,{type:`button`,className:`tap-target-comfortable mx-auto flex cursor-pointer items-center gap-1 rounded-sm text-sm font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":C,"aria-controls":`find-event-log-panel`,onClick:()=>w(e=>!e),children:[`Where do I find my event log?`,C?(0,z.jsx)(ie,{"aria-hidden":`true`,className:`size-4 shrink-0`}):(0,z.jsx)(xe,{"aria-hidden":`true`,className:`size-4 shrink-0`})]}),C?(0,z.jsxs)(`div`,{id:`find-event-log-panel`,className:`drop-zone-subpanel mt-3 p-4 text-sm`,children:[(0,z.jsxs)(`ol`,{className:`list-decimal space-y-2 pl-5 text-muted-foreground`,children:[(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`span`,{className:`font-medium text-foreground`,children:`Turn event logging on.`}),` Spark writes one log per application when `,(0,z.jsx)(`code`,{children:`spark.eventLog.enabled`}),` is `,(0,z.jsx)(`code`,{children:`true`}),`, into the directory set by`,` `,(0,z.jsx)(`code`,{children:`spark.eventLog.dir`}),` (for example `,(0,z.jsx)(`code`,{children:`/tmp/spark-events`}),`, or an HDFS or object-store path). Copy the file for your application from there.`]}),(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`span`,{className:`font-medium text-foreground`,children:`Or download it from a Spark History Server.`}),` Open`,` `,(0,z.jsx)(`code`,{children:`<history-server>/api/v1/applications/<app-id>/logs`}),` and drop the .zip it returns here as-is.`]}),(0,z.jsxs)(`li`,{children:[(0,z.jsx)(`span`,{className:`font-medium text-foreground`,children:`Just exploring?`}),` `,(0,z.jsx)(`button`,{type:`button`,className:`cursor-pointer rounded-sm text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,onClick:()=>void ce(),disabled:j,children:`Load the sample run`}),` `,`to see what the report looks like first.`]})]}),(0,z.jsx)(`a`,{href:g,target:`_blank`,rel:`noopener noreferrer`,className:`mt-3 inline-block text-primary underline-offset-4 hover:underline`,children:`More ways to get a log`})]}):null]}),(0,z.jsx)(`input`,{ref:s,type:`file`,className:`hidden`,"data-testid":`file-input`,"aria-label":`Choose file`,onChange:de}),(0,z.jsx)(`input`,{ref:c,type:`file`,className:`hidden`,"data-testid":`folder-input`,"aria-label":`Choose rolling log folder`,onChange:fe,webkitdirectory:`true`,directory:`true`}),t?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(B,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`}),(0,z.jsx)(`div`,{className:`w-full max-w-2xl`,children:ye})]}):(0,z.jsxs)(z.Fragment,{children:[ee?(0,z.jsxs)(`div`,{className:`drop-zone-subpanel flex w-full max-w-2xl items-start gap-2 p-4 text-left`,children:[(0,z.jsx)(Mt,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-muted-foreground`}),(0,z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`If a Spark History Server is reachable, open`,` `,(0,z.jsx)(`strong`,{className:`font-medium text-foreground`,children:`Other sources`}),` below to fetch a run from it directly.`]})]}):null,(0,z.jsxs)(`section`,{className:`landing-other-sources w-full max-w-2xl text-left`,children:[(0,z.jsxs)(`button`,{type:`button`,className:`drop-zone-disclosure tap-target-comfortable flex w-full cursor-pointer items-center justify-between px-3 py-2 text-left text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring`,"aria-expanded":oe,"aria-controls":`other-sources-panel`,onClick:()=>S(e=>!e),children:[`Other sources`,oe?(0,z.jsx)(ie,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,z.jsx)(xe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}),oe?(0,z.jsxs)(`div`,{id:`other-sources-panel`,className:`drop-zone-subpanel mt-3 flex flex-col gap-3 p-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[`Use these for a rolling `,(0,z.jsx)(`code`,{children:`eventlog_v2_*`}),` directory or to fetch an application from a local Spark History Server.`]}),(0,z.jsx)(`div`,{children:(0,z.jsx)(B,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:()=>c.current?.click(),children:`Choose rolling-log folder`})}),ye]}):null]})]}),d.length>0&&(0,z.jsxs)(`div`,{className:`drop-zone-recent w-full max-w-md text-left`,children:[(0,z.jsx)(`p`,{className:`trace-eyebrow mb-1 px-1.5`,children:`Recent files`}),(0,z.jsx)(ic,{entries:d,onPick:e=>void P(e),onRemove:he})]})]})}var hc=`npx sparkforensics-mcp`,gc=`{
7
+ "mcpServers": {
8
+ "sparkforensics": {
9
+ "command": "npx",
10
+ "args": ["sparkforensics-mcp"]
11
+ }
12
+ }
13
+ }`;function _c(){return(0,z.jsxs)(y,{className:`w-full`,children:[(0,z.jsx)(he,{className:b(Ee({variant:`outline`}),`tap-target-comfortable`),children:`Use with an AI assistant (MCP)`}),(0,z.jsxs)(ee,{className:`mt-2 flex w-full flex-col gap-2 text-sm`,children:[(0,z.jsx)(`p`,{className:`text-muted-foreground`,children:`This project exposes an MCP server so an AI assistant can diagnose a run directly, without going through this web UI.`}),(0,z.jsx)(`pre`,{"data-testid":`mcp-config-snippet`,className:`mcp-snippet overflow-x-auto p-2 text-xs whitespace-pre`,children:hc}),(0,z.jsx)(`p`,{className:`text-muted-foreground`,children:`Or, in an MCP client config:`}),(0,z.jsx)(`pre`,{className:`mcp-snippet overflow-x-auto p-2 text-xs whitespace-pre`,children:gc})]})]})}var vc=`[data-shuffle-product-bar]`;function yc(){return document.querySelector(vc)}function bc({className:e,children:t}){let n=yc();return n?(0,Ne.createPortal)((0,z.jsx)(`div`,{"data-shuffle-page-controls":!0,children:t}),n):(0,z.jsx)(`div`,{className:e,"data-shuffle-page-controls":!0,children:t})}function xc({message:e,nonce:t}){let n=(0,R.useRef)(null);return(0,R.useEffect)(()=>{n.current?.focus()},[e,t]),(0,z.jsxs)(`div`,{ref:n,role:`alert`,tabIndex:-1,className:`mb-4 flex items-start gap-3 rounded-xl border border-l-[3px] border-border border-l-critical bg-card p-4 text-sm text-foreground`,children:[(0,z.jsx)(Rt,{"aria-hidden":`true`,className:`mt-0.5 size-4 shrink-0 text-critical`}),(0,z.jsx)(`p`,{children:e})]})}var Sc=`docs/`;function Cc({label:e,onChange:t}){return(0,z.jsxs)(`div`,{className:`trace-panel flex items-center justify-between gap-3 p-4`,children:[(0,z.jsxs)(`span`,{className:`min-w-0 truncate font-mono text-sm`,children:[(0,z.jsx)(`span`,{"aria-hidden":`true`,className:`mr-2 text-accent`,children:`✓`}),e]}),(0,z.jsx)(B,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Change`})]})}function wc({testId:e,ariaLabel:t,source:n,onPick:r,onChange:i}){return(0,z.jsx)(`div`,{"data-testid":e,"aria-label":t,className:`min-w-0 flex-1`,children:n?(0,z.jsx)(Cc,{label:n.label,onChange:i}):(0,z.jsx)(mc,{onPick:r,compact:!0})})}function Tc({onClick:e}){return(0,z.jsxs)(B,{type:`button`,variant:`outline`,className:`tap-target-comfortable`,onClick:e,children:[`Compare two runs `,(0,z.jsx)(mt,{"aria-hidden":`true`})]})}function Ec(){return(0,z.jsxs)(`div`,{className:`landing-resources`,"aria-label":`SparkForensics resources`,children:[(0,z.jsxs)(`a`,{href:Sc,target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,z.jsx)(fe,{"aria-hidden":`true`}),(0,z.jsxs)(`span`,{children:[(0,z.jsx)(`strong`,{children:`Read the docs`}),(0,z.jsx)(`span`,{children:`How to load a log, read the board, and use every finding.`})]}),(0,z.jsx)(mt,{"aria-hidden":`true`,className:`landing-resource-arrow`})]}),(0,z.jsxs)(`a`,{href:`${P}/intro.html`,target:`_blank`,rel:`noopener noreferrer`,className:`landing-resource-card`,children:[(0,z.jsx)(gt,{"aria-hidden":`true`}),(0,z.jsxs)(`span`,{children:[(0,z.jsx)(`strong`,{children:`Spark optimization reference`}),(0,z.jsx)(`span`,{children:`Architecture, memory, shuffle, and tuning notes behind every finding.`})]}),(0,z.jsx)(mt,{"aria-hidden":`true`,className:`landing-resource-arrow`})]})]})}function Dc({onCompare:e}){return(0,z.jsxs)(`section`,{className:`landing-next-steps`,"aria-labelledby":`next-steps-title`,children:[(0,z.jsx)(`div`,{children:(0,z.jsx)(`h2`,{id:`next-steps-title`,children:`After your first run, go further with the same evidence.`})}),(0,z.jsxs)(`div`,{className:`landing-next-step-list`,children:[(0,z.jsxs)(`article`,{children:[(0,z.jsx)(St,{"aria-hidden":`true`}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`h3`,{children:`Compare two runs`}),(0,z.jsx)(`p`,{children:`Use a baseline and candidate log to see which structurally matched stages changed.`}),(0,z.jsx)(Tc,{onClick:e})]})]}),(0,z.jsxs)(`article`,{children:[(0,z.jsx)(vt,{"aria-hidden":`true`}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`h3`,{children:`Use with an AI assistant`}),(0,z.jsx)(`p`,{children:`Connect MCP when you want an agent to inspect this evidence with you.`}),(0,z.jsx)(_c,{})]})]}),(0,z.jsxs)(`article`,{children:[(0,z.jsx)(Ht,{"aria-hidden":`true`}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`h3`,{children:`Automate it in Airflow`}),(0,z.jsx)(`p`,{children:`Run this analysis after every Spark job with sparkforensics-operator instead of checking runs by hand.`}),(0,z.jsxs)(B,{variant:`outline`,className:`tap-target-comfortable`,nativeButton:!1,render:(0,z.jsx)(`a`,{href:`https://github.com/shuffle-works/sparkforensics-operator`,target:`_blank`,rel:`noopener noreferrer`}),children:[`View sparkforensics-operator `,(0,z.jsx)(mt,{"aria-hidden":`true`})]})]})]})]})]})}function Oc({errorMessage:e,errorNonce:t}={}){let{startCompareLoad:n,drillIntoRun:r}=No(),{theme:i,toggle:a}=Me(),[o]=(0,R.useState)(()=>N.getState().compareSeed),[s,c]=(0,R.useState)(o!=null),[l,u]=(0,R.useState)(o?{kind:`cached`,...o}:null),[d,f]=(0,R.useState)(null),p=o!=null&&l?.kind===`cached`&&l.id===o.id;return s?(0,z.jsxs)(`div`,{className:`mx-auto flex w-full max-w-5xl flex-col gap-4`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsx)(`h2`,{className:`compare-landing-title font-heading`,children:`Compare two runs`}),(0,z.jsx)(B,{type:`button`,variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:()=>{if(p){N.getState().setCompareSeed(null),r(o.id);return}c(!1),u(null),f(null)},children:p?`Back to the run`:`Cancel`})]}),(0,z.jsx)(`p`,{className:`landing-compare-intro`,children:p?`The baseline is the run you had open. Pick the candidate to compare it with, for example the same job after a change.`:`Load a baseline run and a candidate run. Compare structurally matched stages to review material changes in a shared stage-level context.`}),e?(0,z.jsx)(xc,{message:e,nonce:t}):null,(0,z.jsxs)(`div`,{className:`grid gap-4 lg:grid-cols-2`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`trace-eyebrow mb-2`,children:`Baseline`}),(0,z.jsx)(wc,{testId:`compare-slot-a`,ariaLabel:`Baseline`,source:l,onPick:u,onChange:()=>{N.getState().setCompareSeed(null),u(null)}})]}),(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`trace-eyebrow mb-2`,children:`Candidate`}),(0,z.jsx)(wc,{testId:`compare-slot-b`,ariaLabel:`Candidate`,source:d,onPick:f,onChange:()=>f(null)})]})]}),(0,z.jsx)(`div`,{className:`flex justify-end`,children:(0,z.jsx)(B,{type:`button`,className:`tap-target-comfortable`,disabled:!l||!d,onClick:()=>{l&&d&&n(l,d)},children:`Compare`})})]}):(0,z.jsxs)(`div`,{className:`landing-shell mx-auto w-full max-w-6xl`,children:[(0,z.jsxs)(`section`,{className:`landing-hero`,"aria-labelledby":`landing-title`,children:[(0,z.jsxs)(bc,{className:`landing-identity`,children:[(0,z.jsx)(ft,{"aria-hidden":`true`,className:`size-4`}),(0,z.jsx)(`span`,{children:`SparkForensics`}),(0,z.jsxs)(`button`,{type:`button`,className:`theme-toggle tap-target-comfortable`,"aria-label":`Toggle theme`,"aria-pressed":i===`light`,title:`Toggle theme`,onClick:a,children:[(0,z.jsx)(It,{"aria-hidden":`true`,className:`theme-icon sun`}),(0,z.jsx)(Ot,{"aria-hidden":`true`,className:`theme-icon moon`})]})]}),(0,z.jsxs)(`div`,{className:`landing-hero-copy`,children:[(0,z.jsx)(`h2`,{id:`landing-title`,children:`Analyze a Spark event log.`}),(0,z.jsx)(`p`,{children:`Load the log from one Spark run. You get a verdict on how it went, the stages worth fixing first, and the evidence behind each suggestion.`})]}),(0,z.jsxs)(`div`,{className:`landing-proof`,"aria-label":`SparkForensics guarantees`,children:[(0,z.jsxs)(`span`,{children:[(0,z.jsx)(Pt,{"aria-hidden":`true`}),` Nothing leaves your machine`]}),(0,z.jsxs)(`span`,{children:[(0,z.jsx)(vt,{"aria-hidden":`true`}),` Bring your AI into the investigation`]}),(0,z.jsxs)(`span`,{children:[(0,z.jsx)(St,{"aria-hidden":`true`}),` Compare one run against another`]})]}),(0,z.jsx)(Ec,{}),(0,z.jsxs)(`div`,{className:`landing-intake`,children:[e?(0,z.jsx)(xc,{message:e,nonce:t}):null,(0,z.jsx)(mc,{})]})]}),(0,z.jsx)(Dc,{onCompare:()=>c(!0)})]})}function kc(e){let t=(0,R.useId)();return`${e??t}`}var Ac=typeof window<`u`?R.useLayoutEffect:R.useEffect;function jc(e){let t=(0,R.useRef)(e);return Ac(()=>{t.current=e},[e]),(0,R.useCallback)((...e)=>t.current?.(...e),[t])}function Mc(...e){return jc(t=>{e.forEach(e=>{if(e)switch(typeof e){case`function`:e(t);break;case`object`:e.current=t}})})}function Y(e,t=`Assertion error`){if(!e)throw Error(t)}(0,R.createContext)(null);var Nc;function Pc(){return Nc===void 0&&(Nc=typeof matchMedia==`function`&&!!matchMedia(`(pointer:coarse)`).matches),Nc}function Fc({expandHitTargets:e,axis:t,rect:n}){let r=e?Pc()?t.resizeTargetMinimumSize.coarse:t.resizeTargetMinimumSize.fine:0;if(n.width<r){let e=r-n.width;n=new DOMRect(n.x-e/2,n.y,n.width+e,n.height)}if(n.height<r){let e=r-n.height;n=new DOMRect(n.x,n.y-e/2,n.width,n.height+e)}return n}function Ic(e){switch(typeof e){case`number`:return[e,`px`];case`string`:{let t=parseFloat(e);return e.endsWith(`%`)?[t,`%`]:e.endsWith(`px`)?[t,`px`]:e.endsWith(`rem`)?[t,`rem`]:e.endsWith(`em`)?[t,`em`]:e.endsWith(`vh`)?[t,`vh`]:e.endsWith(`vw`)?[t,`vw`]:[t,`%`]}}}var Lc=class{#e={};addListener(e,t){let n=this.#e[e];return n===void 0?this.#e[e]=[t]:n.includes(t)||n.push(t),()=>{this.removeListener(e,t)}}emit(e,t){let n=this.#e[e];if(n!==void 0){if(n.length===1)n[0].call(null,t);else{let e=!1,r=null,i=Array.from(n);for(let n=0;n<i.length;n++){let a=i[n];try{a.call(null,t)}catch(t){r===null&&(e=!0,r=t)}}if(e)throw r}}}removeAllListeners(){this.#e={}}removeListener(e,t){let n=this.#e[e];if(n!==void 0){let e=n.indexOf(t);e>=0&&n.splice(e,1)}}},X={cursorFlags:0,state:`inactive`},Rc=new Lc;function zc(){return X}function Bc(e){return Rc.addListener(`change`,e)}function Vc(e,t=[],n,r=!1){let i=X,a={...X};a.cursorFlags=e,a.state===`active`&&(a.didPointerMove||=r,a.previews=t,n&&(a.previewLayoutMap=n)),X=a,Rc.emit(`change`,{prev:i,next:a})}function Hc(e){let t=X;X=e,t.state===`active`&&e.state!==`active`&&t.didPointerMove&&t.hitRegions.forEach(({separator:e})=>{e&&e.element.ownerDocument.activeElement===e.element&&e.element.blur()}),Rc.emit(`change`,{prev:t,next:e})}function Uc(e){X.state!==`active`||!X.previews.some(t=>t.separator===e)||Hc({...X,previews:X.previews.map(t=>t.separator===e?{...t}:t)})}function Wc(e){if(X.state===`inactive`)return!1;let t=X.hitRegions.filter(t=>t.axis!==e),n=X.state===`active`&&X.previews.some(t=>t.axis===e);if(t.length===X.hitRegions.length&&!n)return!1;if(t.length===0)Hc({cursorFlags:0,state:`inactive`});else if(X.state===`active`){let n=new Map(X.initialLayoutMap),r=new Map(X.previewLayoutMap);n.delete(e),r.delete(e),Hc({...X,cursorFlags:0,hitRegions:t,initialLayoutMap:n,previewLayoutMap:r,previews:X.previews.filter(t=>t.axis!==e)})}else Hc({...X,hitRegions:t});return!0}var Gc=e=>e,Kc=()=>{},qc=1,Jc=2,Yc=4,Xc=8,Zc=3,Qc=12,$c;function el(){return $c===void 0&&($c=!1,typeof window<`u`&&(window.navigator.userAgent.includes(`Chrome`)||window.navigator.userAgent.includes(`Firefox`))&&($c=!0)),$c}function tl({cursorFlags:e,axes:t,state:n}){let r=0,i=0;switch(n){case`active`:case`hover`:t.forEach(e=>{if(!e.mutableState.disableCursor)switch(e.orientation){case`horizontal`:r++;break;case`vertical`:i++}})}if(r!==0||i!==0){if(n===`active`&&e&&el()){let t=(e&qc)!==0,n=(e&Jc)!==0,r=(e&Yc)!==0,i=(e&Xc)!==0;if(t)return r?`se-resize`:i?`ne-resize`:`e-resize`;if(n)return r?`sw-resize`:i?`nw-resize`:`w-resize`;if(r)return`s-resize`;if(i)return`n-resize`}return el()?r>0&&i>0?`move`:r>0?`ew-resize`:`ns-resize`:r>0&&i>0?`grab`:r>0?`col-resize`:`row-resize`}}var nl=new WeakMap;function rl(e){if(!e.defaultView||!e.adoptedStyleSheets)return;let{prevStyle:t,styleSheet:n}=nl.get(e)??{};n===void 0&&(n=new e.defaultView.CSSStyleSheet,e.adoptedStyleSheets&&(Object.isExtensible(e.adoptedStyleSheets)?e.adoptedStyleSheets.push(n):e.adoptedStyleSheets=[...e.adoptedStyleSheets,n]));let r=zc();switch(r.state){case`active`:case`hover`:{let e=tl({cursorFlags:r.cursorFlags,axes:r.hitRegions.map(e=>e.axis),state:r.state}),i=`*, *:hover {cursor: ${e} !important; }`;if(t===i)return;t=i,e?n.cssRules.length===0?n.insertRule(i):n.replaceSync(i):n.cssRules.length===1&&n.deleteRule(0);break}case`inactive`:t=void 0,n.cssRules.length===1&&n.deleteRule(0)}nl.set(e,{prevStyle:t,styleSheet:n})}function il({axis:e}){let{layoutStrategy:t,orientation:n,items:r}=e;return t?t.calculateAvailableSize():r.reduce((e,t)=>(e+=n===`horizontal`?t.element.offsetWidth:t.element.offsetHeight,e),0)}function al(e,t){let n=e.compareDocumentPosition(t);return n&Node.DOCUMENT_POSITION_DISCONNECTED?0:n&Node.DOCUMENT_POSITION_FOLLOWING?-1:n&Node.DOCUMENT_POSITION_PRECEDING?1:0}function ol(e,t){return Array.from(t).sort((t,n)=>{let r=e===`horizontal`?sl(t,n):cl(t,n);return r===0?al(t.element,n.element):r})}function sl(e,t){let n=e.element.offsetLeft-t.element.offsetLeft;return n===0?e.element.offsetWidth-t.element.offsetWidth:n}function cl(e,t){let n=e.element.offsetTop-t.element.offsetTop;return n===0?e.element.offsetHeight-t.element.offsetHeight:n}function ll(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.ELEMENT_NODE}function ul(e,t){return{x:e.x>=t.left&&e.x<=t.right?0:Math.min(Math.abs(e.x-t.left),Math.abs(e.x-t.right)),y:e.y>=t.top&&e.y<=t.bottom?0:Math.min(Math.abs(e.y-t.top),Math.abs(e.y-t.bottom))}}function dl({orientation:e,rects:t,targetRect:n}){let r={x:n.x+n.width/2,y:n.y+n.height/2},i,a=Number.MAX_VALUE;for(let n of t){let{x:t,y:o}=ul(r,n),s=e===`horizontal`?t:o;s<a&&(a=s,i=n)}return Y(i,`No rect found`),i}function fl({expandHitTargets:e=!0,axis:t,includeDisabled:n=!1}){if(t.layoutStrategy)return t.layoutStrategy.calculateHitRegions({expandHitTargets:e,axis:t,includeDisabled:n});let{element:r,orientation:i,items:a,separators:o}=t,s=ol(i,Array.from(r.children).filter(ll).filter(e=>!e.hasAttribute(`data-resize-preview`)).map(e=>({element:e}))).map(({element:e})=>e),c=[],l=!1,u=!1,d=-1,f,p=-1,m=0,h,g=[];{let e=-1;for(let t of s)t.hasAttribute(`data-panel`)&&(e++,t.hasAttribute(`data-disabled`)||(m++,d===-1&&(d=e),p=e))}if(n||m>1){let r=-1;for(let m of s)if(m.hasAttribute(`data-panel`)){r++;let o=a.find(e=>e.element===m);if(o){if(h){let a=h.element.getBoundingClientRect(),s=m.getBoundingClientRect(),_;if(u){let e=i===`horizontal`?new DOMRect(a.right,a.top,0,a.height):new DOMRect(a.left,a.bottom,a.width,0),t=i===`horizontal`?new DOMRect(s.left,s.top,0,s.height):new DOMRect(s.left,s.top,s.width,0);switch(g.length){case 0:_=[e,t];break;case 1:{let n=g[0];_=[n,dl({orientation:i,rects:[a,s],targetRect:n.element.getBoundingClientRect()})===a?t:e];break}default:_=g}}else _=g.length?g:[i===`horizontal`?new DOMRect(a.right,s.top,s.left-a.right,s.height):new DOMRect(s.left,a.bottom,s.width,s.top-a.bottom)];for(let i of _){let a=Fc({expandHitTargets:e,axis:t,rect:`width`in i?i:i.element.getBoundingClientRect()});(n||!l&&!(r<=d||r>p))&&(f??=il({axis:t}),c.push({axis:t,axisSize:f,items:[h,o],separator:`width`in i?void 0:i,rect:a})),l=!1}}u=!1,h=o,g=[]}}else if(m.hasAttribute(`data-separator`)){m.ariaDisabled!==null&&(l=!0);let e=o.find(e=>e.element===m);e?g.push(e):(h=void 0,g=[])}else u=!0}return c}function pl(e,t){let n=getComputedStyle(e);return t*parseFloat(n.fontSize)}function ml(e,t){let n=getComputedStyle(e.ownerDocument.documentElement);return t*parseFloat(n.fontSize)}function hl(e){return e/100*window.innerHeight}function gl(e){return e/100*window.innerWidth}function _l({axisSize:e,itemElement:t,styleProp:n}){let r,[i,a]=Ic(n);switch(a){case`%`:r=i/100*e;break;case`px`:r=i;break;case`rem`:r=ml(t,i);break;case`em`:r=pl(t,i);break;case`vh`:r=hl(i);break;case`vw`:r=gl(i)}return r}function Z(e){return parseFloat(e.toFixed(3))}function vl(e){let{items:t}=e,n=il({axis:e});return n===0?t.map(e=>({groupResizeBehavior:e.constraintProps.groupResizeBehavior,collapsedSize:0,collapsible:e.constraintProps.collapsible===!0,defaultSize:void 0,disabled:e.constraintProps.disabled,minSize:0,maxSize:100,itemId:e.id})):t.map(e=>{let{element:t,constraintProps:r}=e,i=0;r.collapsedSize!==void 0&&(i=Z(_l({axisSize:n,itemElement:t,styleProp:r.collapsedSize})/n*100));let a;r.collapsedThreshold!==void 0&&(a=Z(_l({axisSize:n,itemElement:t,styleProp:r.collapsedThreshold})/n*100));let o;r.defaultSize!==void 0&&(o=Z(_l({axisSize:n,itemElement:t,styleProp:r.defaultSize})/n*100));let s=0;r.minSize!==void 0&&(s=Z(_l({axisSize:n,itemElement:t,styleProp:r.minSize})/n*100));let c=100;return r.maxSize!==void 0&&(c=Z(_l({axisSize:n,itemElement:t,styleProp:r.maxSize})/n*100)),{groupResizeBehavior:r.groupResizeBehavior,collapsedSize:i,collapsedThreshold:a,collapsible:r.collapsible===!0,defaultSize:o,disabled:r.disabled,minSize:s,maxSize:c,itemId:e.id}})}var yl=new Map,bl=new Lc;function xl(e){yl=new Map(yl),yl.delete(e)}function Sl(e,t){for(let[t]of yl)if(t.id===e)return t}function Cl(e,t){for(let[t,n]of yl)if(t.id===e)return n;if(t)throw Error(`Could not find data for Group with id ${e}`)}function wl(){return yl}function Tl(e,t){return bl.addListener(`axisChange`,n=>{n.axis.id===e&&t(n)})}function El(e,t,n){let r=yl.get(e);yl=new Map(yl),yl.set(e,t),bl.emit(`axisChange`,{axis:e,isUserInteraction:n?.isUserInteraction===!0,prev:r,next:t})}function Dl(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!=t[n])return!1;return!0}function Q(e,t,n=0){return Math.abs(Z(e)-Z(t))<=n}function Ol(e,t){return Q(e,t)?0:e>t?1:-1}function kl({overrideDisabledItems:e,itemConstraints:t,prevSize:n,size:r}){let{collapsedSize:i=0,collapsedThreshold:a,collapsible:o,disabled:s,maxSize:c=100,minSize:l=0}=t;if(s&&!e)return n;if(Ol(r,l)<0){if(o){let e=a??(l-i)/2,t=Ol(n,i)<=0,o=t?i+e:l-e,s=Ol(r,o);r=Ol(r,i)<=0||s<0||a!==void 0&&t&&s===0?i:l}else r=l}return r=Math.min(c,r),r=Z(r),r}function Al({delta:e,initialLayout:t,itemConstraints:n,pivotIndices:r,prevLayout:i,trigger:a}){if(Q(e,0))return t;let o=a===`imperative-api`,s=n.map(({itemId:e})=>t[e]),c=n.map(({itemId:e})=>i[e]),l=[...s],[u,d]=r;Y(u!=null,`Invalid first pivot index`),Y(d!=null,`Invalid second pivot index`);let f=0;switch(a){case`keyboard`:{let t=e<0?d:u,r=n[t];Y(r,`Panel constraints not found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(Y(n!=null,`Previous layout not found for panel index ${t}`),Q(n,i)){let t=o-n;Ol(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}{let t=e<0?u:d,r=n[t];Y(r,`No panel constraints found for index ${t}`);let{collapsedSize:i=0,collapsible:a,minSize:o=0}=r;if(a){let n=s[t];if(Y(n!=null,`Previous layout not found for panel index ${t}`),Q(n,o)){let t=n-i;Ol(t,Math.abs(e))>0&&(e=e<0?0-t:t)}}}break;default:{let t=e<0?d:u,r=n[t];Y(r,`Panel constraints not found for index ${t}`);let i=s[t],{collapsedSize:a,collapsedThreshold:o,collapsible:c,minSize:l}=r;if(c&&Ol(i,l)<0){let t=l-a,n=o??t/2;if(Ol(i+Math.abs(e),l)<0){let r=Ol(Math.abs(e),n);e=r>0||r===0&&o===void 0&&e<0?e<0?-t:t:0}}break}}{let t=e<0?1:-1,r=e<0?d:u,i=0;for(;;){let e=s[r];Y(e!=null,`Previous layout not found for panel index ${r}`);let a=kl({overrideDisabledItems:o,itemConstraints:n[r],prevSize:e,size:100})-e;if(i+=a,r+=t,r<0||r>=n.length)break}let a=Math.min(Math.abs(e),Math.abs(i));e=e<0?0-a:a}{let t=e<0?u:d;for(;t>=0&&t<n.length;){let r=Math.abs(e)-Math.abs(f),i=s[t];Y(i!=null,`Previous layout not found for panel index ${t}`);let a=i-r,c=kl({overrideDisabledItems:o,itemConstraints:n[t],prevSize:i,size:a});if(!Q(i,c)&&(f+=i-c,l[t]=c,f.toFixed(3).localeCompare(Math.abs(e).toFixed(3),void 0,{numeric:!0})>=0))break;e<0?t--:t++}}if(Dl(c,l))return i;{let t=e<0?d:u,r=s[t];Y(r!=null,`Previous layout not found for panel index ${t}`);let i=r+f,a=kl({overrideDisabledItems:o,itemConstraints:n[t],prevSize:r,size:i});if(l[t]=a,!Q(a,i)){let t=i-a,r=e<0?d:u;for(;r>=0&&r<n.length;){let i=l[r];Y(i!=null,`Previous layout not found for panel index ${r}`);let a=i+t,s=kl({overrideDisabledItems:o,itemConstraints:n[r],prevSize:i,size:a});if(Q(i,s)||(t-=s-i,l[r]=s),Q(t,0))break;e>0?r--:r++}}}return Q(Object.values(l).reduce((e,t)=>t+e,0),100,.1)?l.reduce((e,t,r)=>(e[n[r].itemId]=t,e),{}):i}function jl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(t[n]===void 0||Ol(e[n],t[n])!==0)return!1;return!0}function Ml({commit:e,document:t,event:n,hitRegions:r,initialLayoutMap:i,mountedAxes:a,pointerDownAtPoint:o,prevCursorFlags:s}){let c=0,l=zc(),u=l.state===`active`?l.previews:[],d=new Map(l.state===`active`?l.previewLayoutMap:void 0);r.forEach(t=>{let{axis:r,axisSize:s}=t,{orientation:l,items:f}=r;if(e&&r.resizePreviewMode!==`separator`)return;let{disableCursor:p}=r.mutableState,m=0;m=o?l===`horizontal`?(n.clientX-o.x)/s*100:(n.clientY-o.y)/s*100:l===`horizontal`?n.clientX<0?-100:100:n.clientY<0?-100:100;let h=i.get(r),g=a.get(r);if(!h||!g)return;let{defaultLayoutDeferred:_,derivedItemConstraints:v,axisSize:y,layout:b,separatorToItems:x}=g;if(v&&b&&x){let n=r.resizePreviewMode===`separator`?d.get(r)??b:b,i=Al({delta:m,initialLayout:h,itemConstraints:v,pivotIndices:t.items.map(e=>f.indexOf(e)),prevLayout:n,trigger:`mouse-or-touch`});if(r.resizePreviewMode===`separator`&&!e&&!jl(i,n)){d.set(r,i);let e=0,t=f.map(t=>(e+=i[t.id]-h[t.id],s/100*e));u=u.map(e=>{if(e.axis!==r)return e;let n=t[e.itemIndex];return n===e.offset?e:{...e,offset:n}})}if(jl(i,n)&&m!==0&&!p)switch(l){case`horizontal`:c|=m<0?qc:Jc;break;case`vertical`:c|=m<0?Yc:Xc}(r.resizePreviewMode!==`separator`||e)&&!jl(i,b)&&El(t.axis,{defaultLayoutDeferred:_,derivedItemConstraints:v,axisSize:y,layout:i,requestedAxisSize:y,requestedLayout:i,separatorToItems:x})}});let f=0;n.movementX===0?f|=s&Zc:f|=c&Zc,n.movementY===0?f|=s&Qc:f|=c&Qc;let p=l.state===`active`&&(n.clientX!==l.pointerDownAtPoint.x||n.clientY!==l.pointerDownAtPoint.y);Vc(f,u,d,p),rl(t)}function Nl(e,t){let n=zc(),r=wl(),i=!1;return n.state===`active`&&(Ml({commit:!0,document:e,event:t,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedAxes:r,pointerDownAtPoint:n.pointerDownAtPoint,prevCursorFlags:n.cursorFlags}),Hc({cursorFlags:0,state:`inactive`}),n.hitRegions.length>0&&(rl(e),i=!0,n.hitRegions.forEach(e=>{if(!r.has(e.axis))return;let t=Cl(e.axis.id,!0);El(e.axis,t,{isUserInteraction:!0})}))),i}function Pl(e){e.defaultPrevented||Nl(e.currentTarget,e)}function Fl(e,t,n){let r,i={x:1/0,y:1/0};for(let a of t){let t=ul(n,a.rect);switch(e){case`horizontal`:(t.x<i.x||t.x===i.x&&t.y<=i.y)&&(r=a,i=t);break;case`vertical`:(t.y<i.y||t.y===i.y&&t.x<=i.x)&&(r=a,i=t)}}return r?{distance:i,hitRegion:r}:void 0}function Il(e){return typeof e==`object`&&!!e&&`nodeType`in e&&e.nodeType===Node.DOCUMENT_FRAGMENT_NODE}function Ll(e,t){if(e===t)throw Error(`Cannot compare node with itself`);let n={a:Ul(e),b:Ul(t)},r;for(;n.a.at(-1)===n.b.at(-1);)r=n.a.pop(),n.b.pop();Y(r,`Stacking order can only be calculated for elements with a common ancestor`);let i={a:Hl(Vl(n.a)),b:Hl(Vl(n.b))};if(i.a===i.b){let e=r.childNodes,t={a:n.a.at(-1),b:n.b.at(-1)},i=e.length;for(;i--;){let n=e[i];if(n===t.a)return 1;if(n===t.b)return-1}}return Math.sign(i.a-i.b)}var Rl=/\b(?:position|zIndex|opacity|transform|webkitTransform|mixBlendMode|filter|webkitFilter|isolation)\b/;function zl(e){let t=getComputedStyle(Wl(e)??e).display;return t===`flex`||t===`inline-flex`}function Bl(e){let t=getComputedStyle(e);return!!(t.position===`fixed`||t.zIndex!==`auto`&&(t.position!==`static`||zl(e))||+t.opacity<1||`transform`in t&&t.transform!==`none`||`webkitTransform`in t&&t.webkitTransform!==`none`||`mixBlendMode`in t&&t.mixBlendMode!==`normal`||`filter`in t&&t.filter!==`none`||`webkitFilter`in t&&t.webkitFilter!==`none`||`isolation`in t&&t.isolation===`isolate`||Rl.test(t.willChange)||t.webkitOverflowScrolling===`touch`)}function Vl(e){let t=e.length;for(;t--;){let n=e[t];if(Y(n,`Missing node`),Bl(n))return n}return null}function Hl(e){return e&&Number(getComputedStyle(e).zIndex)||0}function Ul(e){let t=[];for(;e;)t.push(e),e=Wl(e);return t}function Wl(e){let{parentNode:t}=e;return Il(t)?t.host:t}function Gl(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function Kl(e){try{return e.matches(`:modal`)}catch{return!1}}function ql({axisElement:e,hitRegion:t,pointerEventTarget:n}){if(ll(n)){let t=n.closest(`dialog`);if(t&&!t.contains(e)&&Kl(t))return!1}if(!ll(n)||n.contains(e)||e.contains(n))return!0;if(Ll(n,e)>0){let r=n;for(;r;){if(r.contains(e))return!0;if(Gl(r.getBoundingClientRect(),t))return!1;r=r.parentElement}}return!0}function Jl(e,t){let n=[];return t.forEach((t,r)=>{if(r.disabled)return;let i=fl({axis:r}),a=Fl(r.orientation,i,{x:e.clientX,y:e.clientY});a&&a.distance.x<=0&&a.distance.y<=0&&ql({axisElement:r.element,hitRegion:a.hitRegion.rect,pointerEventTarget:e.target})&&n.push(a.hitRegion)}),n}function Yl({layout:e,itemConstraints:t}){let n=t.map(({itemId:t})=>e[t]),r=[...n],i=r.reduce((e,t)=>e+t,0);if(Object.keys(e).length!==t.length)throw Error(`Invalid ${t.length} panel layout: ${Object.values(e).map(e=>`${e}%`).join(`, `)}`);if(!Q(i,100)&&r.length>0)for(let e=0;e<t.length;e++){let t=r[e];Y(t!=null,`No layout data found for index ${e}`);let n=100/i*t;r[e]=n}let a=0;for(let e=0;e<t.length;e++){let i=n[e];Y(i!=null,`No layout data found for index ${e}`);let o=r[e];Y(o!=null,`No layout data found for index ${e}`);let s=kl({overrideDisabledItems:!0,itemConstraints:t[e],prevSize:i,size:o});o!=s&&(a+=o-s,r[e]=s)}if(!Q(a,0))for(let e=0;e<t.length;e++){let n=r[e];Y(n!=null,`No layout data found for index ${e}`);let i=n+a,o=kl({overrideDisabledItems:!0,itemConstraints:t[e],prevSize:n,size:i});if(n!==o&&(a-=o-n,r[e]=o,Q(a,0)))break}return r.reduce((e,n,r)=>(e[t[r].itemId]=n,e),{})}function Xl({axisId:e,itemId:t}){let n=()=>{let t=wl();for(let[n,{defaultLayoutDeferred:r,derivedItemConstraints:i,layout:a,axisSize:o,separatorToItems:s}]of t)if(n.id===e)return{defaultLayoutDeferred:r,derivedItemConstraints:i,axis:n,axisSize:o,layout:a,separatorToItems:s};throw Error(`Group ${e} not found`)},r=()=>{let e=n().derivedItemConstraints.find(e=>e.itemId===t);if(e!==void 0)return e;throw Error(`Panel constraints not found for Panel ${t}`)},i=()=>{let e=n().axis.items.find(e=>e.id===t);if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},a=()=>{let e=n().layout[t];if(e!==void 0)return e;throw Error(`Layout not found for Panel ${t}`)},o=({nextSize:e,items:n,prevLayout:r,derivedItemConstraints:i})=>{let o=a(),s=n.findIndex(e=>e.id===t),c=s===0,l=s===n.length-1;if(l&&e<o&&(c||n.slice(0,s).every((e,t)=>{let n=i[t];return n?.collapsible&&Q(n.collapsedSize,r[n.itemId])}))){let e=n.slice(0,s).reduce((e,t)=>e+r[t.id],0);return{...r,[t]:Z(100-e)}}return Al({delta:l?o-e:e-o,initialLayout:r,itemConstraints:i,pivotIndices:l?[s-1,s]:[s,s+1],prevLayout:r,trigger:`imperative-api`})},s=e=>{if(e===a())return;let{defaultLayoutDeferred:t,derivedItemConstraints:r,axis:i,axisSize:s,layout:c,separatorToItems:l}=n(),u=Yl({layout:o({nextSize:e,items:i.items,prevLayout:c,derivedItemConstraints:r}),itemConstraints:r});jl(c,u)||El(i,{defaultLayoutDeferred:t,derivedItemConstraints:r,axisSize:s,layout:u,requestedAxisSize:s,requestedLayout:u,separatorToItems:l})};return{collapse:()=>{let{collapsible:e,collapsedSize:t}=r(),{mutableValues:n}=i(),o=a();e&&o!==t&&(n.expandToSize=o,s(t))},expand:()=>{let{collapsible:e,collapsedSize:t,minSize:n}=r(),{mutableValues:o}=i(),c=a();if(e&&c===t){let e=o.expandToSize??n;e===0&&(e=1),s(e)}},getSize:()=>{let{axis:e}=n(),r=a(),{element:o}=i();return{asPercentage:r,inPixels:e.layoutStrategy?e.layoutStrategy.getItemSizeInPixels(t):e.orientation===`horizontal`?o.offsetWidth:o.offsetHeight}},isCollapsed:()=>{let{collapsible:e,collapsedSize:t}=r(),n=a();return e&&Q(t,n)},resize:e=>{let{axis:t}=n(),{element:r}=i(),a=il({axis:t}),o=Z(_l({axisSize:a,itemElement:r,styleProp:e})/a*100);s(o)}}}function Zl(e){e.defaultPrevented||Jl(e,wl()).forEach(t=>{if(t.separator&&!t.separator.disableDoubleClick){let n=t.items.find(e=>e.constraintProps.defaultSize!==void 0);if(n){let r=n.constraintProps.defaultSize,i=Xl({axisId:t.axis.id,itemId:n.id});i&&r!==void 0&&(i.resize(r),e.preventDefault())}}})}function Ql(e){let t=wl();for(let[n]of t)if(n.separators.some(t=>t.element===e))return n;throw Error(`Could not find parent Group for separator element`)}function $l({axisId:e}){let t=()=>{let t=wl();for(let[n,r]of t)if(n.id===e)return{axis:n,...r};throw Error(`Could not find Group with id "${e}"`)};return{getLayout(){let{defaultLayoutDeferred:e,layout:n}=t();return e?{}:n},setLayout(e){let{defaultLayoutDeferred:n,derivedItemConstraints:r,axis:i,axisSize:a,layout:o,separatorToItems:s}=t(),c=Yl({layout:e,itemConstraints:r});return n?o:(jl(o,c)||El(i,{defaultLayoutDeferred:n,derivedItemConstraints:r,axisSize:a,layout:c,requestedAxisSize:a,requestedLayout:c,separatorToItems:s}),c)}}}function eu(e,t){let n=Ql(e),r=Cl(n.id,!0),i=n.separators.find(t=>t.element===e);Y(i,`Matching separator not found`);let a=r.separatorToItems.get(i);Y(a,`Matching panels not found`);let o=a.map(e=>n.items.indexOf(e)),s=$l({axisId:n.id}).getLayout(),c=Yl({layout:Al({delta:t,initialLayout:s,itemConstraints:r.derivedItemConstraints,pivotIndices:o,prevLayout:s,trigger:`keyboard`}),itemConstraints:r.derivedItemConstraints});jl(s,c)||El(n,{defaultLayoutDeferred:r.defaultLayoutDeferred,derivedItemConstraints:r.derivedItemConstraints,axisSize:r.axisSize,layout:c,requestedAxisSize:r.axisSize,requestedLayout:c,separatorToItems:r.separatorToItems},{isUserInteraction:!0})}function tu(e){if(e.defaultPrevented)return;let t=e.currentTarget,n=Ql(t);if(!(n.disabled||n.separators.find(e=>e.element===t)?.disabled))switch(e.key){case`ArrowDown`:e.preventDefault(),n.orientation===`vertical`&&eu(t,5);break;case`ArrowLeft`:e.preventDefault(),n.orientation===`horizontal`&&eu(t,-5);break;case`ArrowRight`:e.preventDefault(),n.orientation===`horizontal`&&eu(t,5);break;case`ArrowUp`:e.preventDefault(),n.orientation===`vertical`&&eu(t,-5);break;case`End`:e.preventDefault(),eu(t,100);break;case`Enter`:{e.preventDefault();let{derivedItemConstraints:r,layout:i,separatorToItems:a}=Cl(n.id,!0),o=n.separators.find(e=>e.element===t);Y(o,`Matching separator not found`);let s=a.get(o);Y(s,`Matching panels not found`);let c=s[0],l=r.find(e=>e.itemId===c.id);if(Y(l,`Panel metadata not found`),l.collapsible){let e=i[c.id];eu(t,(l.collapsedSize===e?n.mutableState.expandedItemSizes[c.id]??l.minSize:l.collapsedSize)-e)}break}case`F6`:{e.preventDefault();let t=n.separators.map(e=>e.element),r=Array.from(t).findIndex(t=>t===e.currentTarget);Y(r!==null,`Index not found`),t[e.shiftKey?r>0?r-1:t.length-1:r+1<t.length?r+1:0].focus({preventScroll:!0});break}case`Home`:e.preventDefault(),eu(t,-100)}}function nu(e,t){let{element:n,orientation:r,items:i}=e,a=n.getBoundingClientRect(),o=r===`horizontal`;return fl({expandHitTargets:!1,axis:e,includeDisabled:!0}).map(({items:r,rect:s,separator:c},l)=>{let u=i.indexOf(r[0]),d=o?s.left+s.width/2:s.top+s.height/2;return{active:t.some(t=>{if(t.axis!==e||t.items[0]!==r[0])return!1;if(c||t.separator)return t.separator===c;let n=o?t.rect.left+t.rect.width/2:t.rect.top+t.rect.height/2;return Q(d,n)}),axis:e,key:c?`separator-${c.id}`:`panel-${r[0].id}-${l}`,offset:0,itemIndex:u,rect:new DOMRect((o&&!c?d:s.left)-a.left-n.clientLeft+n.scrollLeft,(!o&&!c?d:s.top)-a.top-n.clientTop+n.scrollTop,o&&!c?0:s.width,!o&&!c?0:s.height),separator:c}})}function ru(e){if(e.defaultPrevented||e.pointerType===`mouse`&&e.button>0)return;let t=wl(),n=Jl(e,t);if(n.length===0)return;let r=new Map,i=!1;n.forEach(e=>{e.separator&&(i||(i=!0,e.separator.element.focus({focusVisible:!1,preventScroll:!0})));let n=t.get(e.axis);n&&r.set(e.axis,n.layout)});let a=Array.from(r.keys()).flatMap(e=>e.resizePreviewMode===`separator`?nu(e,n):[]);Hc({cursorFlags:0,didPointerMove:!1,hitRegions:n,initialLayoutMap:r,pointerDownAtPoint:{x:e.clientX,y:e.clientY},previewLayoutMap:new Map(r),previews:a,state:`active`}),e.preventDefault()}function iu(e){let t=wl(),n=zc();n.state===`active`&&Ml({commit:!1,document:e.currentTarget,event:e,hitRegions:n.hitRegions,initialLayoutMap:n.initialLayoutMap,mountedAxes:t,prevCursorFlags:n.cursorFlags})}function au(e){if(e.defaultPrevented)return;let t=zc(),n=wl();switch(t.state){case`active`:if(e.buttons===0){t.previewLayoutMap.forEach((e,t)=>{let r=n.get(t);t.resizePreviewMode===`separator`&&r&&!jl(e,r.layout)&&El(t,{...r,layout:e,requestedAxisSize:r.axisSize,requestedLayout:e})}),Hc({cursorFlags:0,state:`inactive`}),t.hitRegions.forEach(e=>{if(!n.has(e.axis))return;let t=Cl(e.axis.id,!0);El(e.axis,t,{isUserInteraction:!0})}),rl(e.currentTarget);return}for(let n of t.hitRegions)if(n.separator){let{element:t}=n.separator;t.isConnected&&!t.hasPointerCapture?.(e.pointerId)&&t.setPointerCapture?.(e.pointerId)}Ml({commit:!1,document:e.currentTarget,event:e,hitRegions:t.hitRegions,initialLayoutMap:t.initialLayoutMap,mountedAxes:n,pointerDownAtPoint:t.pointerDownAtPoint,prevCursorFlags:t.cursorFlags});break;default:{let r=Jl(e,n);r.length===0?t.state!==`inactive`&&Hc({cursorFlags:0,state:`inactive`}):Hc({cursorFlags:0,hitRegions:r,state:`hover`}),rl(e.currentTarget);break}}}function ou(e){if(e.relatedTarget instanceof HTMLIFrameElement)switch(zc().state){case`hover`:Hc({cursorFlags:0,state:`inactive`})}}function su(e){e.defaultPrevented||e.pointerType===`mouse`&&e.button>0||Nl(e.currentTarget,e)&&e.preventDefault()}function cu(e){let t=0,n=0,r={};for(let i of e)if(i.defaultSize!==void 0){t++;let e=Z(i.defaultSize);n+=e,r[i.itemId]=e}else r[i.itemId]=void 0;let i=e.length-t;if(i!==0){let t=Z((100-n)/i);for(let n of e)n.defaultSize===void 0&&(r[n.itemId]=t)}return r}function lu(e,t){let n=e.map(e=>e.id),r=Object.keys(t);if(n.length!==r.length)return!1;for(let e of n)if(!r.includes(e))return!1;return!0}function uu({axis:e,itemConstraints:t}){let n=e.items.map(({id:e})=>e).join(`,`),r=e.mutableState.defaultLayout;return e.mutableState.layouts[n]??(r&&lu(e.items,r)?r:cu(t))}function du({itemIds:e,layout:t}){return Yl({layout:t,itemConstraints:e.map(e=>({collapsedSize:0,collapsible:!1,defaultSize:void 0,disabled:void 0,itemId:e,maxSize:100,minSize:0}))})}function fu(e,t,n){if(!n[0])return;let r=e.items.find(e=>e.element===t);if(!r||!r.onResize)return;let i=il({axis:e}),a=e.orientation===`horizontal`?r.element.offsetWidth:r.element.offsetHeight,o=r.mutableValues.prevSize,s={asPercentage:Z(a/i*100),inPixels:a};r.mutableValues.prevSize=s,r.onResize(s,r.id,o)}function pu(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function mu(e,t){return e.length===t.length&&e.every((e,n)=>pu(e,t[n]))}function hu({axis:e,nextAxisSize:t,prevAxisSize:n,prevLayout:r}){if(n<=0||t<=0||n===t)return r;let i=0,a=0,o=!1,s=new Map,c=[];for(let l of e.items){let e=r[l.id]??0;switch(l.constraintProps.groupResizeBehavior){case`preserve-pixel-size`:{o=!0;let r=Z(e/100*n/t*100);s.set(l.id,r),i+=r;break}default:c.push(l.id),a+=e}}if(!o||c.length===0)return r;let l=100-i,u={...r};if(s.forEach((e,t)=>{u[t]=e}),a>0)for(let e of c)u[e]=Z((r[e]??0)/a*l);else{let e=Z(l/c.length);for(let t of c)u[t]=e}return u}var gu=new Map;function _u(e){let t=!0;Y(e.element.ownerDocument.defaultView,`Cannot register an unmounted Group`);let n=e.element.ownerDocument.defaultView.ResizeObserver,r=new Set,i=new Set,a=new n(n=>{for(let r of n){let{borderBoxSize:n,target:i}=r;if(i===e.element){if(t){let t=il({axis:e});if(t===0)return;let n=Cl(e.id);if(!n)return;let r=vl(e),i=n.requestedAxisSize,a=n.requestedLayout;n.defaultLayoutDeferred&&(i=t,a=du({itemIds:e.items.map(({id:e})=>e),layout:uu({axis:e,itemConstraints:r})}));let o=Yl({layout:hu({axis:e,nextAxisSize:t,prevAxisSize:i,prevLayout:a}),itemConstraints:r});if(!n.defaultLayoutDeferred&&jl(n.layout,o)&&mu(n.derivedItemConstraints,r)&&n.axisSize===t)continue;El(e,{defaultLayoutDeferred:!1,derivedItemConstraints:r,axisSize:t,layout:o,requestedAxisSize:i,requestedLayout:a,separatorToItems:n.separatorToItems})}}else fu(e,i,n)}});a.observe(e.element),e.items.forEach(e=>{Y(!r.has(e.id),`Panel ids must be unique; id "${e.id}" was used more than once`),r.add(e.id),e.onResize&&a.observe(e.element)});let o=il({axis:e}),s=vl(e),c=uu({axis:e,itemConstraints:s}),l=Yl({layout:c,itemConstraints:s}),u=e.element.ownerDocument;gu.set(u,(gu.get(u)??0)+1);let d=new Map;return fl({axis:e,includeDisabled:!0}).forEach(e=>{e.separator&&d.set(e.separator,e.items)}),El(e,{defaultLayoutDeferred:o===0,derivedItemConstraints:s,axisSize:o,layout:l,requestedAxisSize:o,requestedLayout:du({itemIds:e.items.map(({id:e})=>e),layout:c}),separatorToItems:d}),e.separators.forEach(e=>{Y(!i.has(e.id),`Separator ids must be unique; id "${e.id}" was used more than once`),i.add(e.id),e.element.addEventListener(`keydown`,tu)}),gu.get(u)===1&&(u.addEventListener(`contextmenu`,Pl,!0),u.addEventListener(`dblclick`,Zl,!0),u.addEventListener(`pointerdown`,ru,!0),u.addEventListener(`pointerleave`,iu),u.addEventListener(`pointermove`,au),u.addEventListener(`pointerout`,ou),u.addEventListener(`pointerup`,su,!0)),function(){t=!1,gu.set(u,Math.max(0,(gu.get(u)??0)-1)),xl(e),Wc(e)&&rl(u),e.separators.forEach(e=>{e.element.removeEventListener(`keydown`,tu)}),gu.get(u)||(u.removeEventListener(`contextmenu`,Pl,!0),u.removeEventListener(`dblclick`,Zl,!0),u.removeEventListener(`pointerdown`,ru,!0),u.removeEventListener(`pointerleave`,iu),u.removeEventListener(`pointermove`,au),u.removeEventListener(`pointerout`,ou),u.removeEventListener(`pointerup`,su,!0)),a.disconnect()}}function vu({derivedItemConstraints:e,axis:t,layout:n,prevLayout:r,requestedLayout:i}){let a=t.items.map(({id:e})=>e).join(`,`);t.mutableState.layouts[a]=i,r&&e.forEach(e=>{if(e.collapsible){let i=Q(e.collapsedSize,n[e.itemId]),a=Q(e.collapsedSize,r[e.itemId]);i&&!a&&(t.mutableState.expandedItemSizes[e.itemId]=r[e.itemId])}})}function yu(){let[e,t]=(0,R.useState)({});return[e,(0,R.useCallback)(()=>t({}),[])]}function bu(e){let t=(0,R.useRef)({...e});return Ac(()=>{for(let n in e)t.current[n]=e[n]},[e]),t.current}var xu=(0,R.createContext)(null);function Su({layout:e,itemConstraints:t,itemId:n,itemIndex:r}){let i,a,o=e[n],s=t.find(e=>e.itemId===n);if(s){let c=s.maxSize,l=s.collapsible?s.collapsedSize:s.minSize,u=[r,r+1];a=Yl({layout:Al({delta:l-o,initialLayout:e,itemConstraints:t,pivotIndices:u,prevLayout:e}),itemConstraints:t})[n],i=Yl({layout:Al({delta:c-o,initialLayout:e,itemConstraints:t,pivotIndices:u,prevLayout:e}),itemConstraints:t})[n]}return{valueControls:n,valueMax:i,valueMin:a,valueNow:o}}function Cu({attributes:e,axisId:t,axisOrientation:n,children:r,className:i,disableCursor:a,disabled:o,disableDoubleClick:s,elementRef:c,id:l,isSharedHitRegion:u,preview:d,registerSeparator:f,requiredStyle:p,style:m,styleDefaults:h,tabIndex:g=0,updateSeparatorProps:_}){let v=bu({disabled:o,disableDoubleClick:s,children:r,className:i,preview:d,style:m}),[y,b]=(0,R.useState)({}),[x,S]=(0,R.useState)(`inactive`),[C,w]=(0,R.useState)(!1),T=(0,R.useRef)(null),E=(0,R.useRef)(null),ee=Mc(T,c),D=n===`horizontal`?`vertical`:`horizontal`;Ac(()=>{let e=T.current;if(e!==null){let n={disabled:v.disabled,disableDoubleClick:v.disableDoubleClick,element:e,id:l,get children(){return v.children},get className(){return v.className},get preview(){return v.preview},get style(){return v.style}};E.current=n;let r=f(n),i=Bc(e=>{S(e.next.state!==`inactive`&&e.next.hitRegions.some(e=>e.separator===n||(u?.(e)??!1))?e.next.state:`inactive`)}),a=Tl(t,e=>{let{derivedItemConstraints:t,layout:r,separatorToItems:i}=e.next,a=i.get(n);if(a){let n=a[0],i=t.findIndex(e=>e.itemId===n.id),{layoutStrategy:o}=e.axis;b({...Su({layout:r,itemConstraints:t,itemId:n.id,itemIndex:i}),...o?.getItemAriaControls&&{valueControls:o.getItemAriaControls(n.id)}})}});return()=>{E.current=null,i(),a(),r()}}},[t,l,u,f,v]),Ac(()=>{let e=E.current;e&&Uc(e)},[d]),(0,R.useEffect)(()=>{_(l,{disabled:o,disableDoubleClick:s})},[o,s,l,_]);let O;o&&!a&&(O=`not-allowed`);let k;if(o)k=`disabled`;else switch(x){case`active`:k=`active`;break;default:k=C?`focus`:x}return(0,z.jsx)(`div`,{...e,"aria-controls":y.valueControls,"aria-disabled":o||void 0,"aria-orientation":D,"aria-valuemax":y.valueMax,"aria-valuemin":y.valueMin,"aria-valuenow":y.valueNow,children:r,className:i,"data-separator":k,"data-testid":l,id:l,onBlur:()=>w(!1),onFocus:()=>w(!0),ref:ee,role:`separator`,style:{...h,cursor:O,...m,...p,touchAction:`none`},tabIndex:o?void 0:g})}function wu(e){for(let t=1;t<e.length;t++)if(al(e[t-1],e[t])>0)return!1;return!0}function Tu({separator:e}){let{element:t}=e,n=(0,R.useRef)(null);return Ac(()=>{let e=t.cloneNode(!0),r=[t,...t.querySelectorAll(`*`)],i=[e,...e.querySelectorAll(`*`)],a=t.ownerDocument.defaultView;return r.forEach((e,t)=>{let n=i[t];if(n instanceof a.HTMLElement||n instanceof a.SVGElement){let t=a.getComputedStyle(e);for(let e=0;e<t.length;e++){let r=t.item(e);n.style.setProperty(r,t.getPropertyValue(r))}}n.removeAttribute(`data-testid`),n.removeAttribute(`id`)}),Object.assign(e.style,{boxSizing:`border-box`,height:`100%`,margin:`0`,position:`static`,transform:`none`,width:`100%`}),n.current.appendChild(e),()=>e.remove()},[t]),(0,z.jsx)(`div`,{ref:n,style:{height:`100%`,opacity:.65,pointerEvents:`none`,width:`100%`}})}function Eu(){let e=(0,R.useContext)(xu);return Y(e,`Group Context not found; did you render a Panel or Separator outside of a Group?`),e}function Du(e){let{registerOverlay:t}=Eu(),n=(0,R.useRef)(e);pu(n.current,e)||(n.current=e);let r=n.current;return Ac(()=>t(r),[t,r]),null}Du.displayName=`SeparatorOverlay`;function Ou({active:e,orientation:t,style:n,...r}){let i;switch(t){case`horizontal`:i={height:`100%`,minWidth:`1px`};break;case`vertical`:i={minHeight:`1px`,width:`100%`}}return(0,z.jsx)(`div`,{...r,"data-separator-overlay":e?`active`:`inactive`,style:{...i,...n,flexShrink:0,pointerEvents:`none`}})}function ku({overlay:e,preview:t}){let{axis:n,offset:r,rect:i,separator:a}=t,o=n.orientation===`horizontal`,s=a?.preview,c=e;return(0,R.isValidElement)(s)&&s.type===Du&&(c=s.props,s=void 0),s??(c?s=(0,z.jsx)(Ou,{...c,active:t.active,orientation:n.orientation}):a&&(s=(0,z.jsx)(Tu,{separator:a}))),(0,z.jsx)(`div`,{"aria-hidden":`true`,"data-resize-preview":!0,inert:!0,style:{height:i.height,left:i.left,pointerEvents:`none`,position:`absolute`,top:i.top,transform:o?`translateX(${r}px)`:`translateY(${r}px)`,width:i.width},children:s})}function Au(e){return Array.from(e).sort(al)}function ju(e,t){let n=(0,R.useRef)({getLayout:()=>({}),setLayout:Gc});(0,R.useImperativeHandle)(t,()=>n.current,[]),Ac(()=>{Object.assign(n.current,$l({axisId:e}))})}function Mu({groupId:e,resizePreviewMode:t}){let[n,r]=(0,R.useState)([]),i=(0,R.useRef)(n);return Ac(()=>{let n=n=>{let a=Sl(e),o=t===`separator`&&n.state===`active`?n.previews.filter(e=>e.axis===a&&(e.active||!Q(e.offset,0))):[],s=i.current;s.length===o.length&&o.every((e,t)=>e===s[t])||(i.current=o,r(o))};if(t!==`separator`){n(zc());return}let a=Bc(({next:e})=>n(e));return n(zc()),a},[e,t]),n}function Nu({children:e,className:t,defaultLayout:n,disableCursor:r,disabled:i,elementRef:a,groupRef:o,id:s,onLayoutChange:c,onLayoutChanged:l,orientation:u=`horizontal`,resizePreviewMode:d=`panel`,resizeTargetMinimumSize:f={coarse:20,fine:10},style:p,...m}){let h=(0,R.useRef)({onLayoutChange:{},onLayoutChanged:{}}),g=jc(e=>{jl(h.current.onLayoutChange,e)||(h.current.onLayoutChange=e,c?.(e))}),_=jc((e,t,n)=>{jl(h.current.onLayoutChanged,e)||(h.current.onLayoutChanged=e,l?.(e,{isUserInteraction:t,requestedLayout:n}))}),v=kc(s),[y,b]=(0,R.useState)(),x=Mu({groupId:v,resizePreviewMode:d}),S=(0,R.useRef)(null),[C,w]=yu(),T=(0,R.useRef)([]),E=(0,R.useRef)({lastExpandedPanelSizes:{},layouts:{},panels:[],separators:[]}),ee=Mc(S,a);ju(v,o);let D=jc((e,t)=>{let r=Cl(e);if(r)return{flexGrow:r.layout[t]??1};if(n?.[t])return{flexGrow:n?.[t]}}),O=bu({defaultLayout:n,disableCursor:r,resizeTargetMinimumSize:f}),k=(0,R.useMemo)(()=>({get disableCursor(){return!!O.disableCursor},getPanelStyles:D,id:v,orientation:u,registerPanel:e=>{let t=E.current;return t.panels=ol(u,[...t.panels,e]),w(),()=>{t.panels=t.panels.filter(t=>t!==e),w()}},registerOverlay:e=>(b(e),()=>{b(void 0)}),registerSeparator:e=>{let t=E.current;return t.separators=ol(u,[...t.separators,e]),w(),()=>{t.separators=t.separators.filter(t=>t!==e),w()}},updatePanelProps:(e,{disabled:t})=>{let n=E.current.panels.find(t=>t.id===e);n&&(n.constraintProps.disabled=t);let r=Sl(v),i=Cl(v);r&&i&&El(r,{...i,derivedItemConstraints:vl(r)})},updateSeparatorProps:(e,{disabled:t,disableDoubleClick:n})=>{let r=E.current.separators.find(t=>t.id===e);r&&(r.disabled=t,r.disableDoubleClick=n)}}),[D,v,w,u,O]),A=(0,R.useRef)(null);return Ac(()=>{let e=S.current;if(e===null)return;let t=E.current;t.panels=ol(u,t.panels),t.separators=ol(u,t.separators),T.current=Au([...t.panels.map(({element:e})=>e),...t.separators.map(({element:e})=>e)]);let n;if(O.defaultLayout!==void 0&&Object.keys(O.defaultLayout).length===t.panels.length){n={};for(let e of t.panels){let t=O.defaultLayout[e.id];t!==void 0&&(n[e.id]=t)}}let r={disabled:!!i,element:e,id:v,mutableState:{defaultLayout:n,disableCursor:!!O.disableCursor,expandedItemSizes:E.current.lastExpandedPanelSizes,layouts:E.current.layouts},orientation:u,items:t.panels,resizePreviewMode:d,get resizeTargetMinimumSize(){return O.resizeTargetMinimumSize},separators:t.separators};A.current=r;let a=_u(r),{defaultLayoutDeferred:o,derivedItemConstraints:s,layout:c,requestedLayout:l}=Cl(r.id,!0);!o&&s.length>0&&(g(c),_(c,!1,l));let f=Tl(v,e=>{let{defaultLayoutDeferred:t,derivedItemConstraints:n,layout:i,requestedLayout:a}=e.next;if(t||n.length===0)return;vu({derivedItemConstraints:n,axis:r,layout:i,prevLayout:e.prev?.layout,requestedLayout:a});let o=zc(),s=o.state!==`active`||!o.hitRegions.some(e=>e.axis===r);g(i),s&&_(i,e.isUserInteraction,a)});return()=>{A.current=null,a(),f()}},[i,v,_,g,u,C,d,O]),Ac(()=>{wu(T.current)||w()}),(0,R.useEffect)(()=>{let e=A.current;e&&(e.mutableState.defaultLayout=n,e.mutableState.disableCursor=!!r)}),(0,z.jsx)(xu.Provider,{value:k,children:(0,z.jsxs)(`div`,{...m,className:t,"data-group":!0,"data-testid":v,id:v,ref:ee,style:{height:`100%`,width:`100%`,overflow:`hidden`,position:d===`separator`?`relative`:void 0,...p,display:`flex`,flexDirection:u===`horizontal`?`row`:`column`,flexWrap:`nowrap`,touchAction:u===`horizontal`?`pan-y`:`pan-x`},children:[e,x.map(e=>(0,z.jsx)(ku,{overlay:y,preview:e},e.key))]})})}Nu.displayName=`Group`;function Pu(e,t){let{id:n}=Eu(),r=(0,R.useRef)({collapse:Kc,expand:Kc,getSize:()=>({asPercentage:0,inPixels:0}),isCollapsed:()=>!1,resize:Kc});(0,R.useImperativeHandle)(t,()=>r.current,[]),Ac(()=>{Object.assign(r.current,Xl({axisId:n,itemId:e}))})}function Fu({children:e,className:t,collapsedSize:n=`0%`,collapsedThreshold:r,collapsible:i=!1,defaultSize:a,disabled:o,elementRef:s,groupResizeBehavior:c=`preserve-relative-size`,id:l,maxSize:u=`100%`,minSize:d=`0%`,onResize:f,panelRef:p,style:m,...h}){let g=!!l,_=kc(l),v=bu({disabled:o}),y=(0,R.useRef)(null),b=Mc(y,s),{getPanelStyles:x,id:S,orientation:C,registerPanel:w,updatePanelProps:T}=Eu(),E=f!==null,ee=jc((e,t,n)=>{f?.(e,l,n)});Ac(()=>{let e=y.current;if(e!==null){let t={element:e,id:_,idIsStable:g,mutableValues:{expandToSize:void 0,prevSize:void 0},onResize:E?ee:void 0,constraintProps:{groupResizeBehavior:c,collapsedSize:n,collapsedThreshold:r,collapsible:i,defaultSize:a,disabled:v.disabled,maxSize:u,minSize:d}};return w(t)}},[c,n,r,i,a,E,_,g,u,d,ee,w,v]),(0,R.useEffect)(()=>{T(_,{disabled:o})},[o,_,T]),Pu(_,p);let D=()=>{let e=x(S,_);if(e)return JSON.stringify(e)},O=(0,R.useSyncExternalStore)(e=>Tl(S,e),D,D),k;return k=O?JSON.parse(O):a===void 0?{flexGrow:1}:{flexGrow:void 0,flexShrink:void 0,flexBasis:a},(0,z.jsx)(`div`,{...h,"data-disabled":o||void 0,"data-panel":!0,"data-testid":_,id:_,ref:b,style:{...Iu,display:`flex`,flexBasis:0,flexShrink:1,overflow:`visible`,...k},children:(0,z.jsx)(`div`,{className:t,style:{maxHeight:`100%`,maxWidth:`100%`,flexGrow:1,overflow:`auto`,...m,touchAction:C===`horizontal`?`pan-y`:`pan-x`},children:e})})}Fu.displayName=`Panel`;var Iu={minHeight:0,maxHeight:`100%`,height:`auto`,minWidth:0,maxWidth:`100%`,width:`auto`,border:`none`,borderWidth:0,padding:0,margin:0},Lu={flexBasis:`auto`},Ru={flexGrow:0,flexShrink:0};function zu({children:e,className:t,disabled:n,disableDoubleClick:r,elementRef:i,id:a,preview:o,style:s,...c}){let l=kc(a),{disableCursor:u,id:d,orientation:f,registerSeparator:p,updateSeparatorProps:m}=Eu();return(0,z.jsx)(Cu,{attributes:c,axisId:d,axisOrientation:f,className:t,disableCursor:u,disabled:n,disableDoubleClick:r,elementRef:i,id:l,preview:o,registerSeparator:p,requiredStyle:Ru,style:s,styleDefaults:Lu,updateSeparatorProps:m,children:e})}zu.displayName=`Separator`;var Bu=6,Vu=320,Hu=.9;function Uu(e){return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)}function Wu(){return Math.min(Vu,Math.floor(window.innerWidth*Hu))}function Gu(e,t){let n=e.indexOf(`#`),r=n===-1?e:e.slice(0,n),i=n===-1?``:e.slice(n);return`${r}${r.includes(`?`)?`&`:`?`}t=${t}${i}`}function Ku(e,t){let n=null;try{n=e.contentDocument}catch{return}n&&n.addEventListener(`keydown`,e=>{e.key!==`Escape`||e.defaultPrevented||n.querySelector(`.VPLocalSearchBox, [role="dialog"][aria-modal="true"]`)||t()})}function qu(){let{isOpen:e,target:t,close:n}=k(),{theme:a}=Me(),l=(0,R.useSyncExternalStore)(Uu,Wu),u=(0,R.useRef)(null),[d,f]=(0,R.useState)(null),p=(0,R.useRef)(null),m=(0,R.useCallback)(e=>{if(p.current?.disconnect(),p.current=null,!e){document.documentElement.style.setProperty(`--docs-inset`,`0px`);return}let t=()=>document.documentElement.style.setProperty(`--docs-inset`,`${e.getBoundingClientRect().width+Bu}px`),n=new ResizeObserver(t);n.observe(e),t(),p.current=n},[]);(0,R.useEffect)(()=>{if(!e){u.current=null,f(null);return}let n=t.path,r=u.current;r&&r.path===n&&r.theme===a||(u.current={kind:`site`,path:n,theme:a},f(Gu(n,a)))},[e,t,a]);let h=t.source===`reference`?`Reference`:`Guide`;return(0,z.jsx)(s,{open:e,modal:!1,disablePointerDismissal:!0,onOpenChange:e=>{e||n()},children:(0,z.jsx)(o,{children:(0,z.jsx)(c,{"data-slot":`docs-panel`,className:`pointer-events-none fixed inset-0 z-[60]`,children:(0,z.jsxs)(Nu,{orientation:`horizontal`,className:`h-full w-full`,children:[(0,z.jsx)(Fu,{minSize:`10%`,className:`pointer-events-none`}),(0,z.jsx)(zu,{"aria-label":`Resize docs panel`,className:`pointer-events-auto w-1.5 cursor-col-resize bg-border/60 transition-colors hover:bg-primary/50 data-dragging:bg-primary/50`}),(0,z.jsx)(Fu,{defaultSize:576,minSize:l,maxSize:`90vw`,className:`pointer-events-auto`,children:(0,z.jsxs)(`div`,{ref:m,className:`flex h-full flex-col border-l border-border bg-popover text-sm text-popover-foreground shadow-lg`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between border-b border-border p-4`,children:[(0,z.jsx)(i,{className:`font-heading text-base font-medium text-foreground`,children:h}),(0,z.jsxs)(r,{render:(0,z.jsx)(B,{variant:`ghost`,size:`icon-sm`}),children:[(0,z.jsx)(Wt,{"aria-hidden":`true`}),(0,z.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]}),(0,z.jsx)(`iframe`,{src:d??void 0,title:h,className:`w-full flex-1 border-0`,onLoad:e=>Ku(e.currentTarget,n)})]})})]})})})})}function Ju({className:e,...t}){return(0,z.jsx)(`div`,{"data-slot":`table-container`,className:`relative w-full overflow-x-auto rounded-sm outline-none focus-visible:ring-2 focus-visible:ring-accent`,tabIndex:0,children:(0,z.jsx)(`table`,{"data-slot":`table`,className:b(`w-full caption-bottom text-sm`,e),...t})})}function Yu({className:e,...t}){return(0,z.jsx)(`thead`,{"data-slot":`table-header`,className:b(`[&_tr]:border-b`,e),...t})}function Xu({className:e,...t}){return(0,z.jsx)(`tbody`,{"data-slot":`table-body`,className:b(`[&_tr:last-child]:border-0`,e),...t})}function Zu({className:e,...t}){return(0,z.jsx)(`tr`,{"data-slot":`table-row`,className:b(`border-b transition-colors hover:bg-muted/50 has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted`,e),...t})}function $({className:e,...t}){return(0,z.jsx)(`th`,{"data-slot":`table-head`,className:b(`h-10 px-2 text-left align-middle font-mono text-[11px] font-medium tracking-[.06em] uppercase whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0`,e),...t})}function Qu({className:e,...t}){return(0,z.jsx)(`td`,{"data-slot":`table-cell`,className:b(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0`,e),...t})}function $u({className:e,...t}){return(0,z.jsx)(`caption`,{"data-slot":`table-caption`,className:b(`mt-4 text-sm text-muted-foreground`,e),...t})}function ed({className:e,size:t=`default`,...n}){return(0,z.jsx)(`div`,{"data-slot":`card`,"data-size":t,className:b(`group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-border [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl`,e),...n})}function td({className:e,...t}){return(0,z.jsx)(`div`,{"data-slot":`card-content`,className:b(`px-(--card-spacing)`,e),...t})}var nd=(0,R.createContext)(null),rd=(0,R.createContext)(null),id=(0,R.createContext)(null),ad=(0,R.createContext)(null);function od({children:e,registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i,focusedWidgetId:a,activeRouteTarget:o,flashedFinding:s}){let c=(0,R.useMemo)(()=>({registerWidget:t,registerFindingAnchor:n,reportWidgetOpen:r,clearRouteFocus:i}),[t,n,r,i]);return(0,z.jsx)(nd.Provider,{value:c,children:(0,z.jsx)(rd.Provider,{value:a,children:(0,z.jsx)(id.Provider,{value:o,children:(0,z.jsx)(ad.Provider,{value:s,children:e})})})})}function sd(){return(0,R.useContext)(nd)}function cd(){return(0,R.useContext)(rd)}function ld(){return(0,R.useContext)(id)}function ud(){return(0,R.useContext)(ad)}var dd=(0,R.createContext)(null);function fd(){return(0,R.useContext)(dd)}function pd({children:e,className:t}){return(0,z.jsx)(`div`,{className:b(`grid grid-cols-[repeat(auto-fit,minmax(320px,1fr))] items-start gap-4`,t),children:e})}function md({cardId:e,widgetId:t,children:n,className:r,collapsedTile:i=!1}){let a=sd(),o=cd(),[s,c]=(0,R.useState)(0),[l,u]=(0,R.useState)(!1),d=(0,R.useRef)(null),f=(0,R.useRef)(null),p=(0,R.useMemo)(()=>({openRequestGeneration:s,reportOpen:e=>{u(e),t&&a?.reportWidgetOpen(t,e)},setDisclosureButton:e=>{f.current=e},onDisclosureBlur:()=>{t&&a?.clearRouteFocus(t)},routeFocused:t?o===t:!1,collapsedTile:i}),[a,s,t,o,i]);return(0,R.useLayoutEffect)(()=>{if(a&&t&&d.current)return a.registerWidget(t,{wrapperElement:d.current,open:()=>{c(e=>e+1)},getDisclosureButton:()=>f.current})},[a,t]),(0,z.jsx)(dd.Provider,{value:p,children:(0,z.jsx)(`div`,{ref:d,"data-testid":`widget-grid-item-${e}`,className:b(`empty:hidden`,t&&`scroll-mt-20`,l&&`col-span-full`,r),children:n})})}function hd({children:e}){return(0,z.jsx)(dd.Provider,{value:null,children:e})}function gd({title:e,subtitle:t,impactBand:n,badges:r,statusBadge:i,summary:a,defaultCollapsed:o=!1,collapsible:s=!0,open:c,onOpenChange:l,compact:u=!1,routeFocused:d,disclosureButtonRef:f,fixFor:p=[],children:m,id:h}){let g=[...new Set(p.map(C).filter(e=>e!==void 0))],_=(0,z.jsxs)(z.Fragment,{children:[g.length>0?(0,z.jsx)(`div`,{className:`mb-3 space-y-1 text-sm`,children:g.map(e=>(0,z.jsx)(`p`,{children:e},e))}):null,m]}),v=fd(),x=(0,R.useRef)(null),S=v?.collapsedTile??!1,[w,T]=(0,R.useState)(!S&&!o),E=c??w,D=d??v?.routeFocused??!1,[O,k]=(0,R.useState)(D),A=(0,R.useRef)(0);(0,R.useLayoutEffect)(()=>{v?.reportOpen(E)},[v,E]),(0,R.useLayoutEffect)(()=>{let e=v?.openRequestGeneration??0;e!==0&&e!==A.current&&(A.current=e,E||(c===void 0?T(!0):l?.(!0)))},[c,v?.openRequestGeneration,l,E]),(0,R.useLayoutEffect)(()=>{k(D)},[D]);let te=e=>{c===void 0?T(e):l?.(e)},ne=(0,z.jsxs)(`div`,{className:`flex flex-col gap-2 px-(--card-spacing) sm:flex-row sm:flex-wrap sm:items-center sm:justify-between`,children:[s?(0,z.jsxs)(he,{ref:e=>{v?.setDisclosureButton(e),typeof f==`function`?f(e):f&&(f.current=e)},"aria-expanded":String(E),"data-route-focused":O?``:void 0,className:b(`tap-target-comfortable tap-target-comfortable--sm flex min-w-0 cursor-pointer items-center gap-2 bg-transparent text-left sm:flex-1`,O&&`border-ring ring-[3px] ring-ring/50 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50`),onBlur:e=>{e.relatedTarget&&x.current?.contains(e.relatedTarget)||(k(!1),v?.onDisclosureBlur())},children:[(0,z.jsx)(`h3`,{className:`font-heading text-sm leading-snug font-semibold`,children:e}),E?(0,z.jsx)(ie,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`}):(0,z.jsx)(xe,{"aria-hidden":`true`,className:`size-4 shrink-0 text-muted-foreground`})]}):(0,z.jsx)(`h3`,{className:`min-w-0 font-heading text-sm leading-snug font-semibold sm:flex-1`,children:e}),r||E&&i?(0,z.jsxs)(`div`,{className:`flex shrink-0 flex-wrap items-center gap-1`,children:[r,E?i:null]}):null,t?(0,z.jsx)(`p`,{className:`w-full basis-full font-mono text-xs text-muted-foreground sm:-mt-1.5`,children:t}):null]}),j=(0,z.jsx)(hd,{children:(0,z.jsx)(td,{children:_})});return(0,z.jsx)(ed,{ref:x,id:h,size:u?`sm`:`default`,className:b(n?b(`border-l-[3px]`,ae[n]):`border-l-0`,S&&!E&&`min-h-[6.5rem]`),children:s?(0,z.jsxs)(y,{open:E,onOpenChange:te,children:[ne,a&&!E?(0,z.jsx)(`div`,{className:`px-(--card-spacing) pb-(--card-spacing)`,children:a}):null,(0,z.jsx)(hd,{children:(0,z.jsx)(ee,{keepMounted:!0,children:(0,z.jsx)(ye.Provider,{value:E,children:(0,z.jsx)(td,{children:_})})})})]}):(0,z.jsxs)(z.Fragment,{children:[ne,j]})})}function _d(){return(0,z.jsx)(ed,{"aria-hidden":`true`,children:(0,z.jsx)(td,{children:(0,z.jsx)(`div`,{className:`h-5 w-1/3 animate-pulse rounded-md bg-muted motion-reduce:animate-none`})})})}var vd=.02;function yd(e){return e.baseline!=null&&e.candidate!=null}function bd(e){return e.baseline===0?e.candidate!==0:Math.abs(e.candidate-e.baseline)/Math.abs(e.baseline)>=vd}function xd(e){let t=ue(e);return se[t]?.expansion??t}function Sd(e){let t=new Map;for(let n of[...e.introduced,...e.resolved]){let e=xd(n.type);t.set(e,(t.get(e)??0)+n.candCount-n.baseCount)}return t}function Cd(e,t){return[...e].filter(([,e])=>t(e)).map(([e])=>e)}function wd(e,{failedJobs:t,totalJobs:n}){return t<n?`The ${e} had ${t} of ${n} jobs fail`:n===1?`The ${e}'s only job failed`:`All ${n} of the ${e}'s jobs failed`}function Td({failedJobs:e,totalJobs:t}){return e===0?`none`:e<t?`${e} of ${t}`:t===1?`its only job failed`:`all ${t} failed`}function Ed(e,t){if(e.failedJobs===0&&t.failedJobs===0)return null;let n=t.failedJobs>e.failedJobs?`worse`:t.failedJobs<e.failedJobs?`better`:`same`;return t.failedJobs===0?{title:`${wd(`baseline`,e)}; the candidate completed`,tone:n}:{title:`${wd(`candidate`,t)} (baseline: ${Td(e)})`,tone:n}}function Dd(e,t,n){let r=e.find(e=>e.key===`wallClock`),i=`Run time could not be compared between the baseline and the candidate`,a=`unknown`,o=n?[`baseline`,`candidate`].filter(e=>n[e].incomplete):[];if(r&&r.baseline!=null&&r.baseline>0&&r.candidate!=null&&o.length>0){let e=r.candidate-r.baseline;i=Math.abs(e/r.baseline)<.02?`The candidate's log covers about as much run time as the baseline's`:`The candidate's log covers ${h(Math.abs(e))} ${e<0?`less`:`more`} run time than the baseline's`}else if(r&&r.baseline!=null&&r.baseline>0&&r.candidate!=null){let e=r.candidate-r.baseline,t=e/r.baseline;if(Math.abs(t)<.02)i=`The candidate took about as long as the baseline`,a=`same`;else{let n=e<0;i=`The candidate finished ${h(Math.abs(e))} ${n?`faster`:`slower`} than the baseline (${Math.round(Math.abs(t)*100)}%)`,a=n?`better`:`worse`}}let s=e.filter(e=>e.key!==`wallClock`&&!qs.has(e.key)).filter(yd),c=s.filter(bd),l=c.filter(e=>e.direction===`regression`).map(e=>e.label),u=c.filter(e=>e.direction===`improvement`).map(e=>e.label),d=[],f=n?Ed(n.baseline,n.candidate):null;f&&(d.push(`${i}.`),i=f.title,a=f.tone),o.length===2?d.push(`Neither log has an end-of-run record, so their times cover only what each log captured, not how long the runs took.`):o.length===1&&d.push(`The ${o[0]}'s log has no end-of-run record, so its time covers only what the log captured, not how long the run took.`),l.length>0&&d.push(`Worse in the candidate: ${l.join(`, `)}.`),u.length>0&&d.push(`Better in the candidate: ${u.join(`, `)}.`),s.length>0&&l.length===0&&u.length===0&&d.push(`Other measured cost metrics look about the same.`);let p=Sd(t),m=Cd(p,e=>e>0),g=Cd(p,e=>e<0);return m.length>0&&d.push(`New or more frequent in the candidate: ${m.join(`, `)}.`),g.length>0&&d.push(`Less frequent in the candidate: ${g.join(`, `)}.`),{title:i,tone:a,sentences:d}}function Od({...e}){return(0,z.jsx)(s,{"data-slot":`dialog`,...e})}function kd({...e}){return(0,z.jsx)(o,{"data-slot":`dialog-portal`,...e})}function Ad({className:e,...t}){return(0,z.jsx)(u,{"data-slot":`dialog-overlay`,className:b(`fixed inset-0 isolate z-50 bg-(--overlay-scrim) duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 motion-reduce:animate-none`,e),...t})}function jd({className:e,children:t,showCloseButton:n=!0,...i}){return(0,z.jsxs)(kd,{children:[(0,z.jsx)(Ad,{}),(0,z.jsxs)(c,{"data-slot":`dialog-content`,className:b(`fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 motion-reduce:animate-none`,e),...i,children:[t,n&&(0,z.jsxs)(r,{"data-slot":`dialog-close`,render:(0,z.jsx)(B,{variant:`ghost`,className:`absolute top-2 right-2`,size:`icon-sm`}),children:[(0,z.jsx)(Wt,{}),(0,z.jsx)(`span`,{className:`sr-only`,children:`Close`})]})]})]})}function Md({className:e,...t}){return(0,z.jsx)(`div`,{"data-slot":`dialog-header`,className:b(`flex flex-col gap-2`,e),...t})}function Nd({className:e,showCloseButton:t=!1,children:n,...i}){return(0,z.jsxs)(`div`,{"data-slot":`dialog-footer`,className:b(`-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end`,e),...i,children:[n,t&&(0,z.jsx)(r,{render:(0,z.jsx)(B,{variant:`outline`}),children:`Close`})]})}function Pd({className:e,...t}){return(0,z.jsx)(i,{"data-slot":`dialog-title`,className:b(`font-heading text-base leading-none font-medium`,e),...t})}function Fd({className:e,...t}){return(0,z.jsx)(a,{"data-slot":`dialog-description`,className:b(`text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground`,e),...t})}var Id=e=>String(e),Ld=[{key:`duration`,label:`Duration`,fmt:h},{key:`executorRunTime`,label:`Executor run-time`,fmt:h},{key:`jvmGCTime`,label:`GC time`,fmt:h},{key:`memoryBytesSpilled`,label:`Memory spill`,fmt:M},{key:`diskBytesSpilled`,label:`Disk spill`,fmt:M},{key:`inputBytes`,label:`Input read`,fmt:M},{key:`outputBytes`,label:`Output written`,fmt:M},{key:`taskCount`,label:`Task count`,fmt:Id},{key:`failedTasks`,label:`Failed tasks`,fmt:Id}];function Rd(e,t){return e==null?`—`:t(e)}function zd({base:e,cand:t,fmt:n}){if(e==null||t==null)return(0,z.jsx)(Qu,{className:`text-muted-foreground`,children:`—`});let r=t-e,i=r===0?`unchanged`:(r<0?`-`:`+`)+n(Math.abs(r));return(0,z.jsx)(Qu,{className:b(`font-medium`,r===0?`text-muted-foreground`:r<0?`text-clean`:`text-critical`),children:i})}function Bd({base:e,cand:t}){return(0,z.jsxs)(Ju,{className:`trace-table`,children:[(0,z.jsx)(Yu,{children:(0,z.jsxs)(Zu,{children:[(0,z.jsx)($,{className:`text-left`,children:`Metric`}),(0,z.jsx)($,{children:`Baseline`}),(0,z.jsx)($,{children:`Candidate`}),(0,z.jsx)($,{children:`Δ`})]})}),(0,z.jsx)(Xu,{children:Ld.map(n=>(0,z.jsxs)(Zu,{"aria-label":n.label,children:[(0,z.jsx)($,{scope:`row`,className:`text-left`,children:n.label}),(0,z.jsx)(Qu,{children:Rd(e.metrics[n.key],n.fmt)}),(0,z.jsx)(Qu,{children:Rd(t.metrics[n.key],n.fmt)}),(0,z.jsx)(zd,{base:e.metrics[n.key],cand:t.metrics[n.key],fmt:n.fmt})]},n.key))})]})}function Vd({baseStages:e,candStages:t}){let[n,r]=(0,R.useState)(``),[i,a]=(0,R.useState)(``),[o,s]=(0,R.useState)([]);if(e.length===0||t.length===0)return null;let c=t=>e.find(e=>e.id===t),l=e=>t.find(t=>t.id===e),u=()=>{n!==``&&i!==``&&s(e=>[...e,{baseId:Number(n),candId:Number(i)}])},d=e=>s(t=>t.filter((t,n)=>n!==e));return(0,z.jsxs)(gd,{title:`Pinned per-stage deltas`,children:[(0,z.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Pick one stage from each run to compare directly. Pairs are chosen by you: no automatic matching.`}),(0,z.jsxs)(`div`,{className:`mb-4 flex flex-wrap items-end gap-3`,children:[(0,z.jsxs)(`label`,{className:`flex max-w-full min-w-0 flex-col gap-1 text-xs text-muted-foreground`,children:[`Baseline stage`,(0,z.jsxs)(`select`,{className:`comparison-select max-w-full px-2 py-1 text-sm text-foreground`,value:n,onChange:e=>r(e.target.value),children:[(0,z.jsx)(`option`,{value:``,children:`Select…`}),e.map(e=>(0,z.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,z.jsxs)(`label`,{className:`flex max-w-full min-w-0 flex-col gap-1 text-xs text-muted-foreground`,children:[`Candidate stage`,(0,z.jsxs)(`select`,{className:`comparison-select max-w-full px-2 py-1 text-sm text-foreground`,value:i,onChange:e=>a(e.target.value),children:[(0,z.jsx)(`option`,{value:``,children:`Select…`}),t.map(e=>(0,z.jsx)(`option`,{value:String(e.id),children:e.name},e.id))]})]}),(0,z.jsx)(B,{type:`button`,size:`sm`,disabled:n===``||i===``,onClick:u,children:`Pin pair`})]}),(0,z.jsx)(`div`,{className:`flex flex-col gap-4`,children:o.map((e,t)=>{let n=c(e.baseId),r=l(e.candId);return!n||!r?null:(0,z.jsxs)(`div`,{className:`comparison-subpanel p-3`,children:[(0,z.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,z.jsxs)(`span`,{className:`text-sm font-medium`,children:[n.name,` → `,r.name]}),(0,z.jsx)(B,{type:`button`,variant:`ghost`,size:`sm`,onClick:()=>d(t),children:`Remove`})]}),(0,z.jsx)(Bd,{base:n,cand:r})]},t)})})]})}var Hd=25,Ud=50,Wd=[{label:`Run time`,metrics:[`executorRunTime`],fmt:h},{label:`CPU time`,metrics:[`executorCpuTime`],fmt:h},{label:`Spill`,metrics:[`memoryBytesSpilled`,`diskBytesSpilled`],fmt:M},{label:`Input`,metrics:[`inputBytes`],fmt:M,neutral:!0},{label:`Output`,metrics:[`outputBytes`],fmt:M,neutral:!0},{label:`Shuffle`,metrics:[`shuffleReadBytes`,`shuffleWriteBytes`],fmt:M}],Gd={exact:`Same plan and details in both runs.`,structural:`Same plan shape; details such as literals or paths differ.`,aligned:`Different plan shape, paired by similarity or position. The two stages may not be the same work.`};function Kd(e,t){let n=null;for(let r of t){let t=e[r].delta;t!=null&&(n=(n??0)+t)}return n}function qd({value:e,column:t}){if(e==null)return(0,z.jsx)(Qu,{className:`text-muted-foreground`,children:`—`});let n=e===0?`unchanged`:(e<0?`-`:`+`)+t.fmt(Math.abs(e)),r=e===0||t.neutral?`text-muted-foreground`:e<0?`text-clean`:`text-critical`;return(0,z.jsx)(Qu,{className:b(`font-medium`,r),children:n})}var Jd=`cursor-pointer rounded text-left text-xs underline-offset-2 hover:underline focus-visible:ring-[3px] focus-visible:ring-ring/50 outline-none`;function Yd({label:e,deltas:t}){let n=t.executorRunTime;return(0,z.jsxs)(`span`,{children:[e,`: `,n.baseline==null?`—`:h(n.baseline),` → `,n.candidate==null?`—`:h(n.candidate)]})}function Xd({model:e,baselineLabel:t,candidateLabel:n,onOpenStage:r}){let[i,a]=(0,R.useState)(Hd),[o,s]=(0,R.useState)(null),c=(e,t)=>e?.find(e=>e.id===t)?.name,l=[...e.stagePairs].sort((e,t)=>Math.abs(t.deltas.executorRunTime.delta??0)-Math.abs(e.deltas.executorRunTime.delta??0)||e.pairId.localeCompare(t.pairId)),u=e.unmatched,d=u.baseStageIds.length+u.candStageIds.length>0;return l.length===0&&e.replanned.length===0&&!d?null:(0,z.jsxs)(gd,{title:`Stages compared`,children:[l.length===0?(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No stages are paired between the two runs.`}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:`Change from baseline to candidate, largest run-time change first. Under each stage, quality says how the pair was matched and score is how alike they are, from 0 to 1. Select a stage to see both runs side by side.`}),(0,z.jsxs)(Ju,{className:`trace-table`,children:[(0,z.jsx)(Yu,{children:(0,z.jsxs)(Zu,{children:[(0,z.jsx)($,{className:`text-left`,children:`Stage`}),Wd.map(e=>(0,z.jsx)($,{children:e.label},e.label))]})}),(0,z.jsx)(Xu,{children:l.slice(0,i).map(t=>{let n=c(e.baseStages,t.baseStageIds[0])??`Stage ${t.baseStageIds[0]}`;return(0,z.jsxs)(Zu,{"data-testid":`stage-pair-row`,"data-quality":t.quality,children:[(0,z.jsxs)($,{scope:`row`,className:`text-left`,children:[(0,z.jsx)(`button`,{type:`button`,className:b(Jd,`block max-w-[22rem] truncate text-sm font-medium`),title:n,"aria-label":`Compare ${n} in both runs`,onClick:()=>s({title:n,note:`${t.quality} match, score ${t.score.toFixed(2)}. ${Gd[t.quality]}`,baseStageIds:t.baseStageIds,candStageIds:t.candStageIds}),children:n}),(0,z.jsxs)(`div`,{className:`stage-pair-meta mt-0.5`,title:Gd[t.quality],children:[t.quality,` · `,t.score.toFixed(2)]})]}),Wd.map(e=>(0,z.jsx)(qd,{value:Kd(t.deltas,e.metrics),column:e},e.label))]},t.pairId)})})]}),l.length>i?(0,z.jsxs)(B,{variant:`ghost`,size:`sm`,className:`mt-2`,onClick:()=>a(e=>e+Ud),children:[`Show `,Math.min(Ud,l.length-i),` more of `,l.length-i,` remaining`]}):null]}),e.replanned.length>0?(0,z.jsxs)(`div`,{className:`mt-4`,"data-testid":`replanned-stages`,children:[(0,z.jsx)(`h4`,{className:`trace-eyebrow mb-1`,children:`Re-planned work`}),(0,z.jsx)(`p`,{className:`mb-2 text-xs text-muted-foreground`,children:`These queries ran a different number of stages, so the leftover stages are compared as a group rather than one by one.`}),(0,z.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.replanned.map(e=>(0,z.jsxs)(`li`,{className:`border-b border-border pb-2 text-sm last:border-0`,children:[(0,z.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 font-mono text-[11px] text-muted-foreground`,children:[(0,z.jsxs)(`span`,{children:[`Query `,e.baseExecutionId,` → `,e.candExecutionId]}),(0,z.jsx)(Yd,{label:`Run time`,deltas:e.deltas})]}),(0,z.jsxs)(`button`,{type:`button`,className:b(Jd,`mt-1`),onClick:()=>s({title:`Re-planned query ${e.baseExecutionId} → ${e.candExecutionId}`,note:`The two runs ran a different number of stages here, so these leftover stages are not paired one to one.`,baseStageIds:e.baseStageIds,candStageIds:e.candStageIds}),children:[`Baseline `,Zd(e.baseStageIds),` · Candidate `,Zd(e.candStageIds)]})]},`${e.baseExecutionId}-${e.candExecutionId}`))})]}):null,d?(0,z.jsxs)(`div`,{className:`mt-4`,"data-testid":`unmatched-stages`,children:[(0,z.jsx)(`h4`,{className:`trace-eyebrow mb-1`,children:`Unmatched stages`}),(0,z.jsxs)(`button`,{type:`button`,className:Jd,onClick:()=>s({title:`Unmatched stages`,note:`These stages paired with nothing in the other run.`,baseStageIds:u.baseStageIds,candStageIds:u.candStageIds}),children:[`Baseline `,Zd(u.baseStageIds),` · Candidate `,Zd(u.candStageIds)]})]}):null,(0,z.jsx)($d,{selection:o,baseStages:e.baseStages??[],candStages:e.candStages??[],baselineLabel:t,candidateLabel:n,onClose:()=>s(null),onOpenStage:r})]})}var Zd=e=>e.length===0?`none`:e.join(`, `),Qd={id:-1,name:`—`,metrics:{duration:null,memoryBytesSpilled:null,diskBytesSpilled:null,jvmGCTime:null,inputBytes:null,outputBytes:null,executorRunTime:null,taskCount:null,failedTasks:null}};function $d({selection:e,baseStages:t,candStages:n,baselineLabel:r,candidateLabel:i,onClose:a,onOpenStage:o}){let s=(e,t)=>e.find(e=>e.id===t)??Qd,c=e?Array.from({length:Math.max(e.baseStageIds.length,e.candStageIds.length)},(t,n)=>({baseId:e.baseStageIds[n],candId:e.candStageIds[n]})):[];return(0,z.jsx)(Od,{open:e!==null,onOpenChange:e=>{e||a()},children:(0,z.jsx)(jd,{className:`max-h-[85vh] overflow-y-auto sm:max-w-5xl`,"data-testid":`stage-pair-dialog`,children:e?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(Md,{children:[(0,z.jsx)(Pd,{className:`[overflow-wrap:anywhere]`,children:e.title}),e.note?(0,z.jsx)(Fd,{children:e.note}):null]}),(0,z.jsx)(`div`,{className:`flex flex-col gap-4`,children:c.map(({baseId:e,candId:a},c)=>{let l=s(t,e),u=s(n,a);return(0,z.jsxs)(`section`,{"aria-label":`Stage ${e??`none`} and stage ${a??`none`}`,className:`comparison-subpanel p-3`,children:[(0,z.jsxs)(`div`,{className:`mb-2 grid gap-2 text-xs sm:grid-cols-2`,children:[(0,z.jsxs)(`div`,{title:r,children:[(0,z.jsxs)(`div`,{className:`font-semibold`,children:[`Baseline`,e===void 0?``:` · stage ${e}`]}),(0,z.jsx)(`div`,{className:`font-mono text-muted-foreground [overflow-wrap:anywhere]`,children:l.name})]}),(0,z.jsxs)(`div`,{title:i,children:[(0,z.jsxs)(`div`,{className:`font-semibold`,children:[`Candidate`,a===void 0?``:` · stage ${a}`]}),(0,z.jsx)(`div`,{className:`font-mono text-muted-foreground [overflow-wrap:anywhere]`,children:u.name})]})]}),(0,z.jsx)(Bd,{base:l,cand:u}),(0,z.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-2`,children:[e===void 0?null:(0,z.jsxs)(B,{variant:`outline`,size:`sm`,onClick:()=>o(`baseline`,e),children:[`Open stage `,e,` in the baseline dashboard`]}),a===void 0?null:(0,z.jsxs)(B,{variant:`outline`,size:`sm`,onClick:()=>o(`candidate`,a),children:[`Open stage `,a,` in the candidate dashboard`]})]})]},c)})})]}):null})})}var ef=`bg-plan-aggregate/8 text-plan-aggregate`,tf=e=>`${e.toFixed(2)}×`,nf={wallClock:h,shuffleSpill:M,taskSkew:tf,failedTaskRate:e=>`${(e*100).toFixed(1)}%`,diskSpill:M,gcTime:h,inputBytes:M,outputBytes:M,executorRunTime:h,executorCpuTime:h,allocatedCoreHours:e=>`${e.toFixed(2)} core-h`},rf=e=>nf[e]??(e=>Intl.NumberFormat().format(e)),af={regression:`text-critical`,improvement:`text-clean`,unchanged:`text-muted-foreground`,neutral:`text-muted-foreground`,unavailable:`text-muted-foreground`};function of({m:e}){if(e.direction===`unavailable`)return(0,z.jsxs)(Zu,{"aria-label":e.label,"data-direction":`unavailable`,children:[(0,z.jsx)($,{scope:`row`,className:`text-left`,children:e.label}),(0,z.jsxs)(Qu,{colSpan:3,className:`text-muted-foreground`,children:[`Unavailable: `,e.unavailableReason]})]});let t=rf(e.key),n=e=>e==null?`—`:t(e),r=e=>e==null?`—`:e===0?`unchanged`:(e<0?`-`:`+`)+t(Math.abs(e)),i=qs.has(e.key)?`text-muted-foreground`:af[e.direction];return(0,z.jsxs)(Zu,{"aria-label":e.label,"data-direction":e.direction,children:[(0,z.jsx)($,{scope:`row`,className:`text-left`,children:e.label}),(0,z.jsx)(Qu,{children:n(e.baseline)}),(0,z.jsx)(Qu,{children:n(e.candidate)}),(0,z.jsx)(Qu,{className:b(`font-medium`,i),children:r(e.delta)})]})}var sf=[`critical`,`warning`,`info`],cf=e=>sf.includes(e)?e:`info`;function lf({stages:e}){return e.length===0?null:(0,z.jsx)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:e.map(e=>(0,z.jsx)(`span`,{className:`comparison-stage-chip`,children:e},e))})}function uf({items:e}){return(0,z.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.map(e=>(0,z.jsxs)(`li`,{className:`flex flex-col gap-1 border-b border-border pb-2 last:border-0 last:pb-0`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(ce,{type:e.type,impactBand:cf(e.impactBand),className:ue(e.type)===`PLAN`?ef:void 0}),(0,z.jsxs)(`span`,{className:`comparison-count text-muted-foreground`,children:[e.baseCount,` → `,e.candCount]})]}),(0,z.jsx)(lf,{stages:e.stages})]},`${e.rule}§${e.impactBand}`))})}function df({reason:e,confidence:t}){let[n,r]=(0,R.useState)(!1);return n?null:(0,z.jsxs)(`div`,{role:`alert`,"data-confidence":t,className:`mb-4 flex items-start justify-between gap-3 rounded-xl border border-l-[3px] border-border border-l-warning bg-card px-4 py-3 text-sm text-foreground`,children:[(0,z.jsx)(`span`,{children:e}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>r(!0),"aria-label":`Dismiss warning`,className:`shrink-0 cursor-pointer rounded px-1 text-muted-foreground hover:text-foreground`,children:`Dismiss`})]})}function ff({model:e,onDrillIn:t}){let n=Dd(e.metrics,e.findings,e.jobOutcomes);return(0,z.jsxs)(`section`,{"aria-labelledby":`comparison-verdict-title`,"data-testid":`comparison-verdict`,"data-tone":n.tone,className:`comparison-verdict space-y-3 p-4 sm:p-5`,children:[(0,z.jsx)(`h2`,{id:`comparison-verdict-title`,className:`font-heading`,children:n.title}),n.sentences.length>0?(0,z.jsx)(`p`,{className:`max-w-prose text-sm text-muted-foreground`,children:n.sentences.join(` `)}):null,t?(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,z.jsxs)(B,{size:`sm`,onClick:()=>t(`candidate`),children:[`See where to start in the candidate`,(0,z.jsx)(mt,{"aria-hidden":`true`})]}),(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:`Opens the candidate's own verdict and next steps.`})]}):null]})}function pf({model:e,onClose:t,onDrillIn:n}){(0,R.useEffect)(()=>{let e=e=>{e.key===`Escape`&&t()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[t]);let r=(0,z.jsxs)(`header`,{className:`mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,z.jsxs)(`div`,{className:`min-w-0`,children:[(0,z.jsx)(`h1`,{className:`comparison-title font-heading`,children:`Run comparison`}),(0,z.jsxs)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:[`Baseline `,(0,z.jsx)(`strong`,{className:`comparison-run-label`,children:e.baselineLabel}),` vs candidate `,(0,z.jsx)(`strong`,{className:`comparison-run-label`,children:e.candidateLabel})]})]}),(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 sm:shrink-0`,children:[n?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(B,{variant:`outline`,size:`sm`,onClick:()=>n(`baseline`),children:`View baseline dashboard`}),(0,z.jsx)(B,{variant:`outline`,size:`sm`,onClick:()=>n(`candidate`),children:`View candidate dashboard`})]}):null,(0,z.jsx)(B,{variant:`ghost`,size:`sm`,onClick:t,children:`Close`})]})]});return(0,z.jsxs)(`div`,{"data-testid":`dashboard`,className:`mx-auto flex max-w-[72rem] flex-col gap-4 px-4 py-6 sm:px-6`,children:[r,(0,z.jsxs)(`main`,{className:`contents`,children:[e.confidence!==`ok`&&e.reason?(0,z.jsx)(df,{reason:e.reason,confidence:e.confidence}):null,(0,z.jsx)(ff,{model:e,onDrillIn:n}),(0,z.jsxs)(gd,{title:`Metrics`,children:[(0,z.jsxs)(`p`,{className:`mb-3 text-xs text-muted-foreground`,children:[`Metrics and finding categories cover the whole run, and run totals count every task attempt, failed and speculative ones too. `,e.runtimeCoverage==null?`Neither run recorded executor run time, so no stages are paired by run time.`:`Per-stage skew below covers only the stages paired between the runs, which hold ${Math.floor(e.runtimeCoverage*100)}% of executor run time.`]}),(0,z.jsxs)(Ju,{className:`trace-table`,children:[(0,z.jsx)(Yu,{children:(0,z.jsxs)(Zu,{children:[(0,z.jsx)($,{className:`text-left`,children:`Metric`}),(0,z.jsx)($,{title:e.baselineLabel,children:`Baseline`}),(0,z.jsx)($,{title:e.candidateLabel,children:`Candidate`}),(0,z.jsx)($,{children:`Change`})]})}),(0,z.jsx)(Xu,{children:e.metrics.map(e=>(0,z.jsx)(of,{m:e},e.key))})]})]}),e.findings.introduced.length>0||e.findings.resolved.length>0?(0,z.jsxs)(gd,{title:`Findings by category`,children:[e.findings.introduced.length>0?(0,z.jsxs)(`div`,{className:`mb-4`,children:[(0,z.jsxs)(`h3`,{className:`trace-eyebrow mb-2`,children:[`More in candidate (`,e.candidateLabel,`)`]}),(0,z.jsx)(uf,{items:e.findings.introduced})]}):null,e.findings.resolved.length>0?(0,z.jsxs)(`div`,{children:[(0,z.jsxs)(`h3`,{className:`trace-eyebrow mb-2`,children:[`Fewer in candidate (`,e.candidateLabel,`)`]}),(0,z.jsx)(uf,{items:e.findings.resolved})]}):null]}):null,e.stagePairs?(0,z.jsx)(Xd,{model:{stagePairs:e.stagePairs,unmatched:e.unmatched??{baseStageIds:[],candStageIds:[]},replanned:e.replanned??[],baseStages:e.baseStages,candStages:e.candStages},baselineLabel:e.baselineLabel,candidateLabel:e.candidateLabel,onOpenStage:(e,t)=>n?.(e,t)}):null,e.stageSkew.length>0?(0,z.jsx)(gd,{title:`Per-stage task skew (matched stages only)`,children:(0,z.jsxs)(Ju,{className:`trace-table`,children:[(0,z.jsx)(Yu,{children:(0,z.jsxs)(Zu,{children:[(0,z.jsx)($,{className:`text-left`,children:`Stage`}),(0,z.jsx)($,{children:`Baseline`}),(0,z.jsx)($,{children:`Candidate`})]})}),(0,z.jsx)(Xu,{children:[...e.stageSkew].sort((e,t)=>Math.abs(t.delta??0)-Math.abs(e.delta??0)).map(e=>(0,z.jsxs)(Zu,{children:[(0,z.jsx)($,{scope:`row`,className:`text-left`,children:e.name}),(0,z.jsx)(Qu,{children:e.baseline==null?`—`:tf(e.baseline)}),(0,z.jsx)(Qu,{children:e.candidate==null?`—`:tf(e.candidate)})]},e.pairId))})]})}):null,(0,z.jsx)(Vd,{baseStages:e.baseStages??[],candStages:e.candStages??[]})]})]})}var mf=(0,R.createContext)(null);function hf({children:e}){let[t,n]=(0,R.useState)(null),r=(0,R.useCallback)(e=>n(e),[]),i=(0,R.useCallback)(()=>n(null),[]),a=(0,R.useMemo)(()=>({stageId:t,openStage:r,close:i}),[t,r,i]);return(0,z.jsx)(mf.Provider,{value:a,children:e})}function gf(){let e=(0,R.useContext)(mf);if(!e)throw Error(`useStageDetail outside StageDetailProvider`);return e}function _f(){let e=I(e=>e.planGraph.stageId),t=I(e=>e.planGraph.initialScope),n=I(e=>e.appModel),r=I(e=>e.catalog),i=I(e=>e.activeFileId),a=I(e=>e.closePlanGraph);return e==null?null:{stageId:e,initialScope:t,appModel:n,findings:r,activeFileId:i,onClose:a}}var vf=`modulepreload`,yf=function(e,t){return new URL(e,t).href},bf={},xf=function(e){return e.pathname.endsWith(`.css`)},Sf=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=o(t.map(t=>{t=yf(t,n);let r=s(t);if(r.href in bf)return;bf[r.href]=!0;let i=xf(r);if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let o=document.createElement(`link`);if(o.rel=i?`stylesheet`:vf,i||(o.as=`script`),o.crossOrigin=``,o.href=r.href,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),i)return new Promise((e,t)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${r}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Cf=(0,R.lazy)(()=>Sf(async()=>{let{PlanGraphRoute:e}=await import(`./PlanGraphRoute-DctPZjS0.js`);return{PlanGraphRoute:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url).then(({PlanGraphRoute:e})=>({default:e}))),wf=(0,R.lazy)(()=>Sf(async()=>{let{Dashboard:e}=await import(`./Dashboard-BHZ76JCu.js`);return{Dashboard:e}},__vite__mapDeps([9,1,2,3,4,5,6,7]),import.meta.url).then(({Dashboard:e})=>({default:e})));function Tf(){let e=I(e=>e.comparison),t=I(e=>e.closeComparison),{prepareComparison:n,drillIntoRun:r}=No(),{openStage:i}=gf(),a=(0,R.useMemo)(()=>{let t=e.baselineId&&e.candidateId?n(e.baselineId,e.candidateId):null;return t?rc(t.baseline,t.candidate):null},[e.baselineId,e.candidateId,n]),o=!a;return(0,R.useEffect)(()=>{o&&t()},[o,t]),a?(0,z.jsx)(pf,{model:a,onClose:t,onDrillIn:(t,n)=>{let a=t===`baseline`?e.baselineId:e.candidateId;a&&(r(a),n!==void 0&&i(n))}}):null}function Ef(){let e=_f();return e?(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading plan graph`,className:`p-6 text-sm text-muted-foreground`,children:`Loading plan graph…`}),children:(0,z.jsx)(Cf,{...e},e.stageId)}):null}function Df({label:e,onCancel:t}){let n=I(e=>e.parse),r=Math.round(n.pct*100),i=n.lines>0?` · ${n.lines.toLocaleString()} lines`:``,a=n.etaMs!=null&&n.etaMs>0?`About ${h(n.etaMs)} left. `:``;return(0,z.jsx)(`main`,{className:`flex min-h-screen flex-col items-center justify-center p-10`,children:(0,z.jsxs)(`div`,{className:`flex w-full max-w-md flex-col items-center gap-3 text-center`,children:[(0,z.jsx)(`p`,{className:`font-heading text-lg font-semibold`,children:`Reading the event log`}),(0,z.jsxs)(`p`,{role:`status`,"aria-live":`polite`,className:`text-sm text-muted-foreground`,children:[e,`… `,r,`%`,i]}),(0,z.jsx)(De,{value:n.pct*100,className:`w-full`}),(0,z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[a,`Parsing runs in your browser, so the log stays on this machine.`]}),t?(0,z.jsx)(B,{variant:`ghost`,size:`sm`,className:`tap-target-comfortable`,onClick:t,children:`Cancel`}):null]})})}function Of(){let e=I(e=>e.status),t=I(e=>e.errorMessage),n=I(e=>e.errorNonce),r=I(e=>e.shsParsing),{cancelParse:i}=No(),a=I(e=>e.planGraph.active),o=I(e=>e.comparison.active),s=I(e=>e.compareLoad);return s?(0,z.jsx)(Df,{label:`Parsing run ${s.current} of 2`}):a?(0,z.jsx)(Ef,{}):o?(0,z.jsx)(Tf,{}):e===`ready`?(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`p`,{role:`status`,"aria-live":`polite`,"aria-label":`Loading dashboard`,className:`p-6 text-sm text-muted-foreground`,children:`Loading dashboard…`}),children:(0,z.jsx)(wf,{})}):e===`parsing`&&!r?(0,z.jsx)(Df,{label:`Parsing`,onCancel:i}):(0,z.jsx)(`main`,{className:`min-h-screen px-4 py-6 sm:p-10`,children:(0,z.jsx)(Oc,{errorMessage:e===`error`?t:null,errorNonce:n})})}function kf(){let e=I(e=>e.status),t=I(e=>e.planGraph.active),n=I(e=>e.comparison.active);return(0,z.jsx)(je,{children:(0,z.jsx)(Se,{children:(0,z.jsxs)(hf,{children:[e===`ready`||t||n?null:(0,z.jsx)(`header`,{children:(0,z.jsx)(`h1`,{className:`sr-only`,children:`SparkForensics`})}),(0,z.jsx)(Of,{}),(0,z.jsx)(qu,{}),(0,z.jsx)(Gt,{})]})})})}var Af=[`PROCESS_LOCAL`,`NODE_LOCAL`,`RACK_LOCAL`,`NO_PREF`,`ANY`];function jf(e,{bucketWidthMs:t=6e4,tiers:n=Af}={}){let r=e.filter(e=>(e.completedAt??0)>(e.submittedAt??0)&&(e.executorRunTime??0)>0);if(r.length===0)return{labels:[],series:{},endTime:0};let i=r.reduce((e,t)=>Math.min(e,t.submittedAt??e),1/0),a=r.reduce((e,t)=>Math.max(e,t.completedAt??e),-1/0),o=Math.max(1,Math.ceil((a-i)/t)),s={};for(let e of n)s[e]=Array(o).fill(0);let c=Array(o).fill(0);for(let e of r){let n=e.completedAt??0,r=e.submittedAt??0,a=n-r,l=(e.executorRunTime??0)/a,u=(e.localityStats??[]).reduce((e,t)=>e+t.count,0)||1,d=new Map((e.localityStats??[]).map(e=>[e.locality,e.count/u]));for(let e=0;e<o;e++){let a=i+e*t,o=a+t,u=Math.min(n,o)-Math.max(r,a);if(u<=0)continue;let f=u/t;for(let[t,n]of d){let r=l*n*f;s[t]?s[t][e]+=r:c[e]+=r}}}c.some(e=>e>0)&&(s.OTHER=c);let l=Array(o).fill(0);for(let e of Object.keys(s))for(let t=0;t<o;t++)l[t]+=s[e][t];let u=l.reduce((e,t)=>Math.max(e,t),0);s.idle=l.map(e=>Math.max(0,u-e));let d=[];for(let e=0;e<o;e++)d.push(i+e*t);return{labels:d,series:s,endTime:a}}function Mf(e,t,n=60){if(!e.some(e=>(e.executorRunTime??0)>0&&(e.completedAt??0)>(e.submittedAt??0)))return{hasActivity:!1};let r=t?.startTime??0,i=t?.endTime??r,a=Math.max(6e4,Math.ceil(Math.max(1,i-r)/n)),{labels:o,series:s,endTime:c}=jf(e,{bucketWidthMs:a}),l=[...Af.filter(e=>s[e]),...s.OTHER?[`OTHER`]:[],`idle`],u=o.map((e,t)=>{let n={t:Math.round((e-r)/1e3)},i=Math.min(a,c-e),o=a/i;for(let e of l)e!==`idle`&&(n[e]=(s[e]?.[t]??0)*o);return n}),d=l.filter(e=>e!==`idle`),f=e=>d.reduce((t,n)=>t+e[n],0),p=u.reduce((e,t)=>Math.max(e,f(t)),0);for(let e of u)e.idle=Math.max(0,p-f(e));return{hasActivity:!0,order:l,points:u,peakCores:p}}function Nf(e,t){let n=ge(e),r=Ca.get(e);return!n||!r?`criteria not met`:n.thresholdSummary(ja(r,t))}var Pf;function Ff(){if(!Pf){Pf=new Map;for(let e of Sa)for(let t of e.emits){let n=Pf.get(t)??new Set;n.add(e.docAnchor),Pf.set(t,n)}}return Pf}function If(e){let t=Ff().get(e)??new Set;if(t.size!==1)return;let[n]=t;return n&&E(n)?n:void 0}function Lf(){let e={};for(let[t,{order:n,scope:r}]of Ca)e[t]={order:n,docAnchor:If(t)??null,thresholdSummary:Nf(t),scope:r};return e}function Rf({app:e,stages:t,executorsAdded:n,executorsRemoved:r,runAggregates:i}){let a={app:e,stages:t,executors:{added:n,removed:r}},o=Kn(a),s=o==null?0:qn(a,Po(t))??0,c=(o??0)/36e5,l=Math.max(0,(o??0)-s)/36e5,u=i?.busyCoreMs??0,d=Math.max(0,s-u)/36e5,f=l+d,p=c>0?Math.round(f/c*100):null,m=0,h=i?.perStage??{};for(let e of Object.keys(h))m+=h[e].totalTaskDurationSum;let g=Mn(e??{},n,r),_=g>0?m/g:0,v=null;return(l>0||d>0)&&(v=l>=d?`driver`:`executor`),{availableComputeHours:c,driverWasteHours:l,executorWasteHours:d,wastagePct:p,floorZeroSkewMs:_,dominantWaste:v}}function zf(e){let t={extract:0,transform:0,load:0};for(let n of e.values()){let e=Math.max(0,(n.completedAt??0)-(n.submittedAt??0));if(e===0)continue;let r=(n.shuffleReadBytes??0)>0||(n.shuffleWriteBytes??0)>0;(n.inputBytes??0)>0&&(n.shuffleReadBytes??0)===0&&(t.extract+=e),r&&(t.transform+=e),(n.outputBytes??0)>0&&(t.load+=e)}return t}function Bf(e){let t=e.impactEstimate;if(!t)return null;if(t.wallClock)return me(t.wallClock.low,t.wallClock.high);if(t.rawWaste){let e=_e(t.rawWaste);return le(e)?null:e}return null}function Vf(e){switch(e?.unit){case`mbSeconds`:return`of unused executor memory`;case`coreHours`:case`coreMs`:return e.idle?`of idle core capacity`:`of core time`;case`bytes`:return`of extra data written`;case`ms`:return`of task time`;default:return null}}function Hf(e){let t=e.impactEstimate;return t?t.wallClock?`of run time`:Vf(t.rawWaste):null}function Uf(e){if(!e)return null;let t=e.wallClock&&e.wallClock.high>0?re(e.wallClock.high):null;if(t&&!le(t))return{text:me(e.wallClock.low,e.wallClock.high),meaning:`of run time`};let n=e.rawWaste&&e.rawWaste.value>0?_e(e.rawWaste):null;return n&&!le(n)?{text:n,meaning:Vf(e.rawWaste)}:null}function Wf(e){if(!e)return null;if(e.wallClock){if(e.wallClock.high<=0)return null;let t=re(e.wallClock.high);return le(t)?null:t}if(e.rawWaste){if(e.rawWaste.value<=0)return null;let t=_e(e.rawWaste);return le(t)?null:t}return null}function Gf(e){let t=e.impactEstimate;if(!t||t.estimateMethod===`none`)return null;let n=`${t.estimateMethod[0].toUpperCase()}${t.estimateMethod.slice(1)}`,r=t.rawWaste&&t.rawWaste.value>0?t.rawWaste:null,i=r&&!le(_e(r))?_e(r):null,a=t.wallClock;if(t.basis===`resourceOnly`)return i?`${n}; ${i} wasted, which may not shorten the run.`:null;if(!a||a.high<=0)return null;let o=me(a.high,a.high);if(le(o))return null;let s=``;if(i&&r.unit!==`ms`?s=` Resource waste measured: ${i}.`:i&&r.value>a.high&&i!==o&&(s=` Raw waste before the floor clipped it: ${i}.`),t.basis===`serial`)return`${n}; the stage ran alone, so this is close to a point estimate.${s}`;if(t.basis===`contended`){let e=me(a.low,a.low);return`${n}; the stage shared the cluster: ${e===o?`its floor and high agree`:`${e} is the floor, ${o} if the fix fully lands`}.${s}`}return null}function Kf(e){return typeof e?.startTime==`number`&&Number.isFinite(e.startTime)&&typeof e?.endTime==`number`&&Number.isFinite(e.endTime)&&e.endTime>e.startTime}function qf(e){if(!Kf(e.app))return{efficiency:{value:null,unavailableReason:`application-timing`},wastage:{value:null,unavailableReason:`application-timing`}};let t=Fo(e.app,e.stages),n=Math.min(100,Math.round(t.stagesActive/t.total*100));if(!e.runAggregates)return{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`core-usage-summary`}};let r=Rf({app:e.app,stages:e.stages,executorsAdded:e.executors.added,executorsRemoved:e.executors.removed,runAggregates:e.runAggregates});return!Number.isFinite(r.availableComputeHours)||r.availableComputeHours<=0?{efficiency:{value:n,unavailableReason:null},wastage:{value:null,unavailableReason:`executor-capacity`}}:{efficiency:{value:n,unavailableReason:null},wastage:{value:r.wastagePct,unavailableReason:null}}}function Jf(e){let t=Kf(e.app),n=qf(e),r=zf(e.stages),i=Mf([...e.stages.values()],e.app);return{wallClockMs:t?Fo(e.app,e.stages).total:null,efficiencyPct:Ms(e.stages)?n.efficiency.value:null,unusedCoreTimePct:n.wastage.value,etlPhasesMs:r.extract+r.transform+r.load>0?r:null,peakBusyCores:i.hasActivity?i.peakCores:null}}Object.fromEntries(Object.keys(ve).map(e=>[e,ve[e].name]));function Yf(e){return ge(e)?.name??e}function Xf(e){return e.replace(/\b\w/g,e=>e.toUpperCase())}function Zf(e){return(typeof e.recommendation==`string`?e.recommendation.trim():``)||Yf(e.type)}function Qf(e){let t=e.lastIndexOf(`: `);return t>0?{measured:e.slice(0,t),fix:e.slice(t+2)}:{measured:null,fix:e}}function $f(e){return ge(e.type)?.actionLabel(e)??Yf(e.type)}function ep(e){return e!=null&&(Array.isArray(e)?e.length:e.size)>0}function tp(e,t){return Array.isArray(e)?e.includes(t):e.has(t)}function np(e){return typeof e.stageId==`number`?e.stageId:e.stageIds&&e.stageIds.length===1?e.stageIds[0]:null}function rp(e,t){if(ep(t.impactBand)&&!tp(t.impactBand,e.impactBand)||ep(t.type)&&!tp(t.type,e.type))return!1;let{stageId:n}=t;if(typeof n==`number`){if(e.stageId!==n)return!1}else if(ep(n)&&(e.stageId==null||!tp(n,e.stageId)))return!1;return!0}var ip=new Set([`memoryUtilization`,`utilization`,`coreLocality`,`cacheUtilization`]),ap=(()=>{let e=e=>+!!ip.has(e);return[...Ca.entries()].sort(([t,n],[r,i])=>e(t)-e(r)||n.order-i.order).map(([e])=>e)})(),op=new Map(ap.map((e,t)=>[e,t]));function sp(e){return e.impactEstimate?.wallClock?.high??null}function cp(e){let t=typeof e.recommendation==`string`?e.recommendation.trim():``;return op.has(e.type)&&t.length>0}function lp(e){let t=e.map((e,t)=>({finding:e,index:t})).filter(({finding:e})=>cp(e));return t.sort((e,t)=>{let n=sp(e.finding),r=sp(t.finding);return n!==null&&r!==null&&n!==r?r-n:n!==null==(r!==null)?(S[e.finding.impactBand]??9)-(S[t.finding.impactBand]??9)||(op.get(e.finding.type)??2**53-1)-(op.get(t.finding.type)??2**53-1)||e.index-t.index:n===null?1:-1}),t.map(({finding:e})=>e)}function up(e){let t=np(e);if(t!=null)return{key:`stage:${t}`,stageId:t};if(`stageIds`in e&&e.stageIds.length>1)return{key:`stages:${e.type}:${[...e.stageIds].sort((e,t)=>e-t).join(`,`)}`,stageId:null};let n=`variant`in e?e.variant:void 0;return{key:n?`app:${e.type}:${n}`:`app:${e.type}`,stageId:null}}function dp(e,t){return Ts.has(e.type)?typeof e.stageId==`number`&&t.has(e.stageId)?0:1:2}function fp(e,{failedJobStageIds:t}={}){let n=lp(e),r=t?[...n].sort((e,n)=>dp(e,t)-dp(n,t)):n,i=new Map;for(let e of r){let{key:t,stageId:n}=up(e),r=i.get(t);if(!r){i.set(t,{key:t,lead:e,related:[],stageId:n});continue}new Set([r.lead.type,...r.related.map(e=>e.type)]).has(e.type)||r.related.push(e)}return[...i.values()]}function pp(e){return e.type===`utilization`||e.type===`memoryUtilization`&&e.variant===`idleCores`}function mp(e){return pp(e.lead)}function hp(e){return typeof e.value==`number`?e.type===`memoryUtilization`&&e.variant===`idleCores`?e.value:e.type===`utilization`?100-e.value:null:null}function gp(e,t){let n=e.find(mp);return(n?hp(n.lead):null)??t}function _p(e,t){return`${e} ${t}${e===1?``:`s`}`}function vp(e){return e.outcome.failedJobs>0}function yp({failedJobs:e,totalJobs:t}){return e<t?`${e} of ${t} jobs failed in this run`:t===1?`This run failed: its job did not finish`:`This run failed: all ${t} jobs did not finish`}function bp(e){return/^[A-Z]{2}/.test(e)?e:e.charAt(0).toLowerCase()+e.slice(1)}function xp(e,t,n){if(vp(n))return yp(n.outcome);if(e.length===0&&n.incomplete)return`This log looks incomplete, so results cover only part of the run`;if(e.length===0&&n.noFinishedStages)return`This log has no finished stages to check`;if(e.length===0&&!n.clean)return`Nothing to fix, but some checks could not run on this log`;if(e.length===0)return`No findings to fix right now.`;if(t.length===0)return`${_p(e.length,`finding`)} to review`;let r=t[0];return mp(r)&&n.idlePct!=null?`Start with cluster size: ${n.idlePct}% of executor capacity sat idle`:r.stageId==null?`Start here: ${bp($f(r.lead))}`:`Start with Stage ${r.stageId}`}function Sp(e,t,n){let r=[],{failedJobs:i,totalJobs:a}=n.outcome;if(i>0?e.some(e=>!Ts.has(e.type))&&r.push(`Fix the failure before tuning: the other findings cover only the work that ran.`):a>0&&!n.incomplete&&r.push(a===1?`Its one job succeeded.`:`All ${a} jobs succeeded.`),e.length===0){if(i>0)return r;n.clean&&r.push(`Every check passed for this run.`)}else if(t.length===0)r.push(`They are listed by impact under Findings.`);else{r.push(`${_p(e.length,`finding`)} in ${_p(t.length,`place`)}.`);let i=t[0].lead.impactEstimate?.wallClock;!mp(t[0])&&i&&n.runMs!=null&&r.push(`The first fix could save up to ${h(i.high)} of this ${h(n.runMs)} run.`),t.some(e=>e.related.length>0)&&r.push(`Findings on one stage are grouped, and their savings overlap.`)}return n.incomplete&&r.push(`The log has no end-of-run record, so these figures cover only the part of the run it captured.`),!(t.length>0&&mp(t[0]))&&n.idlePct!=null&&n.idlePct>=40&&r.push(t.some(mp)?`${n.idlePct}% of the executor capacity sat idle, so the cluster may be larger than this job needs.`:`${n.idlePct}% of the run's core time went unused, so the cluster may be larger than this job needs.`),r}var Cp=`Open the driver log only if you need the full stack trace.`;function wp(e){let t=/[.!?]$/.test(e)?e:`${e}.`;return{shown:`Spark's recorded reason is quoted above. ${Cp}`,copied:`Spark's recorded reason: ${t} ${Cp}`}}function Tp(e,t,n=null){let r=Bf(e),i=Hf(e),a=r&&i?`${r} ${i}`:r,o=n==null?``:` in Stage ${n}`,s=`${$f(e)}${o}: ${t}`;return[/[.!?]$/.test(s)?s:`${s}.`,a?`Potential savings: ${a}`:null].filter(Boolean).join(` `)}function Ep(e){let t=[e.runName?`Spark run ${e.runName}: ${e.title}`:e.title,``];return e.steps.forEach(({step:e,recommendation:n},r)=>{t.push(`${r+1}. ${Tp(e.lead,n,e.stageId)}`)}),e.remaining>0&&t.push(``,`${_p(e.remaining,`more place`)} to look at in the full findings list.`),t.join(`
14
+ `)}function Dp(e,t){return ks(e.lead,t)&&t.reason?wp(t.reason).copied:Zf(e.lead)}function Op(e,t){let n=t.filter(e=>x(e)&&op.has(e.type)),r=Os(e.jobs,t),i=fp(n,r.failedJobs>0?{failedJobStageIds:r.failedJobStageIds}:{}),a={runMs:Kf(e.app)?Fo(e.app,e.stages).total:null,idlePct:gp(i,qf(e).wastage.value),incomplete:t.some(e=>e.type===`incompleteRun`),clean:Rs(e,t),outcome:r,noFinishedStages:!Ms(e.stages)},o=xp(n,i,a),s=i.slice(0,3),c=i.length-s.length,l=s.length>0?Ep({runName:e.app?.name??null,title:o,steps:s.map(e=>({step:e,recommendation:Dp(e,r)})),remaining:c}):null;return{eligible:n,outcome:r,steps:i,facts:a,title:o,summary:Sp(n,i,a),shown:s,remaining:c,copyText:l}}function kp(e){let t=e?[...e.values()]:[],n=new Map,r=0;for(let e of t){if(e.submissionTime==null||e.completionTime==null)continue;let t=e.sqlExecutionId==null?`job:${e.id??r++}`:`sql:${e.sqlExecutionId}`,i=n.get(t);i?(i.start=Math.min(i.start,e.submissionTime),i.end=Math.max(i.end,e.completionTime)):n.set(t,{start:e.submissionTime,end:e.completionTime})}let i=[...n.entries()].sort((e,t)=>e[1].start-t[1].start),a=[];for(let e=1;e<i.length;e++)for(let t=0;t<e;t++){let[n,r]=i[t],[o,s]=i[e];s.start<r.end&&r.start<s.end&&a.push([n,o])}return{wallClockReliable:a.length===0,overlappingGroupIds:a}}var Ap=5,jp={totalCoreHours:null,usefulCoreHours:null,wastedCoreHours:null,totalCores:null,topStages:[]};function Mp(e,t=[],n,r=[]){if(!n||e?.startTime==null||e?.endTime==null||e.endTime-e.startTime<=0)return jp;let i=Kn({app:e,stages:new Map,executors:{added:t,removed:r}});if(i==null)return jp;let a=Mn(e,t,r),o=i/T,s=(n.busyCoreMs??0)/T;return{totalCoreHours:o,usefulCoreHours:s,wastedCoreHours:Math.max(0,o-s),totalCores:a,topStages:Object.entries(n.perStage??{}).map(([e,t])=>({stageId:Number(e),coreMs:t?.totalTaskDurationSum??0})).sort((e,t)=>t.coreMs-e.coreMs).slice(0,Ap)}}function Np(e){return{figure:Bf(e),meaning:Hf(e),board:Uf(e.impactEstimate)?.text??null,compact:Wf(e.impactEstimate),provenance:Gf(e)}}function Pp(e){return e==null?null:e<75?`critical`:e<90?`warning`:null}function Fp(e){return e==null?null:e>=70?`critical`:e>=40?`warning`:null}function Ip(e){let{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r}=Jf(e),i=qf(e);return{wallClockMs:t,efficiencyPct:n,unusedCoreTimePct:r,efficiencyFlag:Pp(n),unusedCoreTimeFlag:Fp(r),unusedCoreTimeUnavailableReason:i.wastage.unavailableReason}}function Lp(e){return e.runAggregates?Rf({app:e.app,stages:e.stages,executorsAdded:e.executors.added,executorsRemoved:e.executors.removed,runAggregates:e.runAggregates}):null}function Rp(e,t){let n=!Ms(e.stages),{notRunReason:r}=zs(e.stages,t),i={};for(let e of ap){let t=r(e);t!=null&&(i[e]=t)}return{noFinishedStages:n,notRunReasons:i,gaps:Ls(t,n)}}function zp(e,t,n){let r=new Map;for(let t of e){let{stageId:e}=up(t);if(e==null)continue;let n=r.get(e)??[];n.push(t),r.set(e,n)}let i={};for(let[e,a]of r){let[r]=fp(a,n?{failedJobStageIds:n}:{}),o=r?[r.lead.type,...r.related.map(e=>e.type)]:[],s=e=>S[de(a.filter(t=>t.type===e))],c=[...new Set(a.map(e=>e.type))].filter(e=>!o.includes(e)).sort((e,t)=>s(e)-s(t));i[String(e)]={findingIndexes:a.map(e=>t.get(e)),typeOrder:[...o,...c]}}return i}var Bp=new Set(ap);function Vp(e,t,n){let r=[...t,...n],i=new Map(r.map((e,t)=>[e,t])),a=Op(e,r),{outcome:o}=a,s=o.failedJobs>0,c=r.filter(e=>x(e)&&Bp.has(e.type)),l=a.shown.map(e=>{let t=ks(e.lead,o)&&o.reason?wp(o.reason):null;return{key:e.key,leadIndex:i.get(e.lead),stageId:e.stageId,relatedTypes:e.related.map(e=>e.type),recommendation:t?.shown??Zf(e.lead),copyText:Tp(e.lead,t?.copied??Zf(e.lead))}});return{savings:r.map(Np),verdict:{title:a.title,summary:a.summary,failed:s,clean:a.facts.clean,failureReason:o.reason,steps:l,remaining:a.remaining,copyText:a.copyText},coverage:Rp(e,r),runShape:Ip(e),wallClock:Fo(e.app,e.stages),wastedCoreHours:Mp(e.app,e.executors.added,e.runAggregates,e.executors.removed),efficiency:Lp(e),wallClockReliable:kp(e.jobs).wallClockReliable,etlPhases:zf(e.stages),coreLocality:{chart:Mf([...e.stages.values()],e.app),ratio:Qn([...e.stages.values()],{topN:1/0})},detectors:Lf(),savingsRank:lp(r).map(e=>i.get(e)),stages:zp(t,i,s?o.failedJobStageIds:null),rollup:{eligibleIndexes:c.map(e=>i.get(e)),groups:O(c,e.stages).map(({members:e,...t})=>({...t,memberIndexes:e.map(e=>i.get(e))}))}}}function Hp(e,t){return e.appModel!==t.appModel||e.catalog!==t.catalog||e.configFindings!==t.configFindings}function Up(e){if(e.exportMode)return;let{appModel:t,catalog:n,configFindings:r}=e;N.getState().setInterpretation({data:Vp(t,n,r),findings:[...n,...r]})}function Wp(){return Up(N.getState()),N.subscribe((e,t)=>{Hp(e,t)&&Up(e)})}Wp(),(0,Te.createRoot)(document.getElementById(`root`)).render((0,z.jsx)(R.StrictMode,{children:(0,z.jsx)(kf,{})}));export{$a as $,_d as A,Me as At,$u as B,Od as C,It as Ct,Md as D,bt as Dt,Nd as E,St as Et,ud as F,ac as G,$ as H,sd as I,Rs as J,ic as K,ed as L,md as M,Ee as Mt,od as N,Pd as O,mt as Ot,ld as P,vo as Q,Ju as R,ef as S,Ht as St,Fd as T,wt as Tt,Yu as U,Qu as V,Zu as W,ho as X,No as Y,go as Z,Hf as _,sn as _t,rp as a,ka as at,Sf as b,Zt as bt,Yf as c,Zr as ct,Xf as d,On as dt,no as et,Jf as f,hn as ft,Vf as g,fn as gt,Bf as h,mn as ht,Tp as i,Fa as it,pd as j,B as jt,gd as k,Ye as kt,Qf as l,An as lt,Uf as m,pn as mt,Op as n,Ma as nt,np as o,Kr as ot,Gf as p,ln as pt,zs as q,Dp as r,Aa as rt,$f as s,Qr as st,Vp as t,Pa as tt,Zf as u,kn as ut,Lf as v,$t as vt,jd as w,Ot as wt,gf as x,Wt as xt,Nf as y,nn as yt,Xu as z};