@faicad/faijs 0.32.2 → 0.33.1
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.
- package/dist/api/api-namespace.js +3 -3
- package/dist/api/api-namespace.js.map +1 -1
- package/dist/api/assembly/index.d.ts +1 -0
- package/dist/api/assembly/index.d.ts.map +1 -1
- package/dist/api/assembly/index.js +1 -0
- package/dist/api/assembly/index.js.map +1 -1
- package/dist/api/assembly/lower.d.ts.map +1 -1
- package/dist/api/assembly/lower.js +7 -0
- package/dist/api/assembly/lower.js.map +1 -1
- package/dist/api/assembly/normalize.d.ts.map +1 -1
- package/dist/api/assembly/normalize.js +2 -1
- package/dist/api/assembly/normalize.js.map +1 -1
- package/dist/api/assembly/solve-tree.d.ts +46 -0
- package/dist/api/assembly/solve-tree.d.ts.map +1 -0
- package/dist/api/assembly/solve-tree.js +135 -0
- package/dist/api/assembly/solve-tree.js.map +1 -0
- package/dist/api/assembly/solve.d.ts +7 -0
- package/dist/api/assembly/solve.d.ts.map +1 -1
- package/dist/api/assembly/solve.js.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.d.ts +4 -0
- package/dist/api/assembly/solvers/assembly-tree.d.ts.map +1 -1
- package/dist/api/assembly/solvers/assembly-tree.js +1 -0
- package/dist/api/assembly/solvers/assembly-tree.js.map +1 -1
- package/dist/api/assembly/solvers/global-solver.d.ts.map +1 -1
- package/dist/api/assembly/solvers/global-solver.js +210 -3
- package/dist/api/assembly/solvers/global-solver.js.map +1 -1
- package/dist/api/assembly/solvers/types.d.ts +8 -0
- package/dist/api/assembly/solvers/types.d.ts.map +1 -1
- package/dist/api/assembly/solvers/types.js.map +1 -1
- package/dist/api/assembly/types.d.ts +32 -1
- package/dist/api/assembly/types.d.ts.map +1 -1
- package/dist/api/assembly/types.js.map +1 -1
- package/dist/api/assembly/validate.d.ts +2 -2
- package/dist/api/assembly/validate.d.ts.map +1 -1
- package/dist/api/assembly/validate.js +24 -2
- package/dist/api/assembly/validate.js.map +1 -1
- package/dist/api/cadquery-selectors/edge.js +1 -1
- package/dist/api/cadquery-selectors/edge.js.map +1 -1
- package/dist/api/cadquery-selectors/entity.d.ts +29 -20
- package/dist/api/cadquery-selectors/entity.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/entity.js +26 -20
- package/dist/api/cadquery-selectors/entity.js.map +1 -1
- package/dist/api/cadquery-selectors/face.d.ts +4 -2
- package/dist/api/cadquery-selectors/face.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/face.js +8 -7
- package/dist/api/cadquery-selectors/face.js.map +1 -1
- package/dist/api/cadquery-selectors/resolve.d.ts +7 -6
- package/dist/api/cadquery-selectors/resolve.d.ts.map +1 -1
- package/dist/api/cadquery-selectors/resolve.js +13 -11
- package/dist/api/cadquery-selectors/resolve.js.map +1 -1
- package/dist/api/chamfer.js +1 -1
- package/dist/api/chamfer.js.map +1 -1
- package/dist/api/draft.js +1 -1
- package/dist/api/draft.js.map +1 -1
- package/dist/api/edge-ref.js +2 -2
- package/dist/api/edge-ref.js.map +1 -1
- package/dist/api/engrave.js +1 -1
- package/dist/api/engrave.js.map +1 -1
- package/dist/api/export-3mf.js +1 -1
- package/dist/api/export-3mf.js.map +1 -1
- package/dist/api/export-brep.js +1 -1
- package/dist/api/export-brep.js.map +1 -1
- package/dist/api/export-step.d.ts +12 -13
- package/dist/api/export-step.d.ts.map +1 -1
- package/dist/api/export-step.js +19 -17
- package/dist/api/export-step.js.map +1 -1
- package/dist/api/extrude.js +3 -3
- package/dist/api/extrude.js.map +1 -1
- package/dist/api/face-ref.js +2 -2
- package/dist/api/face-ref.js.map +1 -1
- package/dist/api/feature-repair.js +2 -2
- package/dist/api/feature-repair.js.map +1 -1
- package/dist/api/fillet-variable.js +1 -1
- package/dist/api/fillet-variable.js.map +1 -1
- package/dist/api/fillet.js +1 -1
- package/dist/api/fillet.js.map +1 -1
- package/dist/api/geom.js +1 -1
- package/dist/api/geom.js.map +1 -1
- package/dist/api/import-step.d.ts.map +1 -1
- package/dist/api/import-step.js +4 -2
- package/dist/api/import-step.js.map +1 -1
- package/dist/api/pattern.js +1 -1
- package/dist/api/pattern.js.map +1 -1
- package/dist/api/place.js +1 -1
- package/dist/api/place.js.map +1 -1
- package/dist/api/punch-hole.js +1 -1
- package/dist/api/punch-hole.js.map +1 -1
- package/dist/api/replicate.js +1 -1
- package/dist/api/replicate.js.map +1 -1
- package/dist/api/revolve.js +1 -1
- package/dist/api/revolve.js.map +1 -1
- package/dist/api/section-by-plane.js +1 -1
- package/dist/api/section-by-plane.js.map +1 -1
- package/dist/api/shell.js +1 -1
- package/dist/api/shell.js.map +1 -1
- package/dist/api/sketch-on-face.js +1 -1
- package/dist/api/sketch-on-face.js.map +1 -1
- package/dist/api/split-by-plane.js +1 -1
- package/dist/api/split-by-plane.js.map +1 -1
- package/dist/api/split.js +1 -1
- package/dist/api/split.js.map +1 -1
- package/dist/api/thicken.js +1 -1
- package/dist/api/thicken.js.map +1 -1
- package/dist/api/topo-resolve.js +4 -4
- package/dist/api/topo-resolve.js.map +1 -1
- package/dist/api/transform.js +1 -1
- package/dist/api/transform.js.map +1 -1
- package/dist/api/view/view-projection.d.ts +8 -0
- package/dist/api/view/view-projection.d.ts.map +1 -1
- package/dist/api/view/view-projection.js +73 -2
- package/dist/api/view/view-projection.js.map +1 -1
- package/dist/boolean/cross-section.d.ts.map +1 -1
- package/dist/boolean/cross-section.js +3 -1
- package/dist/boolean/cross-section.js.map +1 -1
- package/dist/brep/brep-ops.d.ts +26 -0
- package/dist/brep/brep-ops.d.ts.map +1 -1
- package/dist/brep/brep-ops.js +45 -0
- package/dist/brep/brep-ops.js.map +1 -1
- package/dist/brep/brep-topology.js +1 -1
- package/dist/brep/brep-topology.js.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.d.ts.map +1 -1
- package/dist/brep/engine/adapters/brep-mock.js +2 -0
- package/dist/brep/engine/adapters/brep-mock.js.map +1 -1
- package/dist/brep/engine/primitives.d.ts +17 -0
- package/dist/brep/engine/primitives.d.ts.map +1 -1
- package/dist/brep/engine/primitives.js.map +1 -1
- package/dist/brep/export/export-model.d.ts.map +1 -1
- package/dist/brep/export/export-model.js +36 -11
- package/dist/brep/export/export-model.js.map +1 -1
- package/dist/brep/export/step-flat.d.ts +35 -0
- package/dist/brep/export/step-flat.d.ts.map +1 -0
- package/dist/brep/export/step-flat.js +94 -0
- package/dist/brep/export/step-flat.js.map +1 -0
- package/dist/brep/export/step.d.ts.map +1 -1
- package/dist/brep/export/step.js +42 -21
- package/dist/brep/export/step.js.map +1 -1
- package/dist/brep/handle-bridge.d.ts +4 -4
- package/dist/brep/handle-bridge.js +4 -4
- package/dist/brep/handle-bridge.js.map +1 -1
- package/dist/brep/svg/svg-to-solid.d.ts +3 -17
- package/dist/brep/svg/svg-to-solid.d.ts.map +1 -1
- package/dist/brep/svg/svg-to-solid.js +16 -317
- package/dist/brep/svg/svg-to-solid.js.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitKernel.js +10 -0
- package/dist/brepkit-kernel/brepkitKernel.js.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts +1 -1
- package/dist/brepkit-kernel/brepkitWasm.d.ts.map +1 -1
- package/dist/brepkit-kernel/brepkitWasm.js +7 -6
- package/dist/brepkit-kernel/brepkitWasm.js.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.d.ts +7 -7
- package/dist/brepkit-kernel/multi-version-test.d.ts.map +1 -1
- package/dist/brepkit-kernel/multi-version-test.js +10 -10
- package/dist/brepkit-kernel/multi-version-test.js.map +1 -1
- package/dist/cad-runtime/direct-executor.js +2 -2
- package/dist/cad-runtime/direct-executor.js.map +1 -1
- package/dist/cad-runtime/runtime.js +5 -5
- package/dist/cad-runtime/runtime.js.map +1 -1
- package/dist/geometry2d/curve2d.js +42 -1
- package/dist/geometry2d/curve2d.js.map +1 -1
- package/dist/math3d/Box3.js.map +1 -1
- package/dist/math3d/Euler.js.map +1 -1
- package/dist/math3d/Mat4.js.map +1 -1
- package/dist/math3d/Plane.js.map +1 -1
- package/dist/math3d/Quat.js.map +1 -1
- package/dist/math3d/Vec2.js.map +1 -1
- package/dist/math3d/Vec3.js.map +1 -1
- package/dist/math3d/index.js.map +1 -1
- package/dist/mesh/meshdata/contour.d.ts +34 -0
- package/dist/mesh/meshdata/contour.d.ts.map +1 -0
- package/dist/mesh/meshdata/contour.js +39 -0
- package/dist/mesh/meshdata/contour.js.map +1 -0
- package/dist/mesh/meshdata/extrude.d.ts +25 -0
- package/dist/mesh/meshdata/extrude.d.ts.map +1 -0
- package/dist/mesh/meshdata/extrude.js +198 -0
- package/dist/mesh/meshdata/extrude.js.map +1 -0
- package/dist/mesh/meshdata/index.js.map +1 -1
- package/dist/mesh/meshdata/ops.js.map +1 -1
- package/dist/mesh/meshdata/parametric.js.map +1 -1
- package/dist/mesh/meshdata/weld.js.map +1 -1
- package/dist/node-host/cli.d.ts.map +1 -1
- package/dist/node-host/cli.js +3 -2
- package/dist/node-host/cli.js.map +1 -1
- package/dist/occt-kernel/occt-primitives.d.ts.map +1 -1
- package/dist/occt-kernel/occt-primitives.js +2 -0
- package/dist/occt-kernel/occt-primitives.js.map +1 -1
- package/dist/primitives/svg/svg-path.d.ts +192 -0
- package/dist/primitives/svg/svg-path.d.ts.map +1 -0
- package/dist/primitives/svg/svg-path.js +776 -0
- package/dist/primitives/svg/svg-path.js.map +1 -0
- package/dist/third-party/earcut.d.ts +19 -0
- package/dist/third-party/earcut.d.ts.map +1 -0
- package/dist/third-party/earcut.js +575 -0
- package/dist/third-party/earcut.js.map +1 -0
- package/package.json +22 -3
|
@@ -857,6 +857,27 @@ function intersectLineLine(c1, l1, c2, l2, tol) {
|
|
|
857
857
|
const seg = makeLine2d(sx, sy, ex2, ey2);
|
|
858
858
|
return { points: [], segments: [seg] };
|
|
859
859
|
}
|
|
860
|
+
/**
|
|
861
|
+
* Whether a basis-curve parameter `t` falls inside a trimmed curve's span.
|
|
862
|
+
*
|
|
863
|
+
* The comparison is done modulo 2π because a trimmed arc's `tStart`/`tEnd` may
|
|
864
|
+
* be negative (the CW branch of `makeTrimmedCircle2d` negates the angles) or
|
|
865
|
+
* wrap past 2π.
|
|
866
|
+
*
|
|
867
|
+
* @param c - the trimmed curve.
|
|
868
|
+
* @param t - a parameter expressed in the **basis** curve's parameter space.
|
|
869
|
+
* @param tol - angular tolerance added to the end of the span.
|
|
870
|
+
* @returns `true` when `t` lies in `[tStart, tEnd]`.
|
|
871
|
+
*/
|
|
872
|
+
function trimmedSpanContains(c, t, tol) {
|
|
873
|
+
const span = c.tEnd - c.tStart;
|
|
874
|
+
if (span <= 0)
|
|
875
|
+
return false;
|
|
876
|
+
const twoPi = 2 * Math.PI;
|
|
877
|
+
let d = t - c.tStart;
|
|
878
|
+
d -= twoPi * Math.floor(d / twoPi); // → [0, 2π)
|
|
879
|
+
return d <= span + tol;
|
|
880
|
+
}
|
|
860
881
|
function intersectLineCircle(cLine, line, cCirc, circ, tol) {
|
|
861
882
|
// Vector from circle center to line origin
|
|
862
883
|
const fx = line.ox - circ.cx;
|
|
@@ -877,7 +898,27 @@ function intersectLineCircle(cLine, line, cCirc, circ, tol) {
|
|
|
877
898
|
continue;
|
|
878
899
|
const px = line.ox + tLine * line.dx;
|
|
879
900
|
const py = line.oy + tLine * line.dy;
|
|
880
|
-
//
|
|
901
|
+
// GOTCHA(2026-10-11 整圆 / 2026-10-12 推广至 trim 弧):此前的
|
|
902
|
+
// `refineParam(cCirc, px, py)` + `(eval−crossing)² > tol²·1e6`(≈1e-12)二次校验
|
|
903
|
+
// 会**丢弃合法的圆弧交点**——`refineParam` 是 80 样本粗网格,其最近点可能远离
|
|
904
|
+
// 解析交点,1e-12 复检几乎永不通过。后果:`isInside` 射线法对圆弧一律判 false,
|
|
905
|
+
// `organiseBlueprints` 因而**永不嵌套同心轮廓**:整圆情形(垫圈/管/环)产 2 solid
|
|
906
|
+
// 而非 1 空心件;trim 弧情形(矩形/方形空心型材的圆角内外轮廓)同样不嵌套,
|
|
907
|
+
// 对应 parity `solids(1vs2)`,约 230 个。
|
|
908
|
+
// 解析交点 (px,py) 由二次方程解出、本就精确落在 basis 圆上,故只须按参数域校验。
|
|
909
|
+
if (cCirc.kind2d === 'circle') {
|
|
910
|
+
results.push([px, py]);
|
|
911
|
+
continue;
|
|
912
|
+
}
|
|
913
|
+
if (cCirc.kind2d === 'trimmed' && cCirc.basis.kind2d === 'circle') {
|
|
914
|
+
const b = cCirc.basis;
|
|
915
|
+
const ang = Math.atan2(py - b.cy, px - b.cx);
|
|
916
|
+
const tBasis = b.sense ? ang : -ang;
|
|
917
|
+
if (trimmedSpanContains(cCirc, tBasis, tol))
|
|
918
|
+
results.push([px, py]);
|
|
919
|
+
continue;
|
|
920
|
+
}
|
|
921
|
+
// 其余(ellipse / bezier / bspline 上的 trimmed)保留原有 refineParam 校验路径。
|
|
881
922
|
const tCirc = refineParam(cCirc, px, py);
|
|
882
923
|
if (tCirc === null)
|
|
883
924
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curve2d.js","sourceRoot":"","sources":["../../src/geometry2d/curve2d.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AA2E9E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,CAAa,EAAE,CAAS;IACtD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QAC3C,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACzC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACzC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;QAC7D,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QACnC,KAAK,SAAS;YACZ,OAAO,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAChC,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;YACjD,OAAO,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,CAAa,EAAE,CAAS;IACrD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;QACrB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QAChF,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YAClD,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;YACjD,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,4BAA4B;YAC5B,MAAM,CAAC,GAAG,IAAI,CAAA;YACd,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAClD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,IAAI,CAAA;YACd,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAA;YAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;YAC1C,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACxD,MAAM,EAAE,GAAG,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACvD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;YAC3D,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;YACjD,MAAM,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAA;YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,CAAa;IACvC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;QAClC,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;QACxC,KAAK,QAAQ;YACX,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QAC9B,KAAK,SAAS;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,EAAE,CAAA;QACnE,KAAK,SAAS;YACZ,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IAChC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,CAAa;IACzC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,MAAM,CAAA;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAA;QAClB,KAAK,QAAQ;YACX,OAAO,cAAc,CAAA;QACvB,KAAK,SAAS;YACZ,OAAO,eAAe,CAAA;QACxB,KAAK,SAAS;YACZ,OAAO,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACvE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACxC,OAAO;QACL,MAAM,EAAE,MAAM;QACd,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1B,GAAG;KACJ,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU,EAAE,EAAU,EAAE,MAAc,EAAE,QAAiB,IAAI;IACxF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,wCAAwC;IACxC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;IAChE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;QACxB,wCAAwC;QACxC,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,MAAM,EAAE,GACN,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC9B,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/B,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClC,CAAC,CAAA;IACH,MAAM,EAAE,GACN,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC9B,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/B,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAClC,CAAC,CAAA;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACzD,wDAAwD;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACvC,6EAA6E;IAC7E,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,IAAI,IAAI,GAAG,CAAC;QAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IACjC,IAAI,IAAI,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,IAAI,IAAI,GAAG,CAAC;QAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA,CAAC,wCAAwC;IAClE,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,2DAA2D;QAC3D,MAAM,MAAM,GAAG,CAAC,EAAE,CAAA;QAClB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAA;QACd,IAAI,IAAI,GAAG,MAAM,GAAG,IAAI;YAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QAC7C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAC3D,CAAC;IACD,6BAA6B;IAC7B,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI;QAAE,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IACzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACxC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAClB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAA;IACvC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;QAC5B,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;IAChC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAA;IACzB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IACvB,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAA;IACnC,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAA;IAClC,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAA;IAC5C,IAAI,IAAI,CAAA;IACR,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAChB,IAAI,EAAE,IAAI,CAAC;YAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QAC9B,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAChB,IAAI,EAAE,IAAI,CAAC;YAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QAC9B,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACpB,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACvC,OAAO,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AACrD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,EAAU,EACV,WAAmB,EACnB,WAAmB,EACnB,QAAgB,CAAC,EACjB,QAAgB,CAAC,EACjB,QAAiB,IAAI;IAErB,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,EAAE;QACF,EAAE;QACF,WAAW;QACX,WAAW;QACX,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;QACnC,KAAK;KACN,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAA;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAyB,EACzB,KAAe,EACf,cAAwB,EACxB,MAAc,EACd,UAAmB,EACnB,OAAkB;IAElB,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;QACjB,cAAc,EAAE,CAAC,GAAG,cAAc,CAAC;QACnC,MAAM;QACN,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAa,EAAE,EAAU,EAAE,EAAU;IACpE,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAA;QAC/C,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAA;QAC/C,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAA;QAC/C,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAA;QACnE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAA;QACnE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAA;IAC7D,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,CAAa,EAAE,KAAa,EAAE,EAAU,EAAE,EAAU;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,CAAS,EAAoB,EAAE;QAC7D,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;QACjB,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;QACjB,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAA;IAC7D,CAAC,CAAA;IACD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YACxC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAA;YACnC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAA;YACnC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;QAC3C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC1C,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;QACnC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC1C,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,KAAK,EAAE,CAAA;QACnE,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACpE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACpE,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YACnD,oEAAoE;YACpE,6DAA6D;YAC7D,kEAAkE;YAClE,oCAAoC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC1C,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,CAAA;YACxE,CAAC;YACD,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,CAAa,EAAE,MAAc,EAAE,EAAU,EAAE,EAAU;IAChF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS,EAAoB,EAAE,CAAC;QAC7D,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;QACtB,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;KACvB,CAAA;IACD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,yEAAyE;YACzE,oEAAoE;YACpE,0EAA0E;YAC1E,uBAAuB;YACvB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;YACrE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAA;YACnB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAA;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAA;YAC7C,OAAO;gBACL,GAAG,CAAC;gBACJ,EAAE;gBACF,EAAE;gBACF,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBAChC,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBAChC,GAAG,EAAE,IAAI;aACV,CAAA;QACH,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YACzC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;QACxE,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YACzC,OAAO;gBACL,GAAG,CAAC;gBACJ,EAAE,EAAE,GAAG;gBACP,EAAE,EAAE,GAAG;gBACP,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC7C,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;aAC9C,CAAA;QACH,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAA;IACjE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,CAAa,EAAE,EAAU,EAAE,EAAU;IACjE,0EAA0E;IAC1E,4EAA4E;IAC5E,yCAAyC;IACzC,OAAO,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,CAAa,EACb,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACxC,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,CAAC,CAAA;IACzB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;IACnB,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,CAAS,EAAoB,EAAE;QAC9D,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;QACjB,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAA;QACjB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;QAC7B,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC,CAAA;IACD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC3C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;YACnD,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;YACnD,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAA;QACrD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC3C,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;QACpD,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;YAC3C,gEAAgE;YAChE,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;YAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAC3D,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAC5D,CAAA;YACD,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;QACzE,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACrE,KAAK,SAAS;YACZ,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACrE,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YACvD,oEAAoE;YACpE,wEAAwE;YACxE,sEAAsE;YACtE,6DAA6D;YAC7D,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;gBAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;gBAChD,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,CAAA;YACxE,CAAC;YACD,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAC9E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAc,EACd,EAAc,EACd,SAAiB;IAEjB,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,sBAAsB;IACtB,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;IACrD,CAAC;IACD,sCAAsC;IACtC,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACjF,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACjF,CAAC;IACD,0BAA0B;IAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACnF,CAAC;IACD,uDAAuD;IACvD,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAA;IACxB,OAAO,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAa;IAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC;AACD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAA;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB,EAAE,CAAa,EAAE,IAAY;IAC3E,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,sDAAsD;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAM;QAC7D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACvC,OAAM;IACR,CAAC;IACD,qDAAqD;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAM;QAC7D,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;QACvC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,qEAAqE;QACrE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAA;QAC/D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YAChC,qDAAqD;YACrD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;gBACrC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;gBACjC,IAAI,EAAE,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;oBAC/C,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;oBACxC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;oBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACzB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBACzB,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACrC,OAAM;IACR,CAAC;IACD,6CAA6C;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAM;IAC7D,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAA;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAA;QAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,2DAA2D;AAC3D,SAAS,WAAW,CAAC,CAAa;IAChC,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,OAAO,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAA;IAChD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,yDAAyD;AACzD,SAAS,QAAQ,CAAC,CAAa,EAAE,CAAS,EAAE,GAAW;IACrD,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,CAAA;AAChD,CAAC;AAED,kFAAkF;AAClF,SAAS,WAAW,CAAC,CAAa,EAAE,EAAU,EAAE,EAAU,EAAE,QAAQ,GAAG,GAAG;IACxE,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClE,MAAM,CAAC,GAAG,EAAE,CAAA;IACZ,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3C,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IACxB,IAAI,KAAK,GAAG,QAAQ,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAA;QAC/B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;YACd,KAAK,GAAG,CAAC,CAAA;YACT,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;IACH,CAAC;IACD,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IAChD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAC1C,IAAI,CACL,CAAA;IACD,MAAM,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAA;IACrC,OAAO,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAa,EAAE,EAAU,EAAE,EAAU,EAAE,QAAQ,GAAG,GAAG;IACpF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAElE,+EAA+E;IAC/E,qEAAqE;IACrE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC7C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAE9B,8EAA8E;IAC9E,8EAA8E;IAC9E,yDAAyD;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAA;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAA;IACzB,IAAI,CAAC,GAAG,IAAI,CAAA;IACZ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK;YAAE,MAAK;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC/B,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACjE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACrD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK;YAAE,MAAK;QAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QACrB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;QACrD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACzB,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,MAAK;QACzB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACd,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAAE,MAAK;IACrC,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,2EAA2E;AAC3E,SAAS,UAAU,CAAC,CAAa,EAAE,EAAU,EAAE,EAAU,EAAE,CAAS;IAClE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;AAC5C,CAAC;AAED,4EAA4E;AAC5E,SAAS,OAAO,CAAC,CAAa;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;IAC1C,OAAO,CAAC,CAAA;AACV,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,CAAa,EAAE,MAAc,EAAE,IAAY;IACnE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAC/D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAAC,CAAa,EAAE,CAAS;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACxB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,IAAI,CAAA;IACxC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,iBAAiB,CACxB,EAAc,EACd,EAAU,EACV,EAAc,EACd,EAAU,EACV,GAAW;IAEX,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACzC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;QAC3B,uCAAuC;QACvC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;QACxB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;QACxB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;QAC1C,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;QAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACzF,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IAC7E,CAAC;IACD,gDAAgD;IAChD,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACxB,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACxB,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACrC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA,CAAC,6BAA6B;IAC5F,iDAAiD;IACjD,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAA;IAClE,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAA;IAClE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9D,IAAI,UAAU,GAAG,YAAY,GAAG,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA,CAAC,wBAAwB;IACjG,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC,EAAE,CAAA;IACvC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC,EAAE,CAAA;IACvC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG,EAAE,CAAC,EAAE,CAAA;IACtC,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;AACxC,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAiB,EACjB,IAAY,EACZ,KAAiB,EACjB,IAAc,EACd,GAAW;IAEX,2CAA2C;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IAC5B,+BAA+B;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA,CAAC,qBAAqB;IACrE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3C,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IACvD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;IAC7C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACpC,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;YAAE,SAAQ;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;QACpC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;QACpC,iDAAiD;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,IAAI,KAAK,KAAK,IAAI;YAAE,SAAQ;QAC5B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAChD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;YAAE,SAAQ;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAc,EAAE,EAAc,EAAE,GAAW;IAC1E,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAA;IACxE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAA;IACxE,IAAI,aAAa,IAAI,aAAa;QAAE,OAAO,EAAE,CAAA;IAC7C,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,GAAG,GAAuB,EAAE,CAAA;IAClC,MAAM,MAAM,GAAqC;QAC/C,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;KACnC,CAAA;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3C,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;YAC3C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;YAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,qBAAqB,CAC5B,EAAc,EACd,KAAe,EACf,EAAc,EACd,KAAe,EACf,GAAW;IAEX,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;IAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,EAAE,CAAA;IACpD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG;QAAE,OAAO,EAAE,CAAA;IAC9D,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG;YAAE,OAAO,EAAE,CAAA;QAC1D,OAAO,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IACvF,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,UAAU,GACd,CAAC,GAAG,GAAG;QACL,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACZ,CAAC,CAAC;YACE,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;SACvC,CAAA;IACP,yDAAyD;IACzD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAClC,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAClC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;YAAE,SAAQ;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK;YAAE,SAAQ;QACrD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK;YAAE,SAAQ;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CACzB,EAAc,EACd,EAAc,EACd,SAAiB,EACjB,MAAM,GAAG,KAAK;IAEd,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3F,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACrC,CAAC;IACD,MAAM,CAAC,GAAG,GAAG,CAAA;IACb,MAAM,IAAI,GAA0C,EAAE,CAAA;IACtD,MAAM,IAAI,GAA0C,EAAE,CAAA;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACpD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAClC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QACpD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACpC,CAAC;IACD,mFAAmF;IACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,CAAC,qCAAqC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;QACtB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACjB,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QACxC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACvC,CAAC;IACD,gDAAgD;IAChD,MAAM,UAAU,GAAiC,EAAE,CAAA;IACnD,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;QACxB,+DAA+D;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC/C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;YACjB,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK;gBAAE,SAAQ;YACpE,IAAI,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK;gBAAE,SAAQ;YACxE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YACjC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,UAAU;gBAAE,SAAQ;YAC5D,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IACD,yCAAyC;IACzC,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,CAAA;IAClC,MAAM,KAAK,GAAuB,EAAE,CAAA;IACpC,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QACpD,IAAI,EAAE,GAAG,MAAM,CAAA;QACf,IAAI,EAAE,GAAG,MAAM,CAAA;QACf,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YACxC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;YAClB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;YAClB,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;gBAAE,MAAK;YACnC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YACjC,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;YACjC,8CAA8C;YAC9C,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;gBAAE,MAAK;YAChC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;YAC/C,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YAC7C,EAAE,IAAI,GAAG,CAAA;YACT,EAAE,IAAI,GAAG,CAAA;YACT,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;YAC9C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxC,uEAAuE;QACvE,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;YAAE,SAAQ;QACvE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;YAClE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;YACxB,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;YACxB,IAAI,GAAG,GAAG,KAAK,CAAA;YACf,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC7B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC;oBAClE,GAAG,GAAG,IAAI,CAAA;oBACV,MAAK;gBACP,CAAC;YACH,CAAC;YACD,IAAI,CAAC,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACxC,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,SAAS,cAAc,CAAC,KAAyB,EAAE,CAAS;IAC1D,eAAe;IACf,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,MAAM,IAAI,GAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;YACnB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;YACxB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACpC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAE,CAAA;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAY,EAAE,CAAS;IAChD,mCAAmC;IACnC,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IACD,qBAAqB;IACrB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IAClB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;IACxB,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAA;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5E,YAAY;IACZ,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAE,IAAI,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,CAAC;YAC9D,IAAI,GAAG,CAAC,CAAA;YACR,MAAK;QACP,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,IAAI,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE;QAAE,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvD,gFAAgF;IAChF,6EAA6E;IAC7E,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;IACzB,MAAM,CAAC,GAA+B,EAAE,CAAA;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACtD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAE,CAAA;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IAC1C,CAAC;IACD,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;YACtB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;YAC3C,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAA;YAC1B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;YAChB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;YACxB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QACjD,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;IACjB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IAChB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9D,CAAC","sourcesContent":["/**\n * Pure-TypeScript 2D analytic curve model (faijs port of brepjs).\n *\n * Adapted from brepjs `src/kernel/geometry2d.ts` (Apache-2.0), preserving core\n * algorithms and naming. Differences from brepjs:\n * - discriminant field renamed `__bk2d` → `kind2d` (2026-09-27 decision),\n * bbox discriminant `__bk2d_bbox` → `kind2d_b`.\n * - All curves are plain data objects (no kernel handles, no dispose), per the\n * faijs \"2D curves are pure objects\" design.\n *\n * Pure TS, zero WASM, zero external deps. All 2D curves represented as plain\n * objects with a `kind2d` discriminant.\n *\n * License: adapted from brepjs (Apache-2.0). Retained per faijs convention for\n * brepjs-ported files (cf. svg-to-solid.ts).\n *\n * @module\n */\n// ---------------------------------------------------------------------------\n// Evaluation\n// ---------------------------------------------------------------------------\n\n/** Line: origin + unit direction + length. */\nexport interface Line2d {\n readonly kind2d: 'line'\n readonly ox: number\n readonly oy: number\n readonly dx: number\n readonly dy: number\n readonly len: number\n}\n/** Full circle. sense=true → CCW. */\nexport interface Circle2d {\n readonly kind2d: 'circle'\n readonly cx: number\n readonly cy: number\n readonly radius: number\n readonly sense: boolean\n}\n/** Ellipse (or arc of one, via trim). */\nexport interface Ellipse2d {\n readonly kind2d: 'ellipse'\n readonly cx: number\n readonly cy: number\n readonly majorRadius: number\n readonly minorRadius: number\n readonly xDirAngle: number\n readonly sense: boolean\n}\n/** Bezier curve (De Casteljau). */\nexport interface Bezier2d {\n readonly kind2d: 'bezier'\n readonly poles: [number, number][]\n}\n/** B-spline (De Boor). */\nexport interface BSpline2d {\n readonly kind2d: 'bspline'\n readonly poles: [number, number][]\n readonly knots: number[]\n readonly multiplicities: number[]\n readonly degree: number\n readonly isPeriodic: boolean\n /**\n * One weight per pole. Absent (or all 1) for a non-rational curve. Rational\n * B-splines are exactly what a kernel hands back for a conic-approximating or\n * spline edge (`BrepNurbsCurveData.rational`), and dropping the weights turns\n * the curve into a different one — so they travel with the poles.\n */\n readonly weights?: number[]\n}\n/** Trimmed wrapper over another curve. */\nexport interface TrimmedCurve2d {\n readonly kind2d: 'trimmed'\n readonly basis: Curve2dObj\n readonly tStart: number\n readonly tEnd: number\n}\n/**\n * A 2D curve expressed as one of the supported analytic or spline kinds.\n * Discriminated by the `kind2d` field.\n */\nexport type Curve2dObj = Line2d | Circle2d | Ellipse2d | Bezier2d | BSpline2d | TrimmedCurve2d\n\n/**\n * Mutable 2D bounding box carried by the curve-specific bbox helpers.\n * `kind2d_b` marks the discriminant used to detect this box type.\n */\nexport interface CurveBBox2d {\n readonly kind2d_b: true\n xMin: number\n yMin: number\n xMax: number\n yMax: number\n}\n\n/**\n * Evaluate a curve at parameter t to a 2D point.\n * @param c - the curve to evaluate.\n * @param t - the parameter value within the curve's domain.\n * @returns the 2D point `[x, y]` on the curve.\n */\nexport function evaluateCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.ox + c.dx * t, c.oy + c.dy * t]\n case 'circle': {\n const angle = c.sense ? t : -t\n return [c.cx + c.radius * Math.cos(angle), c.cy + c.radius * Math.sin(angle)]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const x = c.majorRadius * Math.cos(angle)\n const y = c.minorRadius * Math.sin(angle)\n return [c.cx + x * cos - y * sin, c.cy + x * sin + y * cos]\n }\n case 'bezier':\n return evaluateBezier(c.poles, t)\n case 'bspline':\n return evaluateBSpline2d(c, t)\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n return evaluateCurve2d(c.basis, mapped)\n }\n }\n}\n\n/**\n * Tangent (non-normalized direction derivative) at parameter t.\n * @param c - the curve to differentiate.\n * @param t - the parameter value within the curve's domain.\n * @returns the unnormalized tangent vector `[dx, dy]` at `t`.\n */\nexport function tangentCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.dx, c.dy]\n case 'circle': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n return [-c.radius * Math.sin(angle) * sign, c.radius * Math.cos(angle) * sign]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const dx = -c.majorRadius * Math.sin(angle) * sign\n const dy = c.minorRadius * Math.cos(angle) * sign\n return [dx * cos - dy * sin, dx * sin + dy * cos]\n }\n case 'bezier': {\n // Numerical differentiation\n const h = 1e-8\n const p0 = evaluateBezier(c.poles, Math.max(0, t - h))\n const p1 = evaluateBezier(c.poles, Math.min(1, t + h))\n const dt = Math.min(1, t + h) - Math.max(0, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'bspline': {\n const h = 1e-8\n const kFirst = c.knots[0]!\n const kLast = c.knots[c.knots.length - 1]!\n const p0 = evaluateBSpline2d(c, Math.max(kFirst, t - h))\n const p1 = evaluateBSpline2d(c, Math.min(kLast, t + h))\n const dt = Math.min(kLast, t + h) - Math.max(kFirst, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n const tan = tangentCurve2d(c.basis, mapped)\n const scale = c.tEnd - c.tStart\n return [tan[0] * scale, tan[1] * scale]\n }\n }\n}\n\n/**\n * Parameter domain of a curve.\n * @param c - the curve whose domain to read.\n * @returns the inclusive `first` and `last` parameter bounds.\n */\nexport function curveBounds(c: Curve2dObj): { first: number; last: number } {\n switch (c.kind2d) {\n case 'line':\n return { first: 0, last: c.len }\n case 'circle':\n case 'ellipse':\n return { first: 0, last: 2 * Math.PI }\n case 'bezier':\n return { first: 0, last: 1 }\n case 'bspline':\n return { first: c.knots[0]!, last: c.knots[c.knots.length - 1]! }\n case 'trimmed':\n return { first: 0, last: 1 }\n }\n}\n\n/**\n * OCCT-style type name of a curve.\n * @param c - the curve to name.\n * @returns the uppercase OCCT type name such as `LINE`, `CIRCLE` or `BSPLINE_CURVE`.\n */\nexport function curveTypeName(c: Curve2dObj): string {\n switch (c.kind2d) {\n case 'line':\n return 'LINE'\n case 'circle':\n return 'CIRCLE'\n case 'ellipse':\n return 'ELLIPSE'\n case 'bezier':\n return 'BEZIER_CURVE'\n case 'bspline':\n return 'BSPLINE_CURVE'\n case 'trimmed':\n return 'TRIMMED_' + curveTypeName(c.basis)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Construction helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Line segment from (x1,y1) to (x2,y2).\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Line2d describing the segment.\n */\nexport function makeLine2d(x1: number, y1: number, x2: number, y2: number): Line2d {\n const dx = x2 - x1\n const dy = y2 - y1\n const len = Math.sqrt(dx * dx + dy * dy)\n return {\n kind2d: 'line',\n ox: x1,\n oy: y1,\n dx: len > 0 ? dx / len : 1,\n dy: len > 0 ? dy / len : 0,\n len,\n }\n}\n\n/**\n * Full circle with the given center, radius and winding sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param radius - the circle radius.\n * @param sense - true for counter-clockwise winding (default true).\n * @returns a Circle2d.\n */\nexport function makeCircle2d(cx: number, cy: number, radius: number, sense: boolean = true): Circle2d {\n return { kind2d: 'circle', cx, cy, radius, sense }\n}\n\n/**\n * Arc through three points; returns a trimmed circle, or a line if collinear.\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param xm - the x coordinate of the mid point.\n * @param ym - the y coordinate of the mid point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed arc circle, or a straight line when the points are collinear.\n */\nexport function makeArc2dThreePoints(\n x1: number,\n y1: number,\n xm: number,\n ym: number,\n x2: number,\n y2: number,\n): Curve2dObj {\n // Circumscribed circle through 3 points\n const d = 2 * (x1 * (ym - y2) + xm * (y2 - y1) + x2 * (y1 - ym))\n if (Math.abs(d) < 1e-12) {\n // Degenerate (collinear): return a line\n return makeLine2d(x1, y1, x2, y2)\n }\n const cx =\n ((x1 * x1 + y1 * y1) * (ym - y2) +\n (xm * xm + ym * ym) * (y2 - y1) +\n (x2 * x2 + y2 * y2) * (y1 - ym)) /\n d\n const cy =\n ((x1 * x1 + y1 * y1) * (x2 - xm) +\n (xm * xm + ym * ym) * (x1 - x2) +\n (x2 * x2 + y2 * y2) * (xm - x1)) /\n d\n const radius = Math.sqrt((x1 - cx) ** 2 + (y1 - cy) ** 2)\n // Compute angles for start (p1), mid (pm), and end (p2)\n const a1 = Math.atan2(y1 - cy, x1 - cx)\n const am = Math.atan2(ym - cy, xm - cx)\n const a2 = Math.atan2(y2 - cy, x2 - cx)\n // Determine sense: CCW if mid-point angle is between start and end going CCW\n let da1m = am - a1\n if (da1m < 0) da1m += 2 * Math.PI\n let da12 = a2 - a1\n if (da12 < 0) da12 += 2 * Math.PI\n const sense = da1m < da12 // CCW if midpoint comes before endpoint\n const circle = makeCircle2d(cx, cy, radius, sense)\n if (!sense) {\n // CW circle evaluates angle = -t, so parameter t = -angle.\n const tStart = -a1\n let tEnd = -a2\n if (tEnd < tStart - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart, tEnd }\n }\n // CCW: ensure tEnd >= tStart\n let tEnd = a2\n if (tEnd < a1 - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart: a1, tEnd }\n}\n\n/**\n * Arc from a start point through a given tangent direction to an end point.\n * @param sx - the x coordinate of the start point.\n * @param sy - the y coordinate of the start point.\n * @param tx - the x component of the tangent direction at the start.\n * @param ty - the y component of the tangent direction at the start.\n * @param ex - the x coordinate of the end point.\n * @param ey - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed circle arc, or a line when degenerate.\n */\nexport function makeArc2dTangent(\n sx: number,\n sy: number,\n tx: number,\n ty: number,\n ex: number,\n ey: number,\n): Curve2dObj {\n const len = Math.sqrt(tx * tx + ty * ty)\n const ntx = len > 0 ? tx / len : 0\n const nty = len > 0 ? ty / len : 0\n const dx = sx - ex\n const dy = sy - ey\n const denom = 2 * (dy * ntx - dx * nty)\n if (Math.abs(denom) < 1e-12) {\n return makeLine2d(sx, sy, ex, ey)\n }\n const chord2 = dx * dx + dy * dy\n const t = -chord2 / denom\n const cx = sx - t * nty\n const cy = sy + t * ntx\n const radius = Math.abs(t)\n const a1 = Math.atan2(sy - cy, sx - cx)\n const a2 = Math.atan2(ey - cy, ex - cx)\n const ccwTanX = -(sy - cy) / radius\n const ccwTanY = (sx - cx) / radius\n const dotCcw = ntx * ccwTanX + nty * ccwTanY\n let aMid\n if (dotCcw > 0) {\n let da = a2 - a1\n if (da <= 0) da += 2 * Math.PI\n aMid = a1 + da / 2\n } else {\n let da = a2 - a1\n if (da >= 0) da -= 2 * Math.PI\n aMid = a1 + da / 2\n }\n const mx = cx + radius * Math.cos(aMid)\n const my = cy + radius * Math.sin(aMid)\n return makeArc2dThreePoints(sx, sy, mx, my, ex, ey)\n}\n\n/**\n * Ellipse with the given center, radii, major-axis direction and sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param majorRadius - the semi-major radius.\n * @param minorRadius - the semi-minor radius.\n * @param xDirX - the x component of the major-axis direction (default 1).\n * @param xDirY - the y component of the major-axis direction (default 0).\n * @param sense - true for counter-clockwise winding (default true).\n * @returns an Ellipse2d.\n */\nexport function makeEllipse2d(\n cx: number,\n cy: number,\n majorRadius: number,\n minorRadius: number,\n xDirX: number = 1,\n xDirY: number = 0,\n sense: boolean = true,\n): Ellipse2d {\n return {\n kind2d: 'ellipse',\n cx,\n cy,\n majorRadius,\n minorRadius,\n xDirAngle: Math.atan2(xDirY, xDirX),\n sense,\n }\n}\n\n/**\n * Bezier curve from control poles.\n * @param poles - the ordered control points `[x, y]` for the curve.\n * @returns a Bezier2d holding a copy of the poles.\n */\nexport function makeBezier2d(poles: [number, number][]): Bezier2d {\n return { kind2d: 'bezier', poles: [...poles] }\n}\n\n/**\n * B-spline from raw NURBS data (the write-side counterpart of a kernel's\n * `getNurbsCurveData`, so an exact edge survives as data instead of a\n * tessellation).\n *\n * The knot vector is NOT expanded here: `knots`/`multiplicities` stay the two\n * parallel arrays the kernel reports, and every evaluator expands them the same\n * way (`evaluateBSpline2d`).\n *\n * @param poles - control points `[x, y]`, one per weight in `weights`.\n * @param knots - distinct knot values.\n * @param multiplicities - multiplicity of each entry in `knots`.\n * @param degree - polynomial degree.\n * @param isPeriodic - true for a periodic (wrap-around) curve.\n * @param weights - optional per-pole weights; omit for a non-rational curve.\n * @returns a BSpline2d holding copies of the control data.\n */\nexport function makeBSpline2d(\n poles: [number, number][],\n knots: number[],\n multiplicities: number[],\n degree: number,\n isPeriodic: boolean,\n weights?: number[],\n): BSpline2d {\n return {\n kind2d: 'bspline',\n poles: poles.map(([x, y]): [number, number] => [x, y]),\n knots: [...knots],\n multiplicities: [...multiplicities],\n degree,\n isPeriodic,\n ...(weights ? { weights: [...weights] } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Transform helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Translate a curve by an offset.\n * @param c - the curve to translate.\n * @param dx - the x offset.\n * @param dy - the y offset.\n * @returns a new Curve2dObj translated by `(dx, dy)`.\n */\nexport function translateCurve2d(c: Curve2dObj, dx: number, dy: number): Curve2dObj {\n switch (c.kind2d) {\n case 'line':\n return { ...c, ox: c.ox + dx, oy: c.oy + dy }\n case 'circle':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'ellipse':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'trimmed':\n return { ...c, basis: translateCurve2d(c.basis, dx, dy) }\n }\n}\n\n/**\n * Rotate a curve by an angle about a center point.\n * @param c - the curve to rotate.\n * @param angle - the rotation angle in radians.\n * @param cx - the x coordinate of the rotation center.\n * @param cy - the y coordinate of the rotation center.\n * @returns a new Curve2dObj rotated by `angle` about `(cx, cy)`.\n */\nexport function rotateCurve2d(c: Curve2dObj, angle: number, cx: number, cy: number): Curve2dObj {\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const rotatePoint = (x: number, y: number): [number, number] => {\n const rx = x - cx\n const ry = y - cy\n return [cx + rx * cos - ry * sin, cy + rx * sin + ry * cos]\n }\n switch (c.kind2d) {\n case 'line': {\n const [ox, oy] = rotatePoint(c.ox, c.oy)\n const ndx = c.dx * cos - c.dy * sin\n const ndy = c.dx * sin + c.dy * cos\n return { ...c, ox, oy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy }\n }\n case 'ellipse': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, xDirAngle: c.xDirAngle + angle }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'trimmed': {\n const basis = rotateCurve2d(c.basis, angle, cx, cy)\n // A circle carries no frame angle, so its rotation must land in the\n // trim range: parameter IS the geometric angle (negated when\n // sense=false). Without this shift, rotating an arc about its own\n // circle center was a silent no-op.\n if (basis.kind2d === 'circle') {\n const shift = basis.sense ? angle : -angle\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n/**\n * Scale a curve by a factor about a center point.\n * @param c - the curve to scale.\n * @param factor - the scale factor (may be negative to mirror-and-scale).\n * @param cx - the x coordinate of the scaling center.\n * @param cy - the y coordinate of the scaling center.\n * @returns a new Curve2dObj scaled by `factor` about `(cx, cy)`.\n */\nexport function scaleCurve2d(c: Curve2dObj, factor: number, cx: number, cy: number): Curve2dObj {\n const scalePoint = (x: number, y: number): [number, number] => [\n cx + (x - cx) * factor,\n cy + (y - cy) * factor,\n ]\n switch (c.kind2d) {\n case 'line': {\n // Scale BOTH endpoints and recompute direction/length (see brepjs notes:\n // scaling only origin left the endpoint wrong for factor != 1, most\n // damagingly for mirror factor=-1 which reflected the origin but kept the\n // original direction).\n const [ox, oy] = scalePoint(c.ox, c.oy)\n const [ex, ey] = scalePoint(c.ox + c.dx * c.len, c.oy + c.dy * c.len)\n const ndx = ex - ox\n const ndy = ey - oy\n const nlen = Math.sqrt(ndx * ndx + ndy * ndy)\n return {\n ...c,\n ox,\n oy,\n dx: nlen > 0 ? ndx / nlen : c.dx,\n dy: nlen > 0 ? ndy / nlen : c.dy,\n len: nlen,\n }\n }\n case 'circle': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, radius: c.radius * Math.abs(factor) }\n }\n case 'ellipse': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return {\n ...c,\n cx: ncx,\n cy: ncy,\n majorRadius: c.majorRadius * Math.abs(factor),\n minorRadius: c.minorRadius * Math.abs(factor),\n }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'trimmed':\n return { ...c, basis: scaleCurve2d(c.basis, factor, cx, cy) }\n }\n}\n\n/**\n * Mirror a curve through a center point (a half-turn).\n * @param c - the curve to mirror.\n * @param cx - the x coordinate of the mirror center.\n * @param cy - the y coordinate of the mirror center.\n * @returns a new Curve2dObj rotated 180 degrees about `(cx, cy)`.\n */\nexport function mirrorAtPoint(c: Curve2dObj, cx: number, cy: number): Curve2dObj {\n // A point mirror IS a half-turn. Routing through rotate keeps every curve\n // type's parameterization exact: scale(-1) reflected conic centers but left\n // their angular parameterization behind.\n return rotateCurve2d(c, Math.PI, cx, cy)\n}\n\n/**\n * Mirror a curve across an axis defined by a point and a direction vector.\n * @param c - the curve to mirror.\n * @param ox - the x coordinate of a point on the mirror axis.\n * @param oy - the y coordinate of a point on the mirror axis.\n * @param dx - the x component of the axis direction vector.\n * @param dy - the y component of the axis direction vector.\n * @returns a new Curve2dObj reflected across the given axis.\n */\nexport function mirrorAcrossAxis(\n c: Curve2dObj,\n ox: number,\n oy: number,\n dx: number,\n dy: number,\n): Curve2dObj {\n const len = Math.sqrt(dx * dx + dy * dy)\n if (len < 1e-15) return c\n const nx = dx / len\n const ny = dy / len\n const reflectPoint = (x: number, y: number): [number, number] => {\n const rx = x - ox\n const ry = y - oy\n const dot = rx * nx + ry * ny\n return [ox + 2 * dot * nx - rx, oy + 2 * dot * ny - ry]\n }\n switch (c.kind2d) {\n case 'line': {\n const [nox, noy] = reflectPoint(c.ox, c.oy)\n const ndx = 2 * (c.dx * nx + c.dy * ny) * nx - c.dx\n const ndy = 2 * (c.dx * nx + c.dy * ny) * ny - c.dy\n return { ...c, ox: nox, oy: noy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, sense: !c.sense }\n }\n case 'ellipse': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n // Reflect the major-axis direction angle across the mirror axis\n const cos2 = nx * nx - ny * ny\n const sin2 = 2 * nx * ny\n const newAngle = Math.atan2(\n sin2 * Math.cos(c.xDirAngle) - cos2 * Math.sin(c.xDirAngle),\n cos2 * Math.cos(c.xDirAngle) + sin2 * Math.sin(c.xDirAngle),\n )\n return { ...c, cx: ncx, cy: ncy, xDirAngle: newAngle, sense: !c.sense }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'trimmed': {\n const basis = mirrorAcrossAxis(c.basis, ox, oy, dx, dy)\n // Reflection maps a circle's geometric angle theta to 2*phi - theta\n // (phi = axis angle). The sense flip on the basis absorbs the negation;\n // the 2*phi rotation has nowhere to live on a frameless circle, so it\n // lands in the trim range (sign follows the ORIGINAL sense).\n if (c.basis.kind2d === 'circle' && basis.kind2d === 'circle') {\n const phi = Math.atan2(ny, nx)\n const shift = c.basis.sense ? -2 * phi : 2 * phi\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// 2D curve–curve intersection\n// ---------------------------------------------------------------------------\n/**\n * Compute intersection points (and overlapping segments) between two 2D curves.\n * Handles analytic cases (line-line, line-circle, circle-circle) and falls back\n * to numerical sampling + Newton refinement for general curves.\n * @param c1 - the first curve.\n * @param c2 - the second curve.\n * @param tolerance - the geometric tolerance used for candidate filtering.\n * @returns the intersection points and any overlapping curve segments.\n */\nexport function intersectCurves2dFn(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = unwrapCurve(c1)\n const b2 = unwrapCurve(c2)\n // Analytic: line-line\n if (b1.kind2d === 'line' && b2.kind2d === 'line') {\n return intersectLineLine(c1, b1, c2, b2, tolerance)\n }\n // Analytic: line-circle / circle-line\n if (b1.kind2d === 'line' && b2.kind2d === 'circle') {\n return { points: intersectLineCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n if (b1.kind2d === 'circle' && b2.kind2d === 'line') {\n return { points: intersectLineCircle(c2, b2, c1, b1, tolerance), segments: [] }\n }\n // Analytic: circle-circle\n if (b1.kind2d === 'circle' && b2.kind2d === 'circle') {\n return { points: intersectCircleCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n // General: numerical (with self-intersection handling)\n const isSelf = c1 === c2\n return numericalIntersect(c1, c2, tolerance, isSelf)\n}\n\n/**\n * Serialize a curve (JSON round-trip).\n * @param c - the curve to serialize.\n * @returns the curve as a JSON string.\n */\nexport function serializeCurve2d(c: Curve2dObj): string {\n return JSON.stringify(c)\n}\n/**\n * Deserialize a curve previously produced by {@link serializeCurve2d}.\n * @param data - the JSON string describing the curve.\n * @returns the reconstructed Curve2dObj.\n */\nexport function deserializeCurve2d(data: string): Curve2dObj {\n return JSON.parse(data)\n}\n\n// ---------------------------------------------------------------------------\n// BBox helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Create an empty (inverted) curve bounding box.\n * @returns a fresh CurveBBox2d whose mins are +Infinity and maxes are -Infinity.\n */\nexport function createCurveBBox2d(): CurveBBox2d {\n return { kind2d_b: true, xMin: Infinity, yMin: Infinity, xMax: -Infinity, yMax: -Infinity }\n}\n\n/**\n * Expand a curve bounding box to include a curve's extent.\n * Uses analytic extremes for lines and circles/arcs and sampling otherwise.\n * @param bbox - the box to expand in place.\n * @param c - the curve whose extent is incorporated.\n * @param _tol - reserved tolerance parameter (unused).\n */\nexport function addCurveToBBox(bbox: CurveBBox2d, c: Curve2dObj, _tol: number): void {\n const basis = c.kind2d === 'trimmed' ? c.basis : c\n // Analytic: lines need only 2 endpoints (no sampling)\n if (basis.kind2d === 'line') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n bbox.xMin = Math.min(bbox.xMin, x0, x1)\n bbox.yMin = Math.min(bbox.yMin, y0, y1)\n bbox.xMax = Math.max(bbox.xMax, x0, x1)\n bbox.yMax = Math.max(bbox.yMax, y0, y1)\n return\n }\n // Analytic: circles/arcs — endpoints + axis extremes\n if (basis.kind2d === 'circle') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const { cx, cy, radius, sense } = basis\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n let xMin = Math.min(x0, x1)\n let xMax = Math.max(x0, x1)\n let yMin = Math.min(y0, y1)\n let yMax = Math.max(y0, y1)\n // Check axis-aligned extreme angles within the arc's parameter range\n const tStart = c.kind2d === 'trimmed' ? c.tStart : bounds.first\n const tEnd = c.kind2d === 'trimmed' ? c.tEnd : bounds.last\n for (let k = 0; k < 4; k++) {\n const angle = (k * Math.PI) / 2\n const t = sense ? angle : -angle\n // Check if t (or t + 2π) falls within [tStart, tEnd]\n for (let wrap = 0; wrap <= 1; wrap++) {\n const tt = t + wrap * 2 * Math.PI\n if (tt >= tStart - 1e-10 && tt <= tEnd + 1e-10) {\n const ex = cx + radius * Math.cos(angle)\n const ey = cy + radius * Math.sin(angle)\n xMin = Math.min(xMin, ex)\n xMax = Math.max(xMax, ex)\n yMin = Math.min(yMin, ey)\n yMax = Math.max(yMax, ey)\n break\n }\n }\n }\n bbox.xMin = Math.min(bbox.xMin, xMin)\n bbox.yMin = Math.min(bbox.yMin, yMin)\n bbox.xMax = Math.max(bbox.xMax, xMax)\n bbox.yMax = Math.max(bbox.yMax, yMax)\n return\n }\n // General: sample (bezier, bspline, ellipse)\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const nSamples = 20\n const dt = (bounds.last - bounds.first) / nSamples\n for (let i = 0; i <= nSamples; i++) {\n const t = bounds.first + i * dt\n const [x, y] = evaluateCurve2d(c, t)\n if (x < bbox.xMin) bbox.xMin = x\n if (y < bbox.yMin) bbox.yMin = y\n if (x > bbox.xMax) bbox.xMax = x\n if (y > bbox.yMax) bbox.yMax = y\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/** Unwrap trimmed wrappers to get the basis curve type. */\nfunction unwrapCurve(c: Curve2dObj): Curve2dObj {\n let cur = c\n while (cur.kind2d === 'trimmed') cur = cur.basis\n return cur\n}\n\n/** Check if parameter t is within the curve's domain. */\nfunction inDomain(c: Curve2dObj, t: number, tol: number): boolean {\n const b = curveBounds(c)\n return t >= b.first - tol && t <= b.last + tol\n}\n\n/** Find parameter on curve c closest to point (px, py), searching near tGuess. */\nfunction refineParam(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n const N = 80\n const dt = (bounds.last - bounds.first) / N\n let bestT = bounds.first\n let bestD = Infinity\n for (let i = 0; i <= N; i++) {\n const t = bounds.first + i * dt\n const [ex, ey] = evaluateCurve2d(c, t)\n const d = (ex - px) ** 2 + (ey - py) ** 2\n if (d < bestD) {\n bestD = d\n bestT = t\n }\n }\n // bestD is squared geometric distance. Derive a scale-relative threshold\n // from the curve's geometric extent (not parameter span).\n const [sx, sy] = evaluateCurve2d(c, bounds.first)\n const [ex, ey] = evaluateCurve2d(c, bounds.last)\n const [mx, my] = evaluateCurve2d(c, (bounds.first + bounds.last) / 2)\n const geomExtent = Math.max(\n Math.sqrt((ex - sx) ** 2 + (ey - sy) ** 2),\n Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2),\n 1e-6,\n )\n const maxDist = geomExtent * maxRatio\n return bestD < maxDist * maxDist ? bestT : null\n}\n\n/**\n * Parameter on a curve closest to a point.\n *\n * This is the general \"point → parameter\" primitive used by corner/offset work:\n * it searches the curve's domain for the parameter whose evaluated point is\n * nearest to `(px, py)` and returns it when that nearest distance is within a\n * configurable fraction of the curve's geometric extent. Returns `null` when the\n * point lies too far off the curve (the raw gap-vs-extent guard) so callers can\n * distinguish \"on/very near the curve\" from \"clearly off\".\n *\n * @param c - the curve to search (line, arc, ellipse, bezier, bspline, trimmed).\n * @param px - the query point x.\n * @param py - the query point y.\n * @param maxRatio - the maximum acceptable nearest-distance / geometric-extent\n * ratio (default 0.1; raise it to accept points that sit further off the curve).\n * @returns the domain parameter `t`, or `null` when `(px, py)` is off-curve by\n * more than `maxRatio` of the curve's geometric extent.\n */\nexport function parameterOfPoint(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n\n // Coarse sample to get within one domain step of the nearest point (semantics,\n // curvature, and per-kernel sensitivity: `refineParam`'s N=80 grid).\n const seed = refineParam(c, px, py, maxRatio)\n if (seed === null) return null\n\n // Refine to the projection foot: for the farthest/nearest parameter the chord\n // `(curve(t) − P)` is perpendicular to the tangent, i.e. g(t)=dot(·)=0. Solve\n // g(t)=0 with Newton on a central-difference derivative.\n const span = bounds.last - bounds.first\n const hbase = span * 1e-6\n let t = seed\n const fixed = new Set<string>()\n for (let i = 0; i < 24; i++) {\n const [ex, ey] = evaluateCurve2d(c, t)\n const [tx, ty] = tangentCurve2d(c, t)\n const g = (ex - px) * tx + (ey - py) * ty\n if (Math.abs(g) < 1e-12) break\n const h = Math.max(hbase, 1e-9)\n const [hx, hy] = evaluateCurve2d(c, Math.min(bounds.last, t + h))\n const [hT, hTy] = tangentCurve2d(c, Math.min(bounds.last, t + h))\n const gp = ((hx - px) * hT + (hy - py) * hTy - g) / h\n if (Math.abs(gp) < 1e-16) break\n const tn = t - g / gp\n t = Math.max(bounds.first, Math.min(bounds.last, tn))\n const key = t.toFixed(12)\n if (fixed.has(key)) break\n fixed.add(key)\n if (okConverge(c, px, py, t)) break\n }\n return t\n}\n\n/** True when `(px, py)` is within `1e-9` of the curve at parameter `t`. */\nfunction okConverge(c: Curve2dObj, px: number, py: number, t: number): boolean {\n const [ex, ey] = evaluateCurve2d(c, t)\n return Math.hypot(ex - px, ey - py) < 1e-9\n}\n\n/** The unwrapped basis curve (strips any nesting of `trimmed` wrappers). */\nfunction basisOf(c: Curve2dObj): Curve2dObj {\n let b = c\n while (b.kind2d === 'trimmed') b = b.basis\n return b\n}\n\n/**\n * Trim a curve to a sub-parameter range given in the basis curve's native domain.\n *\n * The returned `trimmed` curve keeps the full basis; its `t∈[0,1]` domain maps\n * into `[tStart, tEnd]` of the basis (so it is the inverse of `curveBounds` for\n * trimmed curves). Parameters are in the basis's native domain (a line: distance\n * along `[0,len]`; an arc/ellipse: angle `[.., ..]`).\n *\n * @param c - the curve to trim (may itself be already-trimmed; the basis is reused).\n * @param tStart - the basis-domain parameter where the sub-curve starts.\n * @param tEnd - the basis-domain parameter where the sub-curve ends.\n * @returns the trimmed `Curve2dObj`.\n */\nexport function trimCurve(c: Curve2dObj, tStart: number, tEnd: number): Curve2dObj {\n return { kind2d: 'trimmed', basis: basisOf(c), tStart, tEnd }\n}\n\n/**\n * Split a curve at a native-domain parameter into two trimmed sub-curves.\n *\n * This is the splice primitive that D1 boolean-splitting and D3 corner\n * (fillet/chamfer) use: it cuts a single curve at an interior parameter into\n * two `TrimmedCurve2d` sharing the same basis, covering `[first, t]` and\n * `[t, last]`. Returns `null` when `t` is not strictly interior.\n *\n * @param c - the curve to split.\n * @param t - the native-domain split parameter (strictly inside the basis domain).\n * @returns the two sub-curves, or `null` when `t` is outside the interior.\n */\nexport function splitCurveAt(c: Curve2dObj, t: number): [Curve2dObj, Curve2dObj] | null {\n const basis = basisOf(c)\n const { first, last } = curveBounds(basis)\n if (t <= first || t >= last) return null\n return [trimCurve(basis, first, t), trimCurve(basis, t, last)]\n}\n\nfunction intersectLineLine(\n c1: Curve2dObj,\n l1: Line2d,\n c2: Curve2dObj,\n l2: Line2d,\n tol: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const det = l1.dx * l2.dy - l1.dy * l2.dx\n if (Math.abs(det) >= 1e-14) {\n // Non-parallel: solve for intersection\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const t1 = (ex * l2.dy - ey * l2.dx) / det\n const t2 = (ex * l1.dy - ey * l1.dx) / det\n if (!inDomain(c1, t1, tol) || !inDomain(c2, t2, tol)) return { points: [], segments: [] }\n return { points: [[l1.ox + t1 * l1.dx, l1.oy + t1 * l1.dy]], segments: [] }\n }\n // Parallel — check if collinear and overlapping\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const cross = ex * l1.dy - ey * l1.dx\n if (Math.abs(cross) > tol) return { points: [], segments: [] } // parallel but not collinear\n // Project c2 endpoints onto c1's parameter space\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const p2s = evaluateCurve2d(c2, b2.first)\n const p2e = evaluateCurve2d(c2, b2.last)\n const t2sOn1 = (p2s[0] - l1.ox) * l1.dx + (p2s[1] - l1.oy) * l1.dy\n const t2eOn1 = (p2e[0] - l1.ox) * l1.dx + (p2e[1] - l1.oy) * l1.dy\n const overlapStart = Math.max(b1.first, Math.min(t2sOn1, t2eOn1))\n const overlapEnd = Math.min(b1.last, Math.max(t2sOn1, t2eOn1))\n if (overlapEnd - overlapStart < tol) return { points: [], segments: [] } // no meaningful overlap\n const sx = l1.ox + overlapStart * l1.dx\n const sy = l1.oy + overlapStart * l1.dy\n const ex2 = l1.ox + overlapEnd * l1.dx\n const ey2 = l1.oy + overlapEnd * l1.dy\n const seg = makeLine2d(sx, sy, ex2, ey2)\n return { points: [], segments: [seg] }\n}\n\nfunction intersectLineCircle(\n cLine: Curve2dObj,\n line: Line2d,\n cCirc: Curve2dObj,\n circ: Circle2d,\n tol: number,\n): [number, number][] {\n // Vector from circle center to line origin\n const fx = line.ox - circ.cx\n const fy = line.oy - circ.cy\n // Quadratic: |f + t*d|^2 = r^2\n const a = line.dx * line.dx + line.dy * line.dy // = 1 for normalized\n const b = 2 * (fx * line.dx + fy * line.dy)\n const c = fx * fx + fy * fy - circ.radius * circ.radius\n const disc = b * b - 4 * a * c\n if (disc < -tol) return []\n const results: [number, number][] = []\n const sqrtDisc = Math.sqrt(Math.max(0, disc))\n const t1 = (-b - sqrtDisc) / (2 * a)\n const t2 = (-b + sqrtDisc) / (2 * a)\n for (const tLine of disc < tol * tol ? [t1] : [t1, t2]) {\n if (!inDomain(cLine, tLine, tol)) continue\n const px = line.ox + tLine * line.dx\n const py = line.oy + tLine * line.dy\n // Check that the point is in the circle's domain\n const tCirc = refineParam(cCirc, px, py)\n if (tCirc === null) continue\n const [cx2, cy2] = evaluateCurve2d(cCirc, tCirc)\n if ((cx2 - px) ** 2 + (cy2 - py) ** 2 > tol * tol * 1e6) continue\n results.push([px, py])\n }\n return results\n}\n\nfunction intersectConcentricArcs(c1: Curve2dObj, c2: Curve2dObj, tol: number): [number, number][] {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const isFullCircle1 = Math.abs(b1.last - b1.first - 2 * Math.PI) < 1e-10\n const isFullCircle2 = Math.abs(b2.last - b2.first - 2 * Math.PI) < 1e-10\n if (isFullCircle1 && isFullCircle2) return []\n if (isFullCircle1) {\n return [evaluateCurve2d(c2, b2.first), evaluateCurve2d(c2, b2.last)]\n }\n if (isFullCircle2) {\n return [evaluateCurve2d(c1, b1.first), evaluateCurve2d(c1, b1.last)]\n }\n const pts: [number, number][] = []\n const checks: [Curve2dObj, [number, number]][] = [\n [c2, evaluateCurve2d(c1, b1.first)],\n [c2, evaluateCurve2d(c1, b1.last)],\n [c1, evaluateCurve2d(c2, b2.first)],\n [c1, evaluateCurve2d(c2, b2.last)],\n ]\n for (const [target, pt] of checks) {\n const t = refineParam(target, pt[0], pt[1])\n if (t !== null) {\n const [ex, ey] = evaluateCurve2d(target, t)\n if ((ex - pt[0]) ** 2 + (ey - pt[1]) ** 2 < tol * tol * 100) pts.push(pt)\n }\n }\n const deduped: [number, number][] = []\n for (const p of pts) {\n if (!deduped.some(([ddx, ddy]) => (ddx - p[0]) ** 2 + (ddy - p[1]) ** 2 < tol * tol * 100)) {\n deduped.push(p)\n }\n }\n return deduped\n}\n\nfunction intersectCircleCircle(\n c1: Curve2dObj,\n circ1: Circle2d,\n c2: Curve2dObj,\n circ2: Circle2d,\n tol: number,\n): [number, number][] {\n const dx = circ2.cx - circ1.cx\n const dy = circ2.cy - circ1.cy\n const d = Math.sqrt(dx * dx + dy * dy)\n if (d > circ1.radius + circ2.radius + tol) return []\n if (d < Math.abs(circ1.radius - circ2.radius) - tol) return []\n if (d < 1e-14) {\n if (Math.abs(circ1.radius - circ2.radius) > tol) return []\n return intersectConcentricArcs(c1, c2, tol)\n }\n const a = (circ1.radius * circ1.radius - circ2.radius * circ2.radius + d * d) / (2 * d)\n const h2 = circ1.radius * circ1.radius - a * a\n const h = Math.sqrt(Math.max(0, h2))\n const mx = circ1.cx + (a * dx) / d\n const my = circ1.cy + (a * dy) / d\n const candidates: [number, number][] =\n h < tol\n ? [[mx, my]]\n : [\n [mx + (h * dy) / d, my - (h * dx) / d],\n [mx - (h * dy) / d, my + (h * dx) / d],\n ]\n // Filter candidates that lie within both curves' domains\n const results: [number, number][] = []\n for (const [px, py] of candidates) {\n const t1 = refineParam(c1, px, py)\n const t2 = refineParam(c2, px, py)\n if (t1 === null || t2 === null) continue\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const tolSq = (tol * 10) ** 2\n if ((x1 - px) ** 2 + (y1 - py) ** 2 > tolSq) continue\n if ((x2 - px) ** 2 + (y2 - py) ** 2 > tolSq) continue\n results.push([px, py])\n }\n return results\n}\n\n/**\n * Numerical intersection via sampling + Newton refinement.\n * Samples both curves densely, finds close point pairs, refines with Newton.\n */\nfunction numericalIntersect(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n isSelf = false,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n if (!isFinite(b1.first) || !isFinite(b1.last) || !isFinite(b2.first) || !isFinite(b2.last)) {\n return { points: [], segments: [] }\n }\n const N = 100\n const pts1: { t: number; x: number; y: number }[] = []\n const pts2: { t: number; x: number; y: number }[] = []\n for (let i = 0; i <= N; i++) {\n const t1 = b1.first + ((b1.last - b1.first) * i) / N\n const [x1, y1] = evaluateCurve2d(c1, t1)\n pts1.push({ t: t1, x: x1, y: y1 })\n const t2 = b2.first + ((b2.last - b2.first) * i) / N\n const [x2, y2] = evaluateCurve2d(c2, t2)\n pts2.push({ t: t2, x: x2, y: y2 })\n }\n // Pre-compute segment bounds for curve2 (avoids recomputing N times in inner loop)\n const crossTol = Math.max(tolerance * 100, 0.5)\n const seg2Bounds = new Float64Array(N * 6) // xmin, xmax, ymin, ymax, tmid, _pad\n for (let j = 0; j < N; j++) {\n const a = pts2[j]!\n const b = pts2[j + 1]!\n const off = j * 6\n seg2Bounds[off] = Math.min(a.x, b.x)\n seg2Bounds[off + 1] = Math.max(a.x, b.x)\n seg2Bounds[off + 2] = Math.min(a.y, b.y)\n seg2Bounds[off + 3] = Math.max(a.y, b.y)\n seg2Bounds[off + 4] = (a.t + b.t) / 2\n }\n // Find segment pairs where the curves are close\n const candidates: { t1: number; t2: number }[] = []\n const selfMinSep = (b1.last - b1.first) / 5\n for (let i = 0; i < N; i++) {\n const p1a = pts1[i]!\n const p1b = pts1[i + 1]!\n // Hoist outer segment AABB (computed once per outer iteration)\n const x1min = Math.min(p1a.x, p1b.x) - crossTol\n const x1max = Math.max(p1a.x, p1b.x) + crossTol\n const y1min = Math.min(p1a.y, p1b.y) - crossTol\n const y1max = Math.max(p1a.y, p1b.y) + crossTol\n const t1mid = (p1a.t + p1b.t) / 2\n for (let j = 0; j < N; j++) {\n const off = j * 6\n if (x1max < seg2Bounds[off] || seg2Bounds[off + 1] < x1min) continue\n if (y1max < seg2Bounds[off + 2] || seg2Bounds[off + 3] < y1min) continue\n const t2mid = seg2Bounds[off + 4]\n if (isSelf && Math.abs(t1mid - t2mid) < selfMinSep) continue\n candidates.push({ t1: t1mid, t2: t2mid })\n }\n }\n // Refine candidates via Newton iteration\n const tol2 = tolerance * tolerance\n const found: [number, number][] = []\n for (const { t1: t1Init, t2: t2Init } of candidates) {\n let t1 = t1Init\n let t2 = t2Init\n for (let iter = 0; iter < 20; iter++) {\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const dx = x1 - x2\n const dy = y1 - y2\n if (dx * dx + dy * dy < tol2) break\n const d1 = tangentCurve2d(c1, t1)\n const d2 = tangentCurve2d(c2, t2)\n // Newton system: J * [dt1, dt2]^T = -[dx, dy]\n const det = d1[0] * -d2[1] - -d2[0] * d1[1]\n if (Math.abs(det) < 1e-14) break\n const dt1 = (-dx * -d2[1] - -dy * -d2[0]) / det\n const dt2 = (d1[0] * -dy - d1[1] * -dx) / det\n t1 += dt1\n t2 += dt2\n t1 = Math.max(b1.first, Math.min(b1.last, t1))\n t2 = Math.max(b2.first, Math.min(b2.last, t2))\n }\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n // For self-intersection, only accept points with well-separated params\n if (isSelf && Math.abs(t1 - t2) < (b1.last - b1.first) * 0.05) continue\n if ((x1 - x2) ** 2 + (y1 - y2) ** 2 < tolerance * tolerance * 1e6) {\n const px = (x1 + x2) / 2\n const py = (y1 + y2) / 2\n let dup = false\n for (const [fx, fy] of found) {\n if ((fx - px) ** 2 + (fy - py) ** 2 < tolerance * tolerance * 1e4) {\n dup = true\n break\n }\n }\n if (!dup) found.push([px, py])\n }\n }\n return { points: found, segments: [] }\n}\n\n// ---------------------------------------------------------------------------\n// Private curve evaluators\n// ---------------------------------------------------------------------------\n\nfunction evaluateBezier(poles: [number, number][], t: number): [number, number] {\n // De Casteljau\n const n = poles.length\n const work: [number, number][] = poles.map(([x, y]) => [x, y])\n for (let r = 1; r < n; r++) {\n for (let i = 0; i < n - r; i++) {\n const wi = work[i]!\n const wi1 = work[i + 1]!\n wi[0] = (1 - t) * wi[0] + t * wi1[0]\n wi[1] = (1 - t) * wi[1] + t * wi1[1]\n }\n }\n return work[0]!\n}\n\nfunction evaluateBSpline2d(c: BSpline2d, t: number): [number, number] {\n // Expand knots with multiplicities\n const fullKnots: number[] = []\n for (let i = 0; i < c.knots.length; i++) {\n const mult = c.multiplicities[i] ?? 1\n for (let j = 0; j < mult; j++) {\n fullKnots.push(c.knots[i]!)\n }\n }\n // De Boor evaluation\n const p = c.degree\n const n = c.poles.length\n const k = fullKnots.length\n const tClamped = Math.max(fullKnots[p]!, Math.min(fullKnots[k - p - 1]!, t))\n // Find span\n let span = p\n for (let i = p; i < k - p - 1; i++) {\n if (tClamped >= fullKnots[i]! && tClamped < fullKnots[i + 1]!) {\n span = i\n break\n }\n }\n if (tClamped >= fullKnots[k - p - 1]!) span = k - p - 2\n // Relevant control points in HOMOGENEOUS form [w·x, w·y, w]. De Boor is linear,\n // so running it on the homogeneous values and dividing at the end is exactly\n // the rational (NURBS) evaluation; with every weight 1 the third component\n // stays 1 and this reduces to the non-rational case bit for bit.\n const weights = c.weights\n const d: [number, number, number][] = []\n for (let j = 0; j <= p; j++) {\n const idx = Math.max(0, Math.min(span - p + j, n - 1))\n const pole = c.poles[idx]!\n const wi = weights ? (weights[idx] ?? 1) : 1\n d.push([pole[0] * wi, pole[1] * wi, wi])\n }\n // De Boor recursion\n for (let r = 1; r <= p; r++) {\n for (let j = p; j >= r; j--) {\n const i = span - p + j\n const left = fullKnots[i] ?? 0\n const right = fullKnots[i + p - r + 1] ?? 1\n const denom = right - left\n const alpha = denom > 1e-15 ? (tClamped - left) / denom : 0\n const dj = d[j]!\n const djPrev = d[j - 1]!\n dj[0] = (1 - alpha) * djPrev[0] + alpha * dj[0]\n dj[1] = (1 - alpha) * djPrev[1] + alpha * dj[1]\n dj[2] = (1 - alpha) * djPrev[2] + alpha * dj[2]\n }\n }\n const res = d[p]!\n const w = res[2]\n return w !== 0 ? [res[0] / w, res[1] / w] : [res[0], res[1]]\n}"]}
|
|
1
|
+
{"version":3,"file":"curve2d.js","sourceRoot":"","sources":["../../src/geometry2d/curve2d.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Pure-TypeScript 2D analytic curve model (faijs port of brepjs).\n *\n * Adapted from brepjs `src/kernel/geometry2d.ts` (Apache-2.0), preserving core\n * algorithms and naming. Differences from brepjs:\n * - discriminant field renamed `__bk2d` → `kind2d` (2026-09-27 decision),\n * bbox discriminant `__bk2d_bbox` → `kind2d_b`.\n * - All curves are plain data objects (no kernel handles, no dispose), per the\n * faijs \"2D curves are pure objects\" design.\n *\n * Pure TS, zero WASM, zero external deps. All 2D curves represented as plain\n * objects with a `kind2d` discriminant.\n *\n * License: adapted from brepjs (Apache-2.0). Retained per faijs convention for\n * brepjs-ported files (cf. svg-to-solid.ts).\n *\n * @module\n */\n// ---------------------------------------------------------------------------\n// Evaluation\n// ---------------------------------------------------------------------------\n\n/** Line: origin + unit direction + length. */\nexport interface Line2d {\n readonly kind2d: 'line'\n readonly ox: number\n readonly oy: number\n readonly dx: number\n readonly dy: number\n readonly len: number\n}\n/** Full circle. sense=true → CCW. */\nexport interface Circle2d {\n readonly kind2d: 'circle'\n readonly cx: number\n readonly cy: number\n readonly radius: number\n readonly sense: boolean\n}\n/** Ellipse (or arc of one, via trim). */\nexport interface Ellipse2d {\n readonly kind2d: 'ellipse'\n readonly cx: number\n readonly cy: number\n readonly majorRadius: number\n readonly minorRadius: number\n readonly xDirAngle: number\n readonly sense: boolean\n}\n/** Bezier curve (De Casteljau). */\nexport interface Bezier2d {\n readonly kind2d: 'bezier'\n readonly poles: [number, number][]\n}\n/** B-spline (De Boor). */\nexport interface BSpline2d {\n readonly kind2d: 'bspline'\n readonly poles: [number, number][]\n readonly knots: number[]\n readonly multiplicities: number[]\n readonly degree: number\n readonly isPeriodic: boolean\n /**\n * One weight per pole. Absent (or all 1) for a non-rational curve. Rational\n * B-splines are exactly what a kernel hands back for a conic-approximating or\n * spline edge (`BrepNurbsCurveData.rational`), and dropping the weights turns\n * the curve into a different one — so they travel with the poles.\n */\n readonly weights?: number[]\n}\n/** Trimmed wrapper over another curve. */\nexport interface TrimmedCurve2d {\n readonly kind2d: 'trimmed'\n readonly basis: Curve2dObj\n readonly tStart: number\n readonly tEnd: number\n}\n/**\n * A 2D curve expressed as one of the supported analytic or spline kinds.\n * Discriminated by the `kind2d` field.\n */\nexport type Curve2dObj = Line2d | Circle2d | Ellipse2d | Bezier2d | BSpline2d | TrimmedCurve2d\n\n/**\n * Mutable 2D bounding box carried by the curve-specific bbox helpers.\n * `kind2d_b` marks the discriminant used to detect this box type.\n */\nexport interface CurveBBox2d {\n readonly kind2d_b: true\n xMin: number\n yMin: number\n xMax: number\n yMax: number\n}\n\n/**\n * Evaluate a curve at parameter t to a 2D point.\n * @param c - the curve to evaluate.\n * @param t - the parameter value within the curve's domain.\n * @returns the 2D point `[x, y]` on the curve.\n */\nexport function evaluateCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.ox + c.dx * t, c.oy + c.dy * t]\n case 'circle': {\n const angle = c.sense ? t : -t\n return [c.cx + c.radius * Math.cos(angle), c.cy + c.radius * Math.sin(angle)]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const x = c.majorRadius * Math.cos(angle)\n const y = c.minorRadius * Math.sin(angle)\n return [c.cx + x * cos - y * sin, c.cy + x * sin + y * cos]\n }\n case 'bezier':\n return evaluateBezier(c.poles, t)\n case 'bspline':\n return evaluateBSpline2d(c, t)\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n return evaluateCurve2d(c.basis, mapped)\n }\n }\n}\n\n/**\n * Tangent (non-normalized direction derivative) at parameter t.\n * @param c - the curve to differentiate.\n * @param t - the parameter value within the curve's domain.\n * @returns the unnormalized tangent vector `[dx, dy]` at `t`.\n */\nexport function tangentCurve2d(c: Curve2dObj, t: number): [number, number] {\n switch (c.kind2d) {\n case 'line':\n return [c.dx, c.dy]\n case 'circle': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n return [-c.radius * Math.sin(angle) * sign, c.radius * Math.cos(angle) * sign]\n }\n case 'ellipse': {\n const angle = c.sense ? t : -t\n const sign = c.sense ? 1 : -1\n const cos = Math.cos(c.xDirAngle)\n const sin = Math.sin(c.xDirAngle)\n const dx = -c.majorRadius * Math.sin(angle) * sign\n const dy = c.minorRadius * Math.cos(angle) * sign\n return [dx * cos - dy * sin, dx * sin + dy * cos]\n }\n case 'bezier': {\n // Numerical differentiation\n const h = 1e-8\n const p0 = evaluateBezier(c.poles, Math.max(0, t - h))\n const p1 = evaluateBezier(c.poles, Math.min(1, t + h))\n const dt = Math.min(1, t + h) - Math.max(0, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'bspline': {\n const h = 1e-8\n const kFirst = c.knots[0]!\n const kLast = c.knots[c.knots.length - 1]!\n const p0 = evaluateBSpline2d(c, Math.max(kFirst, t - h))\n const p1 = evaluateBSpline2d(c, Math.min(kLast, t + h))\n const dt = Math.min(kLast, t + h) - Math.max(kFirst, t - h)\n return [(p1[0] - p0[0]) / dt, (p1[1] - p0[1]) / dt]\n }\n case 'trimmed': {\n const mapped = c.tStart + t * (c.tEnd - c.tStart)\n const tan = tangentCurve2d(c.basis, mapped)\n const scale = c.tEnd - c.tStart\n return [tan[0] * scale, tan[1] * scale]\n }\n }\n}\n\n/**\n * Parameter domain of a curve.\n * @param c - the curve whose domain to read.\n * @returns the inclusive `first` and `last` parameter bounds.\n */\nexport function curveBounds(c: Curve2dObj): { first: number; last: number } {\n switch (c.kind2d) {\n case 'line':\n return { first: 0, last: c.len }\n case 'circle':\n case 'ellipse':\n return { first: 0, last: 2 * Math.PI }\n case 'bezier':\n return { first: 0, last: 1 }\n case 'bspline':\n return { first: c.knots[0]!, last: c.knots[c.knots.length - 1]! }\n case 'trimmed':\n return { first: 0, last: 1 }\n }\n}\n\n/**\n * OCCT-style type name of a curve.\n * @param c - the curve to name.\n * @returns the uppercase OCCT type name such as `LINE`, `CIRCLE` or `BSPLINE_CURVE`.\n */\nexport function curveTypeName(c: Curve2dObj): string {\n switch (c.kind2d) {\n case 'line':\n return 'LINE'\n case 'circle':\n return 'CIRCLE'\n case 'ellipse':\n return 'ELLIPSE'\n case 'bezier':\n return 'BEZIER_CURVE'\n case 'bspline':\n return 'BSPLINE_CURVE'\n case 'trimmed':\n return 'TRIMMED_' + curveTypeName(c.basis)\n }\n}\n\n// ---------------------------------------------------------------------------\n// Construction helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Line segment from (x1,y1) to (x2,y2).\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Line2d describing the segment.\n */\nexport function makeLine2d(x1: number, y1: number, x2: number, y2: number): Line2d {\n const dx = x2 - x1\n const dy = y2 - y1\n const len = Math.sqrt(dx * dx + dy * dy)\n return {\n kind2d: 'line',\n ox: x1,\n oy: y1,\n dx: len > 0 ? dx / len : 1,\n dy: len > 0 ? dy / len : 0,\n len,\n }\n}\n\n/**\n * Full circle with the given center, radius and winding sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param radius - the circle radius.\n * @param sense - true for counter-clockwise winding (default true).\n * @returns a Circle2d.\n */\nexport function makeCircle2d(cx: number, cy: number, radius: number, sense: boolean = true): Circle2d {\n return { kind2d: 'circle', cx, cy, radius, sense }\n}\n\n/**\n * Arc through three points; returns a trimmed circle, or a line if collinear.\n * @param x1 - the x coordinate of the start point.\n * @param y1 - the y coordinate of the start point.\n * @param xm - the x coordinate of the mid point.\n * @param ym - the y coordinate of the mid point.\n * @param x2 - the x coordinate of the end point.\n * @param y2 - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed arc circle, or a straight line when the points are collinear.\n */\nexport function makeArc2dThreePoints(\n x1: number,\n y1: number,\n xm: number,\n ym: number,\n x2: number,\n y2: number,\n): Curve2dObj {\n // Circumscribed circle through 3 points\n const d = 2 * (x1 * (ym - y2) + xm * (y2 - y1) + x2 * (y1 - ym))\n if (Math.abs(d) < 1e-12) {\n // Degenerate (collinear): return a line\n return makeLine2d(x1, y1, x2, y2)\n }\n const cx =\n ((x1 * x1 + y1 * y1) * (ym - y2) +\n (xm * xm + ym * ym) * (y2 - y1) +\n (x2 * x2 + y2 * y2) * (y1 - ym)) /\n d\n const cy =\n ((x1 * x1 + y1 * y1) * (x2 - xm) +\n (xm * xm + ym * ym) * (x1 - x2) +\n (x2 * x2 + y2 * y2) * (xm - x1)) /\n d\n const radius = Math.sqrt((x1 - cx) ** 2 + (y1 - cy) ** 2)\n // Compute angles for start (p1), mid (pm), and end (p2)\n const a1 = Math.atan2(y1 - cy, x1 - cx)\n const am = Math.atan2(ym - cy, xm - cx)\n const a2 = Math.atan2(y2 - cy, x2 - cx)\n // Determine sense: CCW if mid-point angle is between start and end going CCW\n let da1m = am - a1\n if (da1m < 0) da1m += 2 * Math.PI\n let da12 = a2 - a1\n if (da12 < 0) da12 += 2 * Math.PI\n const sense = da1m < da12 // CCW if midpoint comes before endpoint\n const circle = makeCircle2d(cx, cy, radius, sense)\n if (!sense) {\n // CW circle evaluates angle = -t, so parameter t = -angle.\n const tStart = -a1\n let tEnd = -a2\n if (tEnd < tStart - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart, tEnd }\n }\n // CCW: ensure tEnd >= tStart\n let tEnd = a2\n if (tEnd < a1 - 1e-9) tEnd += 2 * Math.PI\n return { kind2d: 'trimmed', basis: circle, tStart: a1, tEnd }\n}\n\n/**\n * Arc from a start point through a given tangent direction to an end point.\n * @param sx - the x coordinate of the start point.\n * @param sy - the y coordinate of the start point.\n * @param tx - the x component of the tangent direction at the start.\n * @param ty - the y component of the tangent direction at the start.\n * @param ex - the x coordinate of the end point.\n * @param ey - the y coordinate of the end point.\n * @returns a Curve2dObj: a trimmed circle arc, or a line when degenerate.\n */\nexport function makeArc2dTangent(\n sx: number,\n sy: number,\n tx: number,\n ty: number,\n ex: number,\n ey: number,\n): Curve2dObj {\n const len = Math.sqrt(tx * tx + ty * ty)\n const ntx = len > 0 ? tx / len : 0\n const nty = len > 0 ? ty / len : 0\n const dx = sx - ex\n const dy = sy - ey\n const denom = 2 * (dy * ntx - dx * nty)\n if (Math.abs(denom) < 1e-12) {\n return makeLine2d(sx, sy, ex, ey)\n }\n const chord2 = dx * dx + dy * dy\n const t = -chord2 / denom\n const cx = sx - t * nty\n const cy = sy + t * ntx\n const radius = Math.abs(t)\n const a1 = Math.atan2(sy - cy, sx - cx)\n const a2 = Math.atan2(ey - cy, ex - cx)\n const ccwTanX = -(sy - cy) / radius\n const ccwTanY = (sx - cx) / radius\n const dotCcw = ntx * ccwTanX + nty * ccwTanY\n let aMid\n if (dotCcw > 0) {\n let da = a2 - a1\n if (da <= 0) da += 2 * Math.PI\n aMid = a1 + da / 2\n } else {\n let da = a2 - a1\n if (da >= 0) da -= 2 * Math.PI\n aMid = a1 + da / 2\n }\n const mx = cx + radius * Math.cos(aMid)\n const my = cy + radius * Math.sin(aMid)\n return makeArc2dThreePoints(sx, sy, mx, my, ex, ey)\n}\n\n/**\n * Ellipse with the given center, radii, major-axis direction and sense.\n * @param cx - the x coordinate of the center.\n * @param cy - the y coordinate of the center.\n * @param majorRadius - the semi-major radius.\n * @param minorRadius - the semi-minor radius.\n * @param xDirX - the x component of the major-axis direction (default 1).\n * @param xDirY - the y component of the major-axis direction (default 0).\n * @param sense - true for counter-clockwise winding (default true).\n * @returns an Ellipse2d.\n */\nexport function makeEllipse2d(\n cx: number,\n cy: number,\n majorRadius: number,\n minorRadius: number,\n xDirX: number = 1,\n xDirY: number = 0,\n sense: boolean = true,\n): Ellipse2d {\n return {\n kind2d: 'ellipse',\n cx,\n cy,\n majorRadius,\n minorRadius,\n xDirAngle: Math.atan2(xDirY, xDirX),\n sense,\n }\n}\n\n/**\n * Bezier curve from control poles.\n * @param poles - the ordered control points `[x, y]` for the curve.\n * @returns a Bezier2d holding a copy of the poles.\n */\nexport function makeBezier2d(poles: [number, number][]): Bezier2d {\n return { kind2d: 'bezier', poles: [...poles] }\n}\n\n/**\n * B-spline from raw NURBS data (the write-side counterpart of a kernel's\n * `getNurbsCurveData`, so an exact edge survives as data instead of a\n * tessellation).\n *\n * The knot vector is NOT expanded here: `knots`/`multiplicities` stay the two\n * parallel arrays the kernel reports, and every evaluator expands them the same\n * way (`evaluateBSpline2d`).\n *\n * @param poles - control points `[x, y]`, one per weight in `weights`.\n * @param knots - distinct knot values.\n * @param multiplicities - multiplicity of each entry in `knots`.\n * @param degree - polynomial degree.\n * @param isPeriodic - true for a periodic (wrap-around) curve.\n * @param weights - optional per-pole weights; omit for a non-rational curve.\n * @returns a BSpline2d holding copies of the control data.\n */\nexport function makeBSpline2d(\n poles: [number, number][],\n knots: number[],\n multiplicities: number[],\n degree: number,\n isPeriodic: boolean,\n weights?: number[],\n): BSpline2d {\n return {\n kind2d: 'bspline',\n poles: poles.map(([x, y]): [number, number] => [x, y]),\n knots: [...knots],\n multiplicities: [...multiplicities],\n degree,\n isPeriodic,\n ...(weights ? { weights: [...weights] } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Transform helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Translate a curve by an offset.\n * @param c - the curve to translate.\n * @param dx - the x offset.\n * @param dy - the y offset.\n * @returns a new Curve2dObj translated by `(dx, dy)`.\n */\nexport function translateCurve2d(c: Curve2dObj, dx: number, dy: number): Curve2dObj {\n switch (c.kind2d) {\n case 'line':\n return { ...c, ox: c.ox + dx, oy: c.oy + dy }\n case 'circle':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'ellipse':\n return { ...c, cx: c.cx + dx, cy: c.cy + dy }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => [x + dx, y + dy]) }\n case 'trimmed':\n return { ...c, basis: translateCurve2d(c.basis, dx, dy) }\n }\n}\n\n/**\n * Rotate a curve by an angle about a center point.\n * @param c - the curve to rotate.\n * @param angle - the rotation angle in radians.\n * @param cx - the x coordinate of the rotation center.\n * @param cy - the y coordinate of the rotation center.\n * @returns a new Curve2dObj rotated by `angle` about `(cx, cy)`.\n */\nexport function rotateCurve2d(c: Curve2dObj, angle: number, cx: number, cy: number): Curve2dObj {\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const rotatePoint = (x: number, y: number): [number, number] => {\n const rx = x - cx\n const ry = y - cy\n return [cx + rx * cos - ry * sin, cy + rx * sin + ry * cos]\n }\n switch (c.kind2d) {\n case 'line': {\n const [ox, oy] = rotatePoint(c.ox, c.oy)\n const ndx = c.dx * cos - c.dy * sin\n const ndy = c.dx * sin + c.dy * cos\n return { ...c, ox, oy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy }\n }\n case 'ellipse': {\n const [ncx, ncy] = rotatePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, xDirAngle: c.xDirAngle + angle }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => rotatePoint(x, y)) }\n case 'trimmed': {\n const basis = rotateCurve2d(c.basis, angle, cx, cy)\n // A circle carries no frame angle, so its rotation must land in the\n // trim range: parameter IS the geometric angle (negated when\n // sense=false). Without this shift, rotating an arc about its own\n // circle center was a silent no-op.\n if (basis.kind2d === 'circle') {\n const shift = basis.sense ? angle : -angle\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n/**\n * Scale a curve by a factor about a center point.\n * @param c - the curve to scale.\n * @param factor - the scale factor (may be negative to mirror-and-scale).\n * @param cx - the x coordinate of the scaling center.\n * @param cy - the y coordinate of the scaling center.\n * @returns a new Curve2dObj scaled by `factor` about `(cx, cy)`.\n */\nexport function scaleCurve2d(c: Curve2dObj, factor: number, cx: number, cy: number): Curve2dObj {\n const scalePoint = (x: number, y: number): [number, number] => [\n cx + (x - cx) * factor,\n cy + (y - cy) * factor,\n ]\n switch (c.kind2d) {\n case 'line': {\n // Scale BOTH endpoints and recompute direction/length (see brepjs notes:\n // scaling only origin left the endpoint wrong for factor != 1, most\n // damagingly for mirror factor=-1 which reflected the origin but kept the\n // original direction).\n const [ox, oy] = scalePoint(c.ox, c.oy)\n const [ex, ey] = scalePoint(c.ox + c.dx * c.len, c.oy + c.dy * c.len)\n const ndx = ex - ox\n const ndy = ey - oy\n const nlen = Math.sqrt(ndx * ndx + ndy * ndy)\n return {\n ...c,\n ox,\n oy,\n dx: nlen > 0 ? ndx / nlen : c.dx,\n dy: nlen > 0 ? ndy / nlen : c.dy,\n len: nlen,\n }\n }\n case 'circle': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, radius: c.radius * Math.abs(factor) }\n }\n case 'ellipse': {\n const [ncx, ncy] = scalePoint(c.cx, c.cy)\n return {\n ...c,\n cx: ncx,\n cy: ncy,\n majorRadius: c.majorRadius * Math.abs(factor),\n minorRadius: c.minorRadius * Math.abs(factor),\n }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => scalePoint(x, y)) }\n case 'trimmed':\n return { ...c, basis: scaleCurve2d(c.basis, factor, cx, cy) }\n }\n}\n\n/**\n * Mirror a curve through a center point (a half-turn).\n * @param c - the curve to mirror.\n * @param cx - the x coordinate of the mirror center.\n * @param cy - the y coordinate of the mirror center.\n * @returns a new Curve2dObj rotated 180 degrees about `(cx, cy)`.\n */\nexport function mirrorAtPoint(c: Curve2dObj, cx: number, cy: number): Curve2dObj {\n // A point mirror IS a half-turn. Routing through rotate keeps every curve\n // type's parameterization exact: scale(-1) reflected conic centers but left\n // their angular parameterization behind.\n return rotateCurve2d(c, Math.PI, cx, cy)\n}\n\n/**\n * Mirror a curve across an axis defined by a point and a direction vector.\n * @param c - the curve to mirror.\n * @param ox - the x coordinate of a point on the mirror axis.\n * @param oy - the y coordinate of a point on the mirror axis.\n * @param dx - the x component of the axis direction vector.\n * @param dy - the y component of the axis direction vector.\n * @returns a new Curve2dObj reflected across the given axis.\n */\nexport function mirrorAcrossAxis(\n c: Curve2dObj,\n ox: number,\n oy: number,\n dx: number,\n dy: number,\n): Curve2dObj {\n const len = Math.sqrt(dx * dx + dy * dy)\n if (len < 1e-15) return c\n const nx = dx / len\n const ny = dy / len\n const reflectPoint = (x: number, y: number): [number, number] => {\n const rx = x - ox\n const ry = y - oy\n const dot = rx * nx + ry * ny\n return [ox + 2 * dot * nx - rx, oy + 2 * dot * ny - ry]\n }\n switch (c.kind2d) {\n case 'line': {\n const [nox, noy] = reflectPoint(c.ox, c.oy)\n const ndx = 2 * (c.dx * nx + c.dy * ny) * nx - c.dx\n const ndy = 2 * (c.dx * nx + c.dy * ny) * ny - c.dy\n return { ...c, ox: nox, oy: noy, dx: ndx, dy: ndy }\n }\n case 'circle': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n return { ...c, cx: ncx, cy: ncy, sense: !c.sense }\n }\n case 'ellipse': {\n const [ncx, ncy] = reflectPoint(c.cx, c.cy)\n // Reflect the major-axis direction angle across the mirror axis\n const cos2 = nx * nx - ny * ny\n const sin2 = 2 * nx * ny\n const newAngle = Math.atan2(\n sin2 * Math.cos(c.xDirAngle) - cos2 * Math.sin(c.xDirAngle),\n cos2 * Math.cos(c.xDirAngle) + sin2 * Math.sin(c.xDirAngle),\n )\n return { ...c, cx: ncx, cy: ncy, xDirAngle: newAngle, sense: !c.sense }\n }\n case 'bezier':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'bspline':\n return { ...c, poles: c.poles.map(([x, y]) => reflectPoint(x, y)) }\n case 'trimmed': {\n const basis = mirrorAcrossAxis(c.basis, ox, oy, dx, dy)\n // Reflection maps a circle's geometric angle theta to 2*phi - theta\n // (phi = axis angle). The sense flip on the basis absorbs the negation;\n // the 2*phi rotation has nowhere to live on a frameless circle, so it\n // lands in the trim range (sign follows the ORIGINAL sense).\n if (c.basis.kind2d === 'circle' && basis.kind2d === 'circle') {\n const phi = Math.atan2(ny, nx)\n const shift = c.basis.sense ? -2 * phi : 2 * phi\n return { ...c, basis, tStart: c.tStart + shift, tEnd: c.tEnd + shift }\n }\n return { ...c, basis }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// 2D curve–curve intersection\n// ---------------------------------------------------------------------------\n/**\n * Compute intersection points (and overlapping segments) between two 2D curves.\n * Handles analytic cases (line-line, line-circle, circle-circle) and falls back\n * to numerical sampling + Newton refinement for general curves.\n * @param c1 - the first curve.\n * @param c2 - the second curve.\n * @param tolerance - the geometric tolerance used for candidate filtering.\n * @returns the intersection points and any overlapping curve segments.\n */\nexport function intersectCurves2dFn(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = unwrapCurve(c1)\n const b2 = unwrapCurve(c2)\n // Analytic: line-line\n if (b1.kind2d === 'line' && b2.kind2d === 'line') {\n return intersectLineLine(c1, b1, c2, b2, tolerance)\n }\n // Analytic: line-circle / circle-line\n if (b1.kind2d === 'line' && b2.kind2d === 'circle') {\n return { points: intersectLineCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n if (b1.kind2d === 'circle' && b2.kind2d === 'line') {\n return { points: intersectLineCircle(c2, b2, c1, b1, tolerance), segments: [] }\n }\n // Analytic: circle-circle\n if (b1.kind2d === 'circle' && b2.kind2d === 'circle') {\n return { points: intersectCircleCircle(c1, b1, c2, b2, tolerance), segments: [] }\n }\n // General: numerical (with self-intersection handling)\n const isSelf = c1 === c2\n return numericalIntersect(c1, c2, tolerance, isSelf)\n}\n\n/**\n * Serialize a curve (JSON round-trip).\n * @param c - the curve to serialize.\n * @returns the curve as a JSON string.\n */\nexport function serializeCurve2d(c: Curve2dObj): string {\n return JSON.stringify(c)\n}\n/**\n * Deserialize a curve previously produced by {@link serializeCurve2d}.\n * @param data - the JSON string describing the curve.\n * @returns the reconstructed Curve2dObj.\n */\nexport function deserializeCurve2d(data: string): Curve2dObj {\n return JSON.parse(data)\n}\n\n// ---------------------------------------------------------------------------\n// BBox helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Create an empty (inverted) curve bounding box.\n * @returns a fresh CurveBBox2d whose mins are +Infinity and maxes are -Infinity.\n */\nexport function createCurveBBox2d(): CurveBBox2d {\n return { kind2d_b: true, xMin: Infinity, yMin: Infinity, xMax: -Infinity, yMax: -Infinity }\n}\n\n/**\n * Expand a curve bounding box to include a curve's extent.\n * Uses analytic extremes for lines and circles/arcs and sampling otherwise.\n * @param bbox - the box to expand in place.\n * @param c - the curve whose extent is incorporated.\n * @param _tol - reserved tolerance parameter (unused).\n */\nexport function addCurveToBBox(bbox: CurveBBox2d, c: Curve2dObj, _tol: number): void {\n const basis = c.kind2d === 'trimmed' ? c.basis : c\n // Analytic: lines need only 2 endpoints (no sampling)\n if (basis.kind2d === 'line') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n bbox.xMin = Math.min(bbox.xMin, x0, x1)\n bbox.yMin = Math.min(bbox.yMin, y0, y1)\n bbox.xMax = Math.max(bbox.xMax, x0, x1)\n bbox.yMax = Math.max(bbox.yMax, y0, y1)\n return\n }\n // Analytic: circles/arcs — endpoints + axis extremes\n if (basis.kind2d === 'circle') {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const { cx, cy, radius, sense } = basis\n const [x0, y0] = evaluateCurve2d(c, bounds.first)\n const [x1, y1] = evaluateCurve2d(c, bounds.last)\n let xMin = Math.min(x0, x1)\n let xMax = Math.max(x0, x1)\n let yMin = Math.min(y0, y1)\n let yMax = Math.max(y0, y1)\n // Check axis-aligned extreme angles within the arc's parameter range\n const tStart = c.kind2d === 'trimmed' ? c.tStart : bounds.first\n const tEnd = c.kind2d === 'trimmed' ? c.tEnd : bounds.last\n for (let k = 0; k < 4; k++) {\n const angle = (k * Math.PI) / 2\n const t = sense ? angle : -angle\n // Check if t (or t + 2π) falls within [tStart, tEnd]\n for (let wrap = 0; wrap <= 1; wrap++) {\n const tt = t + wrap * 2 * Math.PI\n if (tt >= tStart - 1e-10 && tt <= tEnd + 1e-10) {\n const ex = cx + radius * Math.cos(angle)\n const ey = cy + radius * Math.sin(angle)\n xMin = Math.min(xMin, ex)\n xMax = Math.max(xMax, ex)\n yMin = Math.min(yMin, ey)\n yMax = Math.max(yMax, ey)\n break\n }\n }\n }\n bbox.xMin = Math.min(bbox.xMin, xMin)\n bbox.yMin = Math.min(bbox.yMin, yMin)\n bbox.xMax = Math.max(bbox.xMax, xMax)\n bbox.yMax = Math.max(bbox.yMax, yMax)\n return\n }\n // General: sample (bezier, bspline, ellipse)\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return\n const nSamples = 20\n const dt = (bounds.last - bounds.first) / nSamples\n for (let i = 0; i <= nSamples; i++) {\n const t = bounds.first + i * dt\n const [x, y] = evaluateCurve2d(c, t)\n if (x < bbox.xMin) bbox.xMin = x\n if (y < bbox.yMin) bbox.yMin = y\n if (x > bbox.xMax) bbox.xMax = x\n if (y > bbox.yMax) bbox.yMax = y\n }\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\n/** Unwrap trimmed wrappers to get the basis curve type. */\nfunction unwrapCurve(c: Curve2dObj): Curve2dObj {\n let cur = c\n while (cur.kind2d === 'trimmed') cur = cur.basis\n return cur\n}\n\n/** Check if parameter t is within the curve's domain. */\nfunction inDomain(c: Curve2dObj, t: number, tol: number): boolean {\n const b = curveBounds(c)\n return t >= b.first - tol && t <= b.last + tol\n}\n\n/** Find parameter on curve c closest to point (px, py), searching near tGuess. */\nfunction refineParam(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n const N = 80\n const dt = (bounds.last - bounds.first) / N\n let bestT = bounds.first\n let bestD = Infinity\n for (let i = 0; i <= N; i++) {\n const t = bounds.first + i * dt\n const [ex, ey] = evaluateCurve2d(c, t)\n const d = (ex - px) ** 2 + (ey - py) ** 2\n if (d < bestD) {\n bestD = d\n bestT = t\n }\n }\n // bestD is squared geometric distance. Derive a scale-relative threshold\n // from the curve's geometric extent (not parameter span).\n const [sx, sy] = evaluateCurve2d(c, bounds.first)\n const [ex, ey] = evaluateCurve2d(c, bounds.last)\n const [mx, my] = evaluateCurve2d(c, (bounds.first + bounds.last) / 2)\n const geomExtent = Math.max(\n Math.sqrt((ex - sx) ** 2 + (ey - sy) ** 2),\n Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2),\n 1e-6,\n )\n const maxDist = geomExtent * maxRatio\n return bestD < maxDist * maxDist ? bestT : null\n}\n\n/**\n * Parameter on a curve closest to a point.\n *\n * This is the general \"point → parameter\" primitive used by corner/offset work:\n * it searches the curve's domain for the parameter whose evaluated point is\n * nearest to `(px, py)` and returns it when that nearest distance is within a\n * configurable fraction of the curve's geometric extent. Returns `null` when the\n * point lies too far off the curve (the raw gap-vs-extent guard) so callers can\n * distinguish \"on/very near the curve\" from \"clearly off\".\n *\n * @param c - the curve to search (line, arc, ellipse, bezier, bspline, trimmed).\n * @param px - the query point x.\n * @param py - the query point y.\n * @param maxRatio - the maximum acceptable nearest-distance / geometric-extent\n * ratio (default 0.1; raise it to accept points that sit further off the curve).\n * @returns the domain parameter `t`, or `null` when `(px, py)` is off-curve by\n * more than `maxRatio` of the curve's geometric extent.\n */\nexport function parameterOfPoint(c: Curve2dObj, px: number, py: number, maxRatio = 0.1): number | null {\n const bounds = curveBounds(c)\n if (!isFinite(bounds.first) || !isFinite(bounds.last)) return null\n\n // Coarse sample to get within one domain step of the nearest point (semantics,\n // curvature, and per-kernel sensitivity: `refineParam`'s N=80 grid).\n const seed = refineParam(c, px, py, maxRatio)\n if (seed === null) return null\n\n // Refine to the projection foot: for the farthest/nearest parameter the chord\n // `(curve(t) − P)` is perpendicular to the tangent, i.e. g(t)=dot(·)=0. Solve\n // g(t)=0 with Newton on a central-difference derivative.\n const span = bounds.last - bounds.first\n const hbase = span * 1e-6\n let t = seed\n const fixed = new Set<string>()\n for (let i = 0; i < 24; i++) {\n const [ex, ey] = evaluateCurve2d(c, t)\n const [tx, ty] = tangentCurve2d(c, t)\n const g = (ex - px) * tx + (ey - py) * ty\n if (Math.abs(g) < 1e-12) break\n const h = Math.max(hbase, 1e-9)\n const [hx, hy] = evaluateCurve2d(c, Math.min(bounds.last, t + h))\n const [hT, hTy] = tangentCurve2d(c, Math.min(bounds.last, t + h))\n const gp = ((hx - px) * hT + (hy - py) * hTy - g) / h\n if (Math.abs(gp) < 1e-16) break\n const tn = t - g / gp\n t = Math.max(bounds.first, Math.min(bounds.last, tn))\n const key = t.toFixed(12)\n if (fixed.has(key)) break\n fixed.add(key)\n if (okConverge(c, px, py, t)) break\n }\n return t\n}\n\n/** True when `(px, py)` is within `1e-9` of the curve at parameter `t`. */\nfunction okConverge(c: Curve2dObj, px: number, py: number, t: number): boolean {\n const [ex, ey] = evaluateCurve2d(c, t)\n return Math.hypot(ex - px, ey - py) < 1e-9\n}\n\n/** The unwrapped basis curve (strips any nesting of `trimmed` wrappers). */\nfunction basisOf(c: Curve2dObj): Curve2dObj {\n let b = c\n while (b.kind2d === 'trimmed') b = b.basis\n return b\n}\n\n/**\n * Trim a curve to a sub-parameter range given in the basis curve's native domain.\n *\n * The returned `trimmed` curve keeps the full basis; its `t∈[0,1]` domain maps\n * into `[tStart, tEnd]` of the basis (so it is the inverse of `curveBounds` for\n * trimmed curves). Parameters are in the basis's native domain (a line: distance\n * along `[0,len]`; an arc/ellipse: angle `[.., ..]`).\n *\n * @param c - the curve to trim (may itself be already-trimmed; the basis is reused).\n * @param tStart - the basis-domain parameter where the sub-curve starts.\n * @param tEnd - the basis-domain parameter where the sub-curve ends.\n * @returns the trimmed `Curve2dObj`.\n */\nexport function trimCurve(c: Curve2dObj, tStart: number, tEnd: number): Curve2dObj {\n return { kind2d: 'trimmed', basis: basisOf(c), tStart, tEnd }\n}\n\n/**\n * Split a curve at a native-domain parameter into two trimmed sub-curves.\n *\n * This is the splice primitive that D1 boolean-splitting and D3 corner\n * (fillet/chamfer) use: it cuts a single curve at an interior parameter into\n * two `TrimmedCurve2d` sharing the same basis, covering `[first, t]` and\n * `[t, last]`. Returns `null` when `t` is not strictly interior.\n *\n * @param c - the curve to split.\n * @param t - the native-domain split parameter (strictly inside the basis domain).\n * @returns the two sub-curves, or `null` when `t` is outside the interior.\n */\nexport function splitCurveAt(c: Curve2dObj, t: number): [Curve2dObj, Curve2dObj] | null {\n const basis = basisOf(c)\n const { first, last } = curveBounds(basis)\n if (t <= first || t >= last) return null\n return [trimCurve(basis, first, t), trimCurve(basis, t, last)]\n}\n\nfunction intersectLineLine(\n c1: Curve2dObj,\n l1: Line2d,\n c2: Curve2dObj,\n l2: Line2d,\n tol: number,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const det = l1.dx * l2.dy - l1.dy * l2.dx\n if (Math.abs(det) >= 1e-14) {\n // Non-parallel: solve for intersection\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const t1 = (ex * l2.dy - ey * l2.dx) / det\n const t2 = (ex * l1.dy - ey * l1.dx) / det\n if (!inDomain(c1, t1, tol) || !inDomain(c2, t2, tol)) return { points: [], segments: [] }\n return { points: [[l1.ox + t1 * l1.dx, l1.oy + t1 * l1.dy]], segments: [] }\n }\n // Parallel — check if collinear and overlapping\n const ex = l2.ox - l1.ox\n const ey = l2.oy - l1.oy\n const cross = ex * l1.dy - ey * l1.dx\n if (Math.abs(cross) > tol) return { points: [], segments: [] } // parallel but not collinear\n // Project c2 endpoints onto c1's parameter space\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const p2s = evaluateCurve2d(c2, b2.first)\n const p2e = evaluateCurve2d(c2, b2.last)\n const t2sOn1 = (p2s[0] - l1.ox) * l1.dx + (p2s[1] - l1.oy) * l1.dy\n const t2eOn1 = (p2e[0] - l1.ox) * l1.dx + (p2e[1] - l1.oy) * l1.dy\n const overlapStart = Math.max(b1.first, Math.min(t2sOn1, t2eOn1))\n const overlapEnd = Math.min(b1.last, Math.max(t2sOn1, t2eOn1))\n if (overlapEnd - overlapStart < tol) return { points: [], segments: [] } // no meaningful overlap\n const sx = l1.ox + overlapStart * l1.dx\n const sy = l1.oy + overlapStart * l1.dy\n const ex2 = l1.ox + overlapEnd * l1.dx\n const ey2 = l1.oy + overlapEnd * l1.dy\n const seg = makeLine2d(sx, sy, ex2, ey2)\n return { points: [], segments: [seg] }\n}\n\n/**\n * Whether a basis-curve parameter `t` falls inside a trimmed curve's span.\n *\n * The comparison is done modulo 2π because a trimmed arc's `tStart`/`tEnd` may\n * be negative (the CW branch of `makeTrimmedCircle2d` negates the angles) or\n * wrap past 2π.\n *\n * @param c - the trimmed curve.\n * @param t - a parameter expressed in the **basis** curve's parameter space.\n * @param tol - angular tolerance added to the end of the span.\n * @returns `true` when `t` lies in `[tStart, tEnd]`.\n */\nfunction trimmedSpanContains(c: TrimmedCurve2d, t: number, tol: number): boolean {\n const span = c.tEnd - c.tStart\n if (span <= 0) return false\n const twoPi = 2 * Math.PI\n let d = t - c.tStart\n d -= twoPi * Math.floor(d / twoPi) // → [0, 2π)\n return d <= span + tol\n}\n\nfunction intersectLineCircle(\n cLine: Curve2dObj,\n line: Line2d,\n cCirc: Curve2dObj,\n circ: Circle2d,\n tol: number,\n): [number, number][] {\n // Vector from circle center to line origin\n const fx = line.ox - circ.cx\n const fy = line.oy - circ.cy\n // Quadratic: |f + t*d|^2 = r^2\n const a = line.dx * line.dx + line.dy * line.dy // = 1 for normalized\n const b = 2 * (fx * line.dx + fy * line.dy)\n const c = fx * fx + fy * fy - circ.radius * circ.radius\n const disc = b * b - 4 * a * c\n if (disc < -tol) return []\n const results: [number, number][] = []\n const sqrtDisc = Math.sqrt(Math.max(0, disc))\n const t1 = (-b - sqrtDisc) / (2 * a)\n const t2 = (-b + sqrtDisc) / (2 * a)\n for (const tLine of disc < tol * tol ? [t1] : [t1, t2]) {\n if (!inDomain(cLine, tLine, tol)) continue\n const px = line.ox + tLine * line.dx\n const py = line.oy + tLine * line.dy\n // GOTCHA(2026-10-11 整圆 / 2026-10-12 推广至 trim 弧):此前的\n // `refineParam(cCirc, px, py)` + `(eval−crossing)² > tol²·1e6`(≈1e-12)二次校验\n // 会**丢弃合法的圆弧交点**——`refineParam` 是 80 样本粗网格,其最近点可能远离\n // 解析交点,1e-12 复检几乎永不通过。后果:`isInside` 射线法对圆弧一律判 false,\n // `organiseBlueprints` 因而**永不嵌套同心轮廓**:整圆情形(垫圈/管/环)产 2 solid\n // 而非 1 空心件;trim 弧情形(矩形/方形空心型材的圆角内外轮廓)同样不嵌套,\n // 对应 parity `solids(1vs2)`,约 230 个。\n // 解析交点 (px,py) 由二次方程解出、本就精确落在 basis 圆上,故只须按参数域校验。\n if (cCirc.kind2d === 'circle') {\n results.push([px, py])\n continue\n }\n if (cCirc.kind2d === 'trimmed' && cCirc.basis.kind2d === 'circle') {\n const b = cCirc.basis\n const ang = Math.atan2(py - b.cy, px - b.cx)\n const tBasis = b.sense ? ang : -ang\n if (trimmedSpanContains(cCirc, tBasis, tol)) results.push([px, py])\n continue\n }\n // 其余(ellipse / bezier / bspline 上的 trimmed)保留原有 refineParam 校验路径。\n const tCirc = refineParam(cCirc, px, py)\n if (tCirc === null) continue\n const [cx2, cy2] = evaluateCurve2d(cCirc, tCirc)\n if ((cx2 - px) ** 2 + (cy2 - py) ** 2 > tol * tol * 1e6) continue\n results.push([px, py])\n }\n return results\n}\n\nfunction intersectConcentricArcs(c1: Curve2dObj, c2: Curve2dObj, tol: number): [number, number][] {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n const isFullCircle1 = Math.abs(b1.last - b1.first - 2 * Math.PI) < 1e-10\n const isFullCircle2 = Math.abs(b2.last - b2.first - 2 * Math.PI) < 1e-10\n if (isFullCircle1 && isFullCircle2) return []\n if (isFullCircle1) {\n return [evaluateCurve2d(c2, b2.first), evaluateCurve2d(c2, b2.last)]\n }\n if (isFullCircle2) {\n return [evaluateCurve2d(c1, b1.first), evaluateCurve2d(c1, b1.last)]\n }\n const pts: [number, number][] = []\n const checks: [Curve2dObj, [number, number]][] = [\n [c2, evaluateCurve2d(c1, b1.first)],\n [c2, evaluateCurve2d(c1, b1.last)],\n [c1, evaluateCurve2d(c2, b2.first)],\n [c1, evaluateCurve2d(c2, b2.last)],\n ]\n for (const [target, pt] of checks) {\n const t = refineParam(target, pt[0], pt[1])\n if (t !== null) {\n const [ex, ey] = evaluateCurve2d(target, t)\n if ((ex - pt[0]) ** 2 + (ey - pt[1]) ** 2 < tol * tol * 100) pts.push(pt)\n }\n }\n const deduped: [number, number][] = []\n for (const p of pts) {\n if (!deduped.some(([ddx, ddy]) => (ddx - p[0]) ** 2 + (ddy - p[1]) ** 2 < tol * tol * 100)) {\n deduped.push(p)\n }\n }\n return deduped\n}\n\nfunction intersectCircleCircle(\n c1: Curve2dObj,\n circ1: Circle2d,\n c2: Curve2dObj,\n circ2: Circle2d,\n tol: number,\n): [number, number][] {\n const dx = circ2.cx - circ1.cx\n const dy = circ2.cy - circ1.cy\n const d = Math.sqrt(dx * dx + dy * dy)\n if (d > circ1.radius + circ2.radius + tol) return []\n if (d < Math.abs(circ1.radius - circ2.radius) - tol) return []\n if (d < 1e-14) {\n if (Math.abs(circ1.radius - circ2.radius) > tol) return []\n return intersectConcentricArcs(c1, c2, tol)\n }\n const a = (circ1.radius * circ1.radius - circ2.radius * circ2.radius + d * d) / (2 * d)\n const h2 = circ1.radius * circ1.radius - a * a\n const h = Math.sqrt(Math.max(0, h2))\n const mx = circ1.cx + (a * dx) / d\n const my = circ1.cy + (a * dy) / d\n const candidates: [number, number][] =\n h < tol\n ? [[mx, my]]\n : [\n [mx + (h * dy) / d, my - (h * dx) / d],\n [mx - (h * dy) / d, my + (h * dx) / d],\n ]\n // Filter candidates that lie within both curves' domains\n const results: [number, number][] = []\n for (const [px, py] of candidates) {\n const t1 = refineParam(c1, px, py)\n const t2 = refineParam(c2, px, py)\n if (t1 === null || t2 === null) continue\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const tolSq = (tol * 10) ** 2\n if ((x1 - px) ** 2 + (y1 - py) ** 2 > tolSq) continue\n if ((x2 - px) ** 2 + (y2 - py) ** 2 > tolSq) continue\n results.push([px, py])\n }\n return results\n}\n\n/**\n * Numerical intersection via sampling + Newton refinement.\n * Samples both curves densely, finds close point pairs, refines with Newton.\n */\nfunction numericalIntersect(\n c1: Curve2dObj,\n c2: Curve2dObj,\n tolerance: number,\n isSelf = false,\n): { points: [number, number][]; segments: Curve2dObj[] } {\n const b1 = curveBounds(c1)\n const b2 = curveBounds(c2)\n if (!isFinite(b1.first) || !isFinite(b1.last) || !isFinite(b2.first) || !isFinite(b2.last)) {\n return { points: [], segments: [] }\n }\n const N = 100\n const pts1: { t: number; x: number; y: number }[] = []\n const pts2: { t: number; x: number; y: number }[] = []\n for (let i = 0; i <= N; i++) {\n const t1 = b1.first + ((b1.last - b1.first) * i) / N\n const [x1, y1] = evaluateCurve2d(c1, t1)\n pts1.push({ t: t1, x: x1, y: y1 })\n const t2 = b2.first + ((b2.last - b2.first) * i) / N\n const [x2, y2] = evaluateCurve2d(c2, t2)\n pts2.push({ t: t2, x: x2, y: y2 })\n }\n // Pre-compute segment bounds for curve2 (avoids recomputing N times in inner loop)\n const crossTol = Math.max(tolerance * 100, 0.5)\n const seg2Bounds = new Float64Array(N * 6) // xmin, xmax, ymin, ymax, tmid, _pad\n for (let j = 0; j < N; j++) {\n const a = pts2[j]!\n const b = pts2[j + 1]!\n const off = j * 6\n seg2Bounds[off] = Math.min(a.x, b.x)\n seg2Bounds[off + 1] = Math.max(a.x, b.x)\n seg2Bounds[off + 2] = Math.min(a.y, b.y)\n seg2Bounds[off + 3] = Math.max(a.y, b.y)\n seg2Bounds[off + 4] = (a.t + b.t) / 2\n }\n // Find segment pairs where the curves are close\n const candidates: { t1: number; t2: number }[] = []\n const selfMinSep = (b1.last - b1.first) / 5\n for (let i = 0; i < N; i++) {\n const p1a = pts1[i]!\n const p1b = pts1[i + 1]!\n // Hoist outer segment AABB (computed once per outer iteration)\n const x1min = Math.min(p1a.x, p1b.x) - crossTol\n const x1max = Math.max(p1a.x, p1b.x) + crossTol\n const y1min = Math.min(p1a.y, p1b.y) - crossTol\n const y1max = Math.max(p1a.y, p1b.y) + crossTol\n const t1mid = (p1a.t + p1b.t) / 2\n for (let j = 0; j < N; j++) {\n const off = j * 6\n if (x1max < seg2Bounds[off] || seg2Bounds[off + 1] < x1min) continue\n if (y1max < seg2Bounds[off + 2] || seg2Bounds[off + 3] < y1min) continue\n const t2mid = seg2Bounds[off + 4]\n if (isSelf && Math.abs(t1mid - t2mid) < selfMinSep) continue\n candidates.push({ t1: t1mid, t2: t2mid })\n }\n }\n // Refine candidates via Newton iteration\n const tol2 = tolerance * tolerance\n const found: [number, number][] = []\n for (const { t1: t1Init, t2: t2Init } of candidates) {\n let t1 = t1Init\n let t2 = t2Init\n for (let iter = 0; iter < 20; iter++) {\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n const dx = x1 - x2\n const dy = y1 - y2\n if (dx * dx + dy * dy < tol2) break\n const d1 = tangentCurve2d(c1, t1)\n const d2 = tangentCurve2d(c2, t2)\n // Newton system: J * [dt1, dt2]^T = -[dx, dy]\n const det = d1[0] * -d2[1] - -d2[0] * d1[1]\n if (Math.abs(det) < 1e-14) break\n const dt1 = (-dx * -d2[1] - -dy * -d2[0]) / det\n const dt2 = (d1[0] * -dy - d1[1] * -dx) / det\n t1 += dt1\n t2 += dt2\n t1 = Math.max(b1.first, Math.min(b1.last, t1))\n t2 = Math.max(b2.first, Math.min(b2.last, t2))\n }\n const [x1, y1] = evaluateCurve2d(c1, t1)\n const [x2, y2] = evaluateCurve2d(c2, t2)\n // For self-intersection, only accept points with well-separated params\n if (isSelf && Math.abs(t1 - t2) < (b1.last - b1.first) * 0.05) continue\n if ((x1 - x2) ** 2 + (y1 - y2) ** 2 < tolerance * tolerance * 1e6) {\n const px = (x1 + x2) / 2\n const py = (y1 + y2) / 2\n let dup = false\n for (const [fx, fy] of found) {\n if ((fx - px) ** 2 + (fy - py) ** 2 < tolerance * tolerance * 1e4) {\n dup = true\n break\n }\n }\n if (!dup) found.push([px, py])\n }\n }\n return { points: found, segments: [] }\n}\n\n// ---------------------------------------------------------------------------\n// Private curve evaluators\n// ---------------------------------------------------------------------------\n\nfunction evaluateBezier(poles: [number, number][], t: number): [number, number] {\n // De Casteljau\n const n = poles.length\n const work: [number, number][] = poles.map(([x, y]) => [x, y])\n for (let r = 1; r < n; r++) {\n for (let i = 0; i < n - r; i++) {\n const wi = work[i]!\n const wi1 = work[i + 1]!\n wi[0] = (1 - t) * wi[0] + t * wi1[0]\n wi[1] = (1 - t) * wi[1] + t * wi1[1]\n }\n }\n return work[0]!\n}\n\nfunction evaluateBSpline2d(c: BSpline2d, t: number): [number, number] {\n // Expand knots with multiplicities\n const fullKnots: number[] = []\n for (let i = 0; i < c.knots.length; i++) {\n const mult = c.multiplicities[i] ?? 1\n for (let j = 0; j < mult; j++) {\n fullKnots.push(c.knots[i]!)\n }\n }\n // De Boor evaluation\n const p = c.degree\n const n = c.poles.length\n const k = fullKnots.length\n const tClamped = Math.max(fullKnots[p]!, Math.min(fullKnots[k - p - 1]!, t))\n // Find span\n let span = p\n for (let i = p; i < k - p - 1; i++) {\n if (tClamped >= fullKnots[i]! && tClamped < fullKnots[i + 1]!) {\n span = i\n break\n }\n }\n if (tClamped >= fullKnots[k - p - 1]!) span = k - p - 2\n // Relevant control points in HOMOGENEOUS form [w·x, w·y, w]. De Boor is linear,\n // so running it on the homogeneous values and dividing at the end is exactly\n // the rational (NURBS) evaluation; with every weight 1 the third component\n // stays 1 and this reduces to the non-rational case bit for bit.\n const weights = c.weights\n const d: [number, number, number][] = []\n for (let j = 0; j <= p; j++) {\n const idx = Math.max(0, Math.min(span - p + j, n - 1))\n const pole = c.poles[idx]!\n const wi = weights ? (weights[idx] ?? 1) : 1\n d.push([pole[0] * wi, pole[1] * wi, wi])\n }\n // De Boor recursion\n for (let r = 1; r <= p; r++) {\n for (let j = p; j >= r; j--) {\n const i = span - p + j\n const left = fullKnots[i] ?? 0\n const right = fullKnots[i + p - r + 1] ?? 1\n const denom = right - left\n const alpha = denom > 1e-15 ? (tClamped - left) / denom : 0\n const dj = d[j]!\n const djPrev = d[j - 1]!\n dj[0] = (1 - alpha) * djPrev[0] + alpha * dj[0]\n dj[1] = (1 - alpha) * djPrev[1] + alpha * dj[1]\n dj[2] = (1 - alpha) * djPrev[2] + alpha * dj[2]\n }\n }\n const res = d[p]!\n const w = res[2]\n return w !== 0 ? [res[0] / w, res[1] / w] : [res[0], res[1]]\n}"]}
|
package/dist/math3d/Box3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Box3.js","sourceRoot":"","sources":["../../src/math3d/Box3.ts"],"names":[],"mappings":"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","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"Box3.js","sourceRoot":"","sources":["../../src/math3d/Box3.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * math3d/Box3 — three.js r162 `Box3` 的算法子集移植。\n *\n * Ported from three.js r162 `src/math/Box3.js` (MIT License, © 2010-2024\n * three.js authors). 公式与运算顺序逐行照抄以保证逐位一致。\n */\n\nimport { Vec3 } from './Vec3'\n\n/** Axis-aligned bounding box, three.js `Box3` subset. */\nexport class Box3 {\n /** three 内部标记。 */\n readonly isBox3 = true\n\n /** Minimum corner. */\n min: Vec3\n /** Maximum corner. */\n max: Vec3\n\n /**\n * @param min - minimum corner (defaults to +Infinity).\n * @param max - maximum corner (defaults to -Infinity).\n */\n constructor(\n min: Vec3 = new Vec3(+Infinity, +Infinity, +Infinity),\n max: Vec3 = new Vec3(-Infinity, -Infinity, -Infinity),\n ) {\n this.min = min\n this.max = max\n }\n\n /**\n * Set the min/max corners.\n * @param min - minimum corner.\n * @param max - maximum corner.\n * @returns this\n */\n set(min: Vec3, max: Vec3): this {\n this.min.copy(min)\n this.max.copy(max)\n return this\n }\n\n /**\n * Copy min/max from another box.\n * @param box - source box.\n * @returns this\n */\n copy(box: Box3): this {\n this.min.copy(box.min)\n this.max.copy(box.max)\n return this\n }\n\n /**\n * Return a new box with the same corners.\n * @returns a new box with the same corners.\n */\n clone(): Box3 {\n return new Box3().copy(this)\n }\n\n /**\n * Make the box empty (min +Inf, max -Inf).\n * @returns this (empty box)\n */\n makeEmpty(): this {\n this.min.x = this.min.y = this.min.z = +Infinity\n this.max.x = this.max.y = this.max.z = -Infinity\n return this\n }\n\n /**\n * Return true when the box is empty.\n * @returns true when the box is empty.\n */\n isEmpty(): boolean {\n return this.max.x < this.min.x || this.max.y < this.min.y || this.max.z < this.min.z\n }\n\n /**\n * Return the center point.\n * @param target - the output vector.\n * @returns the box center (stored in target).\n */\n getCenter(target: Vec3): Vec3 {\n return this.isEmpty() ? target.set(0, 0, 0) : target.addVectors(this.min, this.max).multiplyScalar(0.5)\n }\n\n /**\n * Return the size vector (zero for an empty box).\n * @param target - the output vector.\n * @returns the box size (stored in target).\n */\n getSize(target: Vec3): Vec3 {\n return this.isEmpty() ? target.set(0, 0, 0) : target.subVectors(this.max, this.min)\n }\n\n /**\n * Expand the box to include a point.\n * @param point - the point to include.\n * @returns this\n */\n expandByPoint(point: Vec3): this {\n this.min.min(point)\n this.max.max(point)\n return this\n }\n\n /**\n * Expand to the union with another box.\n * @param box - the box to union with.\n * @returns this\n */\n union(box: Box3): this {\n this.min.min(box.min)\n this.max.max(box.max)\n return this\n }\n\n /**\n * Set from an array of points.\n * @param points - the points to enclose.\n * @returns this\n */\n setFromPoints(points: Vec3[]): this {\n this.makeEmpty()\n for (let i = 0; i < points.length; i++) this.expandByPoint(points[i])\n return this\n }\n\n /**\n * Set from a flat array of coordinates.\n * @param array - flat position array (x, y, z, ...).\n * @returns this\n */\n setFromArray(array: ArrayLike<number>): this {\n let minX = +Infinity\n let minY = +Infinity\n let minZ = +Infinity\n let maxX = -Infinity\n let maxY = -Infinity\n let maxZ = -Infinity\n for (let i = 0; i < array.length; i += 3) {\n const x = array[i]\n const y = array[i + 1]\n const z = array[i + 2]\n if (x < minX) minX = x\n if (y < minY) minY = y\n if (z < minZ) minZ = z\n if (x > maxX) maxX = x\n if (y > maxY) maxY = y\n if (z > maxZ) maxZ = z\n }\n this.min.set(minX, minY, minZ)\n this.max.set(maxX, maxY, maxZ)\n return this\n }\n}"]}
|
package/dist/math3d/Euler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Euler.js","sourceRoot":"","sources":["../../src/math3d/Euler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,6EAA6E;AAC7E,MAAM,OAAO,KAAK;IAChB,kBAAkB;IACT,OAAO,GAAG,IAAI,CAAA;IAEvB,yDAAyD;IACzD,MAAM,CAAU,aAAa,GAAe,KAAK,CAAA;IAEjD,mBAAmB;IACnB,CAAC,CAAQ;IACT,mBAAmB;IACnB,CAAC,CAAQ;IACT,mBAAmB;IACnB,CAAC,CAAQ;IACT,uCAAuC;IACvC,KAAK,CAAY;IAEjB;;;;;OAKG;IACH,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,QAAoB,KAAK,CAAC,aAAa;QACtE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,QAAoB,IAAI,CAAC,KAAK;QACjE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAY;QACf,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,KAA4C;QACpD,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,QAAoC,EAAE;QAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACrB,OAAO,KAAK,CAAA;IACd,CAAC","sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"Euler.js","sourceRoot":"","sources":["../../src/math3d/Euler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,6EAA6E;AAC7E,MAAM,OAAO,KAAK;IAChB,kBAAkB;IACT,OAAO,GAAG,IAAI,CAAA;IAEvB,yDAAyD;IACzD,MAAM,CAAU,aAAa,GAAe,KAAK,CAAA;IAEjD,mBAAmB;IACnB,CAAC,CAAQ;IACT,mBAAmB;IACnB,CAAC,CAAQ;IACT,mBAAmB;IACnB,CAAC,CAAQ;IACT,uCAAuC;IACvC,KAAK,CAAY;IAEjB;;;;;OAKG;IACH,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,QAAoB,KAAK,CAAC,aAAa;QACtE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,QAAoB,IAAI,CAAC,KAAK;QACjE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACtD,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAY;QACf,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,KAA4C;QACpD,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACjD,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,QAAoC,EAAE;QAC5C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;QACrB,OAAO,KAAK,CAAA;IACd,CAAC","sourcesContent":["/**\n * math3d/Euler — three.js r162 `Euler` 的算法子集移植。\n *\n * Ported from three.js r162 `src/math/Euler.js` (MIT License, © 2010-2024\n * three.js authors). 回调机制未移植;`order` 语义('XYZ' 等六个序)与 three\n * 完全一致。\n */\n\n/** Euler rotation order names supported by three. */\nexport type EulerOrder = 'XYZ' | 'YXZ' | 'ZXY' | 'ZYX' | 'YZX' | 'XZY'\n\n/** Euler angles (radians) with a rotation order, three.js `Euler` subset. */\nexport class Euler {\n /** three 内部标记。 */\n readonly isEuler = true\n\n /** Default rotation order used when none is supplied. */\n static readonly DEFAULT_ORDER: EulerOrder = 'XYZ'\n\n /** X component. */\n x: number\n /** Y component. */\n y: number\n /** Z component. */\n z: number\n /** Rotation axis order, e.g. 'XYZ'. */\n order: EulerOrder\n\n /**\n * @param x - rotation about X in radians.\n * @param y - rotation about Y in radians.\n * @param z - rotation about Z in radians.\n * @param order - rotation order.\n */\n constructor(x = 0, y = 0, z = 0, order: EulerOrder = Euler.DEFAULT_ORDER) {\n this.x = x\n this.y = y\n this.z = z\n this.order = order\n }\n\n /**\n * Set the angles and order.\n * @param x - rotation about X in radians.\n * @param y - rotation about Y in radians.\n * @param z - rotation about Z in radians.\n * @param order - rotation order (kept when omitted).\n * @returns this\n */\n set(x: number, y: number, z: number, order: EulerOrder = this.order): this {\n this.x = x\n this.y = y\n this.z = z\n this.order = order\n return this\n }\n\n /**\n * Return a new Euler with the same values.\n * @returns a new euler with the same components.\n */\n clone(): Euler {\n return new Euler(this.x, this.y, this.z, this.order)\n }\n\n /**\n * Copy from another Euler.\n * @param euler - source euler.\n * @returns this\n */\n copy(euler: Euler): this {\n this.x = euler.x\n this.y = euler.y\n this.z = euler.z\n this.order = euler.order\n return this\n }\n\n /**\n * Load from an array-like [x, y, z, order?].\n * @param array - source array.\n * @returns this\n */\n fromArray(array: [number, number, number, EulerOrder?]): this {\n this.x = array[0]\n this.y = array[1]\n this.z = array[2]\n if (array[3] !== undefined) this.order = array[3]\n return this\n }\n\n /**\n * Write into an array [x, y, z, order?].\n * @param array - target array (created when omitted).\n * @returns the target array.\n */\n toArray(array: Array<number | EulerOrder> = []): Array<number | EulerOrder> {\n array[0] = this.x\n array[1] = this.y\n array[2] = this.z\n array[3] = this.order\n return array\n }\n}"]}
|