minerva-design 1.6.0 → 1.7.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 (120) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/charts/engine/data.cjs +1 -1
  3. package/dist/charts/engine/data.cjs.map +1 -1
  4. package/dist/charts/engine/data.d.cts +2 -0
  5. package/dist/charts/engine/data.d.ts +2 -0
  6. package/dist/charts/engine/data.js +6 -4
  7. package/dist/charts/engine/data.js.map +1 -1
  8. package/dist/charts/engine/defaults.cjs +1 -1
  9. package/dist/charts/engine/defaults.cjs.map +1 -1
  10. package/dist/charts/engine/defaults.js +22 -18
  11. package/dist/charts/engine/defaults.js.map +1 -1
  12. package/dist/charts/engine/graph/chart.cjs +1 -1
  13. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  14. package/dist/charts/engine/graph/chart.js +532 -493
  15. package/dist/charts/engine/graph/chart.js.map +1 -1
  16. package/dist/charts/engine/graph/geometry.cjs +1 -1
  17. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  18. package/dist/charts/engine/graph/geometry.d.cts +12 -2
  19. package/dist/charts/engine/graph/geometry.d.ts +12 -2
  20. package/dist/charts/engine/graph/geometry.js +35 -31
  21. package/dist/charts/engine/graph/geometry.js.map +1 -1
  22. package/dist/charts/engine/model.cjs +1 -1
  23. package/dist/charts/engine/model.cjs.map +1 -1
  24. package/dist/charts/engine/model.js +95 -74
  25. package/dist/charts/engine/model.js.map +1 -1
  26. package/dist/charts/engine/orderbook/field.cjs +1 -1
  27. package/dist/charts/engine/orderbook/field.cjs.map +1 -1
  28. package/dist/charts/engine/orderbook/field.d.cts +15 -2
  29. package/dist/charts/engine/orderbook/field.d.ts +15 -2
  30. package/dist/charts/engine/orderbook/field.js +21 -9
  31. package/dist/charts/engine/orderbook/field.js.map +1 -1
  32. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  33. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  34. package/dist/charts/engine/orderbook/heatmap.d.cts +29 -0
  35. package/dist/charts/engine/orderbook/heatmap.d.ts +29 -0
  36. package/dist/charts/engine/orderbook/heatmap.js +576 -453
  37. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  38. package/dist/charts/engine/orderbook/types.d.cts +36 -11
  39. package/dist/charts/engine/orderbook/types.d.ts +36 -11
  40. package/dist/charts/engine/presets.cjs +1 -1
  41. package/dist/charts/engine/presets.cjs.map +1 -1
  42. package/dist/charts/engine/presets.d.cts +16 -3
  43. package/dist/charts/engine/presets.d.ts +16 -3
  44. package/dist/charts/engine/presets.js +42 -32
  45. package/dist/charts/engine/presets.js.map +1 -1
  46. package/dist/charts/engine/scene.cjs +1 -1
  47. package/dist/charts/engine/scene.cjs.map +1 -1
  48. package/dist/charts/engine/scene.d.cts +4 -2
  49. package/dist/charts/engine/scene.d.ts +4 -2
  50. package/dist/charts/engine/scene.js +185 -107
  51. package/dist/charts/engine/scene.js.map +1 -1
  52. package/dist/charts/engine/three-d/oit.cjs +119 -34
  53. package/dist/charts/engine/three-d/oit.cjs.map +1 -1
  54. package/dist/charts/engine/three-d/oit.d.cts +65 -10
  55. package/dist/charts/engine/three-d/oit.d.ts +65 -10
  56. package/dist/charts/engine/three-d/oit.js +119 -34
  57. package/dist/charts/engine/three-d/oit.js.map +1 -1
  58. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  59. package/dist/charts/engine/three-d/render-types.d.cts +19 -0
  60. package/dist/charts/engine/three-d/render-types.d.ts +19 -0
  61. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  62. package/dist/charts/engine/three-d/shaders.cjs +14 -6
  63. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  64. package/dist/charts/engine/three-d/shaders.d.cts +6 -1
  65. package/dist/charts/engine/three-d/shaders.d.ts +6 -1
  66. package/dist/charts/engine/three-d/shaders.js +40 -26
  67. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  68. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  69. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  70. package/dist/charts/engine/three-d/webgl.js +167 -125
  71. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  72. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  73. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  74. package/dist/charts/engine/three-d/webgpu.js +169 -140
  75. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  76. package/dist/charts/engine/trading/chart.cjs +1 -1
  77. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  78. package/dist/charts/engine/trading/chart.js +1149 -1023
  79. package/dist/charts/engine/trading/chart.js.map +1 -1
  80. package/dist/charts/engine/trading/labels.cjs +1 -1
  81. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  82. package/dist/charts/engine/trading/labels.js +12 -0
  83. package/dist/charts/engine/trading/labels.js.map +1 -1
  84. package/dist/charts/engine/trading/layout.cjs +2 -0
  85. package/dist/charts/engine/trading/layout.cjs.map +1 -0
  86. package/dist/charts/engine/trading/layout.d.cts +37 -0
  87. package/dist/charts/engine/trading/layout.d.ts +37 -0
  88. package/dist/charts/engine/trading/layout.js +63 -0
  89. package/dist/charts/engine/trading/layout.js.map +1 -0
  90. package/dist/charts/engine/trading/types.d.cts +24 -7
  91. package/dist/charts/engine/trading/types.d.ts +24 -7
  92. package/dist/charts/engine/types.d.cts +21 -8
  93. package/dist/charts/engine/types.d.ts +21 -8
  94. package/dist/core/contracts.cjs +1 -1
  95. package/dist/core/contracts.cjs.map +1 -1
  96. package/dist/core/contracts.js +1 -1
  97. package/dist/core/contracts.js.map +1 -1
  98. package/dist/native/charts/src/engine/data.cjs +1 -1
  99. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  100. package/dist/native/charts/src/engine/data.js +6 -4
  101. package/dist/native/charts/src/engine/data.js.map +1 -1
  102. package/dist/native/charts/src/engine/model.cjs +1 -1
  103. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  104. package/dist/native/charts/src/engine/model.js +104 -83
  105. package/dist/native/charts/src/engine/model.js.map +1 -1
  106. package/dist/native/charts/src/engine/presets.cjs +1 -1
  107. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  108. package/dist/native/charts/src/engine/presets.js +42 -32
  109. package/dist/native/charts/src/engine/presets.js.map +1 -1
  110. package/dist/native/charts/src/engine/scene.cjs +1 -1
  111. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  112. package/dist/native/charts/src/engine/scene.js +185 -107
  113. package/dist/native/charts/src/engine/scene.js.map +1 -1
  114. package/dist/taro/index.js +1263 -1152
  115. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +11 -0
  116. package/dist/vue/components/Chart/orderbook.d.ts +7 -0
  117. package/dist/vue/components/Chart/orderbook.js +2 -0
  118. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  119. package/dist/weapp/charts/canvas.js +234 -58
  120. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","toPlotX","require_color","require_data","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","x","mapX","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","yAxisFormat","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","itX","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","resolveDependencies","muted","dependencies","ARROW_HEAD","rowSpans","bar","start","end","dependencyArrows","horizontal","pt","valuePx","categoryPx","dir","rowPx","ev","ca","sv","cb","base","length","points","exit","between","back","COLOR_STOPS","colorLegend","lut","stops","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n gridOf,\n plottedY,\n toPlotX,\n type ChartModel,\n type SeriesModel,\n} from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartDependency,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` / `mapX` turn values\n * into plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n mapX?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n const x = <T extends number | undefined>(v: T): T =>\n (mapX && v !== undefined ? mapX(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: x(a.x0),\n x1: x(a.x1),\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: x(a.x),\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : x(a.value),\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const yAxisFormat =\n s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat;\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n // bubbles: `format` is the one of their value, y keeps the axis one\n value: (it.value !== undefined ? yAxisFormat : formatOf(s))(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n return {\n title: it.label ?? it.seriesName,\n titleColor: it.color,\n // a named point of a group: the group under its name\n ...(it.label !== undefined && model.series.length > 1\n ? { subtitle: it.seriesName }\n : {}),\n rows,\n };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n // plotted x (the logarithm on log x axes)\n const itX = s.cols.x[it.index] ?? it.x;\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, itX + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(itX + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(itX);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** A dependency with its color resolved against the theme */\nexport interface ResolvedDependency {\n from: string;\n to: string;\n color: string;\n}\n\n/** Colors of the dependency arrows (resolved once per options / theme) */\nexport const resolveDependencies = (\n dependencies: readonly ChartDependency[] | undefined,\n theme: ChartTheme,\n): ResolvedDependency[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const muted = toCss(theme.textMuted, 0.85);\n return (dependencies ?? []).map((d) => ({\n from: d.from,\n to: d.to,\n color: d.color ? toCss(resolve(d.color, theme.textMuted)) : muted,\n }));\n};\n\n/**\n * Elbow arrow between two bars, pixels of the stage: an axis-aligned\n * polyline ending at the base of a filled triangular head\n */\nexport interface DependencyArrow {\n /** Corners of the line, from the end of the predecessor to the base of the head */\n points: { x: number; y: number }[];\n /** Tip and the two base corners of the arrowhead */\n head: [\n { x: number; y: number },\n { x: number; y: number },\n { x: number; y: number },\n ];\n color: string;\n width: number;\n}\n\n/** Length and half width of the arrowheads, in CSS pixels */\nexport const ARROW_HEAD = { length: 6, half: 3.5 };\n\ninterface RowSpan {\n /** Category position of the bar center */\n at: number;\n start: number;\n end: number;\n /** Half thickness of the bar / radius of the dot in pixels */\n half: number;\n /** A dot (milestone): the arrows stop at its edge */\n dot: boolean;\n}\n\n/** Bars (or dots) of every category, the first visible one per category */\nconst rowSpans = (model: ChartModel, sc: Scales): Map<number, RowSpan> => {\n const rows = new Map<number, RowSpan>();\n for (const s of model.series) {\n if (s.hidden || !s.tooltip) continue;\n if (s.type !== \"bar\" && s.type !== \"scatter\") continue;\n const { x, y, count } = s.cols;\n const bar = s.type === \"bar\" && s.barBase && s.barTop;\n const half = bar ? s.barHalfWidth / Math.abs(sc.xPerPx) : dotSize(s, 0) / 2;\n for (let i = 0; i < count; i++) {\n const k = Math.round(x[i]);\n if (rows.has(k)) continue;\n const start = bar ? s.barBase![i] : y[i];\n const end = bar ? s.barTop![i] : y[i];\n if (!Number.isFinite(start) || !Number.isFinite(end)) continue;\n rows.set(k, {\n at: x[i] + slotOffset(s),\n start: Math.min(start, end),\n end: Math.max(start, end),\n half,\n dot: !bar,\n });\n }\n }\n return rows;\n};\n\n/**\n * Dependency arrows (`dependencies`, Gantt charts): from the end of the\n * predecessor to the start of the successor; when the successor starts\n * too early the line turns around between the rows\n */\nexport const dependencyArrows = (\n model: ChartModel,\n sc: Scales,\n dependencies: readonly ResolvedDependency[],\n): DependencyArrow[] => {\n if (!dependencies.length || model.x.type !== \"category\") return [];\n const rows = rowSpans(model, sc);\n const index = new Map<string, number>();\n model.x.categories.forEach((c, i) => {\n if (!index.has(c)) index.set(c, i);\n });\n // (value pixel, category pixel) -> stage pixels\n const horizontal = sc.horizontal;\n const pt = (v: number, c: number) =>\n horizontal ? { x: v, y: c } : { x: c, y: v };\n const valuePx = (value: number) => {\n const p = toScreen(sc, 0, value);\n return horizontal ? p.x : p.y;\n };\n const categoryPx = (at: number) => {\n const p = toScreen(sc, at, 0);\n return horizontal ? p.y : p.x;\n };\n const dir = Math.sign(valuePx(sc.view.y[1]) - valuePx(sc.view.y[0])) || 1;\n const rowPx = Math.abs(categoryPx(1) - categoryPx(0));\n const { length, half } = ARROW_HEAD;\n const gap = 8;\n const out: DependencyArrow[] = [];\n for (const d of dependencies) {\n const a = rows.get(index.get(d.from) ?? NaN);\n const b = rows.get(index.get(d.to) ?? NaN);\n if (!a || !b || a === b) continue;\n const ev = valuePx(a.end) + (a.dot ? dir * a.half : 0);\n const ca = categoryPx(a.at);\n const sv = valuePx(b.start) - dir * (b.dot ? b.half + 1 : 1);\n const cb = categoryPx(b.at);\n const base = sv - dir * length;\n const points = [pt(ev, ca)];\n const exit = ev + dir * gap;\n if (dir * (base - exit) >= 0) {\n // room before the successor: out, across the rows, in\n points.push(pt(exit, ca), pt(exit, cb), pt(base, cb));\n } else {\n // around: out, to the gap between the rows, back, across, in\n const side = Math.sign(cb - ca) || 1;\n const between = ca + side * Math.max(a.half + 3, rowPx / 2);\n const back = base - dir * gap;\n points.push(\n pt(exit, ca),\n pt(exit, between),\n pt(back, between),\n pt(back, cb),\n pt(base, cb),\n );\n }\n out.push({\n points,\n head: [pt(sv, cb), pt(base, cb - half), pt(base, cb + half)],\n color: d.color,\n width: 1.25,\n });\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const first = event.items[0];\n const c = sc.xToPx(\n model.series[first.seriesIndex]?.cols.x[first.index] ??\n toPlotX(model, first.x),\n );\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"sLA0CA,IAAa2B,EAAkB,CAAE,IAAK,GAAI,MAAO,GAAI,OAAQ,EAAG,KAAM,CAAE,EAE3DC,GAAmB,EAAgB,IAAmBC,EAMtDC,GACX,EACA,EACA,EACA,IACyB,CACzB,IAAMC,EAAUC,EAAM,SAAWJ,EAC3BK,EAAmC,GACtCC,GAAQC,IAAM,IAAA,GAAYD,EAAKC,CAAC,EAAIA,EACjCC,EAAmC,GACtCC,GAAQF,IAAM,IAAA,GAAYE,EAAKF,CAAC,EAAIA,EACvC,OAAQG,GAAe,CAAC,EAAA,CAAG,IAAK,GAAM,CACpC,GAAIC,EAAE,OAAS,OAAQ,CACrB,IAAMC,EAAQD,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,OAAO,EAAIA,EAAM,QAChE,MAAO,CACL,KAAM,OACN,GAAII,EAAEG,EAAE,EAAE,EACV,GAAIH,EAAEG,EAAE,EAAE,EACV,GAAIN,EAAEM,EAAE,EAAE,EACV,GAAIN,EAAEM,EAAE,EAAE,EACV,QACA,QAASA,EAAE,SAAW,IACtB,MAAOA,EAAE,MACT,cAAeA,EAAE,eAAiB,WAClC,WAAYA,EAAE,WACVR,EAAQQ,EAAE,WAAYC,CAAK,EAC3BxC,EAAAA,IAAIwC,EAAOR,EAAM,KAAM,EAAG,CAChC,CACF,CAYA,OAXIO,EAAE,OAAS,OACN,CACL,KAAM,OACN,EAAGH,EAAEG,EAAE,CAAC,EACR,EAAGN,EAAEM,EAAE,CAAC,EACR,KAAMA,EAAE,KACR,OAAQA,EAAE,QAAU,SACpB,MAAOA,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,SAAS,EAAIA,EAAM,UAC3D,OAAQO,EAAE,QAAU,GACtB,EAEK,CACL,KAAM,OACN,KAAMA,EAAE,KACR,MAAOA,EAAE,OAAS,IAAMN,EAAEM,EAAE,KAAK,EAAIH,EAAEG,EAAE,KAAK,EAC9C,MAAOA,EAAE,MAAQR,EAAQQ,EAAE,MAAOP,EAAM,SAAS,EAAIA,EAAM,UAC3D,MAAOO,EAAE,OAAS,EAClB,KAAM,CAAC,GAAIA,EAAE,MAAQ,CAAC,EAAG,CAAC,CAAE,EAC5B,MAAOA,EAAE,KACX,CACF,CAAC,CACH,EA0BaE,EAAe,GAAoC,CAC9D,GAAM,CAAE,QAAO,OAAM,QAAO,QAAO,SAAQ,WAAYC,EACvD,GAAIC,EAAM,WAAY,OAAOC,EAAiBF,CAAK,EAGnD,IAAMG,EACJF,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd,KAAK,IAAI,EAAG,KAAK,OAAOG,EAAS,KAAOd,EAAM,SAAW,EAAE,CAAC,EAC5Dc,GAAU,IACR,EACA,KAAK,IAAI,EAAG,KAAK,OAAOA,EAAS,IAAM,EAAE,CAAC,GAC5CC,EAAS9C,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGH,CAAM,EAC5CI,EAAc,EAClB,GAAIN,EAAM,EAAE,QACV,IAAK,IAAMO,KAASH,EAAO,OACzB,EAAc,KAAK,IAAIE,EAAaE,EAAQD,CAAK,CAAC,EAEtD,IAAME,EAAUC,EAAWV,EAAOI,EAAQC,EAAK,EAAGH,CAAM,EACpDS,EAAe,EACnB,GAAIF,GAAWT,EAAM,IAAI,QACvB,IAAK,IAAMO,KAASE,EAAQ,OAC1B,EAAe,KAAK,IAAIE,EAAcH,EAAQD,CAAK,CAAC,EAExD,IAAIK,EAAgB,GACpB,GAAIZ,EAAM,EAAE,OAAS,WAAY,CAC/B,EAAgB,EAChB,IAAMa,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMb,EAAM,EAAE,WAAW,OAAS,GAAG,CAAC,EACpE,IAAK,IAAIc,EAAI,EAAGA,EAAId,EAAM,EAAE,WAAW,OAAQ,GAAKa,EAClD,EAAgB,KAAK,IAAID,EAAeJ,EAAQR,EAAM,EAAE,WAAWc,EAAE,CAAC,CAE1E,CACA,IAAMC,EAAU,CAAE,GAAG/B,EAAiB,GAAGe,EAAM,OAAQ,EACjDiB,EAAOzD,EAAAA,YAAY,CACvB,QACA,SACA,UACA,YAAayC,EAAM,EAAE,QAAU,KAAK,KAAKM,CAAW,EAAI,EACxD,aAAc,KAAK,KAAKK,CAAY,EACpC,QAAS,CAAC,CAACX,EAAM,IAAI,OAAS,CAAC,CAACA,EAAM,GAAG,QACzC,aAAcA,EAAM,EAAE,QACtB,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,SAAUX,EAAM,QAClB,CAAC,EACGU,EAAM,MAAK,EAAK,GAAKA,EAAM,KAC/B,IAAMkB,EACJjB,EAAM,EAAE,OAAS,WACb,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,OAASJ,EAAgB,GAAG,CAAC,EACxDZ,EAAM,EAAE,WAAa,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,MAAQ,EAAE,CAAC,EAC7DE,EAAS5D,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGY,CAAM,EAEhD,MAAO,CAAE,OAAM,OADAzD,EAAAA,aAAawD,EAAMX,EAAML,EAAM,EAAE,QAASA,EAAM,EAAE,OAClD,EAAQ,SAAQ,SAAQ,SAAQ,CACjD,EAMMU,GACJ,EACA,EACA,EACA,IACqB,CACrB,IAAMS,EAAOnB,EAAM,GACboB,EAAMpB,EAAM,MAClB,GAAI,CAACmB,GAAQ,CAACC,GAAO,CAACA,EAAI,MAAO,OAAO,KACxC,GAAIA,EAAI,IAAK,CACX,IAAMxB,GAAKS,EAAK,GAAKe,EAAI,QAAUA,EAAI,MACjCC,GAAKhB,EAAK,GAAKe,EAAI,QAAUA,EAAI,MACjCE,EAAQhE,EAAAA,UAAU6D,EAAM,CAAC,KAAK,IAAIvB,EAAGyB,CAAC,EAAG,KAAK,IAAIzB,EAAGyB,CAAC,CAAC,EAAGE,CAAK,EACrE,MAAO,CACL,GAAGD,EACH,OAAQA,EAAM,OAAO,IAAK,GAAM,EAAIF,EAAI,MAAQA,EAAI,MAAM,CAC5D,CACF,CACA,IAAMI,EAAMpB,EAAO,OAAO,IAAK,IAAOZ,EAAI4B,EAAI,QAAUA,EAAI,KAAK,EAC3DP,EAAOW,EAAI,OAAS,EAAI,KAAK,IAAIA,EAAI,GAAKA,EAAI,EAAE,EAAI,EACtDC,EAAS,EACb,IAAK,IAAMjC,KAAKgC,EAAK,EAAS,KAAK,IAAIC,EAAQ,KAAK,IAAIjC,CAAC,CAAC,EAC1D,IAAMkC,EAAOP,EAAK,QAAU1D,EAAAA,cAAcoD,EAAMY,EAAQzB,EAAM,MAAM,EACpE,MAAO,CACL,OAAQI,EAAO,OACf,OAAQoB,EAAI,IAAIE,CAAI,EACpB,YAAaP,EAAK,QAAUnB,EAAM,WACpC,CACF,EAGMC,EAAoB,GAAoC,CAC5D,GAAM,CAAE,QAAO,OAAM,QAAO,QAAO,SAAQ,WAAYF,EACjD4B,EAAO,KAAK,IAAI,EAAG,KAAK,OAAOxB,EAAS,KAAOd,EAAM,SAAW,EAAE,CAAC,EACnE4B,EACJjB,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd2B,EACAxB,GAAU,IACR,EACA,KAAK,IAAI,EAAG,KAAK,OAAOA,EAAS,IAAM,EAAE,CAAC,GAC5Ce,EAAS5D,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGY,CAAM,EAC5CW,EAAc,EAClB,GAAI5B,EAAM,EAAE,QAAS,CACnB,GAAIA,EAAM,EAAE,OAAS,WAAY,CAE/B,IAAM6B,EAAQ7B,EAAM,EAAE,WAChBa,EAAO,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAM,OAAS,GAAG,CAAC,EACvD,IAAK,IAAIf,EAAI,EAAGA,EAAIe,EAAM,OAAQ,GAAKhB,EAAM,CAC3C,IAAMiB,EAAO9B,EAAM,EAAE,OAASA,EAAM,EAAE,OAAOc,CAAC,EAAIe,EAAMf,GACxD,EAAc,KAAK,IAAIc,EAAapB,EAAQsB,CAAI,CAAC,CACnD,CACF,MACE,IAAK,IAAMvB,KAASW,EAAO,OACzB,EAAc,KAAK,IAAIU,EAAapB,EAAQD,CAAK,CAAC,CAExD,CACA,IAAMQ,EAAU,CAAE,GAAG/B,EAAiB,GAAGe,EAAM,OAAQ,EACjDiB,EAAOzD,EAAAA,YAAY,CACvB,QACA,SACA,UACA,YAAayC,EAAM,EAAE,QAAU,KAAK,KAAK4B,CAAW,EAAI,EACxD,aAAc5B,EAAM,EAAE,QACtB,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,OAAQ,CAAC,CAACA,EAAM,EAAE,OAASA,EAAM,EAAE,QACnC,SAAUX,EAAM,QAClB,CAAC,EACGU,EAAM,MAAK,EAAK,GAAKA,EAAM,KAC/B,IAAMG,EACJF,EAAM,EAAE,YACPA,EAAM,EAAE,OAAS,WACd,KAAK,IAAI,EAAG,KAAK,MAAMgB,EAAK,MAAQ,EAAE,CAAC,EACvC,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,MAAMA,EAAK,MAAQ,EAAE,CAAC,CAAC,GACpDZ,EAAS9C,EAAAA,UAAU0C,EAAM,EAAGK,EAAK,EAAGH,CAAM,EAQhD,MAAO,CAAE,OAAM,OAPA1C,EAAAA,aACbwD,EACAX,EACAL,EAAM,EAAE,QACRA,EAAM,EAAE,QACR,EAEa,EAAQ,SAAQ,SAAQ,QAAS,IAAK,CACvD,EAGa+B,GACX,EACA,EACA,EACA,IACiB,CACjB,IAAMC,EAAuB,CAAC,EAExBC,EAAajC,EAAM,QACrBA,EAAM,YACLI,GAAQ,aAAeJ,EAAM,YAClC,IAAK,IAAMkC,KAAUlC,EAAM,OAAQ,CACjC,GAAIkC,EAAO,QAAU,CAACA,EAAO,WAAY,SACzC,GAAIA,EAAO,OAAS,OAASA,EAAO,OAAQ,CAE1C,IAAMC,EACJD,EAAO,SACNA,EAAO,QAAU,QACblC,EAAM,IAAI,QAAUA,EAAM,YAC3BiC,GACA,CAAE,IAAG,SAAUC,EAAO,KACtB,CAAE,IAAG,KAAI,OAAQE,GAAUF,EAAO,IAClCG,EAAMH,EAAO,OACb,CAACI,EAAIC,GAAMlC,EAAK,EAAE,IAAMA,EAAK,EAAE,GAAKA,EAAK,EAAI,CAACA,EAAK,EAAE,GAAIA,EAAK,EAAE,EAAE,EACxE,IAAK,IAAIS,EAAI,EAAGA,EAAIS,GAASS,EAAO,OAAA,IAA2B,IAAK,CAClE,IAAMQ,EAAK/C,EAAEqB,GAAKoB,EAAO,UACzB,GAAI,CAAC,OAAO,SAAS5C,EAAEwB,EAAE,GAAK0B,EAAKF,GAAME,EAAKD,EAAI,SAGlD,IAAME,EADWJ,EAAIvB,IAAMoB,EAAO,UAAUpB,IAAM,KACpBd,EAAM,EAAE,QAChC0C,EAAIhF,EAAAA,SAASiF,EAAGH,EAAIH,EAAIvB,EAAE,EAC1BD,EAAOqB,EAAO,UAAYU,GAAM,OAAO,SAASA,EAAG9B,EAAE,EAE3D,GAAID,GAAQb,EAAM,EAAE,OAAS,QAAU,CAACoC,IAAQtB,GAAI,SACpD,IAAM+B,EAAQhC,EAAOvB,EAAEwB,IAAM8B,IAAK9B,IAAM,GAAK,EAC7CkB,EAAO,KAAK,CACV,EAAGU,EAAE,EACL,EAAGA,EAAE,EACL,EAAG,EACH,KACEN,IAAQtB,KACPD,EAAO,GAAGgC,EAAQ,EAAI,IAAM,KAAKV,EAAOU,CAAK,IAAMV,EAAO7C,EAAEwB,EAAE,GACjE,UAAW6B,EAAE,WACTF,EACE,OACA,QACFA,EACE,QACA,OACR,CAAC,CACH,CACA,QACF,CACA,GAAIP,EAAO,OAAS,UAAW,SAC/B,GAAM,CAAE,IAAG,IAAG,QAAO,OAAQE,EAAO,QAASF,EAAO,KACpD,GAAKE,EACL,IAAK,IAAItB,EAAI,EAAGA,EAAIS,GAASS,EAAO,OAAA,IAA2B,IAAK,CAClE,IAAMc,EAAOV,EAAMtB,GACnB,GAAI,CAACgC,EAAM,SACX,IAAMC,EAAKtD,EAAEqB,GACPkC,EAAK1D,EAAEwB,GACb,GAAIiC,EAAK1C,EAAK,EAAE,IAAM0C,EAAK1C,EAAK,EAAE,IAAM2C,EAAK3C,EAAK,EAAE,IAAM2C,EAAK3C,EAAK,EAAE,GACpE,SACF,IAAM4C,EAAIC,GAAQA,EAAKpC,GAAK,EAAIoC,EAAKpC,GAAKoB,EAAO,UAC3CQ,EAAIhF,EAAAA,SAASiF,EAAGI,EAAIC,CAAE,EAC5BhB,EAAO,KAAK,CAAE,EAAGU,EAAE,EAAG,EAAGA,EAAE,EAAG,EAAGO,EAAI,EAAG,MAAK,CAAC,CAChD,CACF,CACA,OAAOjB,CACT,EAmBMmB,EAAc,GAClBR,EAAE,OAAS,OAASA,EAAE,OAAS,UAAYA,EAAE,UAAY,EAM9CS,GAAW,EAAgB,EAAW,IAAe,CAChE,IAAMV,EAAIhF,EAAAA,SAAS2F,EAAIV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,EAAGhF,EAAAA,SAASgF,EAAG7B,CAAC,CAAC,EAClE,MAAO,CAAE,GAAI4B,EAAE,EAAG,GAAIA,EAAE,CAAE,CAC5B,EAGMY,GACJ,EACA,EACA,EACA,EACA,EACA,EACA,IACG,CACH,IAAMC,EAAKF,EAAG,MAAMzD,CAAC,EACf4D,EAAKH,EAAG,MAAMhC,CAAC,EACrB,OACE,KAAK,IAAIoC,EAAKC,CAAM,GAAKC,GACzBC,GAAM,KAAK,IAAIL,EAAIC,CAAE,EAAI,GACzBI,GAAM,KAAK,IAAIL,EAAIC,CAAE,EAAI,CAE7B,EAEMK,GACJ,EACA,EACA,EACA,EACA,IACc,CACd,IAAMnB,EAAIU,EAAQT,EAAG7B,EAAGuC,CAAE,EACpBI,EAAK7F,EAAAA,OAAOyF,EAAIS,EAAIC,CAAE,EACtBH,EAAK/F,EAAAA,OAAOwF,EAAIS,EAAIC,CAAE,EACtBL,EAASL,EAAG,MAAMV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,CAAC,EAC/CqB,EAAS,GACb,GAAIrB,EAAE,OAAS,OAASA,EAAE,SAAWA,EAAE,OAErC,EAASW,EAASD,EAAIK,EADTf,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EACZV,EAAE,QAAQ7B,GAAI6B,EAAE,OAAO7B,GAAI2C,EAAIG,CAAE,OAChE,GAAIjB,EAAE,OAAS,eAAiBA,EAAE,OAAS,UAAW,CAC3D,GAAM,CAAE,OAAM,MAAK,KAAMA,EAAE,KAI3B,EAASW,EAASD,EAAIK,EAHT,KAAK,IAAIf,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAG,CAG9B,EAFpBY,EAAOA,EAAKnD,GAAKxB,EAAEwB,GACnBoD,EAAMA,EAAIpD,GAAKxB,EAAEwB,GACe2C,EAAIG,CAAE,CAClD,CACA,MAAO,CACL,OAAQjB,EACR,MAAO7B,EACP,GAAI4B,EAAE,GACN,GAAIA,EAAE,GACN,GAAI,KAAK,IAAIW,EAAG,MAAMV,EAAE,KAAK,EAAE7B,EAAE,EAAI2C,CAAE,EACvC,KAAMO,EAAS,EAAI,KAAK,MAAMtB,EAAE,GAAKoB,EAAIpB,EAAE,GAAKqB,CAAE,EAClD,QACF,CACF,EAGMI,GACJ,EACA,EACA,EACA,EACA,EACA,IACuB,CACvB,IAAMC,EAAOzB,EAAE,KAAK,WAAW7B,GAC/B,GAAI,CAACsD,EAAM,OACX,IAAMV,EAASL,EAAG,MAAMV,EAAE,KAAK,EAAE7B,GAAKqC,EAAWR,CAAC,CAAC,EAC7Cc,EAAK7F,EAAAA,OAAOyF,EAAIS,EAAIC,CAAE,EAAIL,EAC1BE,EAAK/F,EAAAA,OAAOwF,EAAIS,EAAIC,CAAE,EACtBM,EAAQ1B,EAAE,YAAc,EAAI,EAAI2B,EAClCC,EACAC,EAAWH,EASf,OARAD,EAAK,SAAS,EAAG,IAAM,CACrB,IAAMnB,EAAI,KAAK,MAAMQ,EAAIJ,EAAG,MAAM7D,CAAC,EAAIoE,CAAE,EACrCX,GAAKuB,IACP,EAAWvB,EAEX,EAAON,EAAE,IAAI,WAAW7B,EAAE,GAAG2D,IAAMjF,EAEvC,CAAC,EACM+E,CACT,EAGaG,GAAW,EAAgB,IACtC/B,EAAE,KAAK,MAAQA,EAAE,KAAK,KAAK7B,GAAK,EAAI6B,EAAE,KAAK,KAAK7B,GAAK6B,EAAE,UAEnDgC,EAAW,IAAI,QAGfC,EAAU,GAAmB,CACjC,IAAMC,EAAQlC,EAAE,KAAK,KACrB,GAAI,CAACkC,EAAO,OAAOlC,EAAE,UACrB,IAAImC,EAAMH,EAAS,IAAIE,CAAK,EAC5B,GAAIC,IAAQ,IAAA,GAAW,CACrB,EAAMnC,EAAE,UACR,IAAK,IAAI7B,EAAI,EAAGA,EAAI+D,EAAM,OAAQ,IAASA,EAAM/D,GAAKgE,IAAK,EAAMD,EAAM/D,IACvE6D,EAAS,IAAIE,EAAOC,CAAG,CACzB,CACA,OAAOA,CACT,EAEMC,GACJ,EACA,EACA,EACA,EACA,IACG,CACH,IAAMC,EAAS,KAAK,IAAIJ,EAAOjC,CAAC,EAAI,EAAI,EAAG,EAAE,EAAI2B,EAC3CW,EAAKnH,EAAAA,OAAOuF,EAAIS,EAAIC,CAAE,EACtBmB,EAAKF,EAAS,KAAK,IAAI3B,EAAG,MAAM,EAChC8B,EAAKH,EAAS,KAAK,IAAI3B,EAAG,MAAM,EAClCkB,EAAO,GACPC,EAAW,IACT,CAAE,IAAG,KAAM7B,EAAE,KAUnB,OATA7D,EAAA,OAAO6D,CAAC,CAAC,CAAC,MAAMsC,EAAG,EAAIC,EAAID,EAAG,EAAIC,EAAID,EAAG,EAAIE,EAAIF,EAAG,EAAIE,EAAK,GAAM,CACjE,IAAMzC,EAAIhF,EAAAA,SAAS2F,EAAI5D,EAAEqB,GAAIxB,EAAEwB,EAAE,EAC3BmC,EAAI,KAAK,MAAMP,EAAE,EAAIoB,EAAIpB,EAAE,EAAIqB,CAAE,EAEnCd,GADU,KAAK,IAAIyB,EAAQ/B,EAAG7B,CAAC,EAAI,EAAI,EAAG,CAAC,EAAIwD,GACjCrB,GAAKuB,IACrB,EAAWvB,EACX,EAAOnC,EAEX,CAAC,EACMyD,CACT,EAGMa,GAAU,EAAgB,EAAY,IAAe,CACzD,GAAM,CAAE,EAAGC,EAAI,EAAGC,GAAO3C,EAAE,SACrB,CAAE,IAAG,KAAMA,EAAE,KACf4C,EAAQ,GAUZ,OATAzG,EAAA,OAAO6D,CAAC,CAAC,CAAC,MAAMH,EAAK6C,EAAI7C,EAAK6C,EAAIG,EAAKF,EAAIE,EAAKF,EAAK,GAAM,CAEvD3C,EAAE,aAAa7B,IACf,KAAK,IAAIrB,EAAEqB,GAAK0B,CAAE,GAAK6C,GACvB,KAAK,IAAI/F,EAAEwB,GAAK0E,CAAE,GAAKF,IAEvB,EAAQxE,EAEZ,CAAC,EACMyE,CACT,EAEME,GAAY,EAAgB,IAAe,CAC/C,GAAM,CAAE,IAAG,IAAG,QAAO,UAAW9C,EAAE,KAClC,GAAI+C,EAAQ,OAAO3H,EAAAA,aAAa0B,EAAGH,EAAGiC,EAAOiB,CAAE,EAC/C,IAAI+B,EAAO,GACPoB,EAAQ,IACZ,IAAK,IAAI7E,EAAI,EAAGA,EAAIS,EAAO,IAAK,CAC9B,GAAI,CAAC,OAAO,SAASjC,EAAEwB,EAAE,EAAG,SAC5B,IAAMmC,EAAI,KAAK,IAAIxD,EAAEqB,GAAK0B,CAAE,EACxBS,EAAI0C,IACN,EAAQ1C,EACR,EAAOnC,EAEX,CACA,OAAOyD,CACT,EAGaqB,GAAe,EAAgB,IAAkC,CAC5E,IAAMC,EAAKlD,EAAE,cAAcmD,GACrB,CAAE,OAAM,OAAM,MAAK,QAAO,KAAI,KAAI,KAAI,WAAU,UAAWnD,EAAE,IAC7DpC,EAAQyB,IAAS8D,GACnBjG,EAAQgG,EAAK7H,EAAAA,MAAM6H,CAAE,EAAIlD,EAAE,SACzBoD,EAAiC,CAAC,EACxC,GAAIpD,EAAE,OAAS,cAAe,CAC5B,IAAMqD,EAAIC,EAAOA,EAAKH,GAAS,IAC3B,OAAO,SAASE,CAAC,IAAG,EAAM,KAAOA,GACjC/B,GAAQ,OAAO,SAASA,EAAK6B,EAAM,IAAG,EAAM,KAAO7B,EAAK6B,IACxD5B,GAAO,OAAO,SAASA,EAAI4B,EAAM,IAAG,EAAM,IAAM5B,EAAI4B,IACxD,EAAQ9H,EAAAA,MAAM2E,EAAE,IAAI,EAAEmD,GAASE,EAAIrD,EAAE,UAAYA,EAAE,OAAO,CAC5D,MAAO,GAAIA,EAAE,OAAS,UAAW,CAC/B,IAAMnD,EAAI0G,EAAQA,EAAMJ,GAASnD,EAAE,IAAI,EAAEmD,GACrC,OAAO,SAAStG,CAAC,IAAG,EAAM,MAAQA,GACtC,IAAM2G,EAASxD,EAAE,aAAamD,GAC1BK,IAAQ,EAAQnI,EAAAA,MAAMC,EAAAA,YAAYkI,CAAM,CAAC,EAC/C,MAAO,GAAIxD,EAAE,OAAS,UAAW,CAC3BsB,GAAQ,OAAO,SAASA,EAAK6B,EAAM,IAAG,EAAM,KAAO7B,EAAK6B,IACxD5B,GAAO,OAAO,SAASA,EAAI4B,EAAM,IAAG,EAAM,IAAM5B,EAAI4B,IACpDM,GAAM,OAAO,SAASA,EAAGN,EAAM,IAAG,EAAM,GAAKM,EAAGN,IAChDO,GAAM,OAAO,SAASA,EAAGP,EAAM,IAAG,EAAM,GAAKO,EAAGP,IACpD,IAAMQ,EAAMC,IAAWT,GACnBQ,IAAK,EAAM,SAAWA,EAAI,OAChC,MACM1D,GAAM,OAAO,SAASA,EAAGkD,EAAM,IAAG,EAAM,GAAKlD,EAAGkD,IAChDnD,EAAE,OAAS,WAAauD,GAAS,OAAO,SAASA,EAAMJ,EAAM,IAC/D,EAAM,MAAQI,EAAMJ,IAExB,MAAO,CACL,YAAanD,EAAE,MACf,SAAUA,EAAE,GACZ,WAAYA,EAAE,KACd,QACA,EAAGA,EAAE,IAAI,EAAEmD,GACX,EAAGnD,EAAE,IAAI,EAAEmD,GACX,QACA,GAAIvF,IAAU,IAAA,GAAwB,CAAC,EAAb,CAAE,OAAM,EAClC,GAAGwF,CACL,CACF,EAEMS,GACJ,EACA,IAC2B,CAC3B,GAAI,CAACC,EAAW,OAAQ,OAAO,KAC/BA,EAAW,MAAM,EAAG,IAAM7G,EAAE,OAAO,MAAQyB,EAAE,OAAO,KAAK,EACzD,IAAMqF,EAAQD,EAAW,IAAK,GAAM,CAClC,IAAME,EAAOf,EAAYgB,EAAE,OAAQA,EAAE,KAAK,EAE1C,OADIA,EAAE,UAAY,IAAA,KAAW,EAAK,QAAUA,EAAE,SACvCD,CACT,CAAC,EACKlH,EAAIiH,EAAM,EAAE,CAAC,EACnB,MAAO,CAAE,QAAO,IAAG,OAAQxF,GAAQ,YAAYzB,CAAC,GAAK,OAAOA,CAAC,CAAE,CACjE,EAOaoH,GACX,EACA,EACA,EACA,EACA,EACA,EAAO,IACoB,CAC3B,GAAM,CAAE,QAASxD,EACXyD,EAAS,EAAIxC,EACnB,GACER,EAAK9C,EAAK,EAAI8F,GACdhD,EAAK9C,EAAK,EAAIA,EAAK,MAAQ8F,GAC3B/C,EAAK/C,EAAK,EAAI8F,GACd/C,EAAK/C,EAAK,EAAIA,EAAK,OAAS8F,EAE5B,OAAO,KAET,IAAM7B,EAAKnH,EAAAA,OAAOuF,EAAIS,EAAIC,CAAE,EACtBgD,EAAuB,CAAC,EACxBC,EAAsB,CAAC,EAC7B,IAAK,IAAMrE,KAAK3C,EAAM,OACpB,GAAI,GAAE,QAAW2C,EAAE,SAAWA,EAAE,KAAK,QAAU,EAC/C,IAAIA,EAAE,OAAS,UAAW,CACxB,IAAM7B,EAAIiE,EAAepC,EAAGmB,EAAIC,EAAIV,EAAIiB,CAAI,EACxCxD,GAAK,GAAGiG,EAAQ,KAAKlD,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,CAAC,CACxD,MAAO,GAAIV,EAAE,OAAS,UAAW,CAC/B,IAAM7B,EAAIsE,EAAOzC,EAAGsC,EAAG,EAAGA,EAAG,CAAC,EAC9B,GAAInE,GAAK,EAAG,CACV,IAAM8F,EAAI/C,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,EACtC,EAAE,OAAS,GACX,EAAE,KAAO,EACT0D,EAAQ,KAAKH,CAAC,CAChB,CACF,KAAO,CACL,IAAM9F,EAAI2E,EAAS9C,EAAGsC,EAAG,CAAC,EAC1B,GAAInE,EAAI,EAAG,SACX,IAAM8F,EAAI/C,EAAYlB,EAAG7B,EAAGgD,EAAIC,EAAIV,CAAE,EAClCV,EAAE,OAAS,YACb,EAAE,QAAUwB,EAAUxB,EAAG7B,EAAGgD,EAAIC,EAAIV,EAAIiB,CAAI,EACxCsC,EAAE,UAAY,IAAA,KAChB,EAAE,OAAS,GACX,EAAE,KAAO,IAGbI,EAAO,KAAKJ,CAAC,CACf,EAEF,GAAI5G,EAAM,cAAgB,OAAQ,CAGhC,IAAMiH,EAAM,CAAC,GAAGF,EAAS,GAAGC,CAAM,CAAC,CAAC,OACjC,GACCJ,EAAE,QACFA,EAAE,OAAO,OAAS,YAChBA,EAAE,OAAO,OAAS,QAAUA,EAAE,OAAO,OAAS,SAC9CA,EAAE,MAAQ,EAAItC,CACpB,EAOA,OANK2C,EAAI,OAMFT,EAAQ,CALFS,EAAI,QAAQ,EAAG,IAC1B5F,EAAE,KAAOzB,EAAE,MAASyB,EAAE,OAASzB,EAAE,MAAQyB,EAAE,OAAO,MAAQzB,EAAE,OAAO,MAC/DyB,EACAzB,CAEU,CAAI,EAAGsB,CAAM,EANL,IAO1B,CACA,GAAIlB,EAAM,cAAgB,UAAW,CACnC,IAAMiH,EAAM,CAAC,GAAGF,EAAS,GAAGC,CAAM,CAAC,CAAC,OACjC,GAAMJ,EAAE,QAAUA,EAAE,OAAO,OAAS,WAAaA,EAAE,MAAQ,GAAKtC,CACnE,EAGA,OAFK2C,EAAI,OAEFT,EAAQ,CADFS,EAAI,QAAQ,EAAG,IAAO5F,EAAE,MAAQzB,EAAE,KAAOyB,EAAIzB,CAC1C,CAAI,EAAGsB,CAAM,EAFL,IAG1B,CACA,GAAI,CAAC8F,EAAO,OAEV,OADKD,EAAQ,OACNP,EACL,CAACO,EAAQ,QAAQ,EAAG,IAAO1F,EAAE,MAAQzB,EAAE,KAAOyB,EAAIzB,CAAE,CAAC,EACrDsB,CACF,EAJ4B,KAM9B,IAAMgG,EAAS,KAAK,IAAI,GAAGF,EAAO,IAAK,GAAMJ,EAAE,EAAE,CAAC,EAC5CO,EAASnH,EAAM,EAAE,OAAS,WAAa,GAAM,KAAK,IAAIqD,EAAG,MAAM,EAAI,EACnE+D,EAAUJ,EAAO,OAAQ,GAAMJ,EAAE,IAAMM,EAAS,KAAK,IAAI,EAAGC,CAAM,CAAC,EACnEE,EAAQD,EAAQ,QAAQ,EAAG,IAAO/F,EAAE,GAAKzB,EAAE,GAAKyB,EAAIzB,CAAE,EAEtD0H,EAAQd,EAAQ,CADLa,EAAO,GAAGD,EAAQ,OAAQ,GAAMR,IAAMS,CAAK,EAAG,GAAGN,CAC5C,EAAS7F,CAAM,EAKrC,OAJIoG,IACF,EAAM,EAAI1B,EAAYyB,EAAM,OAAQA,EAAM,KAAK,CAAC,CAAC,EACjD,EAAM,OAASnG,GAAQ,YAAYoG,EAAM,CAAC,GAAK,OAAOA,EAAM,CAAC,GAExDA,CACT,EAGaC,GACX,EACA,IAEA3H,IAAMyB,GACL,CAAC,CAACzB,GACD,CAAC,CAACyB,GACFzB,EAAE,MAAM,SAAWyB,EAAE,MAAM,QAC3BzB,EAAE,MAAM,OACL,EAAI,IACH4H,EAAG,QAAUnG,EAAE,MAAMP,EAAE,CAAC,OACxB0G,EAAG,cAAgBnG,EAAE,MAAMP,EAAE,CAAC,WAClC,EAKE2G,EAA2C,CAC/C,MAAO,UACP,sBAAuB,EACvB,sBAAuB,CACzB,EAmBMC,GAAc,EAAgB,IAClC/E,EAAE,IAAI,UAAUmD,EAAM,EAAE,IAAK,IAAO,CAClC,MAAO,KACP,KAAM7C,EAAE,KACR,MAAOA,EAAE,KACX,EAAE,GAAK,CAAC,EAMG0E,GACX,EACA,EACA,EACA,EAA4B,OACT,CACnB,IAAMC,EAAUxH,GAAQ,aAAe,OACjCyH,EAAY,GAChBlF,EAAE,SACDA,EAAE,QAAU,QACRlC,GAAS,aAAeT,EAAM,IAAI,QAAUA,EAAM,YACnD4H,GACA/F,EAAQ7B,EAAM,OACdqH,EAAQC,EAAM,MAAM,GACpBQ,EAAcT,EAAQrH,EAAM,OAAOqH,EAAM,aAAe,KAC9D,GACEC,EAAM,MAAM,SAAW,GACvBD,GACAS,GAAa,OAAS,OACtBT,EAAM,KAAO,IAAA,IACbrH,EAAM,EAAE,OAAS,OACjB,CAEA,IAAMmC,EAAS0F,EAASC,CAAW,EAEnC,MAAO,CACL,MAFYT,EAAM,OAASC,EAAM,OAGjC,WAAYD,EAAM,MAClB,SACEA,EAAM,QAAU,IAAA,GAEZS,EAAY,KADZ,GAAGR,EAAM,OAAO,KAAKQ,EAAY,OAEvC,KAAM,CACJ,CAAE,MAAO,KAAM,KAAMjG,EAAM,MAAO,MAAOM,EAAOkF,EAAM,EAAE,CAAE,EAC1D,CAAE,MAAO,KAAM,KAAMxF,EAAM,IAAK,MAAOM,EAAOkF,EAAM,CAAC,CAAE,EACvD,CACE,MAAO,KACP,KAAMxF,EAAM,SACZ,MAAO3D,EAAAA,eAAemJ,EAAM,EAAIA,EAAM,GAAIrH,EAAM,MAAM,CACxD,EACA,GAAG0H,EAAWI,EAAaT,EAAM,KAAK,CACxC,CACF,CACF,CACA,GAAIC,EAAM,MAAM,SAAW,GAAKQ,GAAa,OAAS,UAAW,CAC/D,IAAMC,EACJ/H,EAAM,EAAE,OAAS,WACZA,EAAM,EAAE,WAAW,KAAK,MAAMqH,EAAM,CAAC,IAAMO,EAAQP,EAAM,CAAC,EAC3DO,EAAQP,EAAM,CAAC,EACrB,MAAO,CACL,MAAO,GAAGC,EAAM,OAAO,KAAKS,IAC5B,WAAY,KACZ,KAAM,CACJ,CACE,MAAOV,EAAM,MACb,KAAMA,EAAM,OAASS,EAAY,KACjC,MACET,EAAM,QAAU,IAAA,GACZ,KACCS,EAAY,QAAU9H,EAAM,YAAA,CAAaqH,EAAM,KAAK,CAC7D,EACA,GAAGK,EAAWI,EAAaT,EAAM,KAAK,CACxC,CACF,CACF,CAIA,GAHoBC,EAAM,MAAM,MAC7B,GAAOtH,EAAM,OAAOwH,EAAG,YAAY,CAAC,OAAS,SAE5C,GAAeF,EAAM,MAAM,SAAW,EAAG,CAC3C,IAAME,EAAKF,EAAM,MAAM,GACjB3E,EAAI3C,EAAM,OAAOwH,EAAG,aACpBQ,EACJR,EAAG,QAAU,IAAA,GAQT,CAAC,EAPD,CACE,CACE,MAAO,KACP,KAAM7E,EAAE,WAAad,EAAM,MAC3B,OAAQc,EAAE,QAAU3C,EAAM,YAAA,CAAawH,EAAG,KAAK,CACjD,CACF,EAEN,GAAIxH,EAAM,EAAE,OAAS,WAEnB,MAAO,CACL,MAAOwH,EAAG,OAASF,EAAM,OACzB,WAAY,KACZ,KAAM,CACJ,CAAE,MAAOE,EAAG,MAAO,KAAMA,EAAG,WAAY,MAAOK,EAASlF,CAAC,CAAC,CAAC6E,EAAG,CAAC,CAAE,EACjE,GAAGQ,EACH,GAAGN,EAAW/E,EAAG6E,EAAG,KAAK,CAC3B,CACF,EAEF,IAAMS,EACJtF,EAAE,QAAU,QACPlC,GAAS,aAAeT,EAAM,IAAI,QAAUA,EAAM,YACnD4H,EACAjG,EAAqB,CACzB,CAAE,MAAO,KAAM,KAAM3B,EAAM,EAAE,OAAS6B,EAAM,EAAG,MAAOyF,EAAM,MAAO,EACnE,CACE,MAAO,KACP,MACG3E,EAAE,QAAU,QAAU3C,EAAM,IAAI,MAAQA,EAAM,EAAE,QAAU6B,EAAM,EAEnE,OAAQ2F,EAAG,QAAU,IAAA,GAA0BK,EAASlF,CAAC,EAAxBsF,EAAwB,CAAGT,EAAG,CAAC,CAClE,EACA,GAAGQ,EACH,GAAGN,EAAW/E,EAAG6E,EAAG,KAAK,CAC3B,EACA,MAAO,CACL,MAAOA,EAAG,OAASA,EAAG,WACtB,WAAYA,EAAG,MAEf,GAAIA,EAAG,QAAU,IAAA,IAAaxH,EAAM,OAAO,OAAS,EAChD,CAAE,SAAUwH,EAAG,UAAW,EAC1B,CAAC,EACL,MACF,CACF,CACA,IAAM7F,EAAqB,CAAC,EAEtBuG,EAAkB,CAAC,EAEnBC,EACJb,EAAM,MAAM,SAAW,GACvBQ,GAAa,OAAS,OACtB9H,EAAM,EAAE,OAAS,YACjBqH,GAAO,QAAU,IAAA,GACbA,EAAM,MACN,KACN,IAAK,IAAMG,KAAMF,EAAM,MAAO,CAC5B,IAAM3E,EAAI3C,EAAM,OAAOwH,EAAG,aACpBrF,EAAS0F,EAASlF,CAAC,EAEzB,GADAuF,EAAM,KAAKvG,EAAK,MAAM,EAClBgB,EAAE,OAAS,cAAe,CAC5B,IAAMyF,EACJZ,EAAG,OAAS,IAAA,IAAaA,EAAG,OAAS,GAC/BA,EAAG,EAAIA,EAAG,MAAQ,KAAK,IAAIA,EAAG,IAAI,EAAK,IACzC,IACN7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KAAM7E,EAAE,KACR,MAAO,OAAO,SAASyF,CAAM,EACzB,GAAGA,GAAU,EAAI,IAAM,KAAKjK,EAAAA,aAAa6B,EAAM,OAAQyH,CAAc,CAAC,CAAC,OAAOW,EAAS,GAAG,IAC1F,EACN,CAAC,EACD,IAAMC,EAAuC,CAC3C,CAACxG,EAAM,KAAM2F,EAAG,IAAI,EACpB,CAAC3F,EAAM,KAAM2F,EAAG,IAAI,EACpB,CAAC3F,EAAM,IAAK2F,EAAG,GAAG,EAClB,CAAC3F,EAAM,MAAO2F,EAAG,CAAC,CACpB,EACA,IAAK,GAAM,CAAC1F,EAAMtC,KAAM6I,EAClB7I,IAAM,IAAA,IAAa,OAAO,SAASA,CAAC,GACtCmC,EAAK,KAAK,CAAE,MAAO,KAAM,OAAM,MAAOQ,EAAO3C,CAAC,CAAE,CAAC,EAErD,QACF,CACA,GAAImD,EAAE,OAAS,UAAW,CACxB,GAAI6E,EAAG,UAAY,IAAA,GAAW,CAE5B7F,EAAK,KACH,CACE,MAAO6F,EAAG,MACV,KAAMA,EAAG,MAAQ,GAAGA,EAAG,WAAW,KAAKA,EAAG,QAAUA,EAAG,WACvD,MAAO,EACT,EACA,CAAE,MAAO,KAAM,KAAM3F,EAAM,QAAS,MAAOM,EAAOqF,EAAG,OAAO,CAAE,CAChE,EACA,QACF,CACA7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KAAMA,EAAG,MAAQ,GAAGA,EAAG,WAAW,KAAKA,EAAG,QAAUA,EAAG,WACvD,MAAO,EACT,CAAC,EACD,IAAMc,EAAwC,CAC5C,CAACzG,EAAM,IAAK2F,EAAG,IAAI,EACnB,CAAC3F,EAAM,GAAI2F,EAAG,EAAE,EAChB,CAAC3F,EAAM,OAAQ2F,EAAG,CAAC,EACnB,CAAC3F,EAAM,GAAI2F,EAAG,EAAE,EAChB,CAAC3F,EAAM,IAAK2F,EAAG,GAAG,CACpB,EACA,IAAK,GAAM,CAAC1F,EAAMtC,KAAM8I,EAClB9I,IAAM,IAAA,IAAa,OAAO,SAASA,CAAC,GACtCmC,EAAK,KAAK,CAAE,MAAO,KAAM,OAAM,MAAOQ,EAAO3C,CAAC,CAAE,CAAC,EAEjDgI,EAAG,UACL7F,EAAK,KAAK,CACR,MAAO,KACP,KAAME,EAAM,SACZ,MAAO,OAAO2F,EAAG,QAAQ,CAC3B,CAAC,EACH,QACF,CACA,IAAItB,EAAQ/D,EAAOqF,EAAG,CAAC,EACvB,GAAIA,EAAG,KAAO,IAAA,GAAW,CAEvB,IAAM3E,EAAQ2E,EAAG,EAAIA,EAAG,GACxB,EACE7E,EAAE,OAAS,OAAS3C,EAAM,EAAE,OAAS,OACjC,GAAG6C,EAAQ,EAAI,IAAM,KAAKV,EAAOU,CAAK,IACtC,GAAGV,EAAOqF,EAAG,EAAE,EAAE,KAAKrF,EAAOqF,EAAG,CAAC,GACzC,CACA7F,EAAK,KAAK,CACR,MAAO6F,EAAG,MACV,KACEA,EAAG,OAASW,IAAa,KACrB,GAAGX,EAAG,WAAW,KAAKA,EAAG,QACzBA,EAAG,WACT,OACF,CAAC,EACD7F,EAAK,KAAK,GAAG+F,EAAW/E,EAAG6E,EAAG,KAAK,CAAC,CACtC,CACA,GAAIxH,EAAM,QAAS,CAEjB,IAAMuI,EAAS,IAAI,IACnB,IAAK,IAAMf,KAAMF,EAAM,MAAO,CAC5B,IAAMkB,EAAQC,EAAUzI,EAAOwH,EAAG,WAAW,EACzCgB,IAAU,MAAQ,OAAO,SAAShB,EAAG,CAAC,GACxCe,EAAO,IAAIC,GAAQD,EAAO,IAAIC,CAAK,GAAK,GAAK,KAAK,IAAIhB,EAAG,CAAC,CAAC,CAC/D,CACAF,EAAM,MAAM,SAAS,EAAI,IAAM,CAC7B,IAAMkB,EAAQC,EAAUzI,EAAOwH,EAAG,WAAW,EACvCkB,EAAQF,IAAU,KAA2B,IAAA,GAApBD,EAAO,IAAIC,CAAK,EACzCG,EAAMhH,EAAKuG,EAAMzD,IACnBiE,GAASC,GAAO,OAAO,SAASnB,EAAG,CAAC,IAEtC,EAAI,MAAQ,IADGxH,EAAM,OAAOwH,EAAG,YAAY,CAAC,QAAUxH,EAAM,YAAA,CACtCwH,EAAG,CAAC,EAAE,KAAKpJ,EAAAA,cAAe,KAAK,IAAIoJ,EAAG,CAAC,EAAIkB,EAAS,IAAK1I,EAAM,OAAQ,EAAI,IAErG,CAAC,CACH,CACA,MAAO,CAAE,MAAOmI,GAAYb,EAAM,OAAQ,WAAY,KAAM,MAAK,CACnE,EAGMmB,GAAa,EAAmB,IACpCzI,EAAM,OAAO4I,EAAY,CAAC,OAAS,KAAO5I,EAAM,OAAO4I,GAwC5CC,GACX,EACA,EACA,IACgB,CAChB,IAAMC,EAAqB,CAAC,EACtB,CAAE,QAASzF,EACb0F,EAAS,IACTC,EAAS,KACb,IAAK,IAAMxB,KAAMF,EAAM,MAAO,CAC5B,IAAM3E,EAAI3C,EAAM,OAAOwH,EAAG,aAEpByB,EAAMtG,EAAE,KAAK,EAAE6E,EAAG,QAAUA,EAAG,EACrC,GAAI7E,EAAE,OAAS,WAAa6E,EAAG,UAAY,IAAA,GAAW,CACpD,IAAM9E,EAAIhF,EAAAA,SAAS2F,EAAI4F,EAAM9F,EAAWR,CAAC,EAAGuG,EAAevG,EAAG6E,CAAE,CAAC,EACjEsB,EAAM,KAAK,CACT,KAAM,MACN,EAAGpG,EAAE,EACL,EAAGA,EAAE,EACL,KAAMC,EAAE,YAAc,EACtB,MAAO6E,EAAG,MACV,KAAMxJ,EAAAA,MAAM2E,EAAE,cAAc6E,EAAG,QAAU7E,EAAE,MAAO,EAAG,CACvD,CAAC,EACD,QACF,CACA,GAAIA,EAAE,OAAS,OAASA,EAAE,OAAS,eAAiBA,EAAE,OAAS,UAAW,CACxE,IAAMiE,EAAIvD,EAAG,MAAM4F,EAAM9F,EAAWR,CAAC,CAAC,EAChCgB,EAAO,KAAK,IAAIhB,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAG,CAAC,EAC7D,EAAS,KAAK,IAAI0F,EAAQnC,EAAIjD,CAAI,EAClC,EAAS,KAAK,IAAIqF,EAAQpC,EAAIjD,CAAI,EAClC,QACF,CACA,GAAIhB,EAAE,OAAS,UAAW,CACxB,IAAMwG,EAAK9F,EAAG,MAAM4F,CAAG,EACjBG,EAAK/F,EAAG,MAAMmE,EAAG,CAAC,EAClB6B,EAAK,KAAK,IAAI1G,EAAE,SAAS,EAAIU,EAAG,MAAM,EACtCiG,EAAK,KAAK,IAAI3G,EAAE,SAAS,EAAIU,EAAG,MAAM,EACtCkG,EAAOlL,EAAAA,WAAWgF,EAAI8F,EAAKE,EAAIF,EAAKE,EAAID,EAAKE,EAAIF,EAAKE,CAAE,EACxDE,EAAQlL,EAAAA,cAAciL,EAAK,MAAOA,EAAK,OAAQ5G,EAAE,MAAM,EAEvDN,EAAM,KAAK,IAAIrB,EAAK,EAAGuI,EAAK,CAAC,EAC7BE,EAAS,KAAK,IAAIzI,EAAK,EAAIA,EAAK,OAAQuI,EAAK,EAAIA,EAAK,MAAM,EAC5DG,EAAO,KAAK,IAAI1I,EAAK,EAAGuI,EAAK,CAAC,EAC9BI,EAAQ,KAAK,IAAI3I,EAAK,EAAIA,EAAK,MAAOuI,EAAK,EAAIA,EAAK,KAAK,EAC3DE,EAASpH,GACXyG,EAAM,KAAK,CACT,KAAM,QACN,EAAG9H,EAAK,EACR,EAAGqB,EACH,MAAOrB,EAAK,MACZ,OAAQyI,EAASpH,CACnB,CAAC,EACCsH,EAAQD,GACVZ,EAAM,KAAK,CACT,KAAM,QACN,EAAGY,EACH,EAAG1I,EAAK,EACR,MAAO2I,EAAQD,EACf,OAAQ1I,EAAK,MACf,CAAC,EACH,IAAMmF,EAASxD,EAAE,aAAa6E,EAAG,OAC3BoC,EAAOzD,EAASlI,EAAAA,YAAYkI,CAAM,EAAIxD,EAAE,MAC9CmG,EAAM,KAAK,CACT,KAAM,OACN,EAAGS,EAAK,EAAIC,EAAM,MAClB,EAAGD,EAAK,EAAIC,EAAM,MAClB,MAAO,KAAK,IAAI,EAAGD,EAAK,MAAQC,EAAM,MAAQ,CAAC,EAC/C,OAAQ,KAAK,IAAI,EAAGD,EAAK,OAASC,EAAM,MAAQ,CAAC,EACjD,MAAOhC,EAAG,MACV,KAAMqC,EAAaD,CAAI,EACvB,OAAQJ,EAAM,MAChB,CAAC,EACD,QACF,CACA,GAAM,CAAE,KAAI,MAAOpG,EAAQT,EAAG6E,EAAG,MAAOnE,CAAE,EAC1C,GACES,EAAK9C,EAAK,EAAI,GACd8C,EAAK9C,EAAK,EAAIA,EAAK,MAAQ,GAC3B+C,EAAK/C,EAAK,EAAI,GACd+C,EAAK/C,EAAK,EAAIA,EAAK,OAAS,EAE5B,SAEF,IAAMkC,EACJP,EAAE,OAAS,UACP+B,EAAQ/B,EAAG6E,EAAG,KAAK,EAAI,EACvB,KAAK,IAAI,EAAG7E,EAAE,UAAY,EAAI,CAAC,EAC/BmH,EAAOnH,EAAE,cAAc6E,EAAG,QAAU7E,EAAE,MAC5CmG,EAAM,KAAK,CACT,KAAM,MACN,EAAGhF,EACH,EAAGC,EACH,OACA,MAAOyD,EAAG,MACV,KAAMxJ,EAAAA,MAAM8L,EAAM,EAAG,CACvB,CAAC,CACH,CACA,GAAId,EAASD,EAAQ,CAEnB,IAAMgB,EAAM,KAAK,IAAI,GAAIf,EAASD,GAAU,GAAI,EAC1CiB,EAAK3G,EAAG,WAAarC,EAAK,EAAIA,EAAK,EACnCiJ,EAAKD,GAAM3G,EAAG,WAAarC,EAAK,OAASA,EAAK,OAC9CpB,EAAI,KAAK,IAAIoK,EAAIjB,EAASgB,CAAG,EAC7B1I,EAAI,KAAK,IAAI4I,EAAIjB,EAASe,CAAG,EAC/B1I,EAAIzB,GACNkJ,EAAM,QAAQ,CACZ,KAAM,OACN,GAAIzF,EAAG,WACH,CAAE,EAAGrC,EAAK,EAAG,EAAGpB,EAAG,MAAOoB,EAAK,MAAO,OAAQK,EAAIzB,CAAE,EACpD,CAAE,EAAGA,EAAG,EAAGoB,EAAK,EAAG,MAAOK,EAAIzB,EAAG,OAAQoB,EAAK,MAAO,CAC3D,CAAC,CAEL,CACA,OAAO8H,CACT,EAGae,EAAgB,GAC3BtL,EAAAA,UAAUqL,CAAI,EAAI,IACd,yBACA,2BAGAV,GAAkB,EAAgB,IAA+B,CACrE,IAAM1H,EAAMmB,EAAE,IAAI,WAAW6E,EAAG,OAC1B/C,EAAIjD,EAAMA,EAAI,QAAQgG,EAAG,SAAW,GAAG,EAAI,GACjD,OACG/C,GAAK,EAAI9B,EAAE,KAAK,WAAW6E,EAAG,MAAM,GAAG/C,GAAK,IAAA,KAAc+C,EAAG,SAAW,CAE7E,EAiBa0C,GACX,EACA,IACuB,CACvB,IAAM5D,EAA0B,CAAC,EACjC,IAAK,IAAM3D,KAAK3C,EAAM,OAAQ,CAC5B,IAAM4G,EAAIjE,EAAE,UACZ,GAAI,CAACiE,GAAKjE,EAAE,QAAUA,EAAE,OAAS,OAAS,CAACA,EAAE,OAAQ,SACrD,GAAM,CAAE,IAAG,SAAUA,EAAE,KACjBN,EAAMM,EAAE,OACRgB,EAAOhB,EAAE,aACT,CAACwH,EAAIC,GACT/G,EAAG,KAAK,EAAE,IAAMA,EAAG,KAAK,EAAE,GAAKA,EAAG,KAAK,EAAI,CAACA,EAAG,KAAK,EAAE,GAAIA,EAAG,KAAK,EAAE,EAAE,EAClExD,EAAQ7B,EAAAA,MAAM4I,EAAE,MAAO,GAAI,EAC7ByD,EAAO,GACX,IAAK,IAAIvJ,EAAI,EAAGA,EAAIS,GAAS+E,EAAI,OAAA,KAA+B,IAC9D,GAAK,OAAO,SAASjE,EAAIvB,EAAE,GAAM,OAAO,SAASrB,EAAEqB,EAAE,EACrD,IAAIuJ,GAAQ,GAAK5K,EAAEqB,GAAK6C,GAAQwG,GAAM1K,EAAE4K,GAAQ1G,GAAQyG,EAAI,CAC1D,IAAMxK,EAAIlC,EAAAA,SAAS2F,EAAI5D,EAAE4K,GAAQ1H,EAAE,UAAYgB,EAAMtB,EAAIgI,EAAK,EACxDhJ,EAAI3D,EAAAA,SAAS2F,EAAI5D,EAAEqB,GAAK6B,EAAE,UAAYgB,EAAMtB,EAAIgI,EAAK,EAC3D/D,EAAI,KAAK,CACP,GAAI1G,EAAE,EACN,GAAIA,EAAE,EACN,GAAIyB,EAAE,EACN,GAAIA,EAAE,EACN,QACA,MAAOuF,EAAE,MACT,KAAMA,EAAE,IACV,CAAC,CACH,CACA,EAAO9F,CADP,CAGJ,CACA,OAAOwF,CACT,EAUagE,GACX,EACA,IACyB,CACzB,IAAMlL,EAAUC,EAAM,SAAWJ,EAC3BsL,EAAQvM,EAAAA,MAAMqB,EAAM,UAAW,GAAI,EACzC,OAAQmL,GAAgB,CAAC,EAAA,CAAG,IAAK,IAAO,CACtC,KAAMvH,EAAE,KACR,GAAIA,EAAE,GACN,MAAOA,EAAE,MAAQjF,EAAAA,MAAMoB,EAAQ6D,EAAE,MAAO5D,EAAM,SAAS,CAAC,EAAIkL,CAC9D,EAAE,CACJ,EAoBaE,EAAa,CAAE,OAAQ,EAAG,KAAM,GAAI,EAc3CC,GAAY,EAAmB,IAAqC,CACxE,IAAM/I,EAAO,IAAI,IACjB,IAAK,IAAMgB,KAAK3C,EAAM,OAAQ,CAE5B,GADI2C,EAAE,QAAU,CAACA,EAAE,SACfA,EAAE,OAAS,OAASA,EAAE,OAAS,UAAW,SAC9C,GAAM,CAAE,IAAG,IAAG,SAAUA,EAAE,KACpBgI,EAAMhI,EAAE,OAAS,OAASA,EAAE,SAAWA,EAAE,OACzCgB,EAAOgH,EAAMhI,EAAE,aAAe,KAAK,IAAIU,EAAG,MAAM,EAAIqB,EAAQ/B,EAAG,CAAC,EAAI,EAC1E,IAAK,IAAI7B,EAAI,EAAGA,EAAIS,EAAO,IAAK,CAC9B,IAAMkD,EAAI,KAAK,MAAMhF,EAAEqB,EAAE,EACzB,GAAIa,EAAK,IAAI8C,CAAC,EAAG,SACjB,IAAMmG,EAAQD,EAAMhI,EAAE,QAAS7B,GAAKxB,EAAEwB,GAChC+J,EAAMF,EAAMhI,EAAE,OAAQ7B,GAAKxB,EAAEwB,GAC9B,OAAO,SAAS8J,CAAK,GAAM,OAAO,SAASC,CAAG,GACnDlJ,EAAK,IAAI8C,EAAG,CACV,GAAIhF,EAAEqB,GAAKqC,EAAWR,CAAC,EACvB,MAAO,KAAK,IAAIiI,EAAOC,CAAG,EAC1B,IAAK,KAAK,IAAID,EAAOC,CAAG,EACxB,OACA,IAAK,CAACF,CACR,CAAC,CACH,CACF,CACA,OAAOhJ,CACT,EAOamJ,GACX,EACA,EACA,IACsB,CACtB,GAAI,CAACN,EAAa,QAAUxK,EAAM,EAAE,OAAS,WAAY,MAAO,CAAC,EACjE,IAAM2B,EAAO+I,EAAS1K,EAAOqD,CAAE,EACzByC,EAAQ,IAAI,IAClB9F,EAAM,EAAE,WAAW,SAAS,EAAG,IAAM,CAC9B8F,EAAM,IAAIc,CAAC,GAAGd,EAAM,IAAIc,EAAG9F,CAAC,CACnC,CAAC,EAED,IAAMiK,EAAa1H,EAAG,WAChB2H,GAAM,EAAW,IACrBD,EAAa,CAAE,EAAGvL,EAAG,EAAGoH,CAAE,EAAI,CAAE,EAAGA,EAAG,EAAGpH,CAAE,EACvCyL,EAAW,GAAkB,CACjC,IAAMvI,EAAIhF,EAAAA,SAAS2F,EAAI,EAAG6C,CAAK,EAC/B,OAAO6E,EAAarI,EAAE,EAAIA,EAAE,CAC9B,EACMwI,EAAc,GAAe,CACjC,IAAMxI,EAAIhF,EAAAA,SAAS2F,EAAI4B,EAAI,CAAC,EAC5B,OAAO8F,EAAarI,EAAE,EAAIA,EAAE,CAC9B,EACMyI,EAAM,KAAK,KAAKF,EAAQ5H,EAAG,KAAK,EAAE,EAAE,EAAI4H,EAAQ5H,EAAG,KAAK,EAAE,EAAE,CAAC,GAAK,EAClE+H,EAAQ,KAAK,IAAIF,EAAW,CAAC,EAAIA,EAAW,CAAC,CAAC,EAC9C,CAAE,SAAQ,QAAST,EAEnBnE,EAAyB,CAAC,EAChC,IAAK,IAAMrD,KAAKuH,EAAc,CAC5B,IAAM5K,EAAI+B,EAAK,IAAImE,EAAM,IAAI7C,EAAE,IAAI,GAAK,GAAG,EACrC5B,EAAIM,EAAK,IAAImE,EAAM,IAAI7C,EAAE,EAAE,GAAK,GAAG,EACzC,GAAI,CAACrD,GAAK,CAACyB,GAAKzB,IAAMyB,EAAG,SACzB,IAAMgK,EAAKJ,EAAQrL,EAAE,GAAG,GAAKA,EAAE,IAAMuL,EAAMvL,EAAE,KAAO,GAC9C0L,EAAKJ,EAAWtL,EAAE,EAAE,EACpB2L,EAAKN,EAAQ5J,EAAE,KAAK,EAAI8J,GAAO9J,EAAE,IAAMA,EAAE,KAAO,EAAI,GACpDmK,EAAKN,EAAW7J,EAAE,EAAE,EACpBoK,EAAOF,EAAKJ,EAAMO,EAClBC,EAAS,CAACX,EAAGK,EAAIC,CAAE,CAAC,EACpBM,EAAOP,EAAKF,EAAM,EACxB,GAAIA,GAAOM,EAAOG,IAAS,EAEzBD,EAAO,KAAKX,EAAGY,EAAMN,CAAE,EAAGN,EAAGY,EAAMJ,CAAE,EAAGR,EAAGS,EAAMD,CAAE,CAAC,MAC/C,CAGL,IAAMK,EAAUP,GADH,KAAK,KAAKE,EAAKF,CAAE,GAAK,GACP,KAAK,IAAI1L,EAAE,KAAO,EAAGwL,EAAQ,CAAC,EACpDU,EAAOL,EAAON,EAAM,EAC1BQ,EAAO,KACLX,EAAGY,EAAMN,CAAE,EACXN,EAAGY,EAAMC,CAAO,EAChBb,EAAGc,EAAMD,CAAO,EAChBb,EAAGc,EAAMN,CAAE,EACXR,EAAGS,EAAMD,CAAE,CACb,CACF,CACAlF,EAAI,KAAK,CACP,SACA,KAAM,CAAC0E,EAAGO,EAAIC,CAAE,EAAGR,EAAGS,EAAMD,EAAK7H,CAAI,EAAGqH,EAAGS,EAAMD,EAAK7H,CAAI,CAAC,EAC3D,MAAOV,EAAE,MACT,MAAO,IACT,CAAC,CACH,CACA,OAAOqD,CACT,EAWMyF,EAAc,GAMPC,EAAe,GAA0C,CACpE,GAAI,CAAChM,EAAM,OAAO,QAAUA,EAAM,OAAO,KAAM,GAAM2C,EAAE,OAAS,SAAS,EACvE,OAAO,KACT,IAAMA,EAAI3C,EAAM,OAAO,KAAM,GAAO,CAACwH,EAAG,QAAUA,EAAG,QAAQ,EACvDyE,EAAMtJ,GAAG,SACf,GAAI,CAACA,GAAK,CAACsJ,EAAK,OAAO,KACvB,IAAMC,EAAkB,CAAC,EACzB,IAAK,IAAIzH,EAAI,EAAGA,EAAIsH,EAAa,IAAK,CACpC,IAAM5F,EAAS8F,EAAI,KAAK,MAAOxH,EAAK,IAAqBwH,EAAI,OAAS,EAAE,GACxEC,EAAM,KAAKlO,EAAAA,MAAMC,EAAAA,YAAYkI,GAAU,CAAC,CAAC,CAAC,CAC5C,CACA,IAAMhE,EAASQ,EAAE,QAAU3C,EAAM,YAC3B,CAACgK,EAAIC,GAAMtH,EAAE,WACbX,EAAS,CACb,CAAE,GAAI,EAAG,KAAMG,EAAO6H,CAAE,CAAE,EAC1B,CAAE,GAAI,EAAG,KAAM7H,EAAO8H,CAAE,CAAE,CAC5B,EACMkC,EAAMxJ,EAAE,cAGd,OAFIwJ,IAAQ,MAAQA,EAAMnC,GAAMmC,EAAMlC,GACpCjI,EAAO,OAAO,EAAG,EAAG,CAAE,GAAI,GAAK,KAAMG,EAAOgK,CAAG,CAAE,CAAC,EAC7C,CAAE,YAAaxJ,EAAE,MAAO,QAAO,QAAO,CAC/C,EAGayJ,GACX,EACA,EACA,IAEAC,IAAW,IAAA,GAAYC,EAAQ,GAAKN,EAAYhM,CAAK,IAAM,KAAO,CAAC,CAACqM,EAGzDE,EACX,GAEAC,IAAS,UAAY,MAAQA,IAAS,OAAS,OAAS,SAG7CC,GACX,EACA,EACA,IAEAC,IACC1M,EAAM,cAAgB,QACrBsH,EAAM,MAAM,KAAM,GAAO,CACvB,IAAMkF,EAAOxM,EAAM,OAAOwH,EAAG,YAAY,CAAC,KAC1C,OAAOgF,IAAS,QAAUA,IAAS,MACrC,CAAC,GAED,CAAClF,EAAM,MAAM,KAAM,GAAO,CACxB,IAAMkF,EAAOxM,EAAM,OAAOwH,EAAG,YAAY,CAAC,KAC1C,OAAOgF,IAAS,OAASA,IAAS,eAAiBA,IAAS,SAC9D,CAAC,GAGQG,GACX,EACA,EACA,EACA,IACkB,CAClB,GAAI,CAACF,EAAezM,EAAOsH,EAAOoF,CAAS,EAAG,OAAO,KACrD,IAAMrF,EAAQC,EAAM,MAAM,GACpBV,EAAIvD,EAAG,MACXrD,EAAM,OAAOqH,EAAM,YAAY,EAAE,KAAK,EAAEA,EAAM,QAC5C7I,EAAAA,QAAQwB,EAAOqH,EAAM,CAAC,CAC1B,EACM2C,EAAK3G,EAAG,WAAaA,EAAG,KAAK,EAAIA,EAAG,KAAK,EACzC4G,EAAKD,GAAM3G,EAAG,WAAaA,EAAG,KAAK,OAASA,EAAG,KAAK,OAC1D,OAAOuD,GAAKoD,GAAMpD,GAAKqD,EAAKrD,EAAI,IAClC"}
1
+ {"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","tickFormatter","toScreen","plottedY","alongX","alongY","toData","nearestIndex","toCss","unpackColor","formatDuration","numberFormat","formatPercent","screenRect","heatCellStyle","luminance","toPlotX","require_color","require_data","require_layout","require_locale","require_format","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","y","mapY","v","x","mapX","annotations","a","color","layoutChart","input","model","layoutHorizontal","yCount","height","yTicks","view","yLabelWidth","label","measure","y2Ticks","rightTicks","y2LabelWidth","categoryWidth","step","i","padding","plot","xCount","xTicks","axis","map","b","ticks","count","raw","maxAbs","tick","rows","xLabelWidth","names","name","collectPointLabels","labels","axisFormat","series","format","texts","top","x0","x1","xv","reversed","p","s","y0","delta","text","xi","yi","d","size","slotOffset","pointOf","sc","onColumn","pa","pb","ax","center","half","ay","candidateOf","px","py","inside","high","low","outlierAt","list","reach","slop","best","bestDist","k","dotSize","maxSizes","maxDot","sizes","max","nearestScatter","radius","at","rx","ry","cellAt","hx","hy","found","yv","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","value","packed","q1","q3","out","outliers","eventOf","candidates","items","item","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","CHANGE_PERCENT","detailRows","tooltipContent","yFormat","formatOf","firstSeries","yName","valueRow","yAxisFormat","rowOf","binTitle","change","ohlc","stats","totals","stack","stackIdOf","total","row","seriesIndex","hoverMarks","marks","bandLo","bandHi","itX","plottedOutlier","cx","cy","hw","hh","cell","style","bottom","left","right","fill","contrastRing","rgba","pad","lo","hi","connectorSegments","v0","v1","prev","resolveDependencies","muted","dependencies","ARROW_HEAD","taskIndex","categories","ids","id","bar","offset","start","end","p0","valuePx","p1","box","categoryPx","ARROW_RUN","ARROW_CLEARANCE","blockedLanes","boxes","q","r","last","lanes","freeLane","from","along","dir","to","nearestLane","hit","want","straighten","same","points","routeArrow","ca","cb","exit","ev","room","base","lane","side","key","stops","back","m","dependencyArrows","horizontal","pt","tasks","find","sv","length","route","COLOR_STOPS","colorLegend","lut","mid","legendShown","option","named","legendShape","type","showsCrosshair","crosshair","crosshairAt"],"sources":["../../../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { luminance, mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatDuration, formatPercent, tickFormatter } from \"./format\";\nimport { numberFormat } from \"./locale\";\nimport {\n alongX,\n alongY,\n computePlot,\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n gridOf,\n plottedY,\n toPlotX,\n type ChartModel,\n type SeriesModel,\n} from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type { Range } from \"./viewport\";\nimport type {\n ChartAnnotation,\n ChartDependency,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/**\n * Annotation colors resolved against the theme; `mapY` / `mapX` turn values\n * into plotted units (log axes)\n */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n mapY?: (value: number) => number,\n mapX?: (value: number) => number,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const y = <T extends number | undefined>(v: T): T =>\n (mapY && v !== undefined ? mapY(v) : v) as T;\n const x = <T extends number | undefined>(v: T): T =>\n (mapX && v !== undefined ? mapX(v) : v) as T;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: x(a.x0),\n x1: x(a.x1),\n y0: y(a.y0),\n y1: y(a.y1),\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: x(a.x),\n y: y(a.y),\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.axis === \"y\" ? y(a.value) : x(a.value),\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n /** Ticks of the right axis: at the left tick positions, labelled in right axis units */\n y2Ticks: AxisTicks | null;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n if (model.horizontal) return layoutHorizontal(input);\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n const y2Ticks = rightTicks(model, yTicks, view.y, yCount);\n let y2LabelWidth = 0;\n if (y2Ticks && model.y2?.visible) {\n for (const label of y2Ticks.labels)\n y2LabelWidth = Math.max(y2LabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n y2LabelWidth: Math.ceil(y2LabelWidth),\n y2Title: !!model.y2?.title && !!model.y2.visible,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks, y2Ticks };\n};\n\n/**\n * Right axis ticks: the left ticks labelled in right axis units; log axes\n * get their own decades\n */\nconst rightTicks = (\n model: ChartModel,\n yTicks: AxisTicks,\n view: Range,\n count: number,\n): AxisTicks | null => {\n const axis = model.y2;\n const map = model.y2Map;\n if (!axis || !map || !map.scale) return null;\n if (map.log) {\n const a = (view[0] - map.offset) / map.scale;\n const b = (view[1] - map.offset) / map.scale;\n const ticks = axisTicks(axis, [Math.min(a, b), Math.max(a, b)], count);\n return {\n ...ticks,\n values: ticks.values.map((e) => e * map.scale + map.offset),\n };\n }\n const raw = yTicks.values.map((v) => (v - map.offset) / map.scale);\n const step = raw.length > 1 ? Math.abs(raw[1] - raw[0]) : 1;\n let maxAbs = 0;\n for (const v of raw) maxAbs = Math.max(maxAbs, Math.abs(v));\n const tick = axis.format ?? tickFormatter(step, maxAbs, model.locale);\n return {\n values: yTicks.values,\n labels: raw.map(tick),\n formatValue: axis.format ?? model.formatValue,\n };\n};\n\n/** Horizontal charts: the x axis on the left, the values along the bottom */\nconst layoutHorizontal = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n const rows = Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)));\n const xCount =\n model.x.tickCount ??\n (model.x.type === \"category\"\n ? rows\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n let xLabelWidth = 0;\n if (model.x.visible) {\n if (model.x.type === \"category\") {\n // every name (the visible ones change when zooming)\n const names = model.x.categories;\n const step = Math.max(1, Math.floor(names.length / 200));\n for (let i = 0; i < names.length; i += step) {\n const name = model.x.format ? model.x.format(i) : names[i];\n xLabelWidth = Math.max(xLabelWidth, measure(name));\n }\n } else {\n for (const label of xTicks.labels)\n xLabelWidth = Math.max(xLabelWidth, measure(label));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.x.visible ? Math.ceil(xLabelWidth) : 0,\n xAxisVisible: model.y.visible,\n xTitle: !!model.y.title && model.y.visible,\n yTitle: !!model.x.title && model.x.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / 60))\n : Math.max(3, Math.min(8, Math.floor(plot.width / 88))));\n const yTicks = axisTicks(model.y, view.y, yCount);\n const scales = createScales(\n plot,\n view,\n model.x.reverse,\n model.y.reverse,\n true,\n );\n return { plot, scales, xTicks, yTicks, y2Ticks: null };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? model.formatValue\n : (yTicks?.formatValue ?? model.formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n // 100% stacks and right axis series: the values of the data\n const format =\n series.format ??\n (series.yAxis === \"right\"\n ? (model.y2?.format ?? model.formatValue)\n : axisFormat);\n const { x, count } = series.cols;\n const { y, y0, labels: texts } = series.raw;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n // the end away from the base (the top, or the bottom of negative bars)\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n const reversed = negative !== model.y.reverse;\n const p = toScreen(s, xv, top[i]);\n const step = series.floating && y0 && Number.isFinite(y0[i]);\n // ranges on a time axis (Gantt tasks) have no value to write\n if (step && model.y.type === \"time\" && !texts?.[i]) continue;\n const delta = step ? y[i] - (y0?.[i] ?? 0) : 0;\n labels.push({\n x: p.x,\n y: p.y,\n r: 0,\n text:\n texts?.[i] ??\n (step ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}` : format(y[i])),\n placement: s.horizontal\n ? reversed\n ? \"left\"\n : \"right\"\n : reversed\n ? \"below\"\n : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n const p = toScreen(s, xi, yi);\n labels.push({ x: p.x, y: p.y, r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n /** Distance along the x axis */\n dx: number;\n dist: number;\n inside: boolean;\n /** Box plots: value of the outlier under the pointer */\n outlier?: number;\n}\n\n/** Bars and box plots sit in a slot of their category */\nconst slotOffset = (s: SeriesModel) =>\n s.type === \"bar\" || s.type === \"boxplot\" ? s.barOffset : 0;\n\n/**\n * Screen position of a point (the end of a bar or stack, the close of a\n * candle, the median of a box)\n */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const p = toScreen(sc, s.cols.x[i] + slotOffset(s), plottedY(s, i));\n return { px: p.x, py: p.y };\n};\n\n/** Whether a pixel (along x, along y) is on a column from `a` to `b` */\nconst onColumn = (\n sc: Scales,\n center: number,\n half: number,\n a: number,\n b: number,\n ax: number,\n ay: number,\n) => {\n const pa = sc.yToPx(a);\n const pb = sc.yToPx(b);\n return (\n Math.abs(ax - center) <= half &&\n ay >= Math.min(pa, pb) - 2 &&\n ay <= Math.max(pa, pb) + 2\n );\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n const ax = alongX(sc, px, py);\n const ay = alongY(sc, px, py);\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n let inside = false;\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const half = s.barHalfWidth / Math.abs(sc.xPerPx);\n inside = onColumn(sc, center, half, s.barBase[i], s.barTop[i], ax, ay);\n } else if (s.type === \"candlestick\" || s.type === \"boxplot\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 3);\n const a = high ? high[i] : y[i];\n const b = low ? low[i] : y[i];\n inside = onColumn(sc, center, half, a, b, ax, ay);\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - ax),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Outlier of a box under a pixel (`undefined` when none is in reach) */\nconst outlierAt = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n): number | undefined => {\n const list = s.cols.outliers?.[i];\n if (!list) return undefined;\n const center = sc.xToPx(s.cols.x[i] + slotOffset(s));\n const ax = alongX(sc, px, py) - center;\n const ay = alongY(sc, px, py);\n const reach = s.outlierSize / 2 + 4 + slop;\n let best: number | undefined;\n let bestDist = reach;\n list.forEach((v, k) => {\n const d = Math.hypot(ax, sc.yToPx(v) - ay);\n if (d <= bestDist) {\n bestDist = d;\n // the value of the data (right axis series are mapped)\n best = s.raw.outliers?.[i]?.[k] ?? v;\n }\n });\n return best;\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst maxSizes = new WeakMap<Float32Array, number>();\n\n/** Largest dot of a series (bubbles reach further than plain dots) */\nconst maxDot = (s: SeriesModel) => {\n const sizes = s.cols.size;\n if (!sizes) return s.pointSize;\n let max = maxSizes.get(sizes);\n if (max === undefined) {\n max = s.pointSize;\n for (let i = 0; i < sizes.length; i++) if (sizes[i] > max) max = sizes[i];\n maxSizes.set(sizes, max);\n }\n return max;\n};\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(maxDot(s) / 2 + 6, 10) + slop;\n const at = toData(sc, px, py);\n const rx = radius * Math.abs(sc.xPerPx);\n const ry = radius * Math.abs(sc.yPerPx);\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(at.x - rx, at.x + rx, at.y - ry, at.y + ry, (i) => {\n const p = toScreen(sc, x[i], y[i]);\n const d = Math.hypot(p.x - px, p.y - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point (values of the data, right axis included) */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const { open, high, low, value, y0, q1, q3, outliers, labels } = s.raw;\n const label = labels?.[index];\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.raw.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.raw.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n } else if (s.type === \"boxplot\") {\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n if (q1 && Number.isFinite(q1[index])) extra.q1 = q1[index];\n if (q3 && Number.isFinite(q3[index])) extra.q3 = q3[index];\n const out = outliers?.[index];\n if (out) extra.outliers = out.length;\n } else {\n if (y0 && Number.isFinite(y0[index])) extra.y0 = y0[index];\n if (s.type === \"scatter\" && value && Number.isFinite(value[index]))\n extra.value = value[index];\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.raw.x[index],\n y: s.raw.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => {\n const item = hoverItemOf(c.series, c.index);\n if (c.outlier !== undefined) item.outlier = c.outlier;\n return item;\n });\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const at = toData(sc, px, py);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || !s.tooltip || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, at.x, at.y);\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, at.x);\n if (i < 0) continue;\n const c = candidateOf(s, i, px, py, sc);\n if (s.type === \"boxplot\") {\n c.outlier = outlierAt(s, i, px, py, sc, slop);\n if (c.outlier !== undefined) {\n c.inside = true;\n c.dist = 0;\n }\n }\n others.push(c);\n }\n }\n if (model.tooltipMode === \"item\") {\n // the shape under the pointer only: bars, boxes, cells, dots in reach\n // and lines within a few pixels; the last drawn wins\n const all = [...scatter, ...others].filter(\n (c) =>\n c.inside ||\n c.series.type === \"scatter\" ||\n ((c.series.type === \"line\" || c.series.type === \"area\") &&\n c.dist <= 8 + slop),\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) =>\n b.dist < a.dist || (b.dist === a.dist && b.series.index > a.series.index)\n ? b\n : a,\n );\n return eventOf([best], xTicks);\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / Math.abs(sc.xPerPx) : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\n/** Change of a candlestick: `+1.25%` */\nconst CHANGE_PERCENT: Intl.NumberFormatOptions = {\n style: \"percent\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point, Gantt task) */\n titleColor: string | null;\n /** Muted line below the title (the group of a Gantt task) */\n subtitle?: string;\n rows: TooltipRow[];\n}\n\n/** Extra rows of a point (`details` of its datum) */\nconst detailRows = (s: SeriesModel, index: number): TooltipRow[] =>\n s.raw.details?.[index]?.map((d) => ({\n color: null,\n name: d.name,\n value: d.value,\n })) ?? [];\n\n/**\n * Default tooltip content of a hover payload; `y2Ticks` formats the values\n * of the right axis series\n */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n y2Ticks: AxisTicks | null = null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const formatOf = (s: SeriesModel) =>\n s.format ??\n (s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat);\n const names = model.labels;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (\n event.items.length === 1 &&\n first &&\n firstSeries?.type === \"bar\" &&\n first.y0 !== undefined &&\n model.y.type === \"time\"\n ) {\n // a task of a Gantt chart / timeline: its dates and its length\n const format = formatOf(firstSeries);\n const title = first.label ?? event.xLabel;\n return {\n title,\n titleColor: first.color,\n subtitle:\n first.label !== undefined\n ? `${event.xLabel} · ${firstSeries.name}`\n : firstSeries.name,\n rows: [\n { color: null, name: names.start, value: format(first.y0) },\n { color: null, name: names.end, value: format(first.y) },\n {\n color: null,\n name: names.duration,\n value: formatDuration(first.y - first.y0, model.locale),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? model.formatValue)(first.value),\n },\n ...detailRows(firstSeries, first.index),\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const s = model.series[it.seriesIndex];\n const valueRow: TooltipRow[] =\n it.value !== undefined\n ? [\n {\n color: null,\n name: s.valueName ?? names.value,\n value: (s.format ?? model.formatValue)(it.value),\n },\n ]\n : [];\n if (model.x.type === \"category\") {\n // a dot on a category (Gantt milestones, dot plots)\n return {\n title: it.label ?? event.xLabel,\n titleColor: null,\n rows: [\n { color: it.color, name: it.seriesName, value: formatOf(s)(it.y) },\n ...valueRow,\n ...detailRows(s, it.index),\n ],\n };\n }\n const yAxisFormat =\n s.yAxis === \"right\"\n ? (y2Ticks?.formatValue ?? model.y2?.format ?? model.formatValue)\n : yFormat;\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? names.x, value: event.xLabel },\n {\n color: null,\n name:\n (s.yAxis === \"right\" ? model.y2?.title : model.y.title) ?? names.y,\n // bubbles: `format` is the one of their value, y keeps the axis one\n value: (it.value !== undefined ? yAxisFormat : formatOf(s))(it.y),\n },\n ...valueRow,\n ...detailRows(s, it.index),\n ];\n return {\n title: it.label ?? it.seriesName,\n titleColor: it.color,\n // a named point of a group: the group under its name\n ...(it.label !== undefined && model.series.length > 1\n ? { subtitle: it.seriesName }\n : {}),\n rows,\n };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n // one labelled bar on a numeric axis (a histogram bin): the label is the title\n const binTitle =\n event.items.length === 1 &&\n firstSeries?.type === \"bar\" &&\n model.x.type !== \"category\" &&\n first?.label !== undefined\n ? first.label\n : null;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n const format = formatOf(s);\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${numberFormat(model.locale, CHANGE_PERCENT).format(change / 100)}`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [names.open, it.open],\n [names.high, it.high],\n [names.low, it.low],\n [names.close, it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n continue;\n }\n if (s.type === \"boxplot\") {\n if (it.outlier !== undefined) {\n // an outlier: its value and its group\n rows.push(\n {\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n },\n { color: null, name: names.outlier, value: format(it.outlier) },\n );\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: \"\",\n });\n const stats: [string, number | undefined][] = [\n [names.max, it.high],\n [names.q3, it.q3],\n [names.median, it.y],\n [names.q1, it.q1],\n [names.min, it.low],\n ];\n for (const [name, v] of stats) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: format(v) });\n }\n if (it.outliers)\n rows.push({\n color: null,\n name: names.outliers,\n value: String(it.outliers),\n });\n continue;\n }\n let value = format(it.y);\n if (it.y0 !== undefined) {\n // waterfall steps: the change; time ranges and bands: both ends\n const delta = it.y - it.y0;\n value =\n s.type === \"bar\" && model.y.type !== \"time\"\n ? `${delta > 0 ? \"+\" : \"\"}${format(delta)}`\n : `${format(it.y0)} – ${format(it.y)}`;\n }\n rows.push({\n color: it.color,\n name:\n it.label && binTitle === null\n ? `${it.seriesName} · ${it.label}`\n : it.seriesName,\n value,\n });\n rows.push(...detailRows(s, it.index));\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? model.formatValue;\n row.value = `${format(it.y)} · ${formatPercent((Math.abs(it.y) / total) * 100, model.locale, true)}`;\n }\n });\n }\n return { title: binTitle ?? event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | {\n /** Soft band over the row / column of a hovered cell (above the data) */\n kind: \"guide\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n /** The hovered cell, lifted, with a ring inside its edge */\n kind: \"cell\";\n x: number;\n y: number;\n width: number;\n height: number;\n /** Fill of the cell (CSS) */\n color: string;\n /** Ring color (CSS), contrasting with the fill */\n ring: string;\n radius: number;\n };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n // plotted x (the logarithm on log x axes)\n const itX = s.cols.x[it.index] ?? it.x;\n if (s.type === \"boxplot\" && it.outlier !== undefined) {\n const p = toScreen(sc, itX + slotOffset(s), plottedOutlier(s, it));\n marks.push({\n kind: \"dot\",\n x: p.x,\n y: p.y,\n size: s.outlierSize + 3,\n color: it.color,\n halo: toCss(s.pointColors?.[it.index] ?? s.color, 0.2),\n });\n continue;\n }\n if (s.type === \"bar\" || s.type === \"candlestick\" || s.type === \"boxplot\") {\n const c = sc.xToPx(itX + slotOffset(s));\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n bandLo = Math.min(bandLo, c - half);\n bandHi = Math.max(bandHi, c + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(itX);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const cell = screenRect(sc, cx - hw, cx + hw, cy - hh, cy + hh);\n const style = heatCellStyle(cell.width, cell.height, s.radius);\n // the row and the column, clipped to the plot\n const top = Math.max(plot.y, cell.y);\n const bottom = Math.min(plot.y + plot.height, cell.y + cell.height);\n const left = Math.max(plot.x, cell.x);\n const right = Math.min(plot.x + plot.width, cell.x + cell.width);\n if (bottom > top)\n marks.push({\n kind: \"guide\",\n x: plot.x,\n y: top,\n width: plot.width,\n height: bottom - top,\n });\n if (right > left)\n marks.push({\n kind: \"guide\",\n x: left,\n y: plot.y,\n width: right - left,\n height: plot.height,\n });\n const packed = s.cellColors?.[it.index];\n const fill = packed ? unpackColor(packed) : s.color;\n marks.push({\n kind: \"cell\",\n x: cell.x + style.inset,\n y: cell.y + style.inset,\n width: Math.max(1, cell.width - style.inset * 2),\n height: Math.max(1, cell.height - style.inset * 2),\n color: it.color,\n ring: contrastRing(fill),\n radius: style.radius,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const lo = sc.horizontal ? plot.y : plot.x;\n const hi = lo + (sc.horizontal ? plot.height : plot.width);\n const a = Math.max(lo, bandLo - pad);\n const b = Math.min(hi, bandHi + pad);\n if (b > a) {\n marks.unshift({\n kind: \"band\",\n ...(sc.horizontal\n ? { x: plot.x, y: a, width: plot.width, height: b - a }\n : { x: a, y: plot.y, width: b - a, height: plot.height }),\n });\n }\n }\n return marks;\n};\n\n/** Ring of a hovered cell: light on dark fills, dark on light ones */\nexport const contrastRing = (fill: Rgba): string =>\n luminance(fill) > 0.45\n ? \"rgba(15, 23, 42, 0.78)\"\n : \"rgba(255, 255, 255, 0.9)\";\n\n/** Plotted value of the hovered outlier of a box */\nconst plottedOutlier = (s: SeriesModel, it: ChartHoverItem): number => {\n const raw = s.raw.outliers?.[it.index];\n const k = raw ? raw.indexOf(it.outlier ?? NaN) : -1;\n return (\n (k >= 0 ? s.cols.outliers?.[it.index]?.[k] : undefined) ?? it.outlier ?? 0\n );\n};\n\n/** A line from the end of a bar to the next bar, pixels of the stage */\nexport interface ConnectorSegment {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n color: string;\n width: number;\n dash: number[];\n}\n\n/**\n * Connectors of the bar series (`connector`, waterfalls): from the end of\n * every bar to the next bar, at the value where the next one starts\n */\nexport const connectorSegments = (\n model: ChartModel,\n sc: Scales,\n): ConnectorSegment[] => {\n const out: ConnectorSegment[] = [];\n for (const s of model.series) {\n const c = s.connector;\n if (!c || s.hidden || s.type !== \"bar\" || !s.barTop) continue;\n const { x, count } = s.cols;\n const top = s.barTop;\n const half = s.barHalfWidth;\n const [v0, v1] =\n sc.view.x[0] <= sc.view.x[1] ? sc.view.x : [sc.view.x[1], sc.view.x[0]];\n const color = toCss(c.color, 0.75);\n let prev = -1;\n for (let i = 0; i < count && out.length < MAX_POINT_LABELS * 4; i++) {\n if (!Number.isFinite(top[i]) || !Number.isFinite(x[i])) continue;\n if (prev >= 0 && x[i] + half >= v0 && x[prev] - half <= v1) {\n const a = toScreen(sc, x[prev] + s.barOffset + half, top[prev]);\n const b = toScreen(sc, x[i] + s.barOffset - half, top[prev]);\n out.push({\n x0: a.x,\n y0: a.y,\n x1: b.x,\n y1: b.y,\n color,\n width: c.width,\n dash: c.dash,\n });\n }\n prev = i;\n }\n }\n return out;\n};\n\n/** A dependency with its color resolved against the theme */\nexport interface ResolvedDependency {\n from: string;\n to: string;\n color: string;\n}\n\n/** Colors of the dependency arrows (resolved once per options / theme) */\nexport const resolveDependencies = (\n dependencies: readonly ChartDependency[] | undefined,\n theme: ChartTheme,\n): ResolvedDependency[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n const muted = toCss(theme.textMuted, 0.85);\n return (dependencies ?? []).map((d) => ({\n from: d.from,\n to: d.to,\n color: d.color ? toCss(resolve(d.color, theme.textMuted)) : muted,\n }));\n};\n\n/**\n * Elbow arrow between two bars, pixels of the stage: an axis-aligned\n * polyline ending at the base of a filled triangular head\n */\nexport interface DependencyArrow {\n /** Corners of the line, from the end of the predecessor to the base of the head */\n points: { x: number; y: number }[];\n /** Tip and the two base corners of the arrowhead */\n head: [\n { x: number; y: number },\n { x: number; y: number },\n { x: number; y: number },\n ];\n color: string;\n width: number;\n}\n\n/** Length and half width of the arrowheads, in CSS pixels */\nexport const ARROW_HEAD = { length: 6, half: 3.5 };\n\n/**\n * A bar (or dot) that the arrows connect and go around, in pixels: along\n * the category axis (`c`, `half`) and along the value axis (`start` /\n * `end`: the pixels of its lowest / highest value, `lo` / `hi` its extent\n * on screen)\n */\ninterface TaskBox {\n c: number;\n /** Half thickness of the bar / radius of the dot */\n half: number;\n start: number;\n end: number;\n lo: number;\n hi: number;\n /** A dot (milestone): the arrows stop at its edge */\n dot: boolean;\n}\n\n/** Bars and dots of the visible series, by point id and by category */\ninterface TaskIndex {\n boxes: TaskBox[];\n byId: Map<string, TaskBox>;\n byRow: Map<string, TaskBox>;\n /** Ids of every point, hidden ones included (never matched as categories) */\n ids: Set<string>;\n}\n\nconst taskIndex = (\n model: ChartModel,\n sc: Scales,\n valuePx: (value: number) => number,\n categoryPx: (at: number) => number,\n): TaskIndex => {\n const index: TaskIndex = {\n boxes: [],\n byId: new Map(),\n byRow: new Map(),\n ids: new Set(),\n };\n const categories = model.x.type === \"category\" ? model.x.categories : null;\n for (const s of model.series) {\n if (s.type !== \"bar\" && s.type !== \"scatter\") continue;\n const ids = s.raw.ids;\n if (ids) for (const id of ids) if (id !== undefined) index.ids.add(id);\n if (s.hidden || !s.tooltip) continue;\n const { x, y, count } = s.cols;\n const bar = s.type === \"bar\" && s.barBase && s.barTop;\n const offset = slotOffset(s);\n for (let i = 0; i < count; i++) {\n const start = bar ? s.barBase![i] : y[i];\n const end = bar ? s.barTop![i] : y[i];\n if (\n !Number.isFinite(x[i]) ||\n !Number.isFinite(start) ||\n !Number.isFinite(end)\n )\n continue;\n const half = bar\n ? s.barHalfWidth / Math.abs(sc.xPerPx)\n : dotSize(s, i) / 2;\n const p0 = valuePx(Math.min(start, end));\n const p1 = valuePx(Math.max(start, end));\n const pad = bar ? 0 : half;\n const box: TaskBox = {\n c: categoryPx(x[i] + offset),\n half,\n start: p0,\n end: p1,\n lo: Math.min(p0, p1) - pad,\n hi: Math.max(p0, p1) + pad,\n dot: !bar,\n };\n index.boxes.push(box);\n const id = ids?.[i];\n if (id !== undefined && !index.byId.has(id)) index.byId.set(id, box);\n const row = categories\n ? categories[Math.round(x[i])]\n : String(s.raw.x[i]);\n if (row !== undefined && !index.byRow.has(row)) index.byRow.set(row, box);\n }\n }\n return index;\n};\n\n/** Run of an arrow out of a bar before it turns, in pixels */\nconst ARROW_RUN = 8;\n/** Distance an arrow keeps from the bars it passes, in pixels */\nconst ARROW_CLEARANCE = 4;\n\ntype Interval = [number, number];\n\n/** Value-axis extents of bars (with the clearance), sorted and merged */\nconst blockedLanes = (boxes: readonly TaskBox[]): Interval[] => {\n const list = boxes\n .map((o): Interval => [o.lo - ARROW_CLEARANCE, o.hi + ARROW_CLEARANCE])\n .sort((p, q) => p[0] - q[0]);\n const out: Interval[] = [];\n for (const r of list) {\n const last = out[out.length - 1];\n if (last && r[0] <= last[1]) last[1] = Math.max(last[1], r[1]);\n else out.push(r);\n }\n return out;\n};\n\nconst inside = (lanes: readonly Interval[], v: number) =>\n lanes.some(([lo, hi]) => v > lo + 1e-6 && v < hi - 1e-6);\n\n/** First free lane from `from` towards `to` (direction `dir`), or null */\nconst freeLane = (\n lanes: readonly Interval[],\n from: number,\n to: number,\n dir: number,\n): number | null => {\n const candidates = [from];\n for (const [lo, hi] of lanes) candidates.push(lo, hi);\n let best: number | null = null;\n for (const v of candidates) {\n const along = dir * (v - from);\n if (along < 0 || dir * (to - v) < 0 || inside(lanes, v)) continue;\n if (best === null || along < dir * (best - from)) best = v;\n }\n return best;\n};\n\n/** Free lane closest to `want` (ties: the lower one) */\nconst nearestLane = (lanes: readonly Interval[], want: number): number => {\n const hit = lanes.find(([lo, hi]) => want > lo + 1e-6 && want < hi - 1e-6);\n if (!hit) return want;\n const [lo, hi] = hit;\n return want - lo <= hi - want ? lo : hi;\n};\n\n/** Drops repeated points and the middle of straight runs */\nconst straighten = (points: [number, number][]): [number, number][] => {\n const out: [number, number][] = [];\n const same = (p: number, q: number) => Math.abs(p - q) < 1e-6;\n for (const p of points) {\n const last = out[out.length - 1];\n if (last && same(last[0], p[0]) && same(last[1], p[1])) continue;\n const prev = out[out.length - 2];\n if (\n prev &&\n last &&\n ((same(prev[0], last[0]) && same(last[0], p[0])) ||\n (same(prev[1], last[1]) && same(last[1], p[1])))\n )\n out.pop();\n out.push(p);\n }\n return out;\n};\n\n/**\n * Route of an arrow as (value pixel, category pixel) corners, from the end\n * of `a` (`ev`) to the base of the head before `b` (`base`): one lane\n * across the rows clear of the other bars, searched from the predecessor\n * towards the successor; else (no such lane, or the successor starts\n * before the predecessor ends) along the gaps between the rows, crossing\n * every row in a free lane\n */\nconst routeArrow = (\n a: TaskBox,\n b: TaskBox,\n ev: number,\n base: number,\n dir: number,\n boxes: readonly TaskBox[],\n): [number, number][] => {\n const ca = a.c;\n const cb = b.c;\n const exit = ev + dir * ARROW_RUN;\n const room = dir * (base - exit) >= 0;\n const lo = Math.min(ca, cb);\n const hi = Math.max(ca, cb);\n // the other bars reaching between the two centers (none in a single row)\n const others =\n hi - lo < 0.5\n ? []\n : boxes.filter(\n (o) => o !== a && o !== b && o.c + o.half > lo && o.c - o.half < hi,\n );\n if (room) {\n const lane = freeLane(blockedLanes(others), exit, base, dir);\n if (lane !== null)\n return straighten([\n [ev, ca],\n [lane, ca],\n [lane, cb],\n [base, cb],\n ]);\n }\n const side = Math.sign(cb - ca) || 1;\n // the rows in between, from a to b\n const rows = new Map<number, { c: number; half: number; of: TaskBox[] }>();\n for (const o of others) {\n if (Math.abs(o.c - ca) < 0.5 || Math.abs(o.c - cb) < 0.5) continue;\n const key = Math.round(o.c * 2);\n const row = rows.get(key);\n if (row) {\n row.half = Math.max(row.half, o.half);\n row.of.push(o);\n } else rows.set(key, { c: o.c, half: o.half, of: [o] });\n }\n const stops = [\n { c: ca, half: a.half, lanes: [] as Interval[] },\n ...[...rows.values()]\n .sort((p, q) => side * (p.c - q.c))\n .map((r) => ({ c: r.c, half: r.half, lanes: blockedLanes(r.of) })),\n { c: cb, half: b.half, lanes: [] as Interval[] },\n ];\n const back = base - dir * ARROW_RUN;\n const points: [number, number][] = [\n [ev, ca],\n [exit, ca],\n ];\n let v = exit;\n for (let k = 0; k + 1 < stops.length; k++) {\n const from = stops[k]!;\n const to = stops[k + 1]!;\n // the middle of the gap between the two rows (below a row of its own)\n const m =\n Math.abs(to.c - from.c) < 0.5\n ? from.c + side * (Math.max(from.half, to.half) + ARROW_CLEARANCE)\n : (from.c + side * from.half + to.c - side * to.half) / 2;\n const lane =\n k + 2 === stops.length\n ? room && dir * (base - v) >= 0\n ? v\n : back\n : nearestLane(to.lanes, room ? v : back);\n if (lane !== v) {\n points.push([v, m], [lane, m]);\n v = lane;\n }\n }\n points.push([v, cb], [base, cb]);\n return straighten(points);\n};\n\n/**\n * Dependency arrows (`dependencies`, Gantt charts): from the end of the\n * predecessor to the start of the successor, both found by point `id`\n * (else by category), on any x axis and orientation. The line crosses the\n * rows in a lane clear of the other bars, or goes along the gaps between\n * the rows (also when the successor starts too early)\n */\nexport const dependencyArrows = (\n model: ChartModel,\n sc: Scales,\n dependencies: readonly ResolvedDependency[],\n): DependencyArrow[] => {\n if (!dependencies.length) return [];\n // (value pixel, category pixel) -> stage pixels\n const horizontal = sc.horizontal;\n const pt = (v: number, c: number) =>\n horizontal ? { x: v, y: c } : { x: c, y: v };\n const valuePx = (value: number) => {\n const p = toScreen(sc, 0, value);\n return horizontal ? p.x : p.y;\n };\n const categoryPx = (at: number) => {\n const p = toScreen(sc, at, 0);\n return horizontal ? p.y : p.x;\n };\n const dir = Math.sign(valuePx(sc.view.y[1]) - valuePx(sc.view.y[0])) || 1;\n const tasks = taskIndex(model, sc, valuePx, categoryPx);\n const find = (key: string) =>\n tasks.byId.get(key) ??\n (tasks.ids.has(key) ? undefined : tasks.byRow.get(key));\n const { length, half } = ARROW_HEAD;\n const out: DependencyArrow[] = [];\n for (const d of dependencies) {\n const a = find(d.from);\n const b = find(d.to);\n if (!a || !b || a === b) continue;\n // the far end of the predecessor (the edge of a dot)\n const ev = a.end + (a.dot ? dir * a.half : 0);\n const sv = b.start - dir * (b.dot ? b.half + 1 : 1);\n const base = sv - dir * length;\n const route = routeArrow(a, b, ev, base, dir, tasks.boxes);\n out.push({\n points: route.map(([v, c]) => pt(v, c)),\n head: [pt(sv, b.c), pt(base, b.c - half), pt(base, b.c + half)],\n color: d.color,\n width: 1.25,\n });\n }\n return out;\n};\n\n/** Visual map of a heatmap: its color ramp and the values at the ends */\nexport interface ColorLegend {\n seriesIndex: number;\n /** CSS colors at even steps from the lowest to the highest value */\n stops: string[];\n /** Labels along the ramp (`at`: 0-1): the ends, and the middle of diverging ramps */\n labels: { at: number; text: string }[];\n}\n\nconst COLOR_STOPS = 12;\n\n/**\n * Color legend of a heatmap chart (every series is a heatmap; the first\n * visible one), `null` otherwise\n */\nexport const colorLegend = (model: ChartModel): ColorLegend | null => {\n if (!model.series.length || model.series.some((s) => s.type !== \"heatmap\"))\n return null;\n const s = model.series.find((it) => !it.hidden && it.colorLut);\n const lut = s?.colorLut;\n if (!s || !lut) return null;\n const stops: string[] = [];\n for (let k = 0; k < COLOR_STOPS; k++) {\n const packed = lut[Math.round((k / (COLOR_STOPS - 1)) * (lut.length - 1))];\n stops.push(toCss(unpackColor(packed ?? 0)));\n }\n const format = s.format ?? model.formatValue;\n const [lo, hi] = s.valueRange;\n const labels = [\n { at: 0, text: format(lo) },\n { at: 1, text: format(hi) },\n ];\n const mid = s.colorMidpoint;\n if (mid !== null && mid > lo && mid < hi)\n labels.splice(1, 0, { at: 0.5, text: format(mid) });\n return { seriesIndex: s.index, stops, labels };\n};\n\n/** Whether the legend shows (`legend` option; heatmaps get their color legend) */\nexport const legendShown = (\n option: ChartOptions[\"legend\"],\n model: ChartModel,\n named: number,\n): boolean =>\n option === undefined ? named > 1 || colorLegend(model) !== null : !!option;\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\" || type === \"boxplot\";\n }));\n\n/** Pixel of the guide line along the x axis (`null` when hidden / outside the plot) */\nexport const crosshairAt = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n): number | null => {\n if (!showsCrosshair(model, event, crosshair)) return null;\n const first = event.items[0];\n const c = sc.xToPx(\n model.series[first.seriesIndex]?.cols.x[first.index] ??\n toPlotX(model, first.x),\n );\n const lo = sc.horizontal ? sc.plot.y : sc.plot.x;\n const hi = lo + (sc.horizontal ? sc.plot.height : sc.plot.width);\n return c >= lo && c <= hi ? c : null;\n};\n"],"mappings":"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"}