@xom11/whiteboard 0.24.1 → 0.24.2
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/README.md +1 -1
- package/dist/ai.d.mts +616 -0
- package/dist/ai.d.ts +616 -0
- package/dist/ai.js +1036 -0
- package/dist/ai.js.map +1 -0
- package/dist/ai.mjs +999 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/catalog.json +4 -4
- package/dist/{chunk-4D5CSIJO.mjs → chunk-2WF6KIGF.mjs} +4 -3
- package/dist/chunk-2WF6KIGF.mjs.map +1 -0
- package/dist/{chunk-WWMQ2VHZ.mjs → chunk-45CGKJ7S.mjs} +4 -4
- package/dist/{chunk-WWMQ2VHZ.mjs.map → chunk-45CGKJ7S.mjs.map} +1 -1
- package/dist/{chunk-CRAPWQKJ.mjs → chunk-4DS3MKID.mjs} +4 -4
- package/dist/{chunk-CRAPWQKJ.mjs.map → chunk-4DS3MKID.mjs.map} +1 -1
- package/dist/chunk-73Q7ADVL.mjs +35 -0
- package/dist/chunk-73Q7ADVL.mjs.map +1 -0
- package/dist/{chunk-YIPI3WUL.mjs → chunk-7WQXXEVR.mjs} +4 -4
- package/dist/{chunk-YIPI3WUL.mjs.map → chunk-7WQXXEVR.mjs.map} +1 -1
- package/dist/{chunk-CSCF3YFZ.mjs → chunk-BEZSQKPY.mjs} +4 -3
- package/dist/chunk-BEZSQKPY.mjs.map +1 -0
- package/dist/{chunk-MFOGFFIL.mjs → chunk-CGZZO4BX.mjs} +5 -4
- package/dist/chunk-CGZZO4BX.mjs.map +1 -0
- package/dist/{chunk-IBTRMWD6.mjs → chunk-KRC2XOIG.mjs} +3 -3
- package/dist/{chunk-IBTRMWD6.mjs.map → chunk-KRC2XOIG.mjs.map} +1 -1
- package/dist/{chunk-6V4SH4JJ.mjs → chunk-WM2VDYQA.mjs} +4 -34
- package/dist/chunk-WM2VDYQA.mjs.map +1 -0
- package/dist/geometry-2d.d.mts +2 -1
- package/dist/geometry-2d.d.ts +2 -1
- package/dist/geometry-2d.mjs +5 -4
- package/dist/geometry-3d.d.mts +2 -1
- package/dist/geometry-3d.d.ts +2 -1
- package/dist/geometry-3d.mjs +4 -3
- package/dist/graph-2d.d.mts +2 -1
- package/dist/graph-2d.d.ts +2 -1
- package/dist/graph-2d.mjs +4 -3
- package/dist/{host-DOAYVL35.mjs → host-EPZCNFLH.mjs} +8 -7
- package/dist/host-EPZCNFLH.mjs.map +1 -0
- package/dist/{host-GKNQBBUE.mjs → host-LKCMYEAV.mjs} +7 -6
- package/dist/host-LKCMYEAV.mjs.map +1 -0
- package/dist/{host-TLIXN4CF.mjs → host-ZIQ77W33.mjs} +6 -5
- package/dist/host-ZIQ77W33.mjs.map +1 -0
- package/dist/index.d.mts +4 -616
- package/dist/index.d.ts +4 -616
- package/dist/index.js +28 -1028
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -1009
- package/dist/index.mjs.map +1 -1
- package/dist/latex.d.mts +2 -1
- package/dist/latex.d.ts +2 -1
- package/dist/serialize-JAVOU22E.mjs +7 -0
- package/dist/{serialize-3NZS6A6Q.mjs.map → serialize-JAVOU22E.mjs.map} +1 -1
- package/dist/{types-rA4slL08.d.mts → types-Crbefnfe.d.ts} +2 -49
- package/dist/types-DxlMPh-6.d.mts +49 -0
- package/dist/types-DxlMPh-6.d.ts +49 -0
- package/dist/{types-rA4slL08.d.ts → types-vtvyKGAA.d.mts} +2 -49
- package/package.json +6 -1
- package/dist/chunk-4D5CSIJO.mjs.map +0 -1
- package/dist/chunk-6V4SH4JJ.mjs.map +0 -1
- package/dist/chunk-CSCF3YFZ.mjs.map +0 -1
- package/dist/chunk-MFOGFFIL.mjs.map +0 -1
- package/dist/host-DOAYVL35.mjs.map +0 -1
- package/dist/host-GKNQBBUE.mjs.map +0 -1
- package/dist/host-TLIXN4CF.mjs.map +0 -1
- package/dist/serialize-3NZS6A6Q.mjs +0 -6
package/dist/ai.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/stamps/geometry-2d/dsl/schema.ts","../src/stamps/geometry-2d/dsl/transpile/errors.ts","../src/stamps/geometry-2d/dsl/transpile/symbols.ts","../src/stamps/geometry-2d/dsl/transpile/refs.ts","../src/stamps/geometry-2d/dsl/transpile/cycles.ts","../src/stamps/geometry-2d/dsl/transpile/ids.ts","../src/stamps/geometry-2d/dsl/transpile/emitPoint.ts","../src/stamps/geometry-2d/dsl/transpile/emitShape.ts","../src/stamps/geometry-2d/dsl/transpile.ts","../src/stamps/geometry-2d/ai/provider.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-equilateral.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-median.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-altitude.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-centroid.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-orthocenter.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-circumcircle.ts","../src/stamps/geometry-2d/dsl/fixtures/triangle-incircle.ts","../src/stamps/geometry-2d/dsl/fixtures/parallelogram.ts","../src/stamps/geometry-2d/dsl/fixtures/two-circles-intersect.ts","../src/stamps/geometry-2d/ai/prompt.ts","../src/stamps/geometry-2d/ai/tools.ts","../src/stamps/geometry-2d/ai/buildFigure.ts"],"names":["fixture","z"],"mappings":";;;;;AAKO,IAAM,KAAA,GAAQ,CAAA,CAClB,MAAA,EAAO,CACP,MAAM,kCAAkC,CAAA;AAEpC,IAAM,QAAA,GAAW,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACnD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACnC,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA,EAAO;AAAA,IAAG,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAO,GAAG,CAAA;AAAA,EAC3D,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO,CAAA;AAAA,EACjC,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,IACxC,SAAA,EAAW,KAAA;AAAA,IAAO,CAAA,EAAG,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,CAAC;AAAA,GAAG,CAAA;AAAA,EAC1D,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACrC,MAAA,EAAQ,KAAA;AAAA,IAAO,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAO,GAAG,CAAA;AAAA,EAClD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,QAAA,EAAU,KAAA;AAAA,IAAO,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAO,GAAG,CAAA;AAAA,EACxD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,IAAA,EAAM,KAAA;AAAA,IAAO,MAAA,EAAQ;AAAA,GAAO,CAAA;AAAA,EACvC,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC3C,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC;AAAA,GAAG,CAAA;AAAA,EACrD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC;AAAA,GAAG,CAAA;AAAA,EACrD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC;AAAA,GAAG,CAAA;AAAA,EACrD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC1C,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC;AAAA,GAAG,CAAA;AAAA,EACrD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC3C,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,KAAA;AAAA,IACnB,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,EAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,EAAE,QAAA;AAAS,GAAG;AACvE,CAAC,CAAA;AAEM,IAAM,QAAA,GAAW,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACnD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,IACtC,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO,CAAA;AAAA,EACjC,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACnC,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO,CAAA;AAAA,EACjC,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,IAClC,MAAA,EAAQ,KAAA;AAAA,IAAO,OAAA,EAAS;AAAA,GAAO,CAAA;AAAA,EAC1C,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,IACtC,UAAU,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,IAAI,CAAC;AAAA,GAAG,CAAA;AAAA;AAAA,EAE5C,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,eAAe,CAAA;AAAA,IAC5C,YAAA,EAAc,KAAA;AAAA,IAAO,MAAA,EAAQ;AAAA,GAAO,CAAA;AAAA,EAC/C,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,YAAA,EAAc,KAAA;AAAA,IAAO,MAAA,EAAQ;AAAA,GAAO,CAAA;AAAA,EAC/C,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC3C,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO,CAAA;AAAA,EACjC,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,eAAe,CAAA;AAAA,IAC5C,EAAA,EAAI,KAAA;AAAA,IAAO,MAAA,EAAQ,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO,CAAA;AAAA,EAChD,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,IACtC,YAAA,EAAc,KAAA;AAAA,IAAO,QAAA,EAAU,KAAA;AAAA,IAC/B,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAG,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAC,CAAC,EAAE,QAAA;AAAS,GAAG,CAAA;AAAA;AAAA,EAEtF,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,IACvC,MAAA,EAAQ,KAAA;AAAA,IAAO,YAAA,EAAc;AAAA,GAAO,CAAA;AAAA,EAC/C,EAAE,MAAA,CAAO;AAAA,IAAE,IAAA,EAAM,KAAA;AAAA,IAAO,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,IACtC,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI,KAAA;AAAA,IAAO,EAAA,EAAI;AAAA,GAAO;AAC9C,CAAC,CAAA;AAEM,IAAM,QAAA,GAAW,EAAE,MAAA,CAAO;AAAA,EAC/B,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA;AAAA,EACxB,QAAQ,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,EAAE;AACtC,CAAC,CAAA;;;AC9CM,SAAS,OAAA,CACd,IAAA,EACA,OAAA,EACA,IAAA,EACgB;AAChB,EAAA,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAK;AAC7D;;;ACTO,SAAS,aAAa,GAAA,EAA8B;AACzD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,CAAA,kBAAA,EAAe,EAAE,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,IAAA,EAAM,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG,CAAC,CAAA;AACnF,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EAClF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,CAAA,kBAAA,EAAe,EAAE,IAAI,CAAA,CAAA,CAAA,EAAK,EAAE,IAAA,EAAM,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG,CAAC,CAAA;AACnF,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EAClF;AAEA,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;;;ACjCA,SAAS,YAAY,GAAA,EAAkC;AACrD,EAAA,OAAO,CAAC,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,OAAA;AAC/B;AAGA,IAAM,qBAAA,uBAA4B,GAAA,CAAuB;AAAA,EACvD,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EACnB,eAAA;AAAA,EAAiB,UAAA;AAAA,EAAY,cAAA;AAAA,EAAgB,eAAA;AAAA,EAAiB;AAChE,CAAC,CAAA;AAED,IAAM,+BAAe,IAAI,GAAA,CAAuB,CAAC,UAAA,EAAY,SAAS,CAAC,CAAA;AAEvE,SAAS,WAAW,GAAA,EAAkC;AACpD,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,SAAS,OAAO,KAAA;AACzC,EAAA,OAAO,qBAAA,CAAsB,GAAA,CAAK,GAAA,CAAI,MAAA,CAAqB,IAAI,CAAA;AACjE;AAEA,SAAS,aAAa,GAAA,EAAkC;AACtD,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,SAAS,OAAO,KAAA;AACzC,EAAA,OAAO,YAAA,CAAa,GAAA,CAAK,GAAA,CAAI,MAAA,CAAqB,IAAI,CAAA;AACxD;AAEA,SAAS,eAAe,GAAA,EAAkC;AACxD,EAAA,OAAO,CAAC,CAAC,GAAA,IAAO,GAAA,CAAI,SAAS,OAAA,IAAY,GAAA,CAAI,OAAqB,IAAA,KAAS,SAAA;AAC7E;AAMO,SAAS,YAAA,CAAa,KAAgB,OAAA,EAA0C;AACrF,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,MAAM,QAAQ,CACZ,KAAA,EACA,KAAA,EACA,OAAA,EACA,WACA,QAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,QAAQ,aAAA;AAAA,QAClB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,qBAAgB,OAAO,CAAA,4BAAA,CAAA;AAAA,QACxC,EAAE,IAAA,EAAM,CAAC,KAAA,EAAO,KAAK,CAAA;AAAE,OAAE,CAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG;AACnB,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,QAAQ,eAAA;AAAA,QAClB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,OAAO,CAAA,0BAAA,EAAmB,QAAQ,CAAA,WAAA,EAAS,IAAI,IAAA,KAAS,OAAA,GAAU,OAAA,GAAW,GAAA,CAAI,OAAqB,IAAI,CAAA,CAAA,CAAA;AAAA,QAChI,EAAE,IAAA,EAAM,CAAC,KAAA,EAAO,KAAK,CAAA;AAAE,OAAE,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,MAAA;AAAQ,QAAA;AAAA,MACb,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,SAAA,EAAW,gBAAgB,SAAS,CAAA;AACjE,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,YAAY,WAAW,CAAA;AACzD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA,CAAE,QAAA,EAAU,cAAc,QAAQ,CAAA;AAC5D,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,aAAa,OAAO,CAAA;AAClD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,YAAY,WAAW,CAAA;AACzD,QAAA;AAAA,MACF,KAAK,cAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,aAAA;AACH,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,UAAA,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,CAAA,SAAA,EAAY,CAAC,CAAA,CAAA,CAAA,EAAK,EAAE,QAAA,CAAS,CAAC,CAAA,EAAG,WAAA,EAAa,OAAO,CAAA;AAAA,QACrE;AACA,QAAA;AAAA,MACF,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,eAAe,CAAC,CAAA,KAA0B,WAAW,CAAC,CAAA,IAAK,aAAa,CAAC,CAAA;AAC/E,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,cAAc,4BAAuB,CAAA;AACnE,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,cAAc,4BAAuB,CAAA;AACnE,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,QAAQ,EAAE,IAAA;AAAM,MACd,KAAK,SAAA;AAAA,MACL,KAAK,MAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,aAAa,OAAO,CAAA;AACtD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,OAAA,EAAS,aAAa,OAAO,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,MACrB,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,CAAA,SAAA,EAAY,CAAC,CAAA,CAAA,CAAA,EAAK,CAAA,EAAG,WAAA,EAAa,OAAO,CAAC,CAAA;AAC1D,QAAA;AAAA,MACF,KAAK,eAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA,CAAE,YAAA,EAAc,aAAa,OAAO,CAAA;AAClE,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,YAAY,WAAW,CAAA;AACzD,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,aAAa,OAAO,CAAA;AACtD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA,CAAE,YAAA,EAAc,aAAa,OAAO,CAAA;AAClE,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA,CAAE,QAAA,EAAU,cAAc,QAAQ,CAAA;AAC5D,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA,CAAE,MAAA,EAAQ,aAAa,OAAO,CAAA;AACtD,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA,CAAE,YAAA,EAAc,aAAa,OAAO,CAAA;AAClE,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,EAAA,EAAI,aAAa,OAAO,CAAA;AAC9C,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAGO,SAAS,YAAY,MAAA,EAAyC;AACnE,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,MAAA;AAAgB,QAAA,OAAO,EAAC;AAAA,MAC7B,KAAK,UAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA;AAAA,MACjD,KAAK,WAAA;AAAgB,QAAA,OAAO,CAAC,OAAO,SAAS,CAAA;AAAA,MAC7C,KAAK,QAAA;AAAgB,QAAA,OAAO,CAAC,OAAO,MAAM,CAAA;AAAA,MAC1C,KAAK,UAAA;AAAgB,QAAA,OAAO,CAAC,OAAO,QAAQ,CAAA;AAAA,MAC5C,KAAK,UAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,MACvD,KAAK,cAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,aAAA;AAAgB,QAAA,OAAO,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,MAC/C,KAAK,cAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MACrD,KAAK,SAAA;AAAA,MACL,KAAK,MAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA;AAAA,MACjD,KAAK,KAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,OAAO,CAAA;AAAA,MAC1D,KAAK,SAAA;AAAgB,QAAA,OAAO,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,MAC/C,KAAK,eAAA;AAAA,MACL,KAAK,UAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,MAAM,CAAA;AAAA,MAC/D,KAAK,cAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA;AAAA,MACjD,KAAK,eAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAE,CAAA;AAAA,MAChE,KAAK,SAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,QAAQ,CAAA;AAAA,MACjE,KAAK,UAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,MAC/D,KAAK,SAAA;AAAgB,QAAA,OAAO,CAAC,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA;AAC9D,EACF;AACA,EAAA,OAAO,EAAC;AACV;;;ACpKO,SAAS,aAAa,OAAA,EAA4C;AACvE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAmB;AACrC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2B;AAC9C,EAAA,MAAM,SAA2B,EAAC;AAClC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,EAAA,KAAA,MAAW,QAAQ,OAAA,CAAQ,IAAA,IAAQ,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAE1D,EAAA,SAAS,WAAA,CAAY,OAAe,GAAA,EAAa;AAE/C,IAAA,MAAM,KAAA,GAAkB,CAAC,KAAK,CAAA;AAC9B,IAAA,IAAI,GAAA,GAAiC,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACrD,IAAA,OAAO,OAAO,GAAA,KAAQ,GAAA,IAAO,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5D,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAEd,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAE,CAAC,CAAA;AACpE,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,EAAG,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,QAAG,CAAA;AAC5B,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,IAAA,cAAA,CAAe,IAAI,GAAG,CAAA;AACtB,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA;AAAA,MAAQ,OAAA;AAAA,MAClB,gCAAmB,KAAA,CAAM,OAAA,EAAQ,CAAE,IAAA,CAAK,UAAK,CAAC,CAAA,CAAA;AAAA,MAC9C,EAAE,IAAA,EAAM,CAAC,GAAG,KAAK,CAAA,EAAG,MAAM,qEAAA;AAAuD,KAAE,CAAA;AAAA,EACvF;AAEA,EAAA,SAAS,IAAI,IAAA,EAAc;AACzB,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,CAAA;AACtB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC5B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA,EAAG;AACzC,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACvB,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,WAAA,CAAY,MAAM,GAAG,CAAA;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,MAAM,OAAA,EAAS;AACjB,UAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACpB,UAAA,GAAA,CAAI,GAAG,CAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAK,EAAG;AACjC,IAAA,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,KAAM,OAAA,EAAS;AAC/B,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,IAAI,CAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;;;AC7DA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA;AACd,IAAA,OAAO,CAAA,CAAE,IAAA,KAAS,cAAA,GAAiB,GAAA,GAAM,GAAA;AAAA,EAC3C;AACA,EAAA,MAAM,IAAI,GAAA,CAAI,MAAA;AACd,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,SAAA;AAAiB,MAAA,OAAO,GAAA;AAAA,IAC7B,KAAK,KAAA;AAAiB,MAAA,OAAO,GAAA;AAAA,IAC7B,KAAK,SAAA;AAAiB,MAAA,OAAO,MAAA;AAAA,IAC7B,KAAK,UAAA;AAAA,IACL,KAAK,SAAA;AAAiB,MAAA,OAAO,GAAA;AAAA;AAAA,IAE7B,KAAK,MAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,SAAA;AAAiB,MAAA,OAAO,GAAA;AAAA;AAEjC;AAEO,SAAS,UAAU,OAAA,EAAmD;AAC3E,EAAA,MAAM,QAAA,GAAmC,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAG,CAAA,EAAE;AACvF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AAEpC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC3C,IAAA,MAAM,MAAA,GAAS,UAAU,GAAG,CAAA;AAC5B,IAAA,QAAA,CAAS,MAAM,CAAA,IAAK,CAAA;AACpB,IAAA,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG,MAAM,GAAG,QAAA,CAAS,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,GAAA;AACT;;;AC1BA,SAAS,SAAA,CAAU,KAA0B,IAAA,EAAsB;AACjE,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,SAAA,CACd,CAAA,EACA,GAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,aAAA,EAAe;AAAA,GACjB;AAEA,EAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACnC,IAAA,MAAM,aAAa,MAAA,KAAW,QAAA;AAC9B,IAAA,MAAM,aAAa,MAAA,KAAW,QAAA;AAC9B,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI,UAAA,IAAc,YAAY,aAAA,GAAgB,cAAA;AAAA,SAAA,IACrC,UAAA,IAAc,YAAY,aAAA,GAAgB,YAAA;AAAA,SAC9C,aAAA,GAAgB,UAAA;AAErB,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,MAC3B,IAAA,EAAM,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,IAAI;AAAA,KAC7B;AACA,IAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,MAAA,KAAA,CAAM,MAAA,GAAS,EAAE,MAAA,IAAU,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAA;AAAA,MACJ,IAAA,EAAM,cAAA;AAAA,MACN,GAAG,UAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,MAAA;AACH,MAAA,UAAA,GAAa,EAAE,MAAM,MAAA,EAAQ,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AAC5C,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,UAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,EAAA,EAAI,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAE;AACpF,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE;AACjF,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE;AACxE,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AACtF,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,EAAQ,SAAA,CAAU,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAE;AAChG,MAAA;AAAA,IACF,KAAK,cAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,UAAA,GAAa;AAAA,QACX,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,QAAA,EAAU,CAAC,SAAA,CAAU,GAAA,EAAK,EAAE,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,SAAA,CAAU,GAAA,EAAK,EAAE,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,SAAA,CAAU,KAAK,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC;AAAA,OACxG;AACA,MAAA;AAAA;AAGJ,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,OAAA;AAAA,IACN,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,EAAE,UAAA;AAAW,GACtB;AACF;;;AC5FA,SAAS,CAAA,CAAE,KAA0B,IAAA,EAAsB;AACzD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,IAAI,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,SAAA,CAAU,GAAc,GAAA,EAAuC;AAC7E,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AACxB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,aAAA,EAAe;AAAA,GACjB;AAEA,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,SAAA,EAAW,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,GAAG,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,GAAE,EAAE;AAAA,IAEvF,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,GAAG,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,GAAE,EAAE;AAAA,IAEpF,KAAK,KAAA;AACH,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,MAAM,GAAG,OAAA,EAAS,CAAA,CAAE,KAAK,CAAA,CAAE,OAAO,GAAE,EAAE;AAAA,IAErG,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAW,GAAG,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,EAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAC,GAAE,EAAE;AAAA,IAE/F,KAAK,eAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QAAI,IAAA,EAAM,MAAA;AAAA,QAAQ,GAAG,IAAA;AAAA,QACrB,OAAO,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,YAAA,EAAc,CAAA,CAAE,KAAK,CAAA,CAAE,YAAY,GAAG,MAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAE,MAAM,GAAE;AAAE,OAC1G;AAAA,IAEF,KAAK,cAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QAAI,IAAA,EAAM,MAAA;AAAA,QAAQ,GAAG,IAAA;AAAA,QACrB,OAAO,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,EAAE,GAAG,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAE,EAAE,GAAE;AAAE,OACtF;AAAA,IAEF,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QAAI,IAAA,EAAM,MAAA;AAAA,QAAQ,GAAG,IAAA;AAAA,QACrB,KAAA,EAAO,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,iBAAiB,EAAA,EAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,EAAA,EAAI,EAAE,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAE;AAAE,OACjH;AAAA,IAEF,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,YAAA,GAAwC;AAAA,QAC5C,IAAA,EAAM,SAAA;AAAA,QACN,YAAA,EAAc,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,YAAY,CAAA;AAAA,QACnC,QAAA,EAAU,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAQ;AAAA,OAC7B;AACA,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,YAAA,CAAa,SAAS,CAAA,CAAE,MAAA;AACpD,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,GAAG,IAAA,EAAM,KAAA,EAAO,EAAE,YAAA,EAAa,EAAE;AAAA,IAC9D;AAAA,IAEA,KAAK,UAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QAAI,IAAA,EAAM,QAAA;AAAA,QAAU,GAAG,IAAA;AAAA,QACvB,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,YAAA,EAAc,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,YAAY,CAAA;AAAE,OAC1E;AAAA,IAEF,KAAK,SAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAA;AAAA,QAAI,IAAA,EAAM,QAAA;AAAA,QAAU,GAAG,IAAA;AAAA,QACvB,KAAA,EAAO,EAAE,YAAA,EAAc,EAAE,IAAA,EAAM,iBAAiB,EAAA,EAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,IAAI,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAG,EAAA,EAAI,EAAE,GAAA,EAAK,CAAA,CAAE,EAAE,CAAA,EAAE;AAAE,OACzG;AAAA;AAEN;;;AC9DA,SAAS,OAAO,MAAA,EAA+C;AAE7D,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,MAAA;AAAA,MAAQ,KAAK,UAAA;AAAA,MAAY,KAAK,WAAA;AAAA,MAAa,KAAK,QAAA;AAAA,MACrD,KAAK,UAAA;AAAA,MAAY,KAAK,UAAA;AAAA,MAAY,KAAK,cAAA;AAAA,MACvC,KAAK,UAAA;AAAA,MAAY,KAAK,UAAA;AAAA,MAAY,KAAK,aAAA;AAAA,MAAe,KAAK,cAAA;AACzD,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,SAAA;AAAY,QAAA,OAAO,SAAA;AAAA,MACxB,KAAK,MAAA;AAAY,QAAA,OAAO,MAAA;AAAA,MACxB,KAAK,KAAA;AAAY,QAAA,OAAO,KAAA;AAAA,MACxB,KAAK,SAAA;AAAY,QAAA,OAAO,OAAA;AAAA;AAAA,MACxB,KAAK,eAAA;AAAA,MAAiB,KAAK,UAAA;AAAA,MAAY,KAAK,cAAA;AAAA,MAC5C,KAAK,eAAA;AAAA,MAAiB,KAAK,SAAA;AACzB,QAAA,OAAO,kBAAA;AAAA,MACT,KAAK,UAAA;AAAA,MAAY,KAAK,SAAA;AACpB,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,UAAU,MAAA,EAAkC;AAE1D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,MAAA,GAA2B,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA;AAAA,MAAI,CAAC,GAAA,KACxD,OAAA,CAAQ,QAAA,EAAU,GAAA,CAAI,OAAA,EAAS,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG;AAAA,KAC/D;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B;AACA,EAAA,MAAM,MAAM,MAAA,CAAO,IAAA;AAGnB,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAU,GAAI,aAAa,GAAG,CAAA;AACvD,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,YAAA,CAAa,KAAK,OAAO,CAAA;AACvD,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAI,aAAa,OAAO,CAAA;AAEpD,EAAA,MAAM,YAAY,CAAC,GAAG,WAAW,GAAG,SAAA,EAAW,GAAG,WAAW,CAAA;AAC7D,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,SAAA,EAAU;AAGhE,EAAA,MAAM,GAAA,GAAM,UAAU,OAAO,CAAA;AAG7B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4B;AAClD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC3C,IAAA,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,UAAuC,EAAC;AAC9C,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,SAAS,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,EACnB;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAA,GAAQ,iBAAiB,IAAI,CAAA;AACnC,EAAA,MAAM,KAAA,GAAe;AAAA,IACnB,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAS,KAAA,CAAM,MAAA;AAAA,IACf,MAAM,KAAA,CAAM;AAAA,GACd;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAC3B;AC1CA,eAAsB,aAAa,IAAA,EAAmD;AACpF,EAAA,MAAM,SAAS,IAAI,SAAA,CAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACpD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA;AAAA,IACjC;AAAA,MACE,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK,UAAA;AAAA,MAClB,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,IACA,KAAK,MAAA,GAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAO,GAAI;AAAA,GAC1C;AACA,EAAA,OAAO,IAAA;AACT;;;ACtDO,IAAM,OAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,gDAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA;AAAM,KAC5C;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE;AAC5D;AAEJ,CAAA;;;ACbO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,+DAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,YAAY,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA;AAAI,KAClD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MAC1D,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA;AAAI;AAClD;AAEJ,CAAA;;;ACfO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,mEAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,YAAY,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA;AAAK,KACzD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MAC1D,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,MAChD,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA;AAAI;AAClD;AAEJ,CAAA;;;AChBO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,6CAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE,KAC3D;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE;AAC5D;AAEJ,CAAA;;;ACdO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,4CAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,aAAA,EAAe,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE,KAC9D;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE;AAC5D;AAEJ,CAAA;;;ACdO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,2EAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE,KAC/D;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MAC1D,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,SAAA,EAAW,IAAI,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,GAAA;AAAI;AAC1D;AAEJ,CAAA;;;ACfO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,sHAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,UAAA,EAAY,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MACzD,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,YAAY,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA;AAAK,KACzD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,UAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MAC1D,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,MAChD,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,YAAY,MAAA,EAAQ,GAAA,EAAK,cAAc,GAAA;AAAI;AACvE;AAEJ,CAAA;;;ACjBO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,iGAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,EAAE,MAAM,GAAA,EAAK,IAAA,EAAM,gBAAgB,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA;AAAK,KAC5D;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,MAChE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,MAChD,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,WAAW,EAAA,EAAI,GAAA,EAAK,IAAI,GAAA;AAAI;AAClD;AAEJ,CAAA;;;ACjBO,IAAMA,QAAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,oFAAA;AAAA,EACT,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACvC,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAE;AAAA,MACrE,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,cAAA,EAAgB,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAE,KACvE;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,YAAY,MAAA,EAAQ,IAAA,EAAM,cAAc,IAAA,EAAK;AAAA,MACjE,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,YAAY,MAAA,EAAQ,IAAA,EAAM,cAAc,IAAA;AAAK;AACnE;AAEJ,CAAA;;;ACTA,IAAM,QAAA,GAAW,CAAC,OAAA,EAAIA,QAAAA,EAAIA,QAAAA,EAAKA,UAAIA,QAAAA,EAAIA,QAAAA,EAAIA,QAAAA,EAAIA,QAAAA,EAAKA,QAAG,CAAA;AAEhD,SAAS,iBAAA,GAA4B;AAC1C,EAAA,MAAM,WAAW,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,CAAA,EAAG,CAAA,KAChC,CAAA,kBAAA,EAAa,IAAI,CAAC;AAAA,kBAAA,EAAa,EAAE,OAAO;AAAA;AAAA;AAAA,EAA2B,KAAK,SAAA,CAAU,CAAA,CAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAC;AAAA,MAAA;AAAA,GACnG,CAAE,KAAK,MAAM,CAAA;AAEb,EAAA,OAAO,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,EAmBP,QAAQ;;AAAA;AAAA,gPAAA,CAAA;AAIV;ACpCO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EAAa,wHAAA;AAAA,EACb,YAAA,EAAc,gBAAgB,QAAA,EAAU;AAAA,IACtC,MAAA,EAAQ,aAAA;AAAA,IACR,YAAA,EAAc;AAAA,GACf;AACH,CAAA;AAEA,IAAM,YAAA,GAAeC,EAAE,MAAA,CAAO;AAAA,EAC5B,MAAA,EAAQA,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,SAAS,sEAAkC;AACvE,CAAC,CAAA;AAEM,IAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,sJAAA;AAAA,EACb,cAAc,eAAA,CAAgB,YAAA,EAAc,EAAE,MAAA,EAAQ,eAAe;AACvE,CAAA;AAEO,IAAM,KAAA,GAAQ,CAAC,iBAAA,EAAmB,WAAW,CAAA;;;AChBpD,IAAM,aAAA,GAAgB,iBAAA;AACtB,IAAM,kBAAA,GAAqB,IAAA;AAwB3B,SAAS,QAAQ,CAAA,EAA0C;AACzD,EAAA,OAAO;AAAA,IACL,aAAa,CAAA,CAAE,YAAA;AAAA,IACf,cAAc,CAAA,CAAE,aAAA;AAAA,IAChB,eAAA,EAAiB,EAAE,uBAAA,IAA2B,CAAA;AAAA,IAC9C,mBAAA,EAAqB,EAAE,2BAAA,IAA+B;AAAA,GACxD;AACF;AAEA,eAAsB,cAAA,CACpB,SACA,IAAA,EACyB;AACzB,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,SAAS,2BAAA,EAAkB;AAAA,EACtE;AACA,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAK,EAAG;AAC/B,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,SAAS,+BAAA,EAAc;AAAA,EAClE;AAEA,EAAA,MAAM,aAAa,iBAAA,EAAkB;AACrC,EAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,KAAkB,KAAA;AAC7C,EAAA,MAAM,cAAc,aAAA,GAChB,EAAE,IAAA,EAAM,MAAA,EAAiB,MAAM,UAAA,EAAY,aAAA,EAAe,EAAE,IAAA,EAAM,aAAqB,EAAE,GACzF,EAAE,IAAA,EAAM,MAAA,EAAiB,MAAM,UAAA,EAAW;AAE9C,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,MAAM,YAAA,CAAa;AAAA,MAC5B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAA,EAAO,KAAK,KAAA,IAAS,aAAA;AAAA,MACrB,SAAA,EAAW,KAAK,SAAA,IAAa,kBAAA;AAAA,MAC7B,MAAA,EAAQ,CAAC,WAAW,CAAA;AAAA,MACpB,KAAA,EAAO,KAAA;AAAA,MACP,UAAA,EAAY,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MAC1B,UAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,MAC7C,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,WAAA;AAAA,MACR,OAAA,EAAS,IAAI,OAAA,IAAW,8BAAA;AAAA,MACxB,GAAI,IAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO,GAAI;AAAC,KAC3D;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAClE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,UAAA,EAAY;AAC3C,IAAA,MAAM,IAAA,GAAO,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAM,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,EAAM,IAAA,KAAS,MAAA,GAAS,KAAK,IAAA,GAAO,SAAA;AACpD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,SAAS,8CAAA,GAAsC,OAAA;AAAA,MAC/C,KAAK,QAAA,CAAS,OAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,MAAM,MAAA,IAAU,+CAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,cAAA,EAAgB;AACnC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,aAAA;AAAA,MACR,OAAA,EAAS,CAAA,sCAAA,EAAyB,OAAA,CAAQ,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9C,GAAA,EAAK,OAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,KAAK,CAAA;AACvC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,iBAAA;AAAA,MACR,OAAA,EAAS,0CAAA;AAAA,MACT,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAK,OAAA,CAAQ,KAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,KAAK,OAAA,CAAQ,KAAA;AAAA,IACb;AAAA,GACF;AACF","file":"ai.mjs","sourcesContent":["// src/stamps/geometry-2d/dsl/schema.ts\nimport { z } from 'zod';\n\n// Label-style name: chữ cái Latin đầu, cho phép unicode prime (') + subscript ₀-₉.\n// Max length 12 ký tự. Phân biệt hoa/thường.\nexport const NameZ = z\n .string()\n .regex(/^[A-Za-z][A-Za-z0-9_'₀-₉]{0,11}$/);\n\nexport const DslPoint = z.discriminatedUnion('kind', [\n z.object({ name: NameZ, kind: z.literal('free'),\n x: z.number().finite(), y: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('midpoint'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('onSegment'),\n segmentId: NameZ, t: z.number().min(0).max(1) }),\n z.object({ name: NameZ, kind: z.literal('onLine'),\n lineId: NameZ, t: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('onCircle'),\n circleId: NameZ, theta: z.number().finite() }),\n z.object({ name: NameZ, kind: z.literal('perpFoot'),\n from: NameZ, onLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('circumcenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('incenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('centroid'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('orthocenter'),\n vertices: z.tuple([NameZ, NameZ, NameZ]) }),\n z.object({ name: NameZ, kind: z.literal('intersection'),\n ref1: NameZ, ref2: NameZ,\n branch: z.union([z.literal(0), z.literal(1)]).optional() }),\n]);\n\nexport const DslShape = z.discriminatedUnion('kind', [\n z.object({ name: NameZ, kind: z.literal('segment'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('line'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('ray'),\n origin: NameZ, through: NameZ }),\n z.object({ name: NameZ, kind: z.literal('polygon'),\n vertices: z.array(NameZ).min(3) }),\n // Line constructions\n z.object({ name: NameZ, kind: z.literal('perpendicular'),\n throughPoint: NameZ, toLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('parallel'),\n throughPoint: NameZ, toLine: NameZ }),\n z.object({ name: NameZ, kind: z.literal('perpBisector'),\n p1: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('angleBisector'),\n p1: NameZ, vertex: NameZ, p2: NameZ }),\n z.object({ name: NameZ, kind: z.literal('tangent'),\n throughPoint: NameZ, toCircle: NameZ,\n branch: z.union([z.literal(0), z.literal(1), z.literal('on')]).optional() }),\n // Circle constructions\n z.object({ name: NameZ, kind: z.literal('circleCP'),\n center: NameZ, surfacePoint: NameZ }),\n z.object({ name: NameZ, kind: z.literal('circle3'),\n p1: NameZ, p2: NameZ, p3: NameZ }),\n]);\n\nexport const DslInput = z.object({\n version: z.literal(1),\n points: z.array(DslPoint),\n shapes: z.array(DslShape).default([]),\n});\n\nexport type DslPointT = z.infer<typeof DslPoint>;\nexport type DslShapeT = z.infer<typeof DslShape>;\nexport type DslInputT = z.infer<typeof DslInput>;\n","// src/stamps/geometry-2d/dsl/transpile/errors.ts\nimport type { State } from '../../../../core/scene/types';\n\nexport type TranspileErrorCode =\n | 'SCHEMA'\n | 'DUPLICATE_NAME'\n | 'UNKNOWN_REF'\n | 'KIND_MISMATCH'\n | 'CYCLE';\n\nexport interface TranspileError {\n code: TranspileErrorCode;\n message: string;\n path?: string[];\n hint?: string;\n}\n\nexport type TranspileResult =\n | { ok: true; state: State }\n | { ok: false; errors: TranspileError[] };\n\nexport function mkError(\n code: TranspileErrorCode,\n message: string,\n opts?: { path?: string[]; hint?: string },\n): TranspileError {\n return { code, message, path: opts?.path, hint: opts?.hint };\n}\n","// src/stamps/geometry-2d/dsl/transpile/symbols.ts\nimport type { DslInputT, DslPointT, DslShapeT } from '../schema';\nimport { mkError, type TranspileError } from './errors';\n\nexport type Role = 'point' | 'shape';\n\nexport interface Symbol {\n name: string;\n role: Role;\n entity: DslPointT | DslShapeT;\n index: number; // vị trí trong list nguyên thuỷ (cho deterministic id assign sau)\n}\n\nexport interface SymbolResult {\n symbols: Map<string, Symbol>;\n errors: TranspileError[];\n}\n\nexport function buildSymbols(dsl: DslInputT): SymbolResult {\n const symbols = new Map<string, Symbol>();\n const errors: TranspileError[] = [];\n let counter = 0;\n\n for (const p of dsl.points) {\n if (symbols.has(p.name)) {\n errors.push(mkError('DUPLICATE_NAME', `Tên trùng: \"${p.name}\"`, { path: [p.name] }));\n continue;\n }\n symbols.set(p.name, { name: p.name, role: 'point', entity: p, index: counter++ });\n }\n\n for (const s of dsl.shapes) {\n if (symbols.has(s.name)) {\n errors.push(mkError('DUPLICATE_NAME', `Tên trùng: \"${s.name}\"`, { path: [s.name] }));\n continue;\n }\n symbols.set(s.name, { name: s.name, role: 'shape', entity: s, index: counter++ });\n }\n\n return { symbols, errors };\n}\n","// src/stamps/geometry-2d/dsl/transpile/refs.ts\nimport type { DslInputT, DslPointT, DslShapeT } from '../schema';\nimport type { Symbol } from './symbols';\nimport { mkError, type TranspileError } from './errors';\n\n// \"Point-like\" = DslPoint of any kind. State sẽ emit `kind: 'point'` hoặc\n// `kind: 'intersection'`; cả hai visualize as points.\nfunction isPointLike(sym: Symbol | undefined): boolean {\n return !!sym && sym.role === 'point';\n}\n\n// \"Line-like\" gồm: line / segment / ray + 5 line-constructions.\nconst LINE_LIKE_SHAPE_KINDS = new Set<DslShapeT['kind']>([\n 'line', 'segment', 'ray',\n 'perpendicular', 'parallel', 'perpBisector', 'angleBisector', 'tangent',\n]);\n\nconst CIRCLE_KINDS = new Set<DslShapeT['kind']>(['circleCP', 'circle3']);\n\nfunction isLineLike(sym: Symbol | undefined): boolean {\n if (!sym || sym.role !== 'shape') return false;\n return LINE_LIKE_SHAPE_KINDS.has((sym.entity as DslShapeT).kind);\n}\n\nfunction isCircleLike(sym: Symbol | undefined): boolean {\n if (!sym || sym.role !== 'shape') return false;\n return CIRCLE_KINDS.has((sym.entity as DslShapeT).kind);\n}\n\nfunction isSegmentExact(sym: Symbol | undefined): boolean {\n return !!sym && sym.role === 'shape' && (sym.entity as DslShapeT).kind === 'segment';\n}\n\nexport interface RefsResult {\n errors: TranspileError[];\n}\n\nexport function validateRefs(dsl: DslInputT, symbols: Map<string, Symbol>): RefsResult {\n const errors: TranspileError[] = [];\n\n const check = (\n owner: string,\n field: string,\n refName: string,\n predicate: (s: Symbol | undefined) => boolean,\n expected: string,\n ) => {\n const sym = symbols.get(refName);\n if (!sym) {\n errors.push(mkError('UNKNOWN_REF',\n `${owner}.${field} tham chiếu \"${refName}\" không tồn tại`,\n { path: [owner, field] }));\n return;\n }\n if (!predicate(sym)) {\n errors.push(mkError('KIND_MISMATCH',\n `${owner}.${field}=\"${refName}\" sai kiểu (cần ${expected}, gặp ${sym.role === 'point' ? 'point' : (sym.entity as DslShapeT).kind})`,\n { path: [owner, field] }));\n }\n };\n\n for (const p of dsl.points) {\n switch (p.kind) {\n case 'free': break;\n case 'midpoint':\n check(p.name, 'p1', p.p1, isPointLike, 'point');\n check(p.name, 'p2', p.p2, isPointLike, 'point');\n break;\n case 'onSegment':\n check(p.name, 'segmentId', p.segmentId, isSegmentExact, 'segment');\n break;\n case 'onLine':\n check(p.name, 'lineId', p.lineId, isLineLike, 'line-like');\n break;\n case 'onCircle':\n check(p.name, 'circleId', p.circleId, isCircleLike, 'circle');\n break;\n case 'perpFoot':\n check(p.name, 'from', p.from, isPointLike, 'point');\n check(p.name, 'onLine', p.onLine, isLineLike, 'line-like');\n break;\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter':\n for (let i = 0; i < 3; i++) {\n check(p.name, `vertices[${i}]`, p.vertices[i], isPointLike, 'point');\n }\n break;\n case 'intersection': {\n const refPredicate = (s: Symbol | undefined) => isLineLike(s) || isCircleLike(s);\n check(p.name, 'ref1', p.ref1, refPredicate, 'line-like hoặc circle');\n check(p.name, 'ref2', p.ref2, refPredicate, 'line-like hoặc circle');\n break;\n }\n }\n }\n\n for (const s of dsl.shapes) {\n switch (s.kind) {\n case 'segment':\n case 'line':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'ray':\n check(s.name, 'origin', s.origin, isPointLike, 'point');\n check(s.name, 'through', s.through, isPointLike, 'point');\n break;\n case 'polygon':\n s.vertices.forEach((v, i) =>\n check(s.name, `vertices[${i}]`, v, isPointLike, 'point'));\n break;\n case 'perpendicular':\n case 'parallel':\n check(s.name, 'throughPoint', s.throughPoint, isPointLike, 'point');\n check(s.name, 'toLine', s.toLine, isLineLike, 'line-like');\n break;\n case 'perpBisector':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'angleBisector':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'vertex', s.vertex, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n break;\n case 'tangent':\n check(s.name, 'throughPoint', s.throughPoint, isPointLike, 'point');\n check(s.name, 'toCircle', s.toCircle, isCircleLike, 'circle');\n break;\n case 'circleCP':\n check(s.name, 'center', s.center, isPointLike, 'point');\n check(s.name, 'surfacePoint', s.surfacePoint, isPointLike, 'point');\n break;\n case 'circle3':\n check(s.name, 'p1', s.p1, isPointLike, 'point');\n check(s.name, 'p2', s.p2, isPointLike, 'point');\n check(s.name, 'p3', s.p3, isPointLike, 'point');\n break;\n }\n }\n\n return { errors };\n}\n\n// Helper export cho cycles.ts: collect refs cho mỗi entity (name) trả về list ref names.\nexport function collectRefs(entity: DslPointT | DslShapeT): string[] {\n if ('kind' in entity) {\n switch (entity.kind) {\n case 'free': return [];\n case 'midpoint': return [entity.p1, entity.p2];\n case 'onSegment': return [entity.segmentId];\n case 'onLine': return [entity.lineId];\n case 'onCircle': return [entity.circleId];\n case 'perpFoot': return [entity.from, entity.onLine];\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter': return [...entity.vertices];\n case 'intersection': return [entity.ref1, entity.ref2];\n case 'segment':\n case 'line': return [entity.p1, entity.p2];\n case 'ray': return [entity.origin, entity.through];\n case 'polygon': return [...entity.vertices];\n case 'perpendicular':\n case 'parallel': return [entity.throughPoint, entity.toLine];\n case 'perpBisector': return [entity.p1, entity.p2];\n case 'angleBisector':return [entity.p1, entity.vertex, entity.p2];\n case 'tangent': return [entity.throughPoint, entity.toCircle];\n case 'circleCP': return [entity.center, entity.surfacePoint];\n case 'circle3': return [entity.p1, entity.p2, entity.p3];\n }\n }\n return [];\n}\n","// src/stamps/geometry-2d/dsl/transpile/cycles.ts\nimport type { Symbol } from './symbols';\nimport { collectRefs } from './refs';\nimport { mkError, type TranspileError } from './errors';\n\ntype Color = 'white' | 'gray' | 'black';\n\nexport interface CyclesResult {\n errors: TranspileError[];\n}\n\nexport function detectCycles(symbols: Map<string, Symbol>): CyclesResult {\n const color = new Map<string, Color>();\n const parent = new Map<string, string | null>();\n const errors: TranspileError[] = [];\n const reportedCycles = new Set<string>();\n\n for (const name of symbols.keys()) color.set(name, 'white');\n\n function reportCycle(start: string, hit: string) {\n // reconstruct chain hit ← ... ← start\n const chain: string[] = [start];\n let cur: string | null | undefined = parent.get(start);\n while (cur && cur !== hit && chain.length < symbols.size + 2) {\n chain.push(cur);\n cur = parent.get(cur);\n }\n chain.push(hit);\n // normalize cho dedupe (rotate min-first)\n const minIdx = chain.indexOf(chain.reduce((a, b) => (a < b ? a : b)));\n const rotated = [...chain.slice(minIdx), ...chain.slice(0, minIdx)];\n const key = rotated.join('→');\n if (reportedCycles.has(key)) return;\n reportedCycles.add(key);\n errors.push(mkError('CYCLE',\n `Phụ thuộc vòng: ${chain.reverse().join(' → ')}`,\n { path: [...chain], hint: 'Kiểm tra lại quan hệ midpoint/perpFoot/intersection.' }));\n }\n\n function dfs(name: string) {\n color.set(name, 'gray');\n const sym = symbols.get(name);\n if (sym) {\n for (const ref of collectRefs(sym.entity)) {\n if (!symbols.has(ref)) continue; // unknown — refs.ts handle\n const c = color.get(ref);\n if (c === 'gray') {\n reportCycle(name, ref);\n continue;\n }\n if (c === 'white') {\n parent.set(ref, name);\n dfs(ref);\n }\n }\n }\n color.set(name, 'black');\n }\n\n for (const name of symbols.keys()) {\n if (color.get(name) === 'white') {\n parent.set(name, null);\n dfs(name);\n }\n }\n\n return { errors };\n}\n","// src/stamps/geometry-2d/dsl/transpile/ids.ts\nimport type { DslPointT, DslShapeT } from '../schema';\nimport type { Symbol } from './symbols';\n\ntype Prefix = 'p' | 'i' | 's' | 'l' | 'r' | 'poly' | 'c';\n\nfunction prefixFor(sym: Symbol): Prefix {\n if (sym.role === 'point') {\n const p = sym.entity as DslPointT;\n return p.kind === 'intersection' ? 'i' : 'p';\n }\n const s = sym.entity as DslShapeT;\n switch (s.kind) {\n case 'segment': return 's';\n case 'ray': return 'r';\n case 'polygon': return 'poly';\n case 'circleCP':\n case 'circle3': return 'c';\n // line + 5 line-constructions all share 'l'\n case 'line':\n case 'perpendicular':\n case 'parallel':\n case 'perpBisector':\n case 'angleBisector':\n case 'tangent': return 'l';\n }\n}\n\nexport function assignIds(symbols: Map<string, Symbol>): Map<string, string> {\n const counters: Record<Prefix, number> = { p: 0, i: 0, s: 0, l: 0, r: 0, poly: 0, c: 0 };\n const ids = new Map<string, string>();\n // Insertion order của Map khớp DSL order (points first, shapes after) — buildSymbols guarantee.\n for (const [name, sym] of symbols.entries()) {\n const prefix = prefixFor(sym);\n counters[prefix] += 1;\n ids.set(name, `${prefix}${counters[prefix]}`);\n }\n return ids;\n}\n","// src/stamps/geometry-2d/dsl/transpile/emitPoint.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { DslPointT } from '../schema';\n\nexport type EntityKindHint =\n | 'point'\n | 'line' // DslShape 'line'\n | 'segment'\n | 'ray'\n | 'lineConstruction' // perpendicular/parallel/perpBisector/angleBisector/tangent\n | 'circle';\n\nfunction resolveId(ids: Map<string, string>, name: string): string {\n const id = ids.get(name);\n if (!id) throw new Error(`emitPoint: id not assigned for \"${name}\"`);\n return id;\n}\n\nexport function emitPoint(\n p: DslPointT,\n ids: Map<string, string>,\n kindHints: Map<string, EntityKindHint>,\n): SceneObject {\n const baseId = resolveId(ids, p.name);\n\n const baseFields = {\n label: p.name,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n };\n\n if (p.kind === 'intersection') {\n const r1Hint = kindHints.get(p.ref1);\n const r2Hint = kindHints.get(p.ref2);\n const r1IsCircle = r1Hint === 'circle';\n const r2IsCircle = r2Hint === 'circle';\n let intersectKind: 'lineLine' | 'lineCircle' | 'circleCircle';\n if (r1IsCircle && r2IsCircle) intersectKind = 'circleCircle';\n else if (r1IsCircle || r2IsCircle) intersectKind = 'lineCircle';\n else intersectKind = 'lineLine';\n\n const attrs: Record<string, unknown> = {\n kind: intersectKind,\n ref1: resolveId(ids, p.ref1),\n ref2: resolveId(ids, p.ref2),\n };\n if (intersectKind !== 'lineLine') {\n attrs.branch = p.branch ?? 0;\n }\n return {\n id: baseId,\n kind: 'intersection',\n ...baseFields,\n attrs,\n };\n }\n\n let constraint: Record<string, unknown>;\n switch (p.kind) {\n case 'free':\n constraint = { kind: 'free', x: p.x, y: p.y };\n break;\n case 'midpoint':\n constraint = { kind: 'midpoint', p1: resolveId(ids, p.p1), p2: resolveId(ids, p.p2) };\n break;\n case 'onSegment':\n constraint = { kind: 'onSegment', segmentId: resolveId(ids, p.segmentId), t: p.t };\n break;\n case 'onLine':\n constraint = { kind: 'onLine', lineId: resolveId(ids, p.lineId), t: p.t };\n break;\n case 'onCircle':\n constraint = { kind: 'onCircle', circleId: resolveId(ids, p.circleId), theta: p.theta };\n break;\n case 'perpFoot':\n constraint = { kind: 'perpFoot', from: resolveId(ids, p.from), onLine: resolveId(ids, p.onLine) };\n break;\n case 'circumcenter':\n case 'incenter':\n case 'centroid':\n case 'orthocenter':\n constraint = {\n kind: p.kind,\n vertices: [resolveId(ids, p.vertices[0]), resolveId(ids, p.vertices[1]), resolveId(ids, p.vertices[2])],\n };\n break;\n }\n\n return {\n id: baseId,\n kind: 'point',\n ...baseFields,\n attrs: { constraint },\n };\n}\n","// src/stamps/geometry-2d/dsl/transpile/emitShape.ts\nimport type { SceneObject } from '../../../../core/scene/types';\nimport type { DslShapeT } from '../schema';\n\nfunction r(ids: Map<string, string>, name: string): string {\n const id = ids.get(name);\n if (!id) throw new Error(`emitShape: id not assigned for \"${name}\"`);\n return id;\n}\n\nexport function emitShape(s: DslShapeT, ids: Map<string, string>): SceneObject {\n const id = r(ids, s.name);\n const base = {\n label: s.name,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n };\n\n switch (s.kind) {\n case 'segment':\n return { id, kind: 'segment', ...base, attrs: { p1: r(ids, s.p1), p2: r(ids, s.p2) } };\n\n case 'line':\n return { id, kind: 'line', ...base, attrs: { p1: r(ids, s.p1), p2: r(ids, s.p2) } };\n\n case 'ray':\n return { id, kind: 'ray', ...base, attrs: { origin: r(ids, s.origin), through: r(ids, s.through) } };\n\n case 'polygon':\n return { id, kind: 'polygon', ...base, attrs: { vertices: s.vertices.map((v) => r(ids, v)) } };\n\n case 'perpendicular':\n case 'parallel':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: s.kind, throughPoint: r(ids, s.throughPoint), toLine: r(ids, s.toLine) } },\n };\n\n case 'perpBisector':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: 'perpBisector', p1: r(ids, s.p1), p2: r(ids, s.p2) } },\n };\n\n case 'angleBisector':\n return {\n id, kind: 'line', ...base,\n attrs: { construction: { kind: 'angleBisector', p1: r(ids, s.p1), vertex: r(ids, s.vertex), p2: r(ids, s.p2) } },\n };\n\n case 'tangent': {\n const construction: Record<string, unknown> = {\n kind: 'tangent',\n throughPoint: r(ids, s.throughPoint),\n toCircle: r(ids, s.toCircle),\n };\n if (s.branch !== undefined) construction.branch = s.branch;\n return { id, kind: 'line', ...base, attrs: { construction } };\n }\n\n case 'circleCP':\n return {\n id, kind: 'circle', ...base,\n attrs: { center: r(ids, s.center), surfacePoint: r(ids, s.surfacePoint) },\n };\n\n case 'circle3':\n return {\n id, kind: 'circle', ...base,\n attrs: { construction: { kind: 'circumscribed', p1: r(ids, s.p1), p2: r(ids, s.p2), p3: r(ids, s.p3) } },\n };\n }\n}\n","// src/stamps/geometry-2d/dsl/transpile.ts\nimport type { SceneObject, State } from '../../../core/scene/types';\nimport { createEmptyState } from '../../../core/scene/types';\nimport { DslInput, type DslPointT, type DslShapeT } from './schema';\nimport { buildSymbols } from './transpile/symbols';\nimport { validateRefs } from './transpile/refs';\nimport { detectCycles } from './transpile/cycles';\nimport { assignIds } from './transpile/ids';\nimport { emitPoint, type EntityKindHint } from './transpile/emitPoint';\nimport { emitShape } from './transpile/emitShape';\nimport { mkError, type TranspileError, type TranspileResult } from './transpile/errors';\n\nfunction hintOf(entity: DslPointT | DslShapeT): EntityKindHint {\n // points (including intersection) are point-like at scene level.\n if ('kind' in entity) {\n switch (entity.kind) {\n case 'free': case 'midpoint': case 'onSegment': case 'onLine':\n case 'onCircle': case 'perpFoot': case 'circumcenter':\n case 'incenter': case 'centroid': case 'orthocenter': case 'intersection':\n return 'point';\n case 'segment': return 'segment';\n case 'line': return 'line';\n case 'ray': return 'ray';\n case 'polygon': return 'point'; // not used as ref target in MVP\n case 'perpendicular': case 'parallel': case 'perpBisector':\n case 'angleBisector': case 'tangent':\n return 'lineConstruction';\n case 'circleCP': case 'circle3':\n return 'circle';\n }\n }\n return 'point';\n}\n\nexport function transpile(dslRaw: unknown): TranspileResult {\n // Stage 1: schema parse\n const parsed = DslInput.safeParse(dslRaw);\n if (!parsed.success) {\n const errors: TranspileError[] = parsed.error.issues.map((iss) =>\n mkError('SCHEMA', iss.message, { path: iss.path.map(String) }),\n );\n return { ok: false, errors };\n }\n const dsl = parsed.data;\n\n // Stage 2-4: collect errors\n const { symbols, errors: dupErrors } = buildSymbols(dsl);\n const { errors: refErrors } = validateRefs(dsl, symbols);\n const { errors: cycleErrors } = detectCycles(symbols);\n\n const allErrors = [...dupErrors, ...refErrors, ...cycleErrors];\n if (allErrors.length > 0) return { ok: false, errors: allErrors };\n\n // Stage 5: id assignment\n const ids = assignIds(symbols);\n\n // Build kindHints (DSL name → EntityKindHint) cho intersection inference.\n const kindHints = new Map<string, EntityKindHint>();\n for (const [name, sym] of symbols.entries()) {\n kindHints.set(name, hintOf(sym.entity));\n }\n\n // Stage 6: emit\n const objects: Record<string, SceneObject> = {};\n const order: string[] = [];\n\n for (const p of dsl.points) {\n const obj = emitPoint(p, ids, kindHints);\n objects[obj.id] = obj;\n order.push(obj.id);\n }\n for (const s of dsl.shapes) {\n const obj = emitShape(s, ids);\n objects[obj.id] = obj;\n order.push(obj.id);\n }\n\n const empty = createEmptyState('2d');\n const state: State = {\n objects,\n order,\n counter: order.length,\n meta: empty.meta,\n };\n return { ok: true, state };\n}\n","// src/stamps/geometry-2d/ai/provider.ts\nimport Anthropic from '@anthropic-ai/sdk';\n\nexport interface ProviderSystemBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ProviderToolDef {\n name: string;\n description: string;\n input_schema: unknown;\n}\n\nexport interface ProviderCallArgs {\n apiKey: string;\n model: string;\n maxTokens: number;\n system: ProviderSystemBlock[];\n tools: ProviderToolDef[];\n toolChoice: { type: 'any' } | { type: 'tool'; name: string };\n messages: Array<{ role: 'user' | 'assistant'; content: string }>;\n signal?: AbortSignal;\n}\n\nexport interface ProviderUsage {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}\n\nexport type ProviderContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: unknown };\n\nexport interface ProviderResponse {\n content: ProviderContentBlock[];\n stop_reason: string;\n usage: ProviderUsage;\n}\n\nexport async function callProvider(args: ProviderCallArgs): Promise<ProviderResponse> {\n const client = new Anthropic({ apiKey: args.apiKey });\n const resp = await client.messages.create(\n {\n model: args.model,\n max_tokens: args.maxTokens,\n system: args.system,\n tools: args.tools as never,\n tool_choice: args.toolChoice,\n messages: args.messages,\n },\n args.signal ? { signal: args.signal } : undefined,\n );\n return resp as unknown as ProviderResponse;\n}\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-equilateral.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Cho tam giác đều ABC cạnh 4.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 2, y: 3.464 },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-median.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, M là trung điểm BC. Vẽ AM.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'M', kind: 'midpoint', p1: 'B', p2: 'C' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'AM', kind: 'segment', p1: 'A', p2: 'M' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-altitude.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, AH là đường cao xuống BC.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 1, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'H', kind: 'perpFoot', from: 'A', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'AH', kind: 'segment', p1: 'A', p2: 'H' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-centroid.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, G là trọng tâm.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'G', kind: 'centroid', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-orthocenter.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, H là trực tâm.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'H', kind: 'orthocenter', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-circumcircle.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC nội tiếp đường tròn tâm O.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'O', kind: 'circumcenter', vertices: ['A', 'B', 'C'] },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'k', kind: 'circle3', p1: 'A', p2: 'B', p3: 'C' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/triangle-incircle.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Tam giác ABC, I là tâm nội tiếp, đường tròn (I) tiếp xúc BC tại D.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 3 },\n { name: 'B', kind: 'free', x: -2, y: 0 },\n { name: 'C', kind: 'free', x: 3, y: 0 },\n { name: 'I', kind: 'incenter', vertices: ['A', 'B', 'C'] },\n { name: 'D', kind: 'perpFoot', from: 'I', onLine: 'BC' },\n ],\n shapes: [\n { name: 'ABC', kind: 'polygon', vertices: ['A', 'B', 'C'] },\n { name: 'BC', kind: 'segment', p1: 'B', p2: 'C' },\n { name: 'incircle', kind: 'circleCP', center: 'I', surfacePoint: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/parallelogram.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hình bình hành ABCD, hai đường chéo AC, BD cắt nhau tại O.',\n dsl: {\n version: 1,\n points: [\n { name: 'A', kind: 'free', x: 0, y: 0 },\n { name: 'B', kind: 'free', x: 4, y: 0 },\n { name: 'C', kind: 'free', x: 5, y: 2 },\n { name: 'D', kind: 'free', x: 1, y: 2 },\n { name: 'O', kind: 'intersection', ref1: 'AC', ref2: 'BD' },\n ],\n shapes: [\n { name: 'ABCD', kind: 'polygon', vertices: ['A', 'B', 'C', 'D'] },\n { name: 'AC', kind: 'segment', p1: 'A', p2: 'C' },\n { name: 'BD', kind: 'segment', p1: 'B', p2: 'D' },\n ],\n },\n};\n","// src/stamps/geometry-2d/dsl/fixtures/two-circles-intersect.ts\nimport type { DslInputT } from '../schema';\n\nexport const fixture: { problem: string; dsl: DslInputT } = {\n problem: 'Hai đường tròn (O₁), (O₂) cắt nhau tại P, Q.',\n dsl: {\n version: 1,\n points: [\n { name: 'O1', kind: 'free', x: 0, y: 0 },\n { name: 'A1', kind: 'free', x: 2, y: 0 },\n { name: 'O2', kind: 'free', x: 3, y: 0 },\n { name: 'A2', kind: 'free', x: 5, y: 0 },\n { name: 'P', kind: 'intersection', ref1: 'k1', ref2: 'k2', branch: 0 },\n { name: 'Q', kind: 'intersection', ref1: 'k1', ref2: 'k2', branch: 1 },\n ],\n shapes: [\n { name: 'k1', kind: 'circleCP', center: 'O1', surfacePoint: 'A1' },\n { name: 'k2', kind: 'circleCP', center: 'O2', surfacePoint: 'A2' },\n ],\n },\n};\n","// src/stamps/geometry-2d/ai/prompt.ts\nimport { fixture as eq } from '../dsl/fixtures/triangle-equilateral';\nimport { fixture as md } from '../dsl/fixtures/triangle-median';\nimport { fixture as alt } from '../dsl/fixtures/triangle-altitude';\nimport { fixture as ce } from '../dsl/fixtures/triangle-centroid';\nimport { fixture as oc } from '../dsl/fixtures/triangle-orthocenter';\nimport { fixture as cc } from '../dsl/fixtures/triangle-circumcircle';\nimport { fixture as ic } from '../dsl/fixtures/triangle-incircle';\nimport { fixture as par } from '../dsl/fixtures/parallelogram';\nimport { fixture as two } from '../dsl/fixtures/two-circles-intersect';\n\nconst FIXTURES = [eq, md, alt, ce, oc, cc, ic, par, two];\n\nexport function buildSystemPrompt(): string {\n const examples = FIXTURES.map((f, i) =>\n `### Ví dụ ${i + 1}\\n**Đề:** ${f.problem}\\n**DSL:**\\n\\`\\`\\`json\\n${JSON.stringify(f.dsl, null, 2)}\\n\\`\\`\\``,\n ).join('\\n\\n');\n\n return `Bạn là trợ lý vẽ hình học 2D cho học sinh THCS và lớp 10 Việt Nam.\n\n## Nhiệm vụ\nĐọc đề bài tiếng Việt → emit DSL JSON mô tả hình. Hệ thống sẽ render hình từ DSL.\n\n## Quy tắc\n1. Dùng tool \\`build_figure\\` khi vẽ được. Dùng tool \\`refuse\\` khi không vẽ được hoặc đề ngoài phạm vi (3D, lượng giác, phép biến hình lớp 11+, đại số).\n2. Ưu tiên derived points (midpoint, perpFoot, circumcenter, ...) thay vì tự compute toạ độ.\n3. Anchor (free) chỉ dùng cho điểm gốc (thường A, B, C của tam giác). Đặt coord hợp lý quanh gốc (-5..5).\n4. Mọi điểm + hình phải có \\`name\\` (label \"A\", \"M\", \"O₁\", ...). Tham chiếu bằng name, không phải id.\n5. Tam giác: emit cả \\`polygon\\` (vẽ viền) + segment/đường phụ riêng nếu đề yêu cầu (đường cao, trung tuyến).\n6. Đường tròn (O; R) cho trước bán kính số: emit anchor helper trên đường tròn rồi dùng \\`circleCP\\` (DSL không hỗ trợ radius numeric trực tiếp).\n7. Nếu đề mơ hồ: chọn case phổ biến nhất, không hỏi lại.\n\n## Primitives sẵn có\n**Points:** free, midpoint, onSegment, onLine, onCircle, perpFoot, circumcenter, incenter, centroid, orthocenter, intersection\n**Shapes:** segment, line, ray, polygon, perpendicular, parallel, perpBisector, angleBisector, tangent, circleCP, circle3\n\n## 9 ví dụ\n${examples}\n\n## Khi không vẽ được\nGọi \\`refuse\\` với \\`reason\\` tiếng Việt giải thích cụ thể (vd: \"Đề thuộc lớp 11, ngoài phạm vi MVP\" hoặc \"Đề không rõ vị trí điểm M\").`;\n}\n","// src/stamps/geometry-2d/ai/tools.ts\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { DslInput } from '../dsl';\n\nexport const BUILD_FIGURE_TOOL = {\n name: 'build_figure',\n description: 'Vẽ hình học 2D theo đề bài. Emit DSL JSON mô tả các điểm và hình.',\n input_schema: zodToJsonSchema(DslInput, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }),\n} as const;\n\nconst RefuseInputZ = z.object({\n reason: z.string().min(1).describe('Lý do không vẽ được (tiếng Việt)'),\n});\n\nexport const REFUSE_TOOL = {\n name: 'refuse',\n description: 'Từ chối khi không vẽ được hoặc đề ngoài phạm vi (3D, lượng giác, lớp 11+).',\n input_schema: zodToJsonSchema(RefuseInputZ, { target: 'jsonSchema7' }),\n} as const;\n\nexport const TOOLS = [BUILD_FIGURE_TOOL, REFUSE_TOOL];\n","// src/stamps/geometry-2d/ai/buildFigure.ts\nimport type { State as SceneState } from '../../../core/scene/types';\nimport type { DslInputT, TranspileError } from '../dsl';\nimport { transpile } from '../dsl';\nimport { callProvider, type ProviderResponse } from './provider';\nimport { buildSystemPrompt } from './prompt';\nimport { TOOLS } from './tools';\n\nconst DEFAULT_MODEL = 'claude-opus-4-7';\nconst DEFAULT_MAX_TOKENS = 8192;\n\nexport interface GenerateOptions {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n enableCaching?: boolean;\n signal?: AbortSignal;\n}\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n}\n\nexport type GenerateResult =\n | { ok: true; state: SceneState; dsl: DslInputT; usage: TokenUsage }\n | { ok: false; reason: 'refused'; message: string; usage?: TokenUsage }\n | { ok: false; reason: 'parse_error'; message: string; raw?: unknown; usage?: TokenUsage }\n | { ok: false; reason: 'transpile_error'; message: string; errors: TranspileError[]; dsl: unknown; usage?: TokenUsage }\n | { ok: false; reason: 'api_error'; message: string; status?: number };\n\nfunction toUsage(u: ProviderResponse['usage']): TokenUsage {\n return {\n inputTokens: u.input_tokens,\n outputTokens: u.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens ?? 0,\n cacheCreationTokens: u.cache_creation_input_tokens ?? 0,\n };\n}\n\nexport async function generateFigure(\n problem: string,\n opts: GenerateOptions,\n): Promise<GenerateResult> {\n if (!opts.apiKey) {\n return { ok: false, reason: 'api_error', message: 'apiKey bắt buộc' };\n }\n if (!problem || !problem.trim()) {\n return { ok: false, reason: 'api_error', message: 'Đề bài rỗng' };\n }\n\n const systemText = buildSystemPrompt();\n const enableCaching = opts.enableCaching !== false;\n const systemBlock = enableCaching\n ? { type: 'text' as const, text: systemText, cache_control: { type: 'ephemeral' as const } }\n : { type: 'text' as const, text: systemText };\n\n let response: ProviderResponse;\n try {\n response = await callProvider({\n apiKey: opts.apiKey,\n model: opts.model ?? DEFAULT_MODEL,\n maxTokens: opts.maxTokens ?? DEFAULT_MAX_TOKENS,\n system: [systemBlock],\n tools: TOOLS as never,\n toolChoice: { type: 'any' },\n messages: [{ role: 'user', content: problem }],\n signal: opts.signal,\n });\n } catch (e) {\n const err = e as { message?: string; status?: number };\n return {\n ok: false,\n reason: 'api_error',\n message: err.message ?? 'Lỗi gọi Claude API',\n ...(err.status !== undefined ? { status: err.status } : {}),\n };\n }\n\n const usage = toUsage(response.usage);\n\n const toolUse = response.content.find((c) => c.type === 'tool_use');\n if (!toolUse || toolUse.type !== 'tool_use') {\n const text = response.content.find((c) => c.type === 'text');\n const textStr = text?.type === 'text' ? text.text : '(empty)';\n return {\n ok: false,\n reason: 'parse_error',\n message: 'AI không gọi tool nào. Response: ' + textStr,\n raw: response.content,\n usage,\n };\n }\n\n if (toolUse.name === 'refuse') {\n const input = toolUse.input as { reason?: string };\n return {\n ok: false,\n reason: 'refused',\n message: input.reason ?? 'AI từ chối không nêu lý do',\n usage,\n };\n }\n\n if (toolUse.name !== 'build_figure') {\n return {\n ok: false,\n reason: 'parse_error',\n message: `Tool không xác định: \"${toolUse.name}\"`,\n raw: toolUse,\n usage,\n };\n }\n\n const tResult = transpile(toolUse.input);\n if (!tResult.ok) {\n return {\n ok: false,\n reason: 'transpile_error',\n message: 'DSL từ AI không hợp lệ',\n errors: tResult.errors,\n dsl: toolUse.input,\n usage,\n };\n }\n\n return {\n ok: true,\n state: tResult.state,\n dsl: toolUse.input as DslInputT,\n usage,\n };\n}\n"]}
|
package/dist/catalog.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generatedAt": "2026-05-
|
|
2
|
+
"generatedAt": "2026-05-26T07:44:39.490Z",
|
|
3
3
|
"entries": [
|
|
4
4
|
{
|
|
5
5
|
"id": "geometry",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"jsxgraph"
|
|
11
11
|
],
|
|
12
12
|
"bundleSize": {
|
|
13
|
-
"js": 60.
|
|
13
|
+
"js": 60.55,
|
|
14
14
|
"css": 0
|
|
15
15
|
}
|
|
16
16
|
},
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"jsxgraph"
|
|
37
37
|
],
|
|
38
38
|
"bundleSize": {
|
|
39
|
-
"js": 50.
|
|
39
|
+
"js": 50.95,
|
|
40
40
|
"css": 0
|
|
41
41
|
}
|
|
42
42
|
},
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"jsxgraph"
|
|
50
50
|
],
|
|
51
51
|
"bundleSize": {
|
|
52
|
-
"js":
|
|
52
|
+
"js": 43.13,
|
|
53
53
|
"css": 0
|
|
54
54
|
}
|
|
55
55
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
2
|
+
import { listObjects } from './chunk-WM2VDYQA.mjs';
|
|
3
3
|
import { createStore, getKind } from './chunk-ZBJBQKJ2.mjs';
|
|
4
|
+
import { createEmptyState } from './chunk-73Q7ADVL.mjs';
|
|
4
5
|
import * as React2 from 'react';
|
|
5
6
|
import React2__default, { createContext, useRef, useReducer, useCallback, useEffect, useMemo, useContext, useState } from 'react';
|
|
6
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
@@ -1163,5 +1164,5 @@ async function initJxgBoard(target, config) {
|
|
|
1163
1164
|
}
|
|
1164
1165
|
|
|
1165
1166
|
export { STAMP_PANEL_DESKTOP, StampLeftPanel, ToastHost, ToastProvider, attachJxgWheelZoom, initJxgBoard, safeJsx, useStampStore, useToast };
|
|
1166
|
-
//# sourceMappingURL=chunk-
|
|
1167
|
-
//# sourceMappingURL=chunk-
|
|
1167
|
+
//# sourceMappingURL=chunk-2WF6KIGF.mjs.map
|
|
1168
|
+
//# sourceMappingURL=chunk-2WF6KIGF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/scene/ui/LeftPanelShell.tsx","../src/core/scene/ui/kindMeta.ts","../src/core/scene/ui/ObjectRowMenu.tsx","../src/core/scene/ui/ObjectRow.tsx","../src/core/scene/ui/ObjectListPanel.tsx","../src/stamps/shared/StampLeftPanel/AxisGridSection.tsx","../src/stamps/shared/StampLeftPanel/types.ts","../src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts","../src/stamps/shared/StampLeftPanel/ToolGrid.tsx","../src/stamps/shared/StampLeftPanel/Desktop.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/shared/StampLeftPanel/Mobile.tsx","../src/stamps/shared/StampLeftPanel/index.tsx","../src/stamps/shared/useStampStore.ts","../src/stamps/shared/StampLeftPanel/constants.ts","../src/stamps/shared/Toast/ToastProvider.tsx","../src/stamps/shared/Toast/useToast.ts","../src/stamps/shared/Toast/Toast.tsx","../src/stamps/shared/Toast/ToastHost.tsx","../src/stamps/shared/safeJsx.ts","../src/stamps/shared/attachJxgWheelZoom.ts","../src/stamps/shared/initJxgBoard.ts"],"names":["React","jsxs","jsx","Fragment","useState","useCallback","useEffect","UndoIcon","RedoIcon","useMemo","useRef"],"mappings":"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","file":"chunk-2WF6KIGF.mjs","sourcesContent":["'use client';\nimport * as React from 'react';\n\nexport interface TabSpec<K extends string = string> {\n key: K;\n label: React.ReactNode;\n testId?: string;\n}\n\nexport interface LeftPanelShellProps<K extends string = string> {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n isDark?: boolean;\n tabs?: readonly TabSpec<K>[];\n activeTab?: K;\n onTabChange?: (k: K) => void;\n /** data-testid trên <aside> root. Mặc định \"left-panel\". */\n testId?: string;\n children: React.ReactNode;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LeftPanelShell<K extends string>(props: LeftPanelShellProps<K>): React.ReactElement {\n const { title, icon, onClose, isDark, tabs, activeTab, onTabChange, testId, children } = props;\n const showTabs = !!tabs && tabs.length >= 2;\n\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid={testId ?? 'left-panel'}\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n\n {showTabs && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-3\">\n {tabs!.map((t) => (\n <TabPill\n key={t.key}\n active={t.key === activeTab}\n onClick={() => onTabChange?.(t.key)}\n testId={t.testId}\n >\n {t.label}\n </TabPill>\n ))}\n </div>\n )}\n\n <div\n {...(showTabs ? { role: 'tabpanel' } : {})}\n className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\"\n >\n {children}\n </div>\n </aside>\n );\n}\n\nexport function TabPill(props: {\n active: boolean;\n onClick: () => void;\n testId?: string;\n children: React.ReactNode;\n}): React.ReactElement {\n const { active, onClick, testId, children } = props;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nexport function Section(props: { label: string; children: React.ReactNode }): React.ReactElement {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {props.label}\n </h4>\n {props.children}\n </section>\n );\n}\n","// src/core/scene/ui/kindMeta.ts\nexport interface KindUiMeta {\n displayName: string;\n icon: string;\n /** Fallback color khi obj.attrs.color không có. Phải khớp default ở renderer. */\n defaultColor: string;\n}\n\n// Default colors:\n// - Points: blue (#1e40af)\n// - Curves / shapes: dark slate (#0f172a)\n// - 3D planes / spheres: light blue (#60a5fa)\nconst POINT_COLOR = '#1e40af';\nconst CURVE_COLOR = '#0f172a';\nconst PLANE_COLOR = '#60a5fa';\n\nexport const KIND_UI_META: Readonly<Record<string, KindUiMeta>> = {\n // 2D\n point: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n circle: { displayName: 'Đường tròn', icon: '○', defaultColor: CURVE_COLOR },\n polygon: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n intersection: { displayName: 'Giao điểm', icon: '✕', defaultColor: POINT_COLOR },\n angle: { displayName: 'Góc', icon: '∠', defaultColor: '#16a34a' },\n distance: { displayName: 'Khoảng cách', icon: '↔', defaultColor: '#dc2626' },\n // 3D\n point3d: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment3d: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line3d: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray3d: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector3d: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n plane3d: { displayName: 'Mặt phẳng', icon: '▱', defaultColor: PLANE_COLOR },\n polygon3d: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n sphere3d: { displayName: 'Mặt cầu', icon: '◯', defaultColor: PLANE_COLOR },\n polyhedron3d: { displayName: 'Đa diện', icon: '⬢', defaultColor: PLANE_COLOR },\n cylinder3d: { displayName: 'Hình trụ', icon: '⌭', defaultColor: PLANE_COLOR },\n cone3d: { displayName: 'Hình nón', icon: '▲', defaultColor: PLANE_COLOR },\n // Graph 2D\n function2d: { displayName: 'Hàm số', icon: 'ƒ', defaultColor: CURVE_COLOR },\n parameter: { displayName: 'Tham số', icon: 'α', defaultColor: '#7c3aed' },\n pointOnCurve: { displayName: 'Điểm trên đồ thị', icon: '◉', defaultColor: POINT_COLOR },\n tangent2d: { displayName: 'Tiếp tuyến', icon: '╱', defaultColor: CURVE_COLOR },\n extremum2d: { displayName: 'Cực trị', icon: '∧', defaultColor: POINT_COLOR },\n root2d: { displayName: 'Nghiệm', icon: '0', defaultColor: POINT_COLOR },\n slope2d: { displayName: 'Hệ số góc', icon: '△', defaultColor: '#dc2626' },\n};\n\nexport function getKindUiMeta(kind: string): KindUiMeta {\n return KIND_UI_META[kind] ?? { displayName: kind, icon: '?', defaultColor: '#888888' };\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface ObjectRowMenuProps {\n locked: boolean;\n onToggleLocked: () => void;\n onRename: () => void;\n onChangeColor: () => void;\n onDelete: () => void;\n}\n\nexport function ObjectRowMenu(props: ObjectRowMenuProps): React.ReactElement {\n const { locked, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n const [open, setOpen] = React.useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"rounded px-1.5 text-black\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n onClick={(e) => e.stopPropagation()}\n >\n <MenuItem onClick={() => { setOpen(false); onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onToggleLocked(); }}>\n {locked ? 'Mở khoá' : 'Khoá'}\n </MenuItem>\n <MenuItem\n onClick={() => { setOpen(false); onDelete(); }}\n className=\"text-red-600 dark:text-red-400\"\n >\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n className,\n}: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left text-black ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { SceneObject, State } from '../types';\nimport { getKind } from '../registry';\nimport { getKindUiMeta } from './kindMeta';\nimport { ObjectRowMenu } from './ObjectRowMenu';\n\nexport interface ObjectRowProps {\n obj: SceneObject;\n state: State;\n selected: boolean;\n onSelect: (id: string) => void;\n onToggleVisible: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onRename: (id: string) => void;\n onChangeColor: (id: string) => void;\n onDelete: (id: string) => void;\n}\n\nfunction formatMeasure(items: { label: string; value: number }[]): string {\n return items.map((it) => `${it.label} = ${it.value.toFixed(2)}`).join(', ');\n}\n\nexport function ObjectRow(props: ObjectRowProps): React.ReactElement {\n const { obj, state, selected, onSelect, onToggleVisible, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n\n const meta = getKindUiMeta(obj.kind);\n\n let title = '';\n try {\n title = getKind(obj.kind).describe(obj, state);\n } catch {\n title = `${meta.displayName} ${obj.label}`;\n }\n\n let measureText: string | null = null;\n if (selected) {\n try {\n const m = getKind(obj.kind).measure?.(obj, state);\n if (m && m.length > 0) measureText = formatMeasure(m);\n } catch {\n measureText = null;\n }\n }\n\n const color = (obj.attrs as { color?: string }).color ?? meta.defaultColor;\n\n return (\n <li\n data-testid={`object-row-${obj.id}`}\n aria-selected={selected}\n onClick={() => onSelect(obj.id)}\n className={\n 'flex flex-col border-b border-zinc-100 cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : '')\n }\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs\">\n <button\n type=\"button\"\n aria-label=\"Toggle visibility\"\n aria-pressed={!obj.visible}\n onClick={(e) => { e.stopPropagation(); onToggleVisible(obj.id); }}\n className=\"h-4 w-4 shrink-0 rounded-full border-2 transition\"\n style={{\n backgroundColor: obj.visible ? color : 'transparent',\n borderColor: color,\n }}\n />\n <span className=\"flex-1 truncate text-black\">\n {title}\n </span>\n <ObjectRowMenu\n locked={obj.locked}\n onToggleLocked={() => onToggleLocked(obj.id)}\n onRename={() => onRename(obj.id)}\n onChangeColor={() => onChangeColor(obj.id)}\n onDelete={() => onDelete(obj.id)}\n />\n </div>\n {selected && measureText && (\n <div\n data-testid={`object-row-detail-${obj.id}`}\n className=\"pl-9 pr-3 pb-1.5 text-[11px] text-black\"\n >\n {measureText}\n </div>\n )}\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { SceneObject } from '../types';\nimport { listObjects } from '../selectors';\nimport { ObjectRow } from './ObjectRow';\n\nexport interface ObjectListPanelProps {\n store: Store;\n selectedId?: string;\n /**\n * Called when user clicks a row. Receives the row id, or `null` when the\n * user clicks the already-selected row (toggle off — request to deselect).\n * Parent should treat `null` as \"clear selection\".\n */\n onSelect?: (id: string | null) => void;\n /**\n * Optional per-kind row renderer. Called with the SceneObject and default props\n * (selected, onClick). Return a ReactNode to override the default ObjectRow.\n * Return null/undefined to fall back to the default ObjectRow.\n */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => React.ReactNode;\n}\n\nexport function ObjectListPanel(props: ObjectListPanelProps): React.ReactElement {\n const { store, selectedId, onSelect, renderRow } = props;\n // useSyncExternalStore expects subscribe to receive () => void callback,\n // but Store.subscribe takes (next, prev, action) => void. Wrap to adapt.\n const subscribe = React.useCallback(\n (cb: () => void) => store.subscribe(() => cb()),\n [store],\n );\n const state = React.useSyncExternalStore(subscribe, store.getState, store.getState);\n const objects = listObjects(state);\n\n function handleSelect(id: string) {\n // Toggle: click vào row đang selected → deselect (collapse detail + tắt highlight).\n onSelect?.(id === selectedId ? null : id);\n }\n\n function handleToggleVisible(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !obj.visible } } });\n }\n\n function handleToggleLocked(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !obj.locked } } });\n }\n\n function handleDelete(id: string) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n }\n\n function noop() { /* rename + change color stubbed for Phase 3 */ }\n\n return (\n <ul\n data-testid=\"object-list-panel\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((obj) => {\n const selected = obj.id === selectedId;\n const onClick = () => handleSelect(obj.id);\n if (renderRow) {\n const custom = renderRow(obj, { selected, onClick });\n if (custom != null) {\n return <React.Fragment key={obj.id}>{custom}</React.Fragment>;\n }\n }\n return (\n <ObjectRow\n key={obj.id}\n obj={obj}\n state={state}\n selected={selected}\n onSelect={handleSelect}\n onToggleVisible={handleToggleVisible}\n onToggleLocked={handleToggleLocked}\n onRename={noop}\n onChangeColor={noop}\n onDelete={handleDelete}\n />\n );\n })\n )}\n </ul>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/AxisGridSection.tsx\n//\n// Section \"Bố cục\" / \"Góc nhìn\": 2 checkbox axis/grid + (optional) undo/redo\n// button ở mép phải. Render khi có ít nhất 1 trong (view, history).\n// Skip toàn bộ section khi cả 2 đều undefined.\n\nimport React from 'react';\nimport { Section } from '../../../core/scene/ui/LeftPanelShell';\nimport type {\n StampLeftPanelHistoryProps,\n StampLeftPanelViewProps,\n} from './types';\n\nexport interface AxisGridSectionProps {\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisGridSection(props: AxisGridSectionProps): React.ReactElement | null {\n const { view, history } = props;\n if (!view && !history) return null;\n\n const sectionLabel = view?.sectionLabel ?? 'Bố cục';\n const axisLabel = view?.axisLabel ?? 'Trục';\n const gridLabel = view?.gridLabel ?? 'Lưới';\n\n return (\n <Section label={sectionLabel}>\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n {view && (\n <>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showAxis}\n onChange={(e) => view.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n {axisLabel}\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showGrid}\n onChange={(e) => view.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n {gridLabel}\n </label>\n </>\n )}\n {history && (\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={history.onUndo}\n disabled={!history.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={history.onRedo}\n disabled={!history.canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n}\n","// src/stamps/shared/StampLeftPanel/types.ts\n//\n// Shared types cho StampLeftPanel template. Dùng generic TKey/TGroup để\n// preserve type safety tại call site (host của từng stamp truyền union type\n// riêng); internal cài theo string là OK.\n\nimport type { ReactNode } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\n\nexport const TOOLTIP_DELAY_MS = 400;\nexport type HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n/** Tool descriptor unified cho 3 stamp editor. */\nexport interface StampToolDef<TKey extends string = string, TGroup extends string = string> {\n key: TKey;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: TGroup;\n shortcut?: string;\n}\n\nexport interface StampLeftPanelTabs {\n /** Label tab \"Đối tượng\" (default \"📐 Đối tượng\"). */\n objectsLabel?: ReactNode;\n /** Label tab \"Công cụ\" (default \"🧰 Công cụ\"). */\n toolsLabel?: ReactNode;\n}\n\nexport interface StampLeftPanelViewProps {\n /** Section header label, default \"Bố cục\". */\n sectionLabel?: string;\n /** Checkbox label cho axis, default \"Trục\". */\n axisLabel?: string;\n /** Checkbox label cho grid, default \"Lưới\". */\n gridLabel?: string;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n}\n\nexport interface StampLeftPanelHistoryProps {\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n}\n\nexport interface StampLeftPanelChordProps<TGroup extends string = string> {\n /** Group đang được focus sau khi user bấm letter. null = không active. */\n activeGroup: TGroup | null;\n /** Mapping group → letter hint (vd \"P\" cho group \"point\"). */\n letterForGroup: (g: TGroup) => string;\n}\n\nexport interface StampLeftPanelObjectsProps {\n store: Store;\n selectedObjectId?: string;\n onObjectSelect?: (id: string | null) => void;\n /** Custom row render (vd graph-2d cần FunctionRow/ParameterRow). Trả null để fallback default ObjectRow. */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => ReactNode | null;\n /** Optional buttons phía trên ObjectListPanel (vd graph-2d \"+Hàm\" \"+Tham số\"). */\n addButtons?: ReadonlyArray<{ label: string; testId?: string; onClick: () => void }>;\n}\n\nexport interface StampLeftPanelProps<\n TKey extends string = string,\n TGroup extends string = string,\n> {\n // Header\n title: string;\n icon: ReactNode;\n onClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> root. Default \"stamp-left-panel\". */\n testId?: string;\n\n // Tools (required)\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n\n // Optional sections\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n chord?: StampLeftPanelChordProps<TGroup>;\n objects?: StampLeftPanelObjectsProps;\n tabs?: StampLeftPanelTabs;\n\n // Mobile\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n","// src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts\n//\n// Generic hover tooltip hook. Trả về { hover, portalReady, showHover, hideHover }\n// để consumer render tooltip qua createPortal. Delay 400ms tránh flash.\n//\n// Generic theo StampToolDef → 3 stamp dùng chung. Moved từ\n// geometry-2d/editor/LeftPanel/useToolHoverTooltip.ts (Phase 1.2).\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { TOOLTIP_DELAY_MS, type HoverState, type StampToolDef } from './types';\n\nexport function useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: StampToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/ToolGrid.tsx\n//\n// Tool button grid chord-aware. Render từng group thành section, mỗi section\n// có 4-col grid icon button. Khi chord.activeGroup set:\n// - section đó được highlight (ring emerald + bg)\n// - các section khác dimmed (opacity-55)\n// - mỗi button trong active group có number badge 1-9\n//\n// Port từ geometry-2d/editor/LeftPanel/Desktop.tsx:104-176 (baseline rich nhất).\n\nimport React, { useMemo } from 'react';\nimport type {\n StampLeftPanelChordProps,\n StampToolDef,\n} from './types';\nimport { useToolHoverTooltip } from './useToolHoverTooltip';\nimport { createPortal } from 'react-dom';\n\nexport interface ToolGridProps<TKey extends string, TGroup extends string> {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n chord?: StampLeftPanelChordProps<TGroup>;\n}\n\nexport function ToolGrid<TKey extends string, TGroup extends string>(\n props: ToolGridProps<TKey, TGroup>,\n): React.ReactElement {\n const { tools, groupOrder, groupLabels, activeTool, onToolChange, chord } = props;\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const grouped = useMemo(() => {\n const acc: Partial<Record<TGroup, StampToolDef<TKey, TGroup>[]>> = {};\n for (const t of tools) {\n (acc[t.group] ??= []).push(t);\n }\n return acc;\n }, [tools]);\n\n const groupKeys = useMemo(\n () => groupOrder.filter((g) => grouped[g]),\n [grouped, groupOrder],\n );\n\n const activeGroupTools = chord?.activeGroup ? grouped[chord.activeGroup] ?? null : null;\n\n return (\n <>\n {groupKeys.map((group) => {\n const isChordActive = chord?.activeGroup === group;\n const dimmed = chord?.activeGroup != null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1' : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{groupLabels[group]}</span>\n {chord && (\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive ? 'text-emerald-700 font-bold' : 'text-slate-400',\n ].join(' ')}\n >\n {chord.letterForGroup(group)}\n </span>\n )}\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group]!.map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n title={t.label + (t.shortcut ? ` (${t.shortcut})` : '')}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-10 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n {chord && (\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chord?.activeGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {chord.letterForGroup(chord.activeGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">{i + 1}</span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Desktop.tsx\n//\n// Desktop layout cho StampLeftPanel. Render:\n// 1. LeftPanelShell chrome + tabs (chỉ render tablist khi có objects)\n// 2. Tab \"tools\": <AxisGridSection> + <ToolGrid> chord-aware\n// 3. Tab \"objects\": optional add buttons + <ObjectListPanel> với custom renderRow\n\nimport React, { useEffect, useState } from 'react';\nimport { LeftPanelShell } from '../../../core/scene/ui/LeftPanelShell';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport { AxisGridSection } from './AxisGridSection';\nimport { ToolGrid } from './ToolGrid';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanelDesktop<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n chord,\n objects,\n tabs,\n } = props;\n\n const [tab, setTab] = useState<'tools' | 'objects'>('tools');\n const hasObjects = !!objects;\n\n useEffect(() => {\n if (!hasObjects && tab === 'objects') setTab('tools');\n }, [hasObjects, tab]);\n\n const tabSpecs = hasObjects\n ? [\n { key: 'tools' as const, label: tabs?.toolsLabel ?? '🧰 Công cụ', testId: 'tab-tools' },\n { key: 'objects' as const, label: tabs?.objectsLabel ?? '📐 Đối tượng', testId: 'tab-objects' },\n ]\n : undefined;\n\n return (\n <LeftPanelShell\n title={title}\n icon={icon}\n onClose={onClose}\n isDark={isDark}\n testId={testId ?? 'stamp-left-panel'}\n tabs={tabSpecs}\n activeTab={hasObjects ? tab : undefined}\n onTabChange={hasObjects ? setTab : undefined}\n >\n {(!hasObjects || tab === 'tools') ? (\n <>\n <AxisGridSection view={view} history={history} />\n <ToolGrid\n tools={tools}\n groupOrder={groupOrder}\n groupLabels={groupLabels}\n activeTool={activeTool}\n onToolChange={onToolChange}\n chord={chord}\n />\n </>\n ) : (\n <section data-testid=\"objects-panel\" className=\"flex flex-col gap-2\">\n {objects!.addButtons && objects!.addButtons.length > 0 && (\n <div className=\"flex gap-1\">\n {objects!.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects!.store}\n selectedId={objects!.selectedObjectId}\n onSelect={objects!.onObjectSelect}\n renderRow={objects!.renderRow}\n />\n </section>\n )}\n </LeftPanelShell>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n /** Optional: thêm tab \"Đối tượng\" trong drawer body. */\n objectsTab?: {\n label: React.ReactNode;\n render: () => React.ReactNode;\n };\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n objectsTab,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n const [mobileTab, setMobileTab] = React.useState<'tools' | 'objects'>('tools');\n const prevOpenRef = React.useRef(drawerOpen);\n React.useEffect(() => {\n if (!prevOpenRef.current && drawerOpen) setMobileTab('tools');\n prevOpenRef.current = drawerOpen;\n }, [drawerOpen]);\n\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Tab row (chỉ render khi objectsTab được cung cấp) */}\n {objectsTab && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-2\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'tools'}\n onClick={() => setMobileTab('tools')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'tools'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n 🧰 Công cụ\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'objects'}\n onClick={() => setMobileTab('objects')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'objects'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {objectsTab.label}\n </button>\n </div>\n )}\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {objectsTab && mobileTab === 'objects' ? (\n <div className=\"px-3 pt-3\">{objectsTab.render()}</div>\n ) : (\n groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-8 w-8 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))\n )}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Mobile.tsx\n//\n// Mobile layout: wrap shared MobileToolDrawer với mapping:\n// chips = axis/grid (from view)\n// actions = undo/redo (from history)\n// groups = tools grouped by group\n// objects = objectsTab (objects.store + addButtons + custom renderRow)\n\nimport React, { useMemo } from 'react';\nimport { MobileToolDrawer, type MobileToolGroup } from '../MobileToolDrawer';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport type { StampLeftPanelProps } from './types';\n\nfunction AxisIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function StampLeftPanelMobile<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n objects,\n tabs,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<TKey, TGroup>[]>(() => {\n const acc = new Map<TGroup, typeof tools[number][]>();\n for (const t of tools) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n // Preserve groupOrder\n return groupOrder\n .filter((g) => acc.has(g))\n .map((group) => ({\n group,\n groupLabel: groupLabels[group],\n tools: acc.get(group)!.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, [tools, groupOrder, groupLabels]);\n\n const chips = view\n ? [\n {\n label: view.axisLabel ?? 'Trục',\n icon: <AxisIcon />,\n pressed: view.showAxis,\n onToggle: view.onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: view.gridLabel ?? 'Lưới',\n icon: <GridIcon />,\n pressed: view.showGrid,\n onToggle: view.onShowGridChange,\n testId: 'toggle-grid',\n },\n ]\n : [];\n\n const actions = history\n ? [\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: history.onUndo,\n disabled: !history.canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: history.onRedo,\n disabled: !history.canRedo,\n testId: 'redo-btn',\n },\n ]\n : [];\n\n return (\n <MobileToolDrawer\n title={title}\n headerIcon={icon}\n testId={testId ?? 'stamp-left-panel'}\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={chips}\n actions={actions}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n objectsTab={\n objects\n ? {\n label: tabs?.objectsLabel ?? '📐 Đối tượng',\n render: () => (\n <div className=\"flex flex-col gap-2 px-3\">\n {objects.addButtons && objects.addButtons.length > 0 && (\n <div className=\"flex gap-1 pt-3\">\n {objects.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects.store}\n selectedId={objects.selectedObjectId}\n onSelect={objects.onObjectSelect}\n renderRow={objects.renderRow}\n />\n </div>\n ),\n }\n : undefined\n }\n />\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/index.tsx\n//\n// Public API. Dispatch isMobile → Desktop hoặc Mobile.\n//\n// Usage:\n//\n// <StampLeftPanel\n// title=\"Hình học\"\n// icon={<GeomIcon />}\n// tools={TOOLS} // ReadonlyArray<StampToolDef>\n// groupOrder={GROUP_ORDER}\n// groupLabels={GROUP_LABELS}\n// activeTool={tool}\n// onToolChange={setTool}\n// view={{ showAxis, showGrid, onShowAxisChange, onShowGridChange }} // optional\n// history={{ onUndo, canUndo, onRedo, canRedo }} // optional\n// chord={{ activeGroup, letterForGroup }} // optional\n// objects={{ store, addButtons, renderRow, ... }} // optional\n// isMobile={isMobile}\n// drawerOpen={drawerOpen}\n// onDrawerClose={...}\n// onClose={onClose}\n// isDark={isDark}\n// />\n\nimport React from 'react';\nimport { StampLeftPanelDesktop } from './Desktop';\nimport { StampLeftPanelMobile } from './Mobile';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanel<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n if (props.isMobile) return <StampLeftPanelMobile {...props} />;\n return <StampLeftPanelDesktop {...props} />;\n}\n\nexport type {\n StampLeftPanelProps,\n StampToolDef,\n StampLeftPanelViewProps,\n StampLeftPanelHistoryProps,\n StampLeftPanelChordProps,\n StampLeftPanelObjectsProps,\n StampLeftPanelTabs,\n HoverState,\n} from './types';\nexport { TOOLTIP_DELAY_MS } from './types';\nexport { useToolHoverTooltip } from './useToolHoverTooltip';\n","// Hook tạo + giữ scene store tại Host level cho mọi stamp interactive\n// (geometry-2d, geometry-3d, graph-2d).\n//\n// Trước đây mỗi stamp dùng pattern riêng:\n// - 3D: useRef + createStore(createEmptyState('3d')) inline tại host.\n// - 2D + graph-2d: useState<Store|null> + callback `onStoreReady` từ editor.\n//\n// Hook này hợp nhất về 1 mental model: store sống ở host, identity stable,\n// pre-load từ customData ngay frame đầu → bỏ ternary `store ? ... : undefined`\n// + bỏ flash 1 frame trên 2D + graph-2d.\n//\n// Roundtrip edit: khi double-click stamp existing element, `editingElement`\n// được pass vào, hook gọi `parseInitial(customData)` để extract State trước\n// khi createStore. Stamp tự define parseInitial vì format customData khác nhau.\n\nimport { useRef } from 'react';\nimport { createStore, createEmptyState, type Store } from '../../core/scene';\nimport type { State } from '../../core/scene/types';\nimport type { StampHostProps } from './types';\n\nexport type StampDomain = '2d' | '3d' | 'graph2d';\n\nexport type ParseInitialStateFn = (customData: unknown) => State | null;\n\nexport function useStampStore(\n domain: StampDomain,\n editingElement: StampHostProps['editingElement'],\n parseInitial: ParseInitialStateFn,\n): Store {\n const ref = useRef<Store | null>(null);\n if (!ref.current) {\n const initial = editingElement?.customData\n ? parseInitial(editingElement.customData) ?? createEmptyState(domain)\n : createEmptyState(domain);\n ref.current = createStore(initial);\n }\n return ref.current;\n}\n","// src/stamps/shared/StampLeftPanel/constants.ts\n//\n// Desktop popover sizing chia sẻ giữa 3 stamp editor (geometry-2d, geometry-3d,\n// graph-2d). Trước đây mỗi EditorPanel hardcode size riêng (640×540 cho 2D/graph,\n// 800×600 cho 3D) → kích thước canvas nhỏ + không nhất quán. Gom vào constant\n// 880×700 + cap responsive để dùng được trên màn nhỏ.\n\n/** Tailwind class string áp cho outer popover của stamp editor (desktop). */\nexport const STAMP_PANEL_DESKTOP =\n 'h-[700px] w-[880px] max-h-[85vh] max-w-[calc(100vw-280px)]';\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type { ShowToastFn, DismissToastFn, ToastItem, ToastOptions } from './types';\n\nexport interface ToastContextValue {\n items: ToastItem[];\n showToast: ShowToastFn;\n dismiss: DismissToastFn;\n}\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\ntype Action =\n | { type: 'PUSH'; item: ToastItem; maxVisible: number }\n | { type: 'REPLACE'; item: ToastItem }\n | { type: 'DISMISS'; id: string };\n\nfunction reducer(state: ToastItem[], action: Action): ToastItem[] {\n switch (action.type) {\n case 'PUSH': {\n const next = [...state, action.item];\n return next.length > action.maxVisible ? next.slice(next.length - action.maxVisible) : next;\n }\n case 'REPLACE':\n return state.map((it) => (it.id === action.item.id ? action.item : it));\n case 'DISMISS':\n return state.filter((it) => it.id !== action.id);\n }\n}\n\ninterface ToastProviderProps {\n children: React.ReactNode;\n /** Max simultaneously visible toasts. Default: 3. Pushing more drops oldest. */\n maxVisible?: number;\n}\n\nlet autoIdCounter = 0;\n\nexport function ToastProvider({ children, maxVisible = 3 }: ToastProviderProps) {\n const [items, dispatch] = useReducer(reducer, [] as ToastItem[]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const clearTimer = useCallback((id: string) => {\n const t = timersRef.current.get(id);\n if (t) {\n clearTimeout(t);\n timersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback<DismissToastFn>((id) => {\n clearTimer(id);\n dispatch({ type: 'DISMISS', id });\n }, [clearTimer]);\n\n const scheduleAutoDismiss = useCallback((id: string, duration: number) => {\n if (duration <= 0) return;\n const t = setTimeout(() => dismiss(id), duration);\n timersRef.current.set(id, t);\n }, [dismiss]);\n\n const showToast = useCallback<ShowToastFn>((message, opts: ToastOptions = {}) => {\n const variant = opts.variant ?? 'info';\n const duration = opts.duration ?? 3000;\n const id = opts.id ?? `toast-${++autoIdCounter}`;\n const item: ToastItem = { id, message, variant, duration };\n const existing = itemsRef.current.find((it) => it.id === id);\n if (existing) {\n clearTimer(id);\n dispatch({ type: 'REPLACE', item });\n } else {\n dispatch({ type: 'PUSH', item, maxVisible });\n }\n scheduleAutoDismiss(id, duration);\n }, [clearTimer, maxVisible, scheduleAutoDismiss]);\n\n useEffect(() => () => {\n timersRef.current.forEach((t) => clearTimeout(t));\n timersRef.current.clear();\n }, []);\n\n const value = useMemo(() => ({ items, showToast, dismiss }), [items, showToast, dismiss]);\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n}\n","import { useContext } from 'react';\nimport { ToastContext } from './ToastProvider';\n\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error('useToast must be used inside <ToastProvider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport type { ToastVariant } from './types';\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n info: 'border-l-sky-500',\n warning: 'border-l-amber-500',\n error: 'border-l-rose-500',\n};\n\nconst VARIANT_ICON: Record<ToastVariant, React.ReactNode> = {\n info: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n warning: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n error: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n};\n\ninterface ToastProps {\n id: string;\n message: string;\n variant: ToastVariant;\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ id, message, variant, onDismiss }: ToastProps) {\n return (\n <div\n role=\"status\"\n className={[\n 'pointer-events-auto flex max-w-sm items-start gap-2 rounded-lg border-l-4 bg-white px-3 py-2 text-sm text-slate-800 shadow-md ring-1 ring-black/5',\n VARIANT_CLASS[variant],\n ].join(' ')}\n >\n <span className=\"mt-0.5 shrink-0 text-slate-500\">{VARIANT_ICON[variant]}</span>\n <span className=\"flex-1 leading-snug\">{message}</span>\n <button\n type=\"button\"\n aria-label=\"Đóng thông báo\"\n onClick={() => onDismiss(id)}\n className=\"-mr-1 ml-1 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-700\"\n >\n ×\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport { Toast } from './Toast';\nimport { useToast } from './useToast';\n\n/**\n * Renders the active toast queue. Mount once near the root of each stamp\n * EditorPanel (inside ToastProvider). Positions itself absolutely at\n * bottom-center of the nearest positioned ancestor.\n */\nexport function ToastHost() {\n const { items, dismiss } = useToast();\n if (items.length === 0) return null;\n return (\n <div\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-50 flex flex-col items-center gap-2\"\n >\n {items.map((it) => (\n <Toast key={it.id} id={it.id} message={it.message} variant={it.variant} onDismiss={dismiss} />\n ))}\n </div>\n );\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n \n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Minimal JSXGraph board surface that wheel-zoom logic depends on.\n * Local shape to avoid importing the (untyped) jsxgraph default export here.\n */\nexport interface JxgBoardZoomable {\n zoomIn: (x?: number, y?: number) => void;\n zoomOut: (x?: number, y?: number) => void;\n // JSXGraph older versions may not expose this — wheel still works, just\n // without cursor-anchored zoom (falls back to board-center).\n getUsrCoordsOfMouse?: (e: WheelEvent) => unknown;\n}\n\n/**\n * Attach Excalidraw-style Ctrl/Cmd + wheel zoom to a container element.\n *\n * - Khi wheel kèm Ctrl/Cmd: preventDefault + zoom in/out với anchor tại\n * con trỏ (nếu board hỗ trợ `getUsrCoordsOfMouse`).\n * - Khi wheel không kèm modifier: bỏ qua → page scroll bình thường.\n *\n * Returns cleanup fn. Caller chịu trách nhiệm gọi trong cleanup của useEffect.\n *\n * @param target Container element (`HTMLDivElement` hoặc `SVGSVGElement`).\n * @param board JSXGraph board instance đã initBoard xong.\n * @param label Tag để log dev-mode khi safeJsx swallow lỗi (vd \"MiniBoard.2d\").\n */\nexport function attachJxgWheelZoom(\n target: HTMLElement,\n board: JxgBoardZoomable,\n label = 'wheelZoom',\n): () => void {\n const onWheel = (e: WheelEvent): void => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n e.stopPropagation();\n let cx: number | undefined;\n let cy: number | undefined;\n safeJsx(`${label}.coords`, () => {\n const usr = board.getUsrCoordsOfMouse?.(e);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n cx = usr[0] as number;\n cy = usr[1] as number;\n }\n });\n if (e.deltaY < 0) safeJsx(`${label}.in`, () => board.zoomIn(cx, cy));\n else if (e.deltaY > 0) safeJsx(`${label}.out`, () => board.zoomOut(cx, cy));\n };\n target.addEventListener('wheel', onWheel, { passive: false });\n return () => { target.removeEventListener('wheel', onWheel); };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Toggles cho common JSXGraph options. Per-stamp callsite override mặc định\n * nếu cần preserve behavior cụ thể.\n *\n * Mặc định:\n * - text.display = 'internal' (true) — bắt buộc cho clone-SVG export.\n * - text.useASCII/MathJax/Katex = false (true) — JSXGraph default rendering,\n * không load extra text engine.\n * - label.display = 'internal' (true) — point label vào trong SVG.\n * - elements.highlight = false (FALSE mặc định) — opt-in vì graph-2d cần\n * JSXGraph's default hover-highlight để phân biệt object đang hover.\n */\nexport interface JxgInitDefaults {\n textDisplayInternal?: boolean;\n disableTextEngines?: boolean;\n labelDisplayInternal?: boolean;\n disableElementHighlight?: boolean;\n}\n\nexport interface InitJxgBoardConfig {\n /** Per-MiniBoard toggle cho common defaults. */\n defaults?: JxgInitDefaults;\n /** Options pass thẳng vào `JXG.JSXGraph.initBoard(target, opts)`. */\n boardOptions: Record<string, unknown>;\n /**\n * Hook để tweak options sau khi defaults được apply. Dùng cho per-stamp\n * customization (vd themeLabel color cho 2D, axesPosition cho 3D view3d).\n */\n \n extraOptionTweaks?: (opts: any) => void;\n /** Tag cho safeJsx log (vd \"MiniBoard.2d\"). Default: \"JxgBoard\". */\n label?: string;\n}\n\nexport interface InitJxgBoardResult {\n \n JXG: any;\n \n board: any;\n /** Gọi để free JSXGraph board (safe-wrapped). */\n cleanup: () => void;\n}\n\n/**\n * Async dynamic-import JSXGraph + apply common options + initBoard + trả\n * cleanup. Centralize boilerplate shared bởi 3 MiniBoard (2D/3D/graph-2d).\n *\n * Caller vẫn handle cancellation flag, refs, và post-init setup (renderer,\n * view3d, axes, etc.) ngoài helper này.\n *\n * @throws Nếu JSXGraph load hoặc initBoard throw. Caller nên try/catch nếu\n * cần tolerate mock environments.\n */\nexport async function initJxgBoard(\n target: string | HTMLElement,\n config: InitJxgBoardConfig,\n): Promise<InitJxgBoardResult> {\n const label = config.label ?? 'JxgBoard';\n \n const JXG = (await import('jsxgraph')).default as any;\n const {\n textDisplayInternal = true,\n disableTextEngines = true,\n labelDisplayInternal = true,\n disableElementHighlight = false,\n } = config.defaults ?? {};\n safeJsx(`${label}.applyOptions`, () => {\n const opts = JXG.Options;\n if (!opts) return;\n if (textDisplayInternal || disableTextEngines) {\n opts.text = opts.text ?? {};\n if (textDisplayInternal) opts.text.display = 'internal';\n if (disableTextEngines) {\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n }\n }\n if (labelDisplayInternal) {\n opts.label = opts.label ?? {};\n opts.label.display = 'internal';\n }\n if (disableElementHighlight) {\n opts.elements = opts.elements ?? {};\n opts.elements.highlight = false;\n }\n config.extraOptionTweaks?.(opts);\n });\n const board = JXG.JSXGraph.initBoard(target, config.boardOptions);\n const cleanup = (): void => {\n safeJsx(`${label}.freeBoard`, () => JXG.JSXGraph.freeBoard(board));\n };\n return { JXG, board, cleanup };\n}\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { isGeometry3DCustomData, renderGeometry3DSvgFromState } from './chunk-
|
|
2
|
+
import { isGeometry3DCustomData, renderGeometry3DSvgFromState } from './chunk-BEZSQKPY.mjs';
|
|
3
3
|
import { svgToStampFile } from './chunk-5UTGXHLJ.mjs';
|
|
4
4
|
import { lazy } from 'react';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
7
|
var Geometry3DStampHost = lazy(
|
|
8
|
-
() => import('./host-
|
|
8
|
+
() => import('./host-ZIQ77W33.mjs').then((m) => ({ default: m.Geometry3DStampHost }))
|
|
9
9
|
);
|
|
10
10
|
var Geometry3DIcon = /* @__PURE__ */ jsxs(
|
|
11
11
|
"svg",
|
|
@@ -57,5 +57,5 @@ var geometry3dStamp = {
|
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
export { geometry3dStamp };
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-45CGKJ7S.mjs.map
|
|
61
|
+
//# sourceMappingURL=chunk-45CGKJ7S.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stamps/geometry-3d/index.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,mBAAA,GAAsB,IAAA;AAAA,EAAK,MAC/B,OAAO,qBAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,mBAAA,EAAoB,CAAE;AACnE,CAAA;AAEA,IAAM,cAAA,mBACJ,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAY,MAAA;AAAA,IAGZ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,2BAAA,EAA4B,CAAA;AAAA,sBAEpC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,CAAA;AAAA,sBAEnC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6BAAA,EAA8B;AAAA;AAAA;AACxC,CAAA;AAGK,IAAM,eAAA,GAAmD;AAAA,EAC9D,IAAA,EAAM,YAAA;AAAA,EACN,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,0BAAA;AAAA,EACf,iBAAA,EAAmB,sBAAA;AAAA,EACnB,MAAM,wBAAwB,IAAA,EAAgC;AAC5D,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,MAAM,mFAA2E,CAAA;AAAA,IAC7F;AACA,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,4BAAA,CAA6B,KAAK,SAAS,CAAA;AACvE,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAAA,EACA,yBAAA,EAA2B,OAAO,OAAA,KAA+C;AAC/E,IAAA,MAAM,OAAO,OAAA,CAAQ,UAAA;AACrB,IAAA,MAAM,SAAU,OAAA,CAAuC,MAAA;AACvD,IAAA,IAAI,CAAC,QAAQ,CAAC,MAAA,IAAU,CAAC,sBAAA,CAAuB,IAAI,GAAG,OAAO,IAAA;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,4BAAA,CAA6B,KAAK,SAAS,CAAA;AACvE,MAAA,OAAO,cAAA,CAAe,WAAW,MAAM,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,IAAA,EAAM;AACR","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/stamps/geometry-3d/index.tsx"],"names":[],"mappings":";;;;;AAgBA,IAAM,mBAAA,GAAsB,IAAA;AAAA,EAAK,MAC/B,OAAO,qBAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO,EAAE,OAAA,EAAS,CAAA,CAAE,mBAAA,EAAoB,CAAE;AACnE,CAAA;AAEA,IAAM,cAAA,mBACJ,IAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAO,IAAA;AAAA,IACP,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,MAAA;AAAA,IACL,MAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAc,OAAA;AAAA,IACd,cAAA,EAAe,OAAA;AAAA,IACf,aAAA,EAAY,MAAA;AAAA,IAGZ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,2BAAA,EAA4B,CAAA;AAAA,sBAEpC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B,CAAA;AAAA,sBAEnC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6BAAA,EAA8B;AAAA;AAAA;AACxC,CAAA;AAGK,IAAM,eAAA,GAAmD;AAAA,EAC9D,IAAA,EAAM,YAAA;AAAA,EACN,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,aAAA,EAAe,0BAAA;AAAA,EACf,iBAAA,EAAmB,sBAAA;AAAA,EACnB,MAAM,wBAAwB,IAAA,EAAgC;AAC5D,IAAA,IAAI,CAAC,sBAAA,CAAuB,IAAI,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,MAAM,mFAA2E,CAAA;AAAA,IAC7F;AACA,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,4BAAA,CAA6B,KAAK,SAAS,CAAA;AACvE,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAAA,EACA,yBAAA,EAA2B,OAAO,OAAA,KAA+C;AAC/E,IAAA,MAAM,OAAO,OAAA,CAAQ,UAAA;AACrB,IAAA,MAAM,SAAU,OAAA,CAAuC,MAAA;AACvD,IAAA,IAAI,CAAC,QAAQ,CAAC,MAAA,IAAU,CAAC,sBAAA,CAAuB,IAAI,GAAG,OAAO,IAAA;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,4BAAA,CAA6B,KAAK,SAAS,CAAA;AACvE,MAAA,OAAO,cAAA,CAAe,WAAW,MAAM,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,IAAA,EAAM;AACR","file":"chunk-45CGKJ7S.mjs","sourcesContent":["'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport {\n isGeometry3DCustomData,\n type Geometry3DCustomData,\n} from './serialize';\nimport { renderGeometry3DSvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { svgToStampFile } from '../shared/svgToStampFile';\n\nexport type { Geometry3DCustomData };\n\nconst Geometry3DStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.Geometry3DStampHost })),\n);\n\nconst Geometry3DIcon: ReactNode = (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {/* Mặt trước */}\n <path d=\"M4 9 L4 20 L14 20 L14 9 Z\" />\n {/* Mặt trên */}\n <path d=\"M4 9 L10 4 L20 4 L14 9 Z\" />\n {/* Mặt phải */}\n <path d=\"M14 9 L20 4 L20 15 L14 20 Z\" />\n </svg>\n);\n\nexport const geometry3dStamp: StampType<Geometry3DCustomData> = {\n kind: 'geometry3d',\n experimental: true,\n shortcutKey: 'd',\n toolbarLabel: 'D',\n toolbarTitle: 'Hình 3D (D)',\n toolbarIcon: Geometry3DIcon,\n toolbarTestId: 'stamp-toolbar-geometry3d',\n matchesCustomData: isGeometry3DCustomData,\n async renderSvgFromCustomData(data: unknown): Promise<string> {\n if (!isGeometry3DCustomData(data)) {\n throw new Error('geometry3dStamp.renderSvgFromCustomData: customData không phải geometry3d');\n }\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgString;\n },\n restoreFileFromCustomData: async (element): Promise<RestoredStampFile | null> => {\n const data = element.customData as Geometry3DCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId || !isGeometry3DCustomData(data)) return null;\n try {\n const { svgString } = await renderGeometry3DSvgFromState(data.jsonState);\n return svgToStampFile(svgString, fileId);\n } catch {\n return null;\n }\n },\n Host: Geometry3DStampHost,\n};\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { isGeometryCustomData, renderGeometrySvgFromState } from './chunk-
|
|
2
|
+
import { isGeometryCustomData, renderGeometrySvgFromState } from './chunk-CGZZO4BX.mjs';
|
|
3
3
|
import { svgToStampFile } from './chunk-5UTGXHLJ.mjs';
|
|
4
4
|
import { lazy } from 'react';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
7
|
var GeometryStampHost = lazy(
|
|
8
|
-
() => import('./host-
|
|
8
|
+
() => import('./host-EPZCNFLH.mjs').then((m) => ({ default: m.GeometryStampHost }))
|
|
9
9
|
);
|
|
10
10
|
var GeometryIcon = /* @__PURE__ */ jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [
|
|
11
11
|
/* @__PURE__ */ jsx("polygon", { points: "4,20 20,20 12,5" }),
|
|
@@ -38,5 +38,5 @@ var geometryStamp = {
|
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
export { geometryStamp };
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-4DS3MKID.mjs.map
|
|
42
|
+
//# sourceMappingURL=chunk-4DS3MKID.mjs.map
|