schematex 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -15
- package/dist/api-bQZ98gkJ.d.cts +22 -0
- package/dist/api-bQZ98gkJ.d.ts +22 -0
- package/dist/browser.cjs +46 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +27 -0
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +40 -0
- package/dist/browser.js.map +1 -0
- package/dist/{chunk-XXU36667.js → chunk-2OIW3MAE.js} +4 -3
- package/dist/chunk-2OIW3MAE.js.map +1 -0
- package/dist/{chunk-3FTUWAXK.cjs → chunk-3M7QWADF.cjs} +5 -4
- package/dist/chunk-3M7QWADF.cjs.map +1 -0
- package/dist/{chunk-BE5HNDA5.cjs → chunk-4HPT4BOI.cjs} +5 -4
- package/dist/{chunk-BE5HNDA5.cjs.map → chunk-4HPT4BOI.cjs.map} +1 -1
- package/dist/{chunk-CZRM7LT7.js → chunk-4TS5NB7L.js} +4 -3
- package/dist/chunk-4TS5NB7L.js.map +1 -0
- package/dist/{chunk-4G7ZIBHN.js → chunk-5SH5NUDW.js} +3 -2
- package/dist/{chunk-4G7ZIBHN.js.map → chunk-5SH5NUDW.js.map} +1 -1
- package/dist/{chunk-47ZC6EMJ.js → chunk-7WXAAVR3.js} +4 -3
- package/dist/{chunk-47ZC6EMJ.js.map → chunk-7WXAAVR3.js.map} +1 -1
- package/dist/{chunk-5C7DPDHQ.js → chunk-A74ZCP5I.js} +4 -3
- package/dist/{chunk-5C7DPDHQ.js.map → chunk-A74ZCP5I.js.map} +1 -1
- package/dist/{chunk-DS47NTWZ.cjs → chunk-AMP2FFES.cjs} +11 -10
- package/dist/chunk-AMP2FFES.cjs.map +1 -0
- package/dist/{chunk-2UKC6ZCY.cjs → chunk-CEV3GZA3.cjs} +12 -11
- package/dist/chunk-CEV3GZA3.cjs.map +1 -0
- package/dist/{chunk-NYCIK4SU.cjs → chunk-DTMCQXXC.cjs} +13 -12
- package/dist/chunk-DTMCQXXC.cjs.map +1 -0
- package/dist/{chunk-FDLZEKEB.js → chunk-GEPBET4L.js} +3 -2
- package/dist/chunk-GEPBET4L.js.map +1 -0
- package/dist/chunk-HAIBAF6J.cjs +1880 -0
- package/dist/chunk-HAIBAF6J.cjs.map +1 -0
- package/dist/{chunk-FGPTCDUT.cjs → chunk-HKRYKEOV.cjs} +5 -4
- package/dist/chunk-HKRYKEOV.cjs.map +1 -0
- package/dist/{chunk-D4JTSPOL.js → chunk-HLYA4QBB.js} +4 -3
- package/dist/chunk-HLYA4QBB.js.map +1 -0
- package/dist/{chunk-7FZSPKX3.cjs → chunk-IMHR3S5H.cjs} +6 -5
- package/dist/chunk-IMHR3S5H.cjs.map +1 -0
- package/dist/{chunk-HGHWCB6K.js → chunk-IQIJ6WW6.js} +4 -3
- package/dist/chunk-IQIJ6WW6.js.map +1 -0
- package/dist/{chunk-UHLYS3W5.cjs → chunk-IY52OWPG.cjs} +5 -4
- package/dist/{chunk-UHLYS3W5.cjs.map → chunk-IY52OWPG.cjs.map} +1 -1
- package/dist/chunk-JZGFSRVT.js +1873 -0
- package/dist/chunk-JZGFSRVT.js.map +1 -0
- package/dist/{chunk-3J7TFUOC.js → chunk-L6IHSTPP.js} +4 -3
- package/dist/{chunk-3J7TFUOC.js.map → chunk-L6IHSTPP.js.map} +1 -1
- package/dist/{chunk-4DBRNOPA.cjs → chunk-LKHWBDWZ.cjs} +5 -4
- package/dist/{chunk-4DBRNOPA.cjs.map → chunk-LKHWBDWZ.cjs.map} +1 -1
- package/dist/{chunk-34X3ZJ6E.cjs → chunk-LXNFVHDT.cjs} +3 -2
- package/dist/{chunk-34X3ZJ6E.cjs.map → chunk-LXNFVHDT.cjs.map} +1 -1
- package/dist/chunk-M6AMNXQ7.js +4539 -0
- package/dist/chunk-M6AMNXQ7.js.map +1 -0
- package/dist/{chunk-XX4BKS7Y.js → chunk-MRGS54WN.js} +4 -3
- package/dist/chunk-MRGS54WN.js.map +1 -0
- package/dist/{chunk-ROFLJ74T.js → chunk-MXJ6FHSY.js} +4 -3
- package/dist/chunk-MXJ6FHSY.js.map +1 -0
- package/dist/{chunk-V6WO7RK7.cjs → chunk-PIQG2Z5N.cjs} +5 -4
- package/dist/chunk-PIQG2Z5N.cjs.map +1 -0
- package/dist/{chunk-U5GGE6PJ.js → chunk-RQX53J6M.js} +4 -3
- package/dist/chunk-RQX53J6M.js.map +1 -0
- package/dist/{chunk-N7KOXOMX.cjs → chunk-S6VPECM3.cjs} +72 -2
- package/dist/chunk-S6VPECM3.cjs.map +1 -0
- package/dist/{chunk-VFQCTXOX.js → chunk-SPIW4VWP.js} +4 -3
- package/dist/chunk-SPIW4VWP.js.map +1 -0
- package/dist/{chunk-IX554O5K.js → chunk-TIGP2OEJ.js} +72 -3
- package/dist/chunk-TIGP2OEJ.js.map +1 -0
- package/dist/{chunk-LMFSHK45.js → chunk-TPA36ULU.js} +4 -3
- package/dist/{chunk-LMFSHK45.js.map → chunk-TPA36ULU.js.map} +1 -1
- package/dist/{chunk-ZX7QKZK2.cjs → chunk-ULERCTGS.cjs} +5 -4
- package/dist/{chunk-ZX7QKZK2.cjs.map → chunk-ULERCTGS.cjs.map} +1 -1
- package/dist/chunk-VP54YPOX.cjs +4544 -0
- package/dist/chunk-VP54YPOX.cjs.map +1 -0
- package/dist/{chunk-XQ52ICHU.cjs → chunk-YKO7DY2F.cjs} +14 -13
- package/dist/chunk-YKO7DY2F.cjs.map +1 -0
- package/dist/{chunk-PDPHRZZT.js → chunk-YO4GU6JX.js} +4 -3
- package/dist/chunk-YO4GU6JX.js.map +1 -0
- package/dist/{chunk-S6BK5DB6.cjs → chunk-ZGKEFVJQ.cjs} +13 -12
- package/dist/chunk-ZGKEFVJQ.cjs.map +1 -0
- package/dist/{chunk-2MQWZ2XY.cjs → chunk-ZO77FHBF.cjs} +3 -2
- package/dist/chunk-ZO77FHBF.cjs.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/export.cjs +87 -0
- package/dist/export.cjs.map +1 -0
- package/dist/export.d.cts +38 -0
- package/dist/export.d.ts +38 -0
- package/dist/export.js +83 -0
- package/dist/export.js.map +1 -0
- package/dist/{index-BXefHVce.d.cts → index-SSGpCggE.d.cts} +52 -3
- package/dist/{index-BSlza1YY.d.ts → index-ga04CTBI.d.ts} +52 -3
- package/dist/index.cjs +65 -1948
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -12
- package/dist/index.d.ts +7 -12
- package/dist/index.js +19 -1942
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +56 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +24 -0
- package/dist/react.d.ts +24 -0
- package/dist/react.js +54 -0
- package/dist/react.js.map +1 -0
- package/dist/{types-DqfcYkcY.d.ts → types-BcPhMdHd.d.cts} +6 -2
- package/dist/{types-DqfcYkcY.d.cts → types-BcPhMdHd.d.ts} +6 -2
- package/package.json +31 -2
- package/dist/chunk-2MQWZ2XY.cjs.map +0 -1
- package/dist/chunk-2UKC6ZCY.cjs.map +0 -1
- package/dist/chunk-3FTUWAXK.cjs.map +0 -1
- package/dist/chunk-7FZSPKX3.cjs.map +0 -1
- package/dist/chunk-ADOXGKAK.js +0 -1251
- package/dist/chunk-ADOXGKAK.js.map +0 -1
- package/dist/chunk-CZRM7LT7.js.map +0 -1
- package/dist/chunk-D4JTSPOL.js.map +0 -1
- package/dist/chunk-DS47NTWZ.cjs.map +0 -1
- package/dist/chunk-FDLZEKEB.js.map +0 -1
- package/dist/chunk-FGPTCDUT.cjs.map +0 -1
- package/dist/chunk-HGHWCB6K.js.map +0 -1
- package/dist/chunk-IX554O5K.js.map +0 -1
- package/dist/chunk-MDICUK6F.cjs +0 -1258
- package/dist/chunk-MDICUK6F.cjs.map +0 -1
- package/dist/chunk-N7KOXOMX.cjs.map +0 -1
- package/dist/chunk-NYCIK4SU.cjs.map +0 -1
- package/dist/chunk-PDPHRZZT.js.map +0 -1
- package/dist/chunk-ROFLJ74T.js.map +0 -1
- package/dist/chunk-S6BK5DB6.cjs.map +0 -1
- package/dist/chunk-U5GGE6PJ.js.map +0 -1
- package/dist/chunk-V6WO7RK7.cjs.map +0 -1
- package/dist/chunk-VFQCTXOX.js.map +0 -1
- package/dist/chunk-XQ52ICHU.cjs.map +0 -1
- package/dist/chunk-XX4BKS7Y.js.map +0 -1
- package/dist/chunk-XXU36667.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/venn/parser.ts","../src/diagrams/venn/geometry.ts","../src/diagrams/venn/labels.ts","../src/diagrams/venn/layout.ts","../src/diagrams/venn/renderer.ts","../src/diagrams/venn/index.ts"],"names":["text","title","el","circle","resolveVennTheme","group","path","desc","svgRoot"],"mappings":";;;;;;AAuBO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CAAY,SAAiC,IAAA,EAAe;AAC1D,IAAA,KAAA,CAAM,SAAS,MAAA,GAAY,CAAA,KAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA;AADpB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAE3C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AAAA,EAH6C,IAAA;AAI/C;AAEA,IAAM,cAAA,GAA6B;AAAA,EACjC,IAAA,EAAM,MAAA;AAAA,EACN,YAAA,EAAc,KAAA;AAAA,EACd,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,UAAA;AAAA,EACX,UAAA,EAAY,MAAA;AAAA,EACZ,WAAA,EAAa;AACf,CAAA;AAEA,SAAS,aAAa,IAAA,EAAsB;AAE1C,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAAA,SAAA,IAClB,EAAA,KAAO,OAAO,CAAC,OAAA,SAAgB,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,iBAAiBA,KAAAA,EAAsC;AAE9D,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAMA,KAAAA,EAAM;AACrB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAAA,SAAA,IAClB,CAAC,OAAA,KAAY,EAAA,KAAO,OAAO,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,CAAA,EAAM,KAAA,EAAA;AAAA,SAAA,IACtD,CAAC,OAAA,KAAY,EAAA,KAAO,OAAO,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,CAAA,EAAM,KAAA,EAAA;AAC/D,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,KAAA,KAAU,CAAA,IAAK,CAAC,OAAA,EAAS;AACzC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,IAAA,EAAK,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AAC9B,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAC/B,IAAA,MAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAChC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,IAAA,EAAiE;AAE3F,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAIC,MAAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,CAAC,CAAA;AAClC,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAI,eAAe,2BAA2B,CAAA;AACjE,IAAAA,MAAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC5B,IAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,EACZ;AACA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACnC,EAAA,IAAI,QAAgC,EAAC;AACrC,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,EAAE,KAAA,EAAAA,MAAAA,EAAO,KAAA,EAAM;AACxB;AAEA,SAAS,WAAW,GAAA,EAA8B;AAChD,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,MAAM,MAAA,EAAO;AAE9B,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACxC,IAAA,MAAM,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AAClC,IAAA,IAAI,CAAC,OAAO,OAAO,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,EAAC,EAAE;AAC7C,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACzE,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM;AAAA,EACtC;AAEA,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,UAAA,CAAW,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAE;AAAA,EAC9D;AAEA,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG;AACrB,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,QAAA,CAAS,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EACnD;AAEA,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACxC,IAAA,OAAO,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAE;AAAA,EAC/C;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA,EAAE;AAClC;AAEA,SAAS,oBAAoB,CAAA,EAAqB;AAChD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAAA,SAAA,IAClB,CAAC,OAAA,KAAY,EAAA,KAAO,OAAO,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,CAAA,EAAM,KAAA,EAAA;AAAA,SAAA,IACtD,CAAC,OAAA,KAAY,EAAA,KAAO,OAAO,EAAA,KAAO,GAAA,IAAO,OAAO,GAAA,CAAA,EAAM,KAAA,EAAA;AAC/D,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,KAAA,KAAU,CAAA,IAAK,CAAC,OAAA,EAAS;AACzC,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA,GAAA,GAAM,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,KAAK,GAAG,CAAA;AAChC,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,cAAA,GAAwD;AAAA,EAC5D,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEA,SAAS,cAAA,CACPD,OACA,SAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAUA,MAAK,IAAA,EAAK;AAE1B,EAAA,MAAM,SAAA,GAAY,4BAAA,CAA6B,IAAA,CAAK,OAAO,CAAA;AAC3D,EAAA,IAAI,SAAA,IAAa,SAAA,CAAU,CAAC,CAAA,EAAG;AAC7B,IAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,gBAAA,EAAmB,EAAE,CAAA,eAAA,CAAiB,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,CAAC,EAAE,CAAA,EAAG,MAAM,IAAA,EAAK;AAAA,EAClC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACpE,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,mBAAA,EAAsBA,KAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACxD;AACA,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,iBAAA,EAAoB,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,IACjE;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,cAAA,CAAe,CAAA,gBAAA,EAAmB,CAAC,CAAA,eAAA,CAAiB,CAAA;AAAA,IAChE;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAC,GAAG,KAAK,CAAA,EAAG,MAAM,KAAA,EAAM;AACzC;AAEO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA;AACjC,EAAA,IAAIC,MAAAA;AACJ,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,MAAM,MAAA,GAAqB,EAAE,GAAG,cAAA,EAAe;AAC/C,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAqB;AAC1C,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,YAAiC,EAAC;AACxC,EAAA,MAAM,WAAmC,EAAC;AAE1C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAwC;AAChE,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACpC;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAM,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AAGnB,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG;AACvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAC7C,MAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAM,GAAI,mBAAmB,IAAI,CAAA;AACnD,MAAA,IAAI,CAAA,KAAM,MAAA,EAAWA,MAAAA,GAAQ,CAAA;AAC7B,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,wCAAA,CAAyC,IAAA,CAAK,GAAG,CAAA;AACrE,IAAA,IAAI,eAAe,WAAA,CAAY,CAAC,CAAA,IAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AACnD,MAAA,WAAA,CAAY,WAAA,CAAY,CAAC,CAAA,EAAG,WAAA,CAAY,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,MAAA,EAAQ,QAAQ,CAAA;AACnE,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,kCAAA,CAAmC,IAAA,CAAK,GAAG,CAAA;AAC/D,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,CAAC,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,GAAO,WAAA,CAAY,CAAC,CAAA,CAAE,WAAA,EAAY;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,kCAAA,CAAmC,IAAA,CAAK,GAAG,CAAA;AAC5D,IAAA,IAAI,YAAY,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC1C,MAAA,MAAM,EAAA,GAAK,SAAS,CAAC,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,MAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM,GAAI,mBAAmB,IAAI,CAAA;AACvD,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,kBAAA,EAAqB,EAAE,KAAK,MAAM,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAO,CAAA,IAAK,MAAM,MAAM,CAAA;AAC5C,MAAA,MAAM,SAAkB,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,IAAS,IAAI,KAAA,EAAM;AACxD,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,MAAA,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AACvB,MAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,yCAAA,CAA0C,IAAA,CAAK,GAAG,CAAA;AACpE,IAAA,IAAI,SAAA,IAAa,UAAU,CAAC,CAAA,KAAM,UAAa,SAAA,CAAU,CAAC,MAAM,MAAA,EAAW;AACzE,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,MAAM,KAAA,GAAQ,oBAAoB,SAAA,CAAU,CAAC,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,EAAE,IAAA,EAAM,CAAC,CAAA,CAChC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7B,MAAA,IAAI,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,GAAS,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,UAAU,KAAA,EAAM;AAC1C,QAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,QAAA,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AACvB,QAAA,WAAA,CAAY,IAAI,EAAE,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AAAA,MACpB;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,0EAAA,CAA2E,IAAA;AAAA,MAC5F;AAAA,KACF;AACA,IAAA,IAAI,UAAA,IAAc,WAAW,CAAC,CAAA,IAAK,WAAW,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AACjE,MAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,CAAE,WAAA,EAAY;AACzC,MAAA,MAAM,GAAA,GAAM,MAAA,KAAW,IAAA,GAAO,QAAA,GAAW,MAAA;AACzC,MAAA,MAAM,EAAA,GAAK,WAAW,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,aAAA,EAAgB,IAAI,iBAAiB,MAAM,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,aAAA,EAAgB,EAAE,iBAAiB,MAAM,CAAA;AAAA,MACpE;AACA,MAAA,MAAM,OAAA,GAAU,eAAe,GAAG,CAAA;AAClC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,cAAA,CAAe,CAAA,kBAAA,EAAqB,GAAG,KAAK,MAAM,CAAA;AAAA,MAC9D;AACA,MAAA,SAAA,CAAU,KAAK,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,SAAS,CAAA;AAC1C,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAAa,GAAA;AACjB,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA,EAAG;AAClC,MAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAAA,IACnD;AACA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACvC,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC5C,MAAA,MAAM,YAAY,UAAA,CAAW,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AACtD,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,MAAK,GAAI,cAAA,CAAe,SAAS,WAAW,CAAA;AACtE,QAAA,MAAM,KAAA,GAAQ,WAAW,SAAS,CAAA;AAClC,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,UAAA,MAAM,IAAI,cAAA,CAAe,CAAA,CAAE,OAAA,EAAS,MAAM,CAAA;AAAA,QAC5C;AACA,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,uBAAA,EAA0B,GAAG,KAAK,MAAM,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,eAAe,gCAAgC,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,iBAAiB,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,MAAS,CAAA;AAChE,EAAA,IAAI,cAAA,IAAkB,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,4BAAA,CAA6B,IAAI,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,GAAA,GAAe;AAAA,IACnB,IAAA,EAAM,MAAA;AAAA,IACN,GAAIA,MAAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAAA,MAAAA,KAAU,EAAC;AAAA,IACvC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,QAAA,EAAS,GAAI;AAAC,GACzD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,SAAA;AACH,MAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,IAAW,UAAU,MAAA,EAAQ;AAC7D,QAAA,MAAA,CAAO,IAAA,GAAO,KAAA;AAAA,MAChB;AACA,MAAA;AAAA,IACF,KAAK,cAAA;AACH,MAAA,MAAA,CAAO,YAAA,GAAe,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,SAAS,KAAA,KAAU,GAAA;AACvE,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,OAAA,IAAW,UAAU,YAAA,EAAc;AACtE,QAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF,KAAK,WAAA;AAAA,IACL,KAAK,WAAA;AACH,MAAA,IAAI,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,QAAA,IAAY,UAAU,MAAA,EAAQ;AAClE,QAAA,MAAA,CAAO,SAAA,GAAY,KAAA;AAAA,MACrB;AACA,MAAA;AAAA,IACF,KAAK,YAAA;AAAA,IACL,KAAK,YAAA;AACH,MAAA,MAAA,CAAO,aACL,KAAA,KAAU,MAAA,GAAS,IAAA,GAAO,KAAA,KAAU,UAAU,KAAA,GAAQ,MAAA;AACxD,MAAA;AAAA,IACF,KAAK,aAAA;AAAA,IACL,KAAK,aAAA;AACH,MAAA,MAAA,CAAO,WAAA,GAAc,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,KAAA;AACnD,MAAA;AAAA,IACF;AACE,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,QAAA,CAAS,IAAA,EAAK;AAAA;AAEpC;AAMA,SAAS,6BAA6B,IAAA,EAA+B;AACnE,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAC;AACrB,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,MAAM,QAAQ,CAAA,IAAK,CAAA;AACnB,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,IAAA,EAAA,EAAQ;AACvC,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,IAAK,IAAA,IAAQ,CAAA,GAAK,CAAA,EAAG,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,WAC/B,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IACtB;AACA,IAAA,MAAM,QAAA,GAAW,SAAS,CAAC,CAAA;AAC3B,IAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,IAAA,MAAM,WAAA,GAAc,KAAK,QAAQ,CAAA;AACjC,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,EAAC;AAC1C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAACC,GAAAA,KAAO;AACtC,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,MAAM,CAAA,GAAI,KAAK,GAAG,CAAA;AAClB,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAA,IAAY,EAAC;AAC7B,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAASA,GAAE,GAAG,OAAO,KAAA;AAAA,MACjC;AACA,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,MAAM,CAAA,GAAI,KAAK,GAAG,CAAA;AAClB,QAAA,MAAM,IAAA,GAAO,CAAA,EAAG,QAAA,IAAY,EAAC;AAC7B,QAAA,IAAI,IAAA,CAAK,QAAA,CAASA,GAAE,CAAA,EAAG,OAAO,KAAA;AAAA,MAChC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAK,GAAG,CAAA;AAClB,MAAA,IAAI,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AAAA,IACzB;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,SAAS,MAAA,GAAS,CAAA;AAAA,MAC/C,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,OAAA;AAAQ,KACvC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;;;ACzZO,SAAS,yBAAA,CAA0B,EAAA,EAAY,EAAA,EAAY,CAAA,EAAmB;AACnF,EAAA,IAAI,EAAA,IAAM,CAAA,IAAK,EAAA,IAAM,CAAA,EAAG,OAAO,CAAA;AAC/B,EAAA,IAAI,CAAA,IAAK,EAAA,GAAK,EAAA,EAAI,OAAO,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,EAAA,IAAI,CAAA,IAAK,KAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,EAAG,OAAO,IAAA,CAAK,EAAA,GAAK,IAAA,GAAO,IAAA;AAEpD,EAAA,MAAM,KAAA,GAAA,CAAS,IAAI,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,KAAO,IAAI,CAAA,GAAI,EAAA,CAAA;AACrD,EAAA,MAAM,KAAA,GAAA,CAAS,IAAI,CAAA,GAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,KAAO,IAAI,CAAA,GAAI,EAAA,CAAA;AAErD,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACzC,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAEzC,EAAA,MAAM,GAAA,GAAA,CACH,CAAC,CAAA,GAAI,EAAA,GAAK,EAAA,KAAO,CAAA,GAAI,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA,GAAI,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA,GAAI,EAAA,GAAK,EAAA,CAAA;AAC7D,EAAA,MAAM,IAAI,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA;AAErC,EAAA,OAAO,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA;AACjE;AAQO,SAAS,sBAAA,CACd,EAAA,EACA,EAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,IAAA,GAAO,IAAA;AACjC,EAAA,IAAI,UAAU,OAAA,EAAS,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,EAAE,CAAA;AAC9C,EAAA,IAAI,MAAA,IAAU,CAAA,EAAG,OAAO,EAAA,GAAK,EAAA;AAE7B,EAAA,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AACzB,EAAA,IAAI,KAAK,EAAA,GAAK,EAAA;AAEd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,GAAA,GAAM,OAAO,EAAA,GAAK,EAAA,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,yBAAA,CAA0B,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAE/C,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,EAAA,GAAK,GAAA;AAAA,IACP,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,GAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,OAAO,OAAO,EAAA,GAAK,EAAA,CAAA;AACrB;AASO,SAAS,kBAAA,CACd,EAAA,EACA,EAAA,EACA,CAAA,EACA,cAAsB,GAAA,EACgB;AACtC,EAAA,MAAM,IAAI,CAAA,GAAI,WAAA;AACd,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAClC,EAAA,OAAO;AAAA,IACL,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,KAAA,EAAO,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,KAAA,EAAO,CAAA,EAAE;AAAA,IACrD,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,KAAA,EAAO,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,KAAA,EAAO,CAAA,EAAE;AAAA,IACrD,EAAE,EAAA,EAAI,GAAA,EAAK,IAAI,EAAA,EAAI,EAAA,GAAK,GAAG,CAAA;AAAE,GAC/B;AACF;AAYO,SAAS,mBAAA,CACd,EAAA,EACA,EAAA,EACA,CAAA,EACA,CAAA,EACsD;AAItD,EAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,EAAA,MAAM,KAAK,GAAA,GAAM,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,UAAU,GAAA,EAAI;AAAA,IACjE,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAK,GAAA,GAAM,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,UAAU,GAAA,EAAI;AAAA,IACvE,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAK,GAAA,GAAM,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,IAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,UAAU,EAAA,EAAG;AAAA,IACtE,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,UAAU,EAAA;AAAG,GAClE;AACF;AAIO,SAAS,aAAA,CAAc,CAAA,EAAe,CAAA,EAAW,CAAA,EAAoB;AAC1E,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,CAAE,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,CAAE,EAAA;AACjB,EAAA,OAAO,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACtC;AAEO,SAAS,cAAA,CAAe,CAAA,EAAgB,CAAA,EAAW,CAAA,EAAoB;AAC5E,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,CAAE,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,CAAE,EAAA;AACjB,EAAA,MAAM,GAAA,GAAO,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA;AACrC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA;AAEzB,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AAC3B,EAAA,OAAQ,EAAA,GAAK,EAAA,IAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,CAAA,GAAO,EAAA,GAAK,EAAA,IAAO,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,CAAA,IAAO,CAAA;AAClE;AAUO,SAAS,WAAW,CAAA,EAAoB;AAC7C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA,EAAE;AAChE;AAGO,SAAS,YAAY,CAAA,EAAqB;AAC/C,EAAA,MAAM,GAAA,GAAO,CAAA,CAAE,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA;AACrC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,GAAA;AAClB,EAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,GAAA;AAClB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,CAAC,GAAA;AACnB,EAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,GAAA;AAClB,EAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtC,EAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,IAAI,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,IAAI,EAAA,EAAG;AAC5D;AAEO,SAAS,UAAU,KAAA,EAAmB;AAC3C,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACxD,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,IAAA,IAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACrC,IAAA,IAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,GAAI,MAAM,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,GAAG,IAAA,GAAO,IAAA,EAAM,CAAA,EAAG,IAAA,GAAO,IAAA,EAAK;AAC5D;AAOO,SAAS,WAAW,IAAA,EAA4B;AACrD,EAAA,IAAI,IAAI,IAAA,KAAS,CAAA;AACjB,EAAA,OAAO,WAAoB;AACzB,IAAA,CAAA,GAAK,IAAI,UAAA,KAAgB,CAAA;AACzB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACnC,IAAA,CAAA,IAAK,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,CAAA,EAAI,IAAI,EAAE,CAAA;AACxC,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACpC,CAAA;AACF;AAsBO,SAAS,eACd,MAAA,EACA,OAAA,EACA,SACA,QAAA,GAAmB,GAAA,EACnB,OAAe,QAAA,EACC;AAChB,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,MAAM,WAA4C,EAAC;AACnD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,IAAA,KAAS,MAAA,CAAO,CAAA;AACrC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,IAAA,KAAS,MAAA,CAAO,CAAA;AACrC,IAAA,IAAI,EAAA,GAAK,IAAA;AACT,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAG;AACnB,QAAA,EAAA,GAAK,KAAA;AACL,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAG;AAClB,QAAA,EAAA,GAAK,KAAA;AACL,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,IAAA,EAAA;AACA,IAAA,IAAA,IAAQ,CAAA;AACR,IAAA,IAAA,IAAQ,CAAA;AACR,IAAA,IAAI,QAAA,CAAS,SAAS,GAAA,EAAK,QAAA,CAAS,KAAK,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,EACnD;AACA,EAAA,MAAM,IAAA,GAAQ,IAAA,GAAO,QAAA,GAAY,MAAA,CAAO,IAAI,MAAA,CAAO,CAAA;AACnD,EAAA,IAAI,IAAA,KAAS,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAK,EAAA,EAAI,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,QAAA,EAAS;AAC7D,EAAA,OAAO,EAAE,IAAI,IAAA,GAAO,IAAA,EAAM,IAAI,IAAA,GAAO,IAAA,EAAM,MAAM,QAAA,EAAS;AAC5D;;;ACpOA,IAAM,QAAA,GAAW,GAAA;AAEjB,IAAM,cAAA,GAAiB,GAAA;AAEvB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,MAAA,GAAS,GAAA;AAEf,IAAM,SAAA,GAAY,CAAA;AAElB,SAAS,WAAWF,KAAAA,EAAsB;AACxC,EAAA,OAAOA,KAAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAChC;AAEA,SAAS,aAAA,CACP,IACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EACA,EAAA,EACA,IACA,EAAA,EACS;AACT,EAAA,OACE,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,SAAA,IACf,KAAK,EAAA,GAAK,SAAA,GAAY,EAAA,IACtB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,SAAA,IACf,EAAA,GAAK,KAAK,SAAA,GAAY,EAAA;AAE1B;AASA,SAAS,eAAe,KAAA,EAA8B;AACpD,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,IAAA,MAAM,CAAA,GAAgB,KAAA;AACtB,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,KAAA;AAAA,MACA,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,MAClB,QAAQ,CAAC,CAAA,EAAG,MAAM,aAAA,CAAc,CAAA,EAAG,GAAG,CAAC;AAAA,KACzC;AAAA,EACF;AACA,EAAA,MAAM,CAAA,GAAiB,KAAA;AACvB,EAAA,OAAO;AAAA,IACL,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,KAAA;AAAA,IACA,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,IACnB,QAAQ,CAAC,CAAA,EAAG,MAAM,cAAA,CAAe,CAAA,EAAG,GAAG,CAAC;AAAA,GAC1C;AACF;AAYO,SAAS,WAAA,CAAY,KAAc,MAAA,EAA0C;AAClF,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,cAAc,CAAA;AACzC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAwB;AACzC,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAEzC,EAAA,MAAM,YAAA,GAAe,UAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAA,GAAI,YAAA,CAAa,CAAA,GAAI,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAA,GAAI,YAAA,CAAa,CAAA,GAAI,CAAA;AAEnD,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,QAAQ,cAAA,GAAiB,QAAA;AAGzC,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,SAAA,KAAc;AACzC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA;AACvE,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,GACpB,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAC,MAAA,CAAO,KAAK,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,IACjD,EAAC;AACL,IAAA,MAAM,MAAA,GAAS,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,OAAS,SAAA,GAAY,UAAA;AAClC,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,UAAS,GAAI,cAAA;AAAA,MACjC,MAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAMA,KAAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,IAAA,IAAI,CAACA,KAAAA,EAAM;AACX,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAChE,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,MAAA;AAAA,MACA,IAAA,EAAAA,KAAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,WAAWA,KAAI;AAAA,KACvB,CAAA;AAAA,EACH,CAAC,CAAA;AAID,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AACjE,EAAA,MAAM,iBAA2D,EAAC;AAClE,EAAA,MAAM,gBAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAA,CAAE,OAAO,OAAA,EAAS;AACpB,MAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,EAAA,GAAK,OAAA,GAAU,CAAA;AAC3B,IAAA,MAAM,WAAW,cAAA,CAAe,IAAA;AAAA,MAAK,CAAC,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG,KACzD,cAAc,CAAA,EAAG,CAAA,EAAG,EAAE,KAAA,EAAO,OAAA,EAAS,IAAI,EAAA,EAAI,CAAA,CAAE,OAAO,OAAO;AAAA,KAChE;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IACjC;AAAA,EACF;AAIA,EAAA,MAAM,kBAAA,GAAqB,cAAA;AAAA,IACzB,aAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAmC;AACzD,EAAA,KAAA,MAAW,EAAE,CAAA,EAAE,IAAK,cAAA,EAAgB;AAClC,IAAA,SAAA,CAAU,GAAA,CAAI,EAAE,MAAA,EAAQ;AAAA,MACtB,IAAA,EAAM,EAAE,MAAA,CAAO,IAAA;AAAA,MACf,OAAO,CAAA,CAAE,IAAA;AAAA,MACT,GAAG,CAAA,CAAE,EAAA;AAAA,MACL,GAAG,CAAA,CAAE,EAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,KAAA,MAAW,KAAK,kBAAA,EAAoB;AAClC,IAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,KAAK,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,MAAA,IAAU,IAAI,OAAA,EAAS;AAChC,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAC9B,IAAA,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,GAAA;AACT;AAWA,SAAS,cAAA,CACP,KAAA,EACA,EAAA,EACA,EAAA,EACA,MAAA,EACqB;AACrB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAGhC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,EAAA;AAClB,IAAA,MAAM,EAAA,GAAK,EAAE,EAAA,GAAK,EAAA;AAClB,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,KAAA,GAAQ,CAAA;AACrC,IAAA,OAAO,EAAE,GAAG,KAAA,EAAM;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAG1C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,EAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,EAAA;AAG/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,CAAK,EAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA,EAAG,IAAI,CAAA;AAC3E,EAAA,MAAM,QAAA,GAAW,kBAAA;AAAA,IACf,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,IAC5B;AAAA,GACF;AAEA,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,EAAE,CAAA,EAAE,GAAI,SAAA,CAAU,CAAC,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,OAAA;AACrB,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,OAAA;AACrB,IAAA,MAAM,SACJ,EAAA,GAAK,IAAA,GAAO,OAAA,GAAU,EAAA,GAAK,QAAQ,KAAA,GAAQ,QAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,EAAE,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,UAAU,EAAE,CAAA,EAAG,EAAE,EAAA,EAAI,CAAA,EAAG,EAAE,EAAA,EAAG;AAC3C,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,EAAE,MAAA,CAAO,IAAA;AAAA,QACf,OAAO,CAAA,CAAE,IAAA;AAAA,QACT,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAE,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAG;AAAA,QACnD;AAAA;AACF,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAOA,SAAS,kBAAA,CAAmB,QAAkB,MAAA,EAA0B;AACtE,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,EAAM;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAK,MAAA;AAC3B,IAAA,IAAI,IAAI,CAAC,CAAA,GAAK,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,YAAY,GAAA,CAAI,CAAC,CAAA,GAAK,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAC1C,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,IAAI,MAAA,GAAS,CAAC,IAAK,SAAA,EAAW;AACtD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAK,SAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAK,KAAA;AAAA,EAC1D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,MAAA,EAA4B;AACnD,EAAA,OAAO,kBAAkB,MAAM,CAAA;AACjC;AAEA,SAAS,UAAa,CAAA,EAA0B;AAC9C,EAAA,OAAO,CAAA,KAAM,MAAA;AACf;;;ACnPA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS,EAAA;AAAA,EACT,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAAA,EAC3C,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAI;AAAA,EAChD,QAAA,EAAU,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAAA,EAC3C,WAAA,EAAa,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA;AAC5B,CAAA;AAEO,SAAS,UAAA,CAAW,GAAA,EAAc,IAAA,GAAsB,EAAC,EAAqB;AACnF,EAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA;AACnB,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAC1C,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AACvC,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AACzC,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAExC,EAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B;AAEA,SAAS,WAAW,GAAA,EAAgC;AAClD,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ,OAAO,MAAA;AACvC,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,OAAA,EAAS,OAAO,OAAA;AAExC,EAAA,OAAO,GAAA,CAAI,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAC9C;AAIA,SAAS,YAAA,CAAa,KAAc,IAAA,EAAuC;AACzE,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,IAAS,GAAA;AACxB,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,IAAU,GAAA;AACzB,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAI,MAAA,EAAQ,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,EACpF;AACA,EAAA,MAAMG,UAAqB,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,GAAG,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,IAAI,CAAA,EAAE;AACrF,EAAA,MAAM,SAAsB,CAAC,EAAE,MAAM,QAAA,EAAU,GAAGA,SAAQ,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,IAAI,EAAE,CAAA;AAClF,EAAA,MAAM,SAA8B,MAAA,GAChC;AAAA,IACE;AAAA,MACE,IAAA,EAAM,CAAC,GAAA,CAAI,EAAE,CAAA;AAAA,MACb,KAAA,EAAO,kBAAkB,MAAM,CAAA;AAAA,MAC/B,GAAGA,OAAAA,CAAO,EAAA;AAAA,MACV,GAAGA,OAAAA,CAAO,EAAA;AAAA,MACV,QAAA,EAAU;AAAA;AACZ,MAEF,EAAC;AACL,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB;AAAA,MACE,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,GAAGA,OAAAA,CAAO,EAAA;AAAA,MACV,CAAA,EAAGA,OAAAA,CAAO,EAAA,GAAKA,OAAAA,CAAO,CAAA,GAAI,EAAA;AAAA,MAC1B,MAAA,EAAQ;AAAA;AACV,GACF;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,KAAM;AAAC,GACrE;AACF;AAIA,SAAS,SAAA,CAAU,KAAc,IAAA,EAAuC;AACtE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,QAAA,CAAS,OAAA;AACzC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,EAAA,GAAK,SAAS,QAAA,CAAS,CAAA;AAC3B,EAAA,IAAI,EAAA,GAAK,SAAS,QAAA,CAAS,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,SAAS,QAAA,CAAS,CAAA;AAE1B,EAAA,IAAI,GAAA,CAAI,OAAO,YAAA,EAAc;AAC3B,IAAA,MAAM,KAAA,GAAQ,wBAAwB,GAAG,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,YAAY,GAAA,EAAK,CAAC,KAAK,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC,CAAA;AAClD,IAAA,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AAC9B,IAAA,EAAA,GAAK,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AAC9B,IAAA,MAAM,WAAA,GAAe,KAAK,EAAA,GAAK,EAAA,GAAK,KAAM,IAAA,CAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAC9D,IAAA,CAAA,GAAI,sBAAA,CAAuB,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,OAAA;AACjC,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,SAAS,QAAA,CAAS,QAAA,CAAS,GAAG,MAAM,CAAA;AAC5D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,QAAA,CAAS,CAAA;AAE3C,EAAA,MAAM,GAAA,GAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AACtB,EAAA,MAAM,MAAM,GAAA,GAAM,CAAA;AAClB,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AAEf,EAAA,MAAM,OAAA,GAAoC;AAAA,IACxC,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,IAAI,GAAA,EAAK,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,IAClC,EAAE,IAAI,IAAA,CAAK,EAAA,EAAI,IAAI,GAAA,EAAK,EAAA,EAAI,GAAG,EAAA;AAAG,GACpC;AAEA,EAAA,MAAM,MAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,QAAA,EAAmB,GAAG,CAAA,EAAE,CAAE,CAAA;AAClF,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,QAAQ,QAAA,EAAkB;AAAA,IACrF,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA,CAAK,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,QAAQ,QAAA;AAAkB,GACvF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,KAAM;AAAC,GACrE;AACF;AAIA,SAAS,WAAA,CAAY,KAAc,IAAA,EAAuC;AACxE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,QAAA,CAAS,CAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,QAAA,CAAS,CAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,SAAS,QAAA,CAAS,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,SAAS,QAAA,CAAS,MAAA;AAGtC,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA;AAEnB,EAAA,IAAI,OAAA,GAAU,kBAAA,CAAmB,EAAA,EAAI,EAAA,EAAI,GAAG,WAAW,CAAA;AAEvD,EAAA,IAAI,GAAA,CAAI,OAAO,YAAA,EAAc;AAC3B,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,GAAA,EAAK,EAAA,EAAI,EAAE,CAAA;AACnD,IAAA,IAAI,UAAU,OAAA,GAAU,QAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,MAAA,GAAsB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAChD,IAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAmB,GAAG,CAAA,EAAG,IAAI,KAAA,EAAM;AAAA,EACpD,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACvC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,IAAK,QAAQ,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAkB;AAAA,IAC7E;AAEA,IAAA,MAAM,QAAQ,CAAA,KAAM,CAAA;AACpB,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAA,GAAA,CAAM,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AAAA,MAClD,CAAA,EAAG,KAAA,GAAQ,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,IAAI,EAAA,GAAK,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AAAA,MAC1C,MAAA,EAAS,KAAA,GAAQ,QAAA,GAAW,CAAA,KAAM,IAAI,KAAA,GAAQ;AAAA,KAChD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,KAAM;AAAC,GACrE;AACF;AAIA,SAAS,UAAA,CAAW,KAAc,IAAA,EAAuC;AACvE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,QAAA,CAAS,CAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,QAAA,CAAS,CAAA;AAC3C,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AAEnB,EAAA,MAAM,QAAA,GAAW,oBAAoB,EAAA,EAAI,EAAA,EAAI,SAAS,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA;AACrF,EAAA,MAAM,MAAA,GAAsB,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IAClD,IAAA,EAAM,SAAA;AAAA,IACN,GAAG,CAAA;AAAA,IACH,IAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE;AAAA,GAC3B,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,MAAM,YAAY,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACvC,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,OAAO,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAkB;AAAA,IAC7E;AACA,IAAA,MAAM,EAAA,GAAK,YAAY,CAAC,CAAA;AAExB,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA;AAC1B,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,GAAG,EAAA,CAAG,CAAA,IAAK,IAAA,GAAO,CAAA,GAAI,IAAI,EAAA,CAAG,CAAA,CAAA;AAAA,MAC7B,CAAA,EAAG,GAAG,CAAA,IAAK,CAAA,GAAI,MAAM,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA,CAAA;AAAA,MACrC,MAAA,EAAS,IAAA,GAAO,CAAA,GAAI,OAAA,GAAU;AAAA,KAChC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,KAAM;AAAC,GACrE;AACF;AAIA,SAAS,WAAA,CAAY,KAAc,IAAA,EAAuC;AACxE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,QAAA,CAAS,WAAA,CAAY,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,WAAA,CAAY,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,MAAA;AACnB,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,QAAQ,EAAC;AAAA,MACT,QAAQ,EAAC;AAAA,MACT,WAAW;AAAC,KACd;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,SAAA,EAAW;AAC/B,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU,OAAA,CAAQ,IAAI,GAAA,CAAI,IAAA,EAAM,IAAI,EAAE,CAAA;AACvD,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,UAAA,EAAY,aAAA,CAAc,GAAA,CAAI,QAAQ,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAC,CAAA;AAAA,EAC1E;AAGA,EAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAExE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwB;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA;AAEpC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,GAAI,UAAA,GAAa,EAAE,CAAA;AAC/E,EAAA,MAAM,SAAS,CAAA,GAAI,CAAA,GAAA,CAAM,KAAA,CAAM,MAAA,GAAS,KAAK,WAAA,GAAe,CAAA;AAC5D,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAQ,EAAA,EAAI,MAAA,GAAS,CAAA,GAAI,WAAA,EAAa,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAA,EAC5F,CAAC,CAAA;AAGD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC5C,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,GAAG,KAAK,EAAC;AACpC,IAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AACd,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,KAAA,KAAwB;AAC/D,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC1C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,SAAS,MAAA,CAAO,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,IAAI,IAAA,GAAO,GAAA,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AAEvB,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAA,GAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,CAAA,IAAK,MAAA,GAAS,GAAA;AAC/E,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACf,EAAA,EAAI,GAAA;AAAA,QACJ,EAAA,EAAI,OAAO,EAAA,GAAK,MAAA;AAAA,QAChB,EAAA,EAAI,OAAO,EAAA,IAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,CAAA,GAAI,CAAC,MAAA,GAAS,GAAA,CAAA;AAAA,QACjD,CAAA,EAAG;AAAA,OACJ,CAAA;AACD,MAAA,aAAA,CAAc,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH,CAAA;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,aAAA,CAAc,CAAA,EAAG,CAAC,CAAA;AAGzC,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,IAAA,EAAM;AACxB,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,IAAI,CAAA,CAAE,EAAA,EAAI,EAAA,EAAI,KAAA,GAAQ,IAAI,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA;AAChE,MAAA,KAAA,IAAS,GAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAsB,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC/C,IAAA,EAAM,QAAA;AAAA,IACN,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,KAAK,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,EAAG,GAAG,EAAA;AAAG,GACnE,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACpC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,IAAK,EAAE,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,EAAA,EAAI,CAAA,GAAI,CAAA,EAAG,GAAG,EAAA,EAAG;AAC7D,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,GAAG,CAAA,CAAE,EAAA;AAAA,MACL,CAAA,EAAG,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,CAAC,CAAA;AAKD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAI,GAAA,CAAI,KAAA,GAAQ,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,EAAG,KAAM;AAAC,GACrE;AACF;AAEA,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AAC7C,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACxC;AAIA,SAAS,wBAAwB,GAAA,EAAmC;AAElE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,KAAK,GAAA,CAAI,IAAA,MAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACzC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,KAAA,MAAW,GAAA,IAAO,EAAE,IAAA,EAAM;AACxB,MAAA,GAAA,CAAI,IAAI,GAAA,EAAA,CAAM,GAAA,CAAI,IAAI,GAAG,CAAA,IAAK,KAAK,GAAG,CAAA;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,CAAA,EAA8B;AAClD,EAAA,IAAI,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,MAAM,IAAA,KAAS,SAAA,EAAW,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA;AAC7E,EAAA,IAAI,EAAE,KAAA,CAAM,IAAA,KAAS,QAAQ,OAAO,CAAA,CAAE,MAAM,KAAA,CAAM,MAAA;AAClD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,KAAc,IAAA,EAA+B;AAEhE,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAI,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,IAAA,MAAM,GAAA,GAAM,CAAC,GAAG,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AACvC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,aAAa,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,sBAAA,CACP,GAAA,EACA,EAAA,EACA,EAAA,EAC6C;AAC7C,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,IAAQ,CAAC,MAAM,OAAO,IAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,wBAAwB,GAAG,CAAA;AACzC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACjC,EAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA;AACjC,EAAA,IAAI,MAAM,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,IAAM,GAAG,OAAO,IAAA;AAI1C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,GAAA;AACd,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,KAAA,GAAQ,KAAA;AACnC,EAAA,MAAM,UAAU,QAAA,GAAW,OAAA;AAC3B,EAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAM,EAAA,GAAK,OAAA,GAAW,KAAK,EAAE,CAAA;AAC7C,EAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAM,EAAA,GAAK,OAAA,GAAW,KAAK,EAAE,CAAA;AAC7C,EAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAM,EAAA,GAAK,OAAA,GAAW,KAAK,EAAE,CAAA;AAG7C,EAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAK,CAAC,KAAK,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAK,CAAC,KAAK,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAK,CAAC,KAAK,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,CAAA;AAEpD,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,EAAA,EAAI,EAAA,EAAI,MAAM,OAAO,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,EAAA,EAAI,EAAA,EAAI,MAAM,OAAO,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,EAAA,EAAI,EAAA,EAAI,MAAM,OAAO,CAAA;AAGxD,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,GAAM,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,GAAM,GAAA;AACtB,EAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,EAAA,MAAM,EAAA,GAAK,EAAA;AAEX,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACvC,EAAA,IAAI,GAAA,GAAM,MAAM,OAAO,IAAA;AACvB,EAAA,MAAM,KAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA,GAAM,QAAQ,CAAA,GAAI,GAAA,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,CAAA,GAAI,CAAA;AAC5B,EAAA,MAAM,IAAI,GAAA,GAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,EAAA,GAAM,CAAA,GAAI,EAAA,GAAM,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAM,CAAA,GAAI,EAAA,GAAM,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAM,CAAA,GAAI,EAAA,GAAM,GAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAM,CAAA,GAAI,EAAA,GAAM,GAAA;AAG3B,EAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAC9B,EAAA,MAAM,OAAO,EAAA,GAAK,IAAA;AAClB,EAAA,MAAM,OAAO,EAAA,GAAK,IAAA;AAClB,EAAA,OAAO;AAAA,IACL,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,CAAA,EAAG,EAAA,EAAG;AAAA,IACnD,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,CAAA,EAAG,EAAA,EAAG;AAAA,IACnD,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,EAAA,EAAI,EAAA,GAAK,IAAA,EAAM,CAAA,EAAG,EAAA;AAAG,GACrD;AACF;AAIO,SAAS,kBAAkB,CAAA,EAAuB;AACvD,EAAA,QAAQ,CAAA,CAAE,MAAM,IAAA;AAAM,IACpB,KAAK,SAAA;AACH,MAAA,OAAO,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7B,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA;AAAA,IACzB,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,KAAA,CAAM,KAAA;AAAA,IACjB,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,CAAE,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAChC,KAAK,MAAA;AACH,MAAA,OAAO,EAAA;AAAA;AAEb;;;ACrdA,SAAS,UAAU,KAAA,EAA4D;AAC7E,EAAA,OAAOD,oBAAA,CAAG,WAAW,KAAK,CAAA;AAC5B;AAEA,SAAS,OAAO,EAAA,EAAoB;AAClC,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA;AAC1C;AAEA,SAAS,SAAS,MAAA,EAAqD;AACrE,EAAA,OAAO;AAAA,8BAAA,EACuB,OAAO,EAAE,CAAA;AAAA,yDAAA,EACkB,OAAO,IAAI,CAAA;AAAA,8BAAA,EACtC,OAAO,aAAa,CAAA;AAAA;AAAA;AAAA,4DAAA,EAGU,OAAO,IAAI,CAAA;AAAA,yDAAA,EACd,OAAO,cAAc,CAAA;AAAA,kEAAA,EACZ,OAAO,cAAc,CAAA;AAAA,iCAAA,EACtD,OAAO,eAAe,CAAA;AAAA,mCAAA,EACpB,OAAO,eAAe,CAAA;AAAA,CAAA,CACzD,IAAA,EAAK;AACP;AAEA,SAAS,WAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACA,SACA,QAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,yCAAyC,KAAK,CAAA,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAaD,uBAAA,CAAQ,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,IAAA,OAAOC,oBAAA;AAAA,MACL,GAAA;AAAA,MACA,EAAE,KAAA,EAAO,CAAA,kDAAA,EAAqD,KAAK,CAAA,CAAA,EAAG;AAAA,MACtE;AAAA,QACEC,wBAAA,CAAS;AAAA,UACP,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,GAAG,KAAA,CAAM,CAAA;AAAA,UACT,KAAA,EAAO,OAAA;AAAA,UACP,IAAA,EAAM,KAAA;AAAA,UACN,cAAA,EAAgB,OAAA;AAAA,UAChB,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,EAAE;AAAA,SAC/B,CAAA;AAAA,QACD;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,OAAOD,oBAAA;AAAA,IACL,GAAA;AAAA,IACA,EAAE,KAAA,EAAO,CAAA,kDAAA,EAAqD,KAAK,CAAA,CAAA,EAAG;AAAA,IACtE;AAAA,MACE,SAAA,CAAU;AAAA,QACR,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,SAAA,EAAW,UAAU,KAAA,CAAM,QAAQ,IAAI,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,EAAE,CAAA,CAAA,CAAA;AAAA,QAC3D,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,KAAA;AAAA,QACN,cAAA,EAAgB,OAAA;AAAA,QAChB,aAAA,EAAe,MAAA,CAAO,KAAA,CAAM,EAAE;AAAA,OAC/B,CAAA;AAAA,MACD;AAAA;AACF,GACF;AACF;AAEO,SAAS,aAAA,CACd,GAAA,EACA,OAAA,GAA8B,EAAC,EACvB;AACR,EAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,EAAA,OAAO,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AAC9C;AAEO,SAAS,gBAAA,CACd,GAAA,EACA,MAAA,EACA,OAAA,GAA8B,EAAC,EACvB;AACR,EAAA,MAAM,MAAA,GAASE,kCAAA,CAAiB,OAAA,CAAQ,KAAA,IAAS,SAAS,CAAA;AAC1D,EAAA,MAAM,cAAA,GACJ,IAAI,MAAA,CAAO,SAAA,KAAc,SAAS,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,aAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAG3B,EAAA,MAAM,SAAS,MAAA,CAAO,aAAA;AACtB,EAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AAC/C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,SAAS,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAM,CAAA,IAAK,SAAA;AACjE,IAAA,OAAO,WAAA,CAAY,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,cAAA,EAAgB,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,IAAS,KAAA,CAAM,EAAE,CAAA;AAAA,EAC3F,CAAC,CAAA;AAED,EAAA,MAAM,WAAA,GAAcC,uBAAA;AAAA,IAClB;AAAA,MACE,KAAA,EAAO,yBAAyB,cAAA,KAAmB,MAAA,GAAS,wBAAwB,cAAc,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK;AAAA,MACjH,GAAI,mBAAmB,MAAA,GAAS,EAAE,OAAO,CAAA,gBAAA,EAAmB,cAAc,CAAA,CAAA,EAAG,GAAI;AAAC,KACpF;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAO,SAAA,CAAU,GAAA;AAAA,IAAI,CAAC,CAAA,KACxCL,sBAAA;AAAA,MACE;AAAA,QACE,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,KAAA,EAAO,yBAAA;AAAA,QACP,eAAe,CAAA,CAAE;AAAA,OACnB;AAAA,MACA,CAAA,CAAE;AAAA;AACJ,GACF;AAGA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,GACd,oDAAA,GACA,sBAAA;AACJ,IAAA,QAAA,CAAS,IAAA;AAAA,MACPA,sBAAA;AAAA,QACE;AAAA,UACE,GAAG,KAAA,CAAM,CAAA;AAAA,UACT,GAAG,KAAA,CAAM,CAAA;AAAA,UACT,KAAA,EAAO,GAAA;AAAA,UACP,aAAA,EAAe,MAAM,MAAA,IAAU,QAAA;AAAA,UAC/B,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA,SACpC;AAAA,QACA,KAAA,CAAM;AAAA;AACR,KACF;AACA,IAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,EAAQ;AAClC,MAAA,SAAA,CAAU,IAAA;AAAA,QACRM,sBAAA,CAAO;AAAA,UACL,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,MAAA,CAAO,EAAE,IAAI,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,GAAA,EAAM,MAAM,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,EAAE,CAAA,CAAA;AAAA,UAClF,KAAA,EAAO,uBAAA;AAAA,UACP,aAAA,EAAe;AAAA,SAChB;AAAA,OACH;AACA,MAAA,SAAA,CAAU,IAAA;AAAA,QACRH,wBAAA,CAAS;AAAA,UACP,EAAA,EAAI,MAAM,MAAA,CAAO,EAAA;AAAA,UACjB,EAAA,EAAI,MAAM,MAAA,CAAO,EAAA;AAAA,UACjB,CAAA,EAAG,GAAA;AAAA,UACH,KAAA,EAAO,2BAAA;AAAA,UACP,aAAA,EAAe;AAAA,SAChB;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,OAAO,KAAA,GACtBH,sBAAA;AAAA,IACE;AAAA,MACE,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA;AAAA,MAChB,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA;AAAA,MAChB,KAAA,EAAO,sBAAA;AAAA,MACP,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,OAAO,KAAA,CAAM;AAAA,GACf,GACA,EAAA;AAEJ,EAAA,MAAM,eAAA,GAAkB,IAAI,OAAA,CAAQ,MAAA;AACpC,EAAA,MAAM,WAAA,GACJ,CAAA,kBAAA,EAAqB,GAAA,CAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,EAAK,GAAA,CAAI,IAAA,CAAK,MAAM,UAAU,eAAe,CAAA,SAAA,CAAA;AAEtG,EAAA,MAAM,IAAA,GAAO;AAAA,IACXC,uBAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,cAAc,CAAA;AAAA,IACnCM,uBAAO,WAAW,CAAA;AAAA,IAClBL,oBAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG,CAAA;AAAA,IACnB,UAAA;AAAA,IACA,WAAA;AAAA,IACAG,uBAAA,CAAM,EAAE,KAAA,EAAO,wBAAA,IAA4B,SAAS,CAAA;AAAA,IACpDA,uBAAA,CAAM,EAAE,KAAA,EAAO,0BAAA,IAA8B,WAAW,CAAA;AAAA,IACxDA,uBAAA,CAAM,EAAE,KAAA,EAAO,uBAAA,IAA2B,QAAQ;AAAA,GACpD;AAEA,EAAA,OAAOG,yBAAA;AAAA,IACL;AAAA,MACE,SAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAAA,MAC7C,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACR;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,UAAA,CAAWR,KAAAA,EAAc,OAAA,GAA8B,EAAC,EAAW;AACjF,EAAA,MAAM,GAAA,GAAM,aAAaA,KAAI,CAAA;AAC7B,EAAA,OAAO,aAAA,CAAc,KAAK,OAAO,CAAA;AACnC;;;AC9NO,IAAM,IAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,MAAA;AAAA,EACN,OAAOA,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,MAAM,CAAA;AAAA,EAChC,CAAA;AAAA,EACA,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,OAAO,WAAWA,KAAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClD;AACF","file":"chunk-3FTUWAXK.cjs","sourcesContent":["/**\n * Venn / Euler DSL parser (hand-written recursive descent).\n *\n * Accepts four DSL modes (see 15-VENN-STANDARD §5):\n * 1. Declarative set + intersection: `A & B : 42`\n * 2. Enumeration shorthand: `A = { 1, 2, 3 }`\n * 3. Region-labeled: `region A & B : \"...\"`\n * 4. Euler-explicit: `dogs subset mammals`\n *\n * All four can be mixed within one document (except enumeration sets imply\n * automatic intersections and shouldn't be combined with explicit `A & B :`).\n */\n\nimport type {\n VennAST,\n VennConfig,\n VennEulerRelation,\n VennEulerRelationType,\n VennRegion,\n VennRegionValue,\n VennSet,\n} from \"../../core/types\";\n\nexport class VennParseError extends Error {\n constructor(message: string, public readonly line?: number) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"VennParseError\";\n }\n}\n\nconst DEFAULT_CONFIG: VennConfig = {\n mode: \"auto\",\n proportional: false,\n palette: \"default\",\n blendMode: \"multiply\",\n showCounts: \"auto\",\n showPercent: false,\n};\n\nfunction stripComment(line: string): string {\n // Comments start at first unquoted '#'.\n let inQuote = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (ch === \"#\" && !inQuote) return line.slice(0, i);\n }\n return line;\n}\n\nfunction stripQuotes(s: string): string {\n const t = s.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction parseConfigProps(text: string): Record<string, string> {\n // Split on commas that are not inside quotes or brackets.\n const out: Record<string, string> = {};\n let depth = 0;\n let inQuote = false;\n let buf = \"\";\n const parts: string[] = [];\n for (const ch of text) {\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && (ch === \"[\" || ch === \"(\" || ch === \"{\")) depth++;\n else if (!inQuote && (ch === \"]\" || ch === \")\" || ch === \"}\")) depth--;\n if (ch === \",\" && depth === 0 && !inQuote) {\n parts.push(buf);\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf.trim()) parts.push(buf);\n for (const p of parts) {\n const idx = p.indexOf(\":\");\n if (idx < 0) continue;\n const k = p.slice(0, idx).trim();\n const v = p.slice(idx + 1).trim();\n out[k] = stripQuotes(v);\n }\n return out;\n}\n\nfunction parseTitleAndProps(rest: string): { title?: string; props: Record<string, string> } {\n // Matches: \"title\" [k: v, k2: v2] or \"title\" or [k: v]\n const trimmed = rest.trim();\n let i = 0;\n let title: string | undefined;\n if (trimmed.startsWith('\"')) {\n const end = trimmed.indexOf('\"', 1);\n if (end < 0) throw new VennParseError(\"unterminated quoted title\");\n title = trimmed.slice(1, end);\n i = end + 1;\n }\n const tail = trimmed.slice(i).trim();\n let props: Record<string, string> = {};\n if (tail.startsWith(\"[\") && tail.endsWith(\"]\")) {\n props = parseConfigProps(tail.slice(1, -1));\n }\n return { title, props };\n}\n\nfunction parseValue(raw: string): VennRegionValue {\n const t = raw.trim();\n if (!t) return { kind: \"none\" };\n // List: [ ... ]\n if (t.startsWith(\"[\") && t.endsWith(\"]\")) {\n const inner = t.slice(1, -1).trim();\n if (!inner) return { kind: \"list\", value: [] };\n const items = splitTopLevelCommas(inner).map((x) => stripQuotes(x.trim()));\n return { kind: \"list\", value: items };\n }\n // Percentage\n if (/^-?\\d+(\\.\\d+)?%$/.test(t)) {\n return { kind: \"percent\", value: parseFloat(t.slice(0, -1)) };\n }\n // Integer\n if (/^-?\\d+$/.test(t)) {\n return { kind: \"integer\", value: parseInt(t, 10) };\n }\n // Quoted string\n if (t.startsWith('\"') && t.endsWith('\"')) {\n return { kind: \"text\", value: t.slice(1, -1) };\n }\n // Bare word / text\n return { kind: \"text\", value: t };\n}\n\nfunction splitTopLevelCommas(s: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && (ch === \"{\" || ch === \"[\" || ch === \"(\")) depth++;\n else if (!inQuote && (ch === \"}\" || ch === \"]\" || ch === \")\")) depth--;\n if (ch === \",\" && depth === 0 && !inQuote) {\n out.push(buf);\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf.length > 0) out.push(buf);\n return out;\n}\n\nconst EULER_KEYWORDS: Record<string, VennEulerRelationType> = {\n subset: \"subset\",\n disjoint: \"disjoint\",\n overlap: \"overlap\",\n};\n\nfunction parseRegionKey(\n text: string,\n knownSets: Set<string>\n): { sets: string[]; only: boolean } {\n const trimmed = text.trim();\n // \"A only\"\n const onlyMatch = /^([A-Za-z][\\w-]*)\\s+only$/i.exec(trimmed);\n if (onlyMatch && onlyMatch[1]) {\n const id = onlyMatch[1];\n if (!knownSets.has(id)) {\n throw new VennParseError(`unknown set id \"${id}\" in region key`);\n }\n return { sets: [id], only: true };\n }\n // \"A & B & C\"\n const parts = trimmed.split(\"&\").map((p) => p.trim()).filter(Boolean);\n if (parts.length === 0) {\n throw new VennParseError(`empty region key: \"${text}\"`);\n }\n for (const p of parts) {\n if (!/^[A-Za-z][\\w-]*$/.test(p)) {\n throw new VennParseError(`invalid set ref \"${p}\" in region key`);\n }\n if (!knownSets.has(p)) {\n throw new VennParseError(`unknown set id \"${p}\" in region key`);\n }\n }\n // Canonicalise by keeping declaration order (caller normalises later).\n return { sets: [...parts], only: false };\n}\n\nexport function parseVennDSL(input: string): VennAST {\n const lines = input.split(/\\r?\\n/);\n let title: string | undefined;\n let headerSeen = false;\n const config: VennConfig = { ...DEFAULT_CONFIG };\n const sets: VennSet[] = [];\n const setsById = new Map<string, VennSet>();\n const regions: VennRegion[] = [];\n const relations: VennEulerRelation[] = [];\n const metadata: Record<string, string> = {};\n\n const knownSetIds = new Set<string>();\n\n const applyConfigProps = (props: Record<string, string>): void => {\n for (const [k, v] of Object.entries(props)) {\n applyConfig(k, v, config, metadata);\n }\n };\n\n for (let i = 0; i < lines.length; i++) {\n const raw = stripComment(lines[i] ?? \"\").trim();\n if (!raw) continue;\n const lineNo = i + 1;\n\n // Header: `venn \"Title\"` or `venn: \"Title\"` (optionally with [props])\n if (!headerSeen && /^venn\\b/i.test(raw)) {\n const rest = raw.replace(/^venn\\s*:?\\s*/i, \"\");\n const { title: t, props } = parseTitleAndProps(rest);\n if (t !== undefined) title = t;\n applyConfigProps(props);\n headerSeen = true;\n continue;\n }\n\n // config: key = value\n const configMatch = /^config\\s*:\\s*([a-zA-Z_]+)\\s*=\\s*(.+)$/.exec(raw);\n if (configMatch && configMatch[1] && configMatch[2]) {\n applyConfig(configMatch[1], configMatch[2].trim(), config, metadata);\n continue;\n }\n\n // layout <venn|euler|auto>\n const layoutMatch = /^layout\\s+(venn|euler|auto)\\s*$/i.exec(raw);\n if (layoutMatch && layoutMatch[1]) {\n config.mode = layoutMatch[1].toLowerCase() as VennConfig[\"mode\"];\n continue;\n }\n\n // set <id> \"label\" [props?]\n const setMatch = /^set\\s+([A-Za-z][\\w-]*)\\s+(.+)$/i.exec(raw);\n if (setMatch && setMatch[1] && setMatch[2]) {\n const id = setMatch[1];\n const rest = setMatch[2];\n const { title: label, props } = parseTitleAndProps(rest);\n if (setsById.has(id)) {\n throw new VennParseError(`duplicate set id \"${id}\"`, lineNo);\n }\n const color = props[\"color\"] ?? props[\"fill\"];\n const setObj: VennSet = { id, label: label ?? id, color };\n sets.push(setObj);\n setsById.set(id, setObj);\n knownSetIds.add(id);\n continue;\n }\n\n // Enumeration: ID = { ... }\n const enumMatch = /^([A-Za-z][\\w-]*)\\s*=\\s*\\{([^}]*)\\}\\s*$/.exec(raw);\n if (enumMatch && enumMatch[1] !== undefined && enumMatch[2] !== undefined) {\n const id = enumMatch[1];\n const items = splitTopLevelCommas(enumMatch[2])\n .map((x) => stripQuotes(x.trim()))\n .filter((x) => x.length > 0);\n let setObj = setsById.get(id);\n if (!setObj) {\n setObj = { id, label: id, elements: items };\n sets.push(setObj);\n setsById.set(id, setObj);\n knownSetIds.add(id);\n } else {\n setObj.elements = items;\n }\n continue;\n }\n\n // Euler relation: ID subset ID | ID in ID | ID disjoint ID | ID overlap ID\n const eulerMatch = /^([A-Za-z][\\w-]*)\\s+(subset|in|disjoint|overlap)\\s+([A-Za-z][\\w-]*)\\s*$/i.exec(\n raw\n );\n if (eulerMatch && eulerMatch[1] && eulerMatch[2] && eulerMatch[3]) {\n const from = eulerMatch[1];\n const relRaw = eulerMatch[2].toLowerCase();\n const rel = relRaw === \"in\" ? \"subset\" : relRaw;\n const to = eulerMatch[3];\n if (!knownSetIds.has(from)) {\n throw new VennParseError(`unknown set \"${from}\" in relation`, lineNo);\n }\n if (!knownSetIds.has(to)) {\n throw new VennParseError(`unknown set \"${to}\" in relation`, lineNo);\n }\n const relType = EULER_KEYWORDS[rel];\n if (!relType) {\n throw new VennParseError(`unknown relation \"${rel}\"`, lineNo);\n }\n relations.push({ from, to, type: relType });\n continue;\n }\n\n // Region syntax: [region ]<key> : <value> [props?]\n let regionBody = raw;\n if (/^region\\s+/i.test(regionBody)) {\n regionBody = regionBody.replace(/^region\\s+/i, \"\");\n }\n const colonIdx = regionBody.indexOf(\":\");\n if (colonIdx > 0) {\n const keyPart = regionBody.slice(0, colonIdx);\n const valuePart = regionBody.slice(colonIdx + 1).trim();\n try {\n const { sets: regionSets, only } = parseRegionKey(keyPart, knownSetIds);\n const value = parseValue(valuePart);\n regions.push({ sets: regionSets, only, value });\n continue;\n } catch (e) {\n if (e instanceof VennParseError) {\n throw new VennParseError(e.message, lineNo);\n }\n throw e;\n }\n }\n\n throw new VennParseError(`could not parse line: \"${raw}\"`, lineNo);\n }\n\n if (!headerSeen && sets.length === 0) {\n throw new VennParseError(\"empty or missing 'venn' header\");\n }\n\n // Auto-derive regions for enumeration sets when no explicit regions were given.\n const hasEnumeration = sets.some((s) => s.elements !== undefined);\n if (hasEnumeration && regions.length === 0) {\n regions.push(...deriveRegionsFromEnumeration(sets));\n }\n\n const ast: VennAST = {\n type: \"venn\",\n ...(title !== undefined ? { title } : {}),\n sets,\n regions,\n relations,\n config,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n return ast;\n}\n\nfunction applyConfig(\n key: string,\n rawValue: string,\n config: VennConfig,\n metadata: Record<string, string>\n): void {\n const value = rawValue.trim().toLowerCase();\n switch (key) {\n case \"diagram\":\n if (value === \"venn\" || value === \"euler\" || value === \"auto\") {\n config.mode = value;\n }\n return;\n case \"proportional\":\n config.proportional = value === \"true\" || value === \"yes\" || value === \"1\";\n return;\n case \"palette\":\n if (value === \"default\" || value === \"brand\" || value === \"monochrome\") {\n config.palette = value;\n }\n return;\n case \"blendMode\":\n case \"blendmode\":\n if (value === \"multiply\" || value === \"screen\" || value === \"none\") {\n config.blendMode = value;\n }\n return;\n case \"showCounts\":\n case \"showcounts\":\n config.showCounts =\n value === \"true\" ? true : value === \"false\" ? false : \"auto\";\n return;\n case \"showPercent\":\n case \"showpercent\":\n config.showPercent = value === \"true\" || value === \"yes\";\n return;\n default:\n metadata[key] = rawValue.trim();\n }\n}\n\n/**\n * Build the full set of non-empty regions from enumeration-style sets by\n * computing every possible intersection of actual elements.\n */\nfunction deriveRegionsFromEnumeration(sets: VennSet[]): VennRegion[] {\n const n = sets.length;\n if (n === 0) return [];\n const regions: VennRegion[] = [];\n const total = 1 << n;\n for (let mask = 1; mask < total; mask++) {\n const included: number[] = [];\n const excluded: number[] = [];\n for (let i = 0; i < n; i++) {\n if ((mask >> i) & 1) included.push(i);\n else excluded.push(i);\n }\n const firstIdx = included[0];\n if (firstIdx === undefined) continue;\n const firstSetObj = sets[firstIdx];\n if (!firstSetObj) continue;\n const firstSet = firstSetObj.elements ?? [];\n const members = firstSet.filter((el) => {\n for (const idx of included) {\n const s = sets[idx];\n const list = s?.elements ?? [];\n if (!list.includes(el)) return false;\n }\n for (const idx of excluded) {\n const s = sets[idx];\n const list = s?.elements ?? [];\n if (list.includes(el)) return false;\n }\n return true;\n });\n if (members.length === 0) continue;\n const setIds: string[] = [];\n for (const idx of included) {\n const s = sets[idx];\n if (s) setIds.push(s.id);\n }\n regions.push({\n sets: setIds,\n only: excluded.length > 0 && included.length < n,\n value: { kind: \"list\", value: members },\n });\n }\n return regions;\n}\n","/**\n * Pure geometry helpers for Venn / Euler diagrams.\n *\n * Zero dependencies; analytic formulas where possible plus Monte Carlo\n * integration used as a fallback for 3-circle region areas.\n *\n * All functions here are side-effect-free and tested in geometry.test.ts.\n */\n\nimport type { VennCircle, VennEllipse } from \"../../core/types\";\n\n// ─── Two-circle helpers ──────────────────────────────────────\n\n/**\n * Lens area (intersection) of two circles separated by distance d.\n * Returns:\n * - 0 if circles are disjoint (d >= rA + rB)\n * - π·min(rA,rB)² if one circle contains the other (d <= |rA-rB|)\n * - otherwise the analytic two-circle lens area.\n */\nexport function twoCircleIntersectionArea(rA: number, rB: number, d: number): number {\n if (rA <= 0 || rB <= 0) return 0;\n if (d >= rA + rB) return 0;\n const rMin = Math.min(rA, rB);\n if (d <= Math.abs(rA - rB)) return Math.PI * rMin * rMin;\n\n const aTerm = (d * d + rA * rA - rB * rB) / (2 * d * rA);\n const bTerm = (d * d + rB * rB - rA * rA) / (2 * d * rB);\n // Clamp to avoid NaN from float slop.\n const a = Math.max(-1, Math.min(1, aTerm));\n const b = Math.max(-1, Math.min(1, bTerm));\n\n const kSq =\n (-d + rA + rB) * (d + rA - rB) * (d - rA + rB) * (d + rA + rB);\n const k = kSq > 0 ? Math.sqrt(kSq) : 0;\n\n return rA * rA * Math.acos(a) + rB * rB * Math.acos(b) - 0.5 * k;\n}\n\n/**\n * Newton-Raphson invert: find the distance d such that\n * `twoCircleIntersectionArea(rA, rB, d) == target`.\n * Returns a d in [|rA-rB|, rA+rB]. If target >= min-disc area, returns |rA-rB|.\n * If target <= 0, returns rA+rB.\n */\nexport function solveTwoCircleDistance(\n rA: number,\n rB: number,\n target: number\n): number {\n const rMin = Math.min(rA, rB);\n const maxArea = Math.PI * rMin * rMin;\n if (target >= maxArea) return Math.abs(rA - rB);\n if (target <= 0) return rA + rB;\n\n let lo = Math.abs(rA - rB);\n let hi = rA + rB;\n // Bisection — robust, ~40 iterations gets 1e-12 precision.\n for (let i = 0; i < 60; i++) {\n const mid = 0.5 * (lo + hi);\n const a = twoCircleIntersectionArea(rA, rB, mid);\n // area is monotone decreasing in d\n if (a > target) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return 0.5 * (lo + hi);\n}\n\n// ─── Three-circle classic coordinates ───────────────────────\n\n/**\n * Three circle canonical layout — circles of radius r, centers on an equilateral\n * triangle whose edge length equals the center offset `o`. With o = r·0.6 the\n * central triple region is ~r·0.15 wide (VennDiagram R convention).\n */\nexport function threeCircleClassic(\n cx: number,\n cy: number,\n r: number,\n offsetScale: number = 0.6\n): [VennCircle, VennCircle, VennCircle] {\n const o = r * offsetScale;\n const cos30 = Math.cos(Math.PI / 6);\n const sin30 = Math.sin(Math.PI / 6);\n return [\n { id: \"0\", cx: cx - o * cos30, cy: cy + o * sin30, r },\n { id: \"1\", cx: cx + o * cos30, cy: cy + o * sin30, r },\n { id: \"2\", cx, cy: cy - o, r },\n ];\n}\n\n// ─── Four-ellipse standard arrangement ──────────────────────\n\n/**\n * Classic Venn 4-ellipse arrangement following Ruskey & Weston 2005.\n * Returns 4 congruent ellipses arranged symmetrically so all 15 non-empty\n * intersection regions exist.\n *\n * Layout uses rotation angles at -65°, -35°, 35°, 65° from the horizontal,\n * with a modest vertical bias to spread overlaps readably.\n */\nexport function fourEllipseStandard(\n cx: number,\n cy: number,\n a: number,\n b: number\n): [VennEllipse, VennEllipse, VennEllipse, VennEllipse] {\n // Based on Venn's original 1881 construction; coords ported from venn.js Venn4.\n // Offsets are a fraction of the semi-major axis. These constants produce all\n // 15 regions for the standard a:b ≈ 2:1 aspect.\n const dx = 0.18 * a;\n const dy = 0.1 * b;\n\n return [\n { id: \"0\", cx: cx - dx, cy: cy - dy, rx: a, ry: b, rotation: -65 },\n { id: \"1\", cx: cx - 0.6 * dx, cy: cy - dy, rx: a, ry: b, rotation: -35 },\n { id: \"2\", cx: cx + 0.6 * dx, cy: cy - dy, rx: a, ry: b, rotation: 35 },\n { id: \"3\", cx: cx + dx, cy: cy - dy, rx: a, ry: b, rotation: 65 },\n ];\n}\n\n// ─── Point-in-shape tests ────────────────────────────────────\n\nexport function pointInCircle(c: VennCircle, x: number, y: number): boolean {\n const dx = x - c.cx;\n const dy = y - c.cy;\n return dx * dx + dy * dy <= c.r * c.r;\n}\n\nexport function pointInEllipse(e: VennEllipse, x: number, y: number): boolean {\n const dx = x - e.cx;\n const dy = y - e.cy;\n const rad = (e.rotation * Math.PI) / 180;\n const cos = Math.cos(-rad);\n const sin = Math.sin(-rad);\n // Rotate (dx, dy) back into the unrotated frame.\n const rx = dx * cos - dy * sin;\n const ry = dx * sin + dy * cos;\n return (rx * rx) / (e.rx * e.rx) + (ry * ry) / (e.ry * e.ry) <= 1;\n}\n\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Axis-aligned bounding box of a circle. */\nexport function circleBBox(c: VennCircle): Box {\n return { x: c.cx - c.r, y: c.cy - c.r, w: 2 * c.r, h: 2 * c.r };\n}\n\n/** Axis-aligned bounding box of an (optionally rotated) ellipse. */\nexport function ellipseBBox(e: VennEllipse): Box {\n const rad = (e.rotation * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const ux = e.rx * cos;\n const uy = e.rx * sin;\n const vx = e.ry * -sin;\n const vy = e.ry * cos;\n const hx = Math.sqrt(ux * ux + vx * vx);\n const hy = Math.sqrt(uy * uy + vy * vy);\n return { x: e.cx - hx, y: e.cy - hy, w: 2 * hx, h: 2 * hy };\n}\n\nexport function unionBBox(boxes: Box[]): Box {\n if (boxes.length === 0) return { x: 0, y: 0, w: 0, h: 0 };\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const b of boxes) {\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n if (b.x + b.w > maxX) maxX = b.x + b.w;\n if (b.y + b.h > maxY) maxY = b.y + b.h;\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n}\n\n// ─── Deterministic sampling-based region centroid / area ─────\n\n/**\n * Rough pseudorandom generator seeded for deterministic tests. Mulberry32.\n */\nexport function mulberry32(seed: number): () => number {\n let a = seed >>> 0;\n return function (): number {\n a = (a + 0x6d2b79f5) >>> 0;\n let t = a;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nexport interface CentroidResult {\n /** Centroid x. NaN when area = 0. */\n cx: number;\n /** Centroid y. NaN when area = 0. */\n cy: number;\n /** Approximate area (square pixels). */\n area: number;\n /** Samples that landed inside the region (for leader fallback). */\n interior: Array<{ x: number; y: number }>;\n}\n\n/**\n * Monte Carlo centroid + area over a region defined by \"must be inside these\n * shapes AND not inside those shapes\". Uniform sampling inside `bounds`.\n *\n * @param bounds Axis-aligned sampling rectangle (must cover the region).\n * @param include Shapes the sample must be inside.\n * @param exclude Shapes the sample must be outside.\n * @param nSamples Sample count (default 2000 is plenty for label placement).\n */\nexport function regionCentroid(\n bounds: Box,\n include: Array<{ inside: (x: number, y: number) => boolean }>,\n exclude: Array<{ inside: (x: number, y: number) => boolean }>,\n nSamples: number = 2000,\n seed: number = 0xc0ffee\n): CentroidResult {\n const rand = mulberry32(seed);\n let hits = 0;\n let sumX = 0;\n let sumY = 0;\n const interior: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < nSamples; i++) {\n const x = bounds.x + rand() * bounds.w;\n const y = bounds.y + rand() * bounds.h;\n let ok = true;\n for (const s of include) {\n if (!s.inside(x, y)) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n for (const s of exclude) {\n if (s.inside(x, y)) {\n ok = false;\n break;\n }\n }\n if (!ok) continue;\n hits++;\n sumX += x;\n sumY += y;\n if (interior.length < 256) interior.push({ x, y });\n }\n const area = (hits / nSamples) * bounds.w * bounds.h;\n if (hits === 0) return { cx: NaN, cy: NaN, area: 0, interior };\n return { cx: sumX / hits, cy: sumY / hits, area, interior };\n}\n","/**\n * Label placement for Venn / Euler diagrams.\n *\n * Pipeline per region:\n * 1. Compute axis-aligned union bbox of included shapes.\n * 2. Monte-Carlo sample to estimate centroid + area of the region\n * (region = (∀ inShape in included) AND (∀ notIn in excluded)).\n * 3. If area < MIN_AREA → externalise the label with a leader line\n * that starts at the centroid and ends just outside the union bbox.\n */\n\nimport type {\n VennAST,\n VennCircle,\n VennEllipse,\n VennLabelPosition,\n VennRegion,\n VennShape,\n} from \"../../core/types\";\nimport {\n circleBBox,\n ellipseBBox,\n pointInCircle,\n pointInEllipse,\n regionCentroid,\n unionBBox,\n type Box,\n} from \"./geometry\";\nimport { formatRegionValue } from \"./layout\";\n\n/** Minimum interior area (sq px) for an inside label. */\nconst MIN_AREA = 400;\n/** For n ≥ 4 we require a more generous interior area to suppress mid-canvas stacking. */\nconst MIN_AREA_DENSE = 900;\n/** Approximate label bbox padding for collision tests. */\nconst LABEL_H = 14;\nconst CHAR_W = 6.2;\n/** Minimum gap (px) between any two interior label bboxes. */\nconst LABEL_GAP = 4;\n\nfunction labelWidth(text: string): number {\n return text.length * CHAR_W + 8;\n}\n\nfunction bboxesOverlap(\n ax: number,\n ay: number,\n aw: number,\n ah: number,\n bx: number,\n by: number,\n bw: number,\n bh: number\n): boolean {\n return (\n ax < bx + bw + LABEL_GAP &&\n ax + aw + LABEL_GAP > bx &&\n ay < by + bh + LABEL_GAP &&\n ay + ah + LABEL_GAP > by\n );\n}\n\ninterface ShapeEntry {\n id: string;\n shape: VennShape;\n bbox: Box;\n inside: (x: number, y: number) => boolean;\n}\n\nfunction makeShapeEntry(shape: VennShape): ShapeEntry {\n if (shape.kind === \"circle\") {\n const c: VennCircle = shape;\n return {\n id: shape.id,\n shape,\n bbox: circleBBox(c),\n inside: (x, y) => pointInCircle(c, x, y),\n };\n }\n const e: VennEllipse = shape;\n return {\n id: shape.id,\n shape,\n bbox: ellipseBBox(e),\n inside: (x, y) => pointInEllipse(e, x, y),\n };\n}\n\ninterface Candidate {\n region: VennRegion;\n text: string;\n cx: number;\n cy: number;\n area: number;\n interior: readonly { x: number; y: number }[];\n width: number;\n}\n\nexport function placeLabels(ast: VennAST, shapes: VennShape[]): VennLabelPosition[] {\n const entries = shapes.map(makeShapeEntry);\n const byId = new Map<string, ShapeEntry>();\n for (const e of entries) byId.set(e.id, e);\n\n const canvasBounds = unionBBox(entries.map((e) => e.bbox));\n const canvasCx = canvasBounds.x + canvasBounds.w / 2;\n const canvasCy = canvasBounds.y + canvasBounds.h / 2;\n // Dense: n ≥ 4 sets → central regions get too crowded; raise internal gate.\n const dense = shapes.length >= 4;\n const minArea = dense ? MIN_AREA_DENSE : MIN_AREA;\n\n // ── Pass 1: compute centroid + area for every region ──────────\n const candidates: Candidate[] = [];\n ast.regions.forEach((region, regionIdx) => {\n const included = region.sets.map((id) => byId.get(id)).filter(isDefined);\n if (included.length === 0) return;\n const excluded = region.only\n ? entries.filter((e) => !region.sets.includes(e.id))\n : [];\n const bounds = unionBBox(included.map((e) => e.bbox));\n const seed = 0x1337 + regionIdx * 0x9e3779b9;\n const { cx, cy, area, interior } = regionCentroid(\n bounds,\n included,\n excluded,\n 1500,\n seed\n );\n const text = regionLabelText(region);\n if (!text) return;\n if (!Number.isFinite(cx) || !Number.isFinite(cy) || area === 0) return;\n candidates.push({\n region,\n text,\n cx,\n cy,\n area,\n interior,\n width: labelWidth(text),\n });\n });\n\n // ── Pass 2: decide internal vs external (area + collision) ────\n // Sort by area desc so bigger regions claim interior slots first.\n const byAreaDesc = [...candidates].sort((a, b) => b.area - a.area);\n const placedInternal: { c: Candidate; x: number; y: number }[] = [];\n const externalQueue: Candidate[] = [];\n\n for (const c of byAreaDesc) {\n if (c.area < minArea) {\n externalQueue.push(c);\n continue;\n }\n // Check collision against already-placed internal labels.\n const x = c.cx - c.width / 2;\n const y = c.cy - LABEL_H / 2;\n const collides = placedInternal.some(({ c: p, x: px, y: py }) =>\n bboxesOverlap(x, y, c.width, LABEL_H, px, py, p.width, LABEL_H)\n );\n if (collides) {\n externalQueue.push(c);\n } else {\n placedInternal.push({ c, x, y });\n }\n }\n\n // ── Pass 3: distribute external labels around canvas by angle ─\n // Each external keeps leader line from its interior sample point.\n const externalPlacements = layoutExternal(\n externalQueue,\n canvasCx,\n canvasCy,\n canvasBounds\n );\n\n // ── Assemble final list, preserving original region order ─────\n const placedMap = new Map<VennRegion, VennLabelPosition>();\n for (const { c } of placedInternal) {\n placedMap.set(c.region, {\n sets: c.region.sets,\n label: c.text,\n x: c.cx,\n y: c.cy,\n external: false,\n });\n }\n for (const p of externalPlacements) {\n placedMap.set(p.region, p.label);\n }\n\n const out: VennLabelPosition[] = [];\n for (const region of ast.regions) {\n const p = placedMap.get(region);\n if (p) out.push(p);\n }\n return out;\n}\n\ninterface ExternalPlacement {\n region: VennRegion;\n label: VennLabelPosition;\n}\n\n/**\n * Distribute external labels evenly around the canvas by centroid angle,\n * preventing the \"all leaders point to the same cluster\" problem on n=4.\n */\nfunction layoutExternal(\n queue: Candidate[],\n cx: number,\n cy: number,\n canvas: Box\n): ExternalPlacement[] {\n if (queue.length === 0) return [];\n\n // Sort by angle around canvas center.\n const withAngle = queue.map((c) => {\n const dx = c.cx - cx;\n const dy = c.cy - cy;\n let theta = Math.atan2(dy, dx);\n if (!Number.isFinite(theta)) theta = 0;\n return { c, theta };\n });\n withAngle.sort((a, b) => a.theta - b.theta);\n\n // Target radius: distance from center to a point just outside canvas bbox.\n const radiusX = canvas.w / 2 + 40;\n const radiusY = canvas.h / 2 + 28;\n\n // Enforce a minimum angular spacing so adjacent externals don't overlap.\n const minGap = Math.min((2 * Math.PI) / Math.max(6, withAngle.length), 0.45);\n const adjusted = redistributeAngles(\n withAngle.map((w) => w.theta),\n minGap\n );\n\n const out: ExternalPlacement[] = [];\n for (let i = 0; i < withAngle.length; i++) {\n const { c } = withAngle[i]!;\n const theta = adjusted[i]!;\n const ux = Math.cos(theta);\n const uy = Math.sin(theta);\n const ex = cx + ux * radiusX;\n const ey = cy + uy * radiusY;\n const anchor: \"start\" | \"end\" | \"middle\" =\n ux > 0.25 ? \"start\" : ux < -0.25 ? \"end\" : \"middle\";\n const picked = c.interior[Math.floor(c.interior.length / 2)];\n const start = picked ?? { x: c.cx, y: c.cy };\n out.push({\n region: c.region,\n label: {\n sets: c.region.sets,\n label: c.text,\n x: ex,\n y: ey,\n external: true,\n leader: { x1: start.x, y1: start.y, x2: ex, y2: ey },\n anchor,\n },\n });\n }\n return out;\n}\n\n/**\n * Adjust angle sequence (already sorted) so adjacent values differ by at least\n * `minGap`. Uses a simple forward-sweep then backward clamp — good enough for\n * Venn label fan-out.\n */\nfunction redistributeAngles(thetas: number[], minGap: number): number[] {\n const out = thetas.slice();\n for (let i = 1; i < out.length; i++) {\n const need = out[i - 1]! + minGap;\n if (out[i]! < need) out[i] = need;\n }\n // Wrap-around: if last exceeds first + 2π − minGap, push everything back.\n const wrapLimit = out[0]! + Math.PI * 2 - minGap;\n if (out.length > 1 && out[out.length - 1]! > wrapLimit) {\n const shift = out[out.length - 1]! - wrapLimit;\n for (let i = 0; i < out.length; i++) out[i] = out[i]! - shift;\n }\n return out;\n}\n\nfunction regionLabelText(region: VennRegion): string {\n return formatRegionValue(region);\n}\n\nfunction isDefined<T>(x: T | undefined): x is T {\n return x !== undefined;\n}\n","/**\n * Venn / Euler layout dispatcher.\n *\n * Picks a layout based on `ast.sets.length`, `config.mode` and\n * `config.proportional`:\n *\n * - n=2 fixed or analytic proportional\n * - n=3 fixed or gradient-descent proportional\n * - n=4 fixed (4 ellipses); proportional deferred\n * - Euler (subset / disjoint / partial overlap) — derived from relations or\n * inferred by auto-detecting which regions actually have values.\n */\n\nimport type {\n VennAST,\n VennCircle,\n VennEllipse,\n VennLayoutResult,\n VennLabelPosition,\n VennRegion,\n VennShape,\n VennEulerRelation,\n} from \"../../core/types\";\nimport {\n circleBBox,\n ellipseBBox,\n fourEllipseStandard,\n pointInCircle,\n pointInEllipse,\n regionCentroid,\n solveTwoCircleDistance,\n threeCircleClassic,\n twoCircleIntersectionArea,\n unionBBox,\n} from \"./geometry\";\nimport { placeLabels } from \"./labels\";\n\nexport interface LayoutOptions {\n /** Canvas width override. */\n width?: number;\n /** Canvas height override. */\n height?: number;\n /** Padding around the diagram (px). */\n padding?: number;\n}\n\nconst DEFAULTS = {\n padding: 24,\n canvasN2: { w: 480, h: 320, r: 110, d: 120 },\n canvasN3: { w: 520, h: 480, r: 130, offset: 0.6 },\n canvasN4: { w: 640, h: 480, a: 216, b: 120 },\n canvasEuler: { w: 520, h: 420 },\n};\n\nexport function layoutVenn(ast: VennAST, opts: LayoutOptions = {}): VennLayoutResult {\n const mode = decideMode(ast);\n if (mode === \"euler\") {\n return layoutEuler(ast, opts);\n }\n const n = ast.sets.length;\n if (n === 1) return layoutSingle(ast, opts);\n if (n === 2) return layoutTwo(ast, opts);\n if (n === 3) return layoutThree(ast, opts);\n if (n === 4) return layoutFour(ast, opts);\n // Fallback for 5+ — collapse to Euler disjoint row (UpSet deferred).\n return layoutEuler(ast, opts);\n}\n\nfunction decideMode(ast: VennAST): \"venn\" | \"euler\" {\n if (ast.config.mode === \"venn\") return \"venn\";\n if (ast.config.mode === \"euler\") return \"euler\";\n // Auto: Euler if any explicit relations were declared.\n return ast.relations.length > 0 ? \"euler\" : \"venn\";\n}\n\n// ─── n = 1 (degenerate) ──────────────────────────────────────\n\nfunction layoutSingle(ast: VennAST, opts: LayoutOptions): VennLayoutResult {\n const w = opts.width ?? 320;\n const h = opts.height ?? 260;\n const set = ast.sets[0];\n if (!set) {\n return { width: w, height: h, mode: \"venn\", shapes: [], labels: [], setLabels: [] };\n }\n const circle: VennCircle = { id: set.id, cx: w / 2, cy: h / 2, r: Math.min(w, h) / 3 };\n const shapes: VennShape[] = [{ kind: \"circle\", ...circle }];\n const region = ast.regions.find((r) => r.sets.length === 1 && r.sets[0] === set.id);\n const labels: VennLabelPosition[] = region\n ? [\n {\n sets: [set.id],\n label: formatRegionValue(region),\n x: circle.cx,\n y: circle.cy,\n external: false,\n },\n ]\n : [];\n const setLabels = [\n {\n id: set.id,\n label: set.label,\n x: circle.cx,\n y: circle.cy - circle.r - 12,\n anchor: \"middle\" as const,\n },\n ];\n return {\n width: w,\n height: h,\n mode: \"venn\",\n shapes,\n labels,\n setLabels,\n ...(ast.title ? { title: { text: ast.title, x: w / 2, y: 24 } } : {}),\n };\n}\n\n// ─── n = 2 ───────────────────────────────────────────────────\n\nfunction layoutTwo(ast: VennAST, opts: LayoutOptions): VennLayoutResult {\n const padding = opts.padding ?? DEFAULTS.padding;\n const setA = ast.sets[0];\n const setB = ast.sets[1];\n if (!setA || !setB) {\n throw new Error(\"layoutTwo requires two sets\");\n }\n let rA = DEFAULTS.canvasN2.r;\n let rB = DEFAULTS.canvasN2.r;\n let d = DEFAULTS.canvasN2.d;\n\n if (ast.config.proportional) {\n const sizes = computeAbsoluteSetSizes(ast);\n const sizeA = sizes.get(setA.id) ?? 1;\n const sizeB = sizes.get(setB.id) ?? 1;\n const inter = regionValue(ast, [setA.id, setB.id]) ?? 0;\n const scale = 1 / Math.sqrt(Math.max(sizeA, sizeB));\n rA = 110 * Math.sqrt(sizeA) * scale;\n rB = 110 * Math.sqrt(sizeB) * scale;\n const areaPerElem = (Math.PI * rA * rA) / Math.max(sizeA, 1e-6);\n d = solveTwoCircleDistance(rA, rB, inter * areaPerElem);\n }\n\n const totalW = rA + rB + d + 2 * padding;\n const w = Math.max(opts.width ?? DEFAULTS.canvasN2.w, totalW);\n const h = opts.height ?? DEFAULTS.canvasN2.h;\n\n const cxA = (w - d) / 2;\n const cxB = cxA + d;\n const cy = h / 2;\n\n const circles: [VennCircle, VennCircle] = [\n { id: setA.id, cx: cxA, cy, r: rA },\n { id: setB.id, cx: cxB, cy, r: rB },\n ];\n\n const shapes: VennShape[] = circles.map((c) => ({ kind: \"circle\" as const, ...c }));\n const labels = placeLabels(ast, shapes);\n const setLabels = [\n { id: setA.id, label: setA.label, x: cxA, y: cy - rA - 10, anchor: \"middle\" as const },\n { id: setB.id, label: setB.label, x: cxB, y: cy - rB - 10, anchor: \"middle\" as const },\n ];\n\n return {\n width: w,\n height: h,\n mode: \"venn\",\n shapes,\n labels,\n setLabels,\n ...(ast.title ? { title: { text: ast.title, x: w / 2, y: 24 } } : {}),\n };\n}\n\n// ─── n = 3 ───────────────────────────────────────────────────\n\nfunction layoutThree(ast: VennAST, opts: LayoutOptions): VennLayoutResult {\n const w = opts.width ?? DEFAULTS.canvasN3.w;\n const h = opts.height ?? DEFAULTS.canvasN3.h;\n const r = DEFAULTS.canvasN3.r;\n const offsetScale = DEFAULTS.canvasN3.offset;\n\n // Leave room for set title + diagram title.\n const cx = w / 2;\n const cy = h / 2 + 12;\n\n let circles = threeCircleClassic(cx, cy, r, offsetScale);\n\n if (ast.config.proportional) {\n const adjusted = solveProportionalThree(ast, cx, cy);\n if (adjusted) circles = adjusted;\n }\n\n const shapes: VennShape[] = circles.map((c, i) => {\n const setId = ast.sets[i]?.id ?? c.id;\n return { kind: \"circle\" as const, ...c, id: setId };\n });\n\n const labels = placeLabels(ast, shapes);\n const setLabels = ast.sets.map((s, i) => {\n const c = circles[i] ?? circles[0];\n if (!c) {\n return { id: s.id, label: s.label, x: cx, y: cy, anchor: \"middle\" as const };\n }\n // Title for top circle goes above; others below-outer.\n const isTop = i === 2;\n return {\n id: s.id,\n label: s.label,\n x: isTop ? c.cx : c.cx + (i === 0 ? -c.r : c.r) * 0.7,\n y: isTop ? c.cy - c.r - 10 : c.cy + c.r + 16,\n anchor: (isTop ? \"middle\" : i === 0 ? \"end\" : \"start\") as \"middle\" | \"start\" | \"end\",\n };\n });\n\n return {\n width: w,\n height: h,\n mode: \"venn\",\n shapes,\n labels,\n setLabels,\n ...(ast.title ? { title: { text: ast.title, x: w / 2, y: 24 } } : {}),\n };\n}\n\n// ─── n = 4 ───────────────────────────────────────────────────\n\nfunction layoutFour(ast: VennAST, opts: LayoutOptions): VennLayoutResult {\n const w = opts.width ?? DEFAULTS.canvasN4.w;\n const h = opts.height ?? DEFAULTS.canvasN4.h;\n const cx = w / 2;\n const cy = h / 2 + 8;\n\n const ellipses = fourEllipseStandard(cx, cy, DEFAULTS.canvasN4.a, DEFAULTS.canvasN4.b);\n const shapes: VennShape[] = ellipses.map((e, i) => ({\n kind: \"ellipse\" as const,\n ...e,\n id: ast.sets[i]?.id ?? e.id,\n }));\n\n const labels = placeLabels(ast, shapes);\n const setLabels = ast.sets.map((s, i) => {\n const e = ellipses[i];\n if (!e) {\n return { id: s.id, label: s.label, x: cx, y: cy, anchor: \"middle\" as const };\n }\n const bb = ellipseBBox(e);\n // Place set titles at the outermost end of each ellipse.\n const sign = i < 2 ? -1 : 1;\n return {\n id: s.id,\n label: s.label,\n x: bb.x + (sign < 0 ? 0 : bb.w),\n y: bb.y + (i % 2 === 0 ? 14 : bb.h - 4),\n anchor: (sign < 0 ? \"start\" : \"end\") as \"start\" | \"middle\" | \"end\",\n };\n });\n\n return {\n width: w,\n height: h,\n mode: \"venn\",\n shapes,\n labels,\n setLabels,\n ...(ast.title ? { title: { text: ast.title, x: w / 2, y: 24 } } : {}),\n };\n}\n\n// ─── Euler layout ────────────────────────────────────────────\n\nfunction layoutEuler(ast: VennAST, opts: LayoutOptions): VennLayoutResult {\n const w = opts.width ?? DEFAULTS.canvasEuler.w;\n const h = opts.height ?? DEFAULTS.canvasEuler.h;\n const n = ast.sets.length;\n if (n === 0) {\n return {\n width: w,\n height: h,\n mode: \"euler\",\n shapes: [],\n labels: [],\n setLabels: [],\n };\n }\n\n // Build containment tree from relations.\n const parents = new Map<string, string>(); // child -> parent (subset)\n const disjointPairs = new Set<string>();\n for (const rel of ast.relations) {\n if (rel.type === \"subset\") parents.set(rel.from, rel.to);\n if (rel.type === \"disjoint\") disjointPairs.add(edgeKey(rel.from, rel.to));\n }\n\n // Roots: sets with no parent.\n const roots = ast.sets.filter((s) => !parents.has(s.id)).map((s) => s.id);\n\n const circles = new Map<string, VennCircle>();\n const rootRadius = Math.min(w, h) * 0.32;\n // Horizontal layout of roots.\n const rootSpacing = Math.min(w / Math.max(roots.length, 1), 2 * rootRadius + 40);\n const startX = w / 2 - ((roots.length - 1) * rootSpacing) / 2;\n roots.forEach((rootId, i) => {\n circles.set(rootId, { id: rootId, cx: startX + i * rootSpacing, cy: h / 2, r: rootRadius });\n });\n\n // Recursively place children inside parents.\n const childrenOf = new Map<string, string[]>();\n for (const [child, par] of parents.entries()) {\n const arr = childrenOf.get(par) ?? [];\n arr.push(child);\n childrenOf.set(par, arr);\n }\n\n const placeChildren = (parentId: string, depth: number): void => {\n const kids = childrenOf.get(parentId) ?? [];\n if (kids.length === 0) return;\n const parent = circles.get(parentId);\n if (!parent) return;\n const childR = parent.r * (kids.length === 1 ? 0.55 : 0.4);\n kids.forEach((kid, i) => {\n // Distribute children horizontally within parent.\n const offset = (kids.length === 1 ? 0 : (i - (kids.length - 1) / 2) * childR * 1.4);\n circles.set(kid, {\n id: kid,\n cx: parent.cx + offset,\n cy: parent.cy + (depth % 2 === 0 ? 0 : -childR * 0.2),\n r: childR,\n });\n placeChildren(kid, depth + 1);\n });\n };\n for (const r of roots) placeChildren(r, 0);\n\n // Handle sets with no relation at all — append at the side.\n let sideX = 30;\n for (const s of ast.sets) {\n if (!circles.has(s.id)) {\n circles.set(s.id, { id: s.id, cx: sideX + 60, cy: h / 2, r: 50 });\n sideX += 130;\n }\n }\n\n const shapes: VennShape[] = ast.sets.map((s) => ({\n kind: \"circle\" as const,\n ...(circles.get(s.id) ?? { id: s.id, cx: w / 2, cy: h / 2, r: 40 }),\n }));\n\n const labels = placeLabels(ast, shapes);\n const setLabels = ast.sets.map((s) => {\n const c = circles.get(s.id) ?? { cx: w / 2, cy: h / 2, r: 40 };\n return {\n id: s.id,\n label: s.label,\n x: c.cx,\n y: c.cy - c.r - 6,\n anchor: \"middle\" as const,\n };\n });\n\n // Avoid unused var warning (disjointPairs informs future placement).\n void disjointPairs;\n\n return {\n width: w,\n height: h,\n mode: \"euler\",\n shapes,\n labels,\n setLabels,\n ...(ast.title ? { title: { text: ast.title, x: w / 2, y: 24 } } : {}),\n };\n}\n\nfunction edgeKey(a: string, b: string): string {\n return a < b ? `${a}|${b}` : `${b}|${a}`;\n}\n\n// ─── Proportional helpers ───────────────────────────────────\n\nfunction computeAbsoluteSetSizes(ast: VennAST): Map<string, number> {\n // |A| = Σ value over all regions containing A.\n const out = new Map<string, number>();\n for (const s of ast.sets) out.set(s.id, 0);\n for (const r of ast.regions) {\n const num = numericValue(r);\n if (num === null) continue;\n for (const sid of r.sets) {\n out.set(sid, (out.get(sid) ?? 0) + num);\n }\n }\n return out;\n}\n\nfunction numericValue(r: VennRegion): number | null {\n if (r.value.kind === \"integer\" || r.value.kind === \"percent\") return r.value.value;\n if (r.value.kind === \"list\") return r.value.value.length;\n return null;\n}\n\nfunction regionValue(ast: VennAST, sets: string[]): number | null {\n // Exact match on \"only\" regions or on intersection regions.\n const needle = [...sets].sort().join(\"|\");\n for (const r of ast.regions) {\n const key = [...r.sets].sort().join(\"|\");\n if (key === needle) {\n return numericValue(r);\n }\n }\n return null;\n}\n\n/**\n * Very small finite-difference gradient descent for n=3 proportional.\n * Returns an adjusted circle triple or null if the solver didn't converge.\n */\nfunction solveProportionalThree(\n ast: VennAST,\n cx: number,\n cy: number\n): [VennCircle, VennCircle, VennCircle] | null {\n const setA = ast.sets[0];\n const setB = ast.sets[1];\n const setC = ast.sets[2];\n if (!setA || !setB || !setC) return null;\n const sizes = computeAbsoluteSetSizes(ast);\n const s0 = sizes.get(setA.id) ?? 0;\n const s1 = sizes.get(setB.id) ?? 0;\n const s2 = sizes.get(setC.id) ?? 0;\n if (s0 <= 0 || s1 <= 0 || s2 <= 0) return null;\n\n // Target absolute areas (px²), normalised so the biggest set becomes ~π·r²\n // with r = 130.\n const maxSize = Math.max(s0, s1, s2);\n const baseR = 130;\n const baseArea = Math.PI * baseR * baseR;\n const perElem = baseArea / maxSize;\n const r0 = Math.sqrt((s0 * perElem) / Math.PI);\n const r1 = Math.sqrt((s1 * perElem) / Math.PI);\n const r2 = Math.sqrt((s2 * perElem) / Math.PI);\n\n // Initial distances from pairwise analytic intersections.\n const p01 = regionValue(ast, [setA.id, setB.id]) ?? 0;\n const p02 = regionValue(ast, [setA.id, setC.id]) ?? 0;\n const p12 = regionValue(ast, [setB.id, setC.id]) ?? 0;\n // Pairwise target area includes triple-overlap contribution; approximate only.\n const d01 = solveTwoCircleDistance(r0, r1, p01 * perElem);\n const d02 = solveTwoCircleDistance(r0, r2, p02 * perElem);\n const d12 = solveTwoCircleDistance(r1, r2, p12 * perElem);\n\n // Place centers using pairwise distances (triangulation).\n const x0 = cx - d01 / 2;\n const y0 = cy + d01 * 0.1; // slight drop\n const x1 = x0 + d01;\n const y1 = y0;\n // Circle 2 at intersection of two circles of radius d02 & d12 around (x0,y0) & (x1,y1).\n const ex = x1 - x0;\n const ey = y1 - y0;\n const dxy = Math.sqrt(ex * ex + ey * ey);\n if (dxy < 1e-6) return null;\n const a = (d02 * d02 - d12 * d12 + dxy * dxy) / (2 * dxy);\n const hSq = d02 * d02 - a * a;\n const h = hSq > 0 ? Math.sqrt(hSq) : 0;\n const px = x0 + (a * ex) / dxy;\n const py = y0 + (a * ey) / dxy;\n const x2 = px - (h * ey) / dxy;\n const y2 = py - (h * ex) / dxy;\n\n // Re-center around (cx, cy).\n const avgX = (x0 + x1 + x2) / 3;\n const avgY = (y0 + y1 + y2) / 3;\n const offX = cx - avgX;\n const offY = cy - avgY;\n return [\n { id: setA.id, cx: x0 + offX, cy: y0 + offY, r: r0 },\n { id: setB.id, cx: x1 + offX, cy: y1 + offY, r: r1 },\n { id: setC.id, cx: x2 + offX, cy: y2 + offY, r: r2 },\n ];\n}\n\n// ─── Shared helpers exposed for renderer/label module ───────\n\nexport function formatRegionValue(r: VennRegion): string {\n switch (r.value.kind) {\n case \"integer\":\n return String(r.value.value);\n case \"percent\":\n return `${r.value.value}%`;\n case \"text\":\n return r.value.value;\n case \"list\":\n return r.value.value.join(\", \");\n case \"none\":\n return \"\";\n }\n}\n\n/** Utility: ensure a VennCircle is a \"raw\" circle (strip `id`). */\nexport function pickCircle(s: VennShape): VennCircle | null {\n return s.kind === \"circle\" ? s : null;\n}\n\n/** Utility: ensure a VennEllipse (strip `id`). */\nexport function pickEllipse(s: VennShape): VennEllipse | null {\n return s.kind === \"ellipse\" ? s : null;\n}\n\n/** Re-export for tests (tests sometimes check bbox math end-to-end). */\nexport { circleBBox, ellipseBBox, pointInCircle, pointInEllipse, unionBBox, regionCentroid, twoCircleIntersectionArea };\n\n/** Export dispatcher helpers kept internal. */\nexport type { VennEulerRelation };\n","/**\n * Venn / Euler SVG renderer.\n *\n * Produces a semantic SVG:\n * - `<title>` + `<desc>` for accessibility\n * - CSS class hierarchy `.schematex-venn-*`\n * - One `<circle>` or `<ellipse>` per set, grouped under a layer that\n * can apply `mix-blend-mode: multiply` for natural overlap blending.\n * - `<text>` per region label, optional `<path>` leader for externalised\n * labels.\n */\n\nimport type { VennAST, VennLayoutResult, VennShape } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n circle as circleEl,\n text as textEl,\n title as titleEl,\n desc as descEl,\n path as pathEl,\n} from \"../../core/svg\";\nimport { resolveVennTheme } from \"../../core/theme\";\nimport { parseVennDSL } from \"./parser\";\nimport { layoutVenn } from \"./layout\";\n\nfunction ellipseEl(attrs: Record<string, string | number | undefined>): string {\n return el(\"ellipse\", attrs);\n}\n\nfunction idSlug(id: string): string {\n return id.replace(/[^A-Za-z0-9_-]/g, \"_\");\n}\n\nfunction buildCss(tokens: ReturnType<typeof resolveVennTheme>): string {\n return `\n.schematex-venn { background: ${tokens.bg}; font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.schematex-venn-title { font: 600 16px sans-serif; fill: ${tokens.text}; }\n.schematex-venn-set { stroke: ${tokens.vennSetStroke}; stroke-width: 1.25; }\n.schematex-venn-blend-multiply { mix-blend-mode: multiply; }\n.schematex-venn-blend-screen { mix-blend-mode: screen; }\n.schematex-venn-setlabel { font: 600 13px sans-serif; fill: ${tokens.text}; }\n.schematex-venn-label { font: 500 12px sans-serif; fill: ${tokens.vennLabelColor}; dominant-baseline: central; text-anchor: middle; }\n.schematex-venn-label-external { font: 500 11px sans-serif; fill: ${tokens.vennLabelColor}; dominant-baseline: central; }\n.schematex-venn-leader { stroke: ${tokens.vennLeaderColor}; stroke-width: 0.7; fill: none; opacity: 0.8; }\n.schematex-venn-leader-dot { fill: ${tokens.vennLeaderColor}; }\n`.trim();\n}\n\nfunction renderShape(\n shape: VennShape,\n index: number,\n color: string,\n opacity: number,\n setLabel: string\n): string {\n const classes = `schematex-venn-set schematex-venn-set-${index}`;\n const hoverTitle = titleEl(`Set ${setLabel}`);\n if (shape.kind === \"circle\") {\n return el(\n \"g\",\n { class: `schematex-venn-set-group schematex-venn-set-group-${index}` },\n [\n circleEl({\n cx: shape.cx,\n cy: shape.cy,\n r: shape.r,\n class: classes,\n fill: color,\n \"fill-opacity\": opacity,\n \"data-set-id\": idSlug(shape.id),\n }),\n hoverTitle,\n ]\n );\n }\n return el(\n \"g\",\n { class: `schematex-venn-set-group schematex-venn-set-group-${index}` },\n [\n ellipseEl({\n cx: shape.cx,\n cy: shape.cy,\n rx: shape.rx,\n ry: shape.ry,\n transform: `rotate(${shape.rotation} ${shape.cx} ${shape.cy})`,\n class: classes,\n fill: color,\n \"fill-opacity\": opacity,\n \"data-set-id\": idSlug(shape.id),\n }),\n hoverTitle,\n ]\n );\n}\n\nexport function renderVennAST(\n ast: VennAST,\n options: { theme?: string } = {}\n): string {\n const layout = layoutVenn(ast);\n return renderVennLayout(ast, layout, options);\n}\n\nexport function renderVennLayout(\n ast: VennAST,\n layout: VennLayoutResult,\n options: { theme?: string } = {}\n): string {\n const tokens = resolveVennTheme(options.theme ?? \"default\");\n const effectiveBlend =\n ast.config.blendMode === \"none\" ? \"none\" : ast.config.blendMode || tokens.vennBlendMode;\n const css = buildCss(tokens);\n\n // Shape rendering.\n const colors = tokens.vennSetColors;\n const shapeEls = layout.shapes.map((shape, i) => {\n const color = ast.sets[i]?.color ?? colors[i % colors.length] ?? \"#4E79A7\";\n return renderShape(shape, i, color, tokens.vennSetOpacity, ast.sets[i]?.label ?? shape.id);\n });\n\n const shapesGroup = group(\n {\n class: `schematex-venn-shapes ${effectiveBlend !== \"none\" ? `schematex-venn-blend-${effectiveBlend}` : \"\"}`.trim(),\n ...(effectiveBlend !== \"none\" ? { style: `mix-blend-mode: ${effectiveBlend}` } : {}),\n },\n shapeEls\n );\n\n // Set titles.\n const setLabelEls = layout.setLabels.map((s) =>\n textEl(\n {\n x: s.x,\n y: s.y,\n class: \"schematex-venn-setlabel\",\n \"text-anchor\": s.anchor,\n },\n s.label\n )\n );\n\n // Region labels and optional leader lines.\n const labelEls: string[] = [];\n const leaderEls: string[] = [];\n for (const label of layout.labels) {\n const cls = label.external\n ? \"schematex-venn-label schematex-venn-label-external\"\n : \"schematex-venn-label\";\n labelEls.push(\n textEl(\n {\n x: label.x,\n y: label.y,\n class: cls,\n \"text-anchor\": label.anchor ?? \"middle\",\n \"data-region\": label.sets.join(\"-\"),\n },\n label.label\n )\n );\n if (label.external && label.leader) {\n leaderEls.push(\n pathEl({\n d: `M ${label.leader.x1} ${label.leader.y1} L ${label.leader.x2} ${label.leader.y2}`,\n class: \"schematex-venn-leader\",\n \"aria-hidden\": \"true\",\n })\n );\n leaderEls.push(\n circleEl({\n cx: label.leader.x1,\n cy: label.leader.y1,\n r: 1.5,\n class: \"schematex-venn-leader-dot\",\n \"aria-hidden\": \"true\",\n })\n );\n }\n }\n\n // Title block.\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.title.x,\n y: layout.title.y,\n class: \"schematex-venn-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title.text\n )\n : \"\";\n\n const nonEmptyRegions = ast.regions.length;\n const description =\n `Venn/Euler diagram${ast.title ? ` \"${ast.title}\"` : \"\"}: ${ast.sets.length} sets, ${nonEmptyRegions} regions.`;\n\n const body = [\n titleEl(ast.title ?? \"Venn diagram\"),\n descEl(description),\n el(\"style\", {}, css),\n titleBlock,\n shapesGroup,\n group({ class: \"schematex-venn-leaders\" }, leaderEls),\n group({ class: \"schematex-venn-setlabels\" }, setLabelEls),\n group({ class: \"schematex-venn-labels\" }, labelEls),\n ];\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"schematex-venn\",\n role: \"img\",\n },\n body\n );\n}\n\nexport function renderVenn(text: string, options: { theme?: string } = {}): string {\n const ast = parseVennDSL(text);\n return renderVennAST(ast, options);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { renderVenn } from \"./renderer\";\n\nexport const venn: DiagramPlugin = {\n type: \"venn\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"venn\");\n },\n render(text: string, config?: RenderConfig): string {\n return renderVenn(text, { theme: config?.theme });\n },\n};\n\nexport { parseVennDSL, VennParseError } from \"./parser\";\nexport { renderVenn, renderVennAST, renderVennLayout } from \"./renderer\";\nexport { layoutVenn } from \"./layout\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/fishbone/parser.ts","../src/diagrams/fishbone/layout.ts","../src/diagrams/fishbone/renderer.ts","../src/diagrams/fishbone/index.ts"],"names":["text","title","line","resolveFishboneTheme","rect","el","group","polygon","desc","defs","svgRoot"],"mappings":"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","file":"chunk-7FZSPKX3.cjs","sourcesContent":["import type {\n FishboneAST,\n FishboneCauseSide,\n FishboneDensity,\n FishboneNode,\n FishboneOrientation,\n FishboneSides,\n} from \"../../core/types\";\n\nexport class FishboneParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FishboneParseError\";\n }\n}\n\ninterface CategoryDef {\n id: string;\n label: string;\n color?: string;\n side?: \"top\" | \"bottom\";\n order?: number;\n}\n\nconst SLOPE_PRESETS: Record<string, number> = {\n gentle: 0.45,\n normal: 0.6,\n steep: 0.75,\n};\n\n/**\n * Fishbone DSL parser.\n *\n * Supports two syntactic styles, mixable in one document:\n *\n * Style A — structured (per 13-FISHBONE-STANDARD §11)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category content \"Content\"\n * category tech \"Technical\"\n * content : \"Publishing frequency down\"\n * content : \"Keyword gaps\"\n * - \"No long-tail coverage\"\n * - \"Competitor dominates H1\"\n *\n * Style B — compact shorthand (convenient for quick authoring, AI output)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category Content: Publishing frequency down; Content too generic; Keyword gaps\n * category Technical: Core Web Vitals failing; Crawl coverage drop\n *\n * Config directives:\n *\n * config direction = left|right # head orientation (default right)\n * config width = 900\n * config height = 620\n *\n * Lines starting with `#` are comments. Leading whitespace is indentation; a\n * line that begins with `-` (after ≥2 spaces of indent) is a Level-2 sub-cause\n * for the most-recent Level-1 cause.\n */\nexport function parseFishboneDSL(text: string): FishboneAST {\n const rawLines = text.split(/\\r?\\n/);\n\n let title: string | undefined;\n let effect = \"\";\n let orientation: FishboneOrientation = \"ltr\";\n let width: number | undefined;\n let height: number | undefined;\n let sides: FishboneSides | undefined;\n let ribSlope: number | undefined;\n let density: FishboneDensity | undefined;\n let causeSide: FishboneCauseSide | undefined;\n\n const categories: CategoryDef[] = [];\n const causesByCategory = new Map<string, FishboneNode[]>();\n let lastLevel1: FishboneNode | null = null;\n\n let headerSeen = false;\n\n const getCat = (id: string): CategoryDef | undefined =>\n categories.find((c) => c.id === id || c.label === id);\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i] ?? \"\";\n const line = stripComment(raw).trimEnd();\n if (!line.trim()) continue;\n\n const indent = countIndent(raw);\n const trimmed = line.trim();\n\n // Header: fishbone \"Title\" OR fishbone: \"Title\"\n if (!headerSeen && /^fishbone\\b/i.test(trimmed)) {\n const m = trimmed.match(/^fishbone\\s*:?\\s*(.*)$/i);\n if (m && m[1]) title = stripQuotes(m[1]);\n headerSeen = true;\n continue;\n }\n\n // Sub-cause (Level 2+): starts with \"-\" after indent\n if (indent >= 2 && trimmed.startsWith(\"-\")) {\n if (!lastLevel1) {\n throw new FishboneParseError(\n `Sub-cause at line ${i + 1} has no preceding Level-1 cause: \"${trimmed}\"`\n );\n }\n const subText = stripQuotes(trimmed.slice(1).trim());\n if (!subText) continue;\n lastLevel1.children.push({ label: subText, children: [] });\n continue;\n }\n\n // effect \"...\"\n if (/^effect\\b/i.test(trimmed)) {\n const m = trimmed.match(/^effect\\s*:?\\s*(.*)$/i);\n if (m) effect = stripQuotes(m[1] ?? \"\");\n continue;\n }\n\n // config key = value\n if (/^config\\b/i.test(trimmed)) {\n const m = trimmed.match(/^config\\s+([a-zA-Z]+)\\s*=\\s*(.+)$/i);\n if (m) {\n const key = m[1]!.toLowerCase();\n const val = stripQuotes(m[2]!.trim());\n if (key === \"direction\") {\n orientation = val === \"left\" || val === \"rtl\" ? \"rtl\" : \"ltr\";\n } else if (key === \"width\") {\n const n = Number(val);\n if (Number.isFinite(n)) width = n;\n } else if (key === \"height\") {\n const n = Number(val);\n if (Number.isFinite(n)) height = n;\n } else if (key === \"sides\") {\n const v = val.toLowerCase();\n if (v === \"both\" || v === \"top\" || v === \"bottom\") sides = v;\n } else if (key === \"slope\" || key === \"ribslope\") {\n const preset = SLOPE_PRESETS[val.toLowerCase()];\n if (preset !== undefined) ribSlope = preset;\n else {\n const n = Number(val);\n if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;\n }\n } else if (key === \"density\") {\n const v = val.toLowerCase();\n if (v === \"compact\" || v === \"normal\" || v === \"spacious\") density = v;\n } else if (key === \"causeside\" || key === \"cause-side\") {\n const v = val.toLowerCase();\n if (v === \"head\" || v === \"tail\" || v === \"both\") causeSide = v;\n }\n }\n continue;\n }\n\n // category <id> \"<display>\" [color: <hex>]\n if (/^category\\b/i.test(trimmed)) {\n const compact = trimmed.match(/^category\\s+([^:]+?)\\s*:\\s*(.+)$/i);\n const structured = trimmed.match(\n /^category\\s+([a-zA-Z][\\w-]*)\\s+(\"[^\"]*\"|[^\\s[]+)(?:\\s*(\\[.*\\]))?\\s*$/i\n );\n\n if (structured) {\n const id = structured[1]!;\n const label = stripQuotes(structured[2]!);\n const props = parseProps(structured[3] ?? \"\");\n if (!getCat(id)) {\n const sideProp = props[\"side\"]?.toLowerCase();\n const side =\n sideProp === \"top\" || sideProp === \"bottom\" ? sideProp : undefined;\n const orderProp = props[\"order\"];\n const orderNum = orderProp !== undefined ? Number(orderProp) : NaN;\n const order = Number.isFinite(orderNum) ? orderNum : undefined;\n categories.push({ id, label, color: props[\"color\"], side, order });\n causesByCategory.set(id, []);\n }\n lastLevel1 = null;\n continue;\n }\n\n if (compact) {\n const label = stripQuotes(compact[1]!.trim());\n const id = slugify(label);\n const rest = compact[2]!.trim();\n if (!getCat(id)) {\n categories.push({ id, label });\n causesByCategory.set(id, []);\n }\n // split by `;` for compact style causes\n const bucket = causesByCategory.get(id)!;\n for (const part of rest.split(/[;,]/)) {\n const txt = stripQuotes(part.trim());\n if (txt) {\n const node: FishboneNode = { label: txt, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n }\n }\n continue;\n }\n }\n\n // <categoryId> : \"cause\"\n const causeMatch = trimmed.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (causeMatch) {\n const catId = causeMatch[1]!;\n const cat = getCat(catId);\n if (!cat) {\n throw new FishboneParseError(\n `Unknown category \"${catId}\" at line ${i + 1}. Declare with \\`category ${catId} \"...\"\\` first.`\n );\n }\n const bucket = causesByCategory.get(cat.id)!;\n const rest = causeMatch[2]!.trim();\n // `cause_text [prop: value]`\n const { text: causeText } = splitTrailingProps(rest);\n const label = stripQuotes(causeText);\n if (!label) continue;\n const node: FishboneNode = { label, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n continue;\n }\n\n // Unknown line — ignore silently to tolerate alien syntax blends\n }\n\n if (!effect) {\n // Fallback: use title as effect\n effect = title ?? \"\";\n }\n\n if (categories.length === 0) {\n throw new FishboneParseError(\n \"Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md.\"\n );\n }\n\n const majors: FishboneNode[] = categories.map((c) => ({\n label: c.label,\n color: c.color,\n children: causesByCategory.get(c.id) ?? [],\n side: c.side,\n order: c.order,\n }));\n\n return {\n type: \"fishbone\",\n title,\n effect,\n majors,\n orientation,\n width,\n height,\n sides,\n ribSlope,\n density,\n causeSide,\n };\n}\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction countIndent(raw: string): number {\n let n = 0;\n for (const ch of raw) {\n if (ch === \" \") n += 1;\n else if (ch === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^\\w\\u4e00-\\u9fff]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"cat\"\n );\n}\n\nfunction splitTrailingProps(s: string): { text: string; props: Record<string, string> } {\n const idx = s.lastIndexOf(\"[\");\n if (idx < 0 || !s.trimEnd().endsWith(\"]\")) return { text: s, props: {} };\n const text = s.slice(0, idx).trim();\n const props = parseProps(s.slice(idx));\n return { text, props };\n}\n\nfunction parseProps(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n const m = raw.match(/^\\[(.*)\\]$/s);\n if (!m) return out;\n const inside = m[1]!;\n for (const part of splitTopLevelCommas(inside)) {\n const [k, ...rest] = part.split(\":\");\n if (!k || rest.length === 0) continue;\n out[k.trim()] = stripQuotes(rest.join(\":\").trim());\n }\n return out;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth += 1;\n else if (ch === \"]\") depth -= 1;\n else if (ch === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n","import type { FishboneAST, FishboneCauseSide, FishboneNode } from \"../../core/types\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\n/**\n * Fishbone layout engine.\n *\n * Geometric contract (see 13-FISHBONE-STANDARD §5, §9):\n * - Horizontal spine at `spineY`\n * - Effect polygon at right (ltr) or left (rtl) end\n * - Category ribs slant AWAY from the fish head (signature of Ishikawa form)\n * - Ribs are paired top/bottom on the same X column for visual rhythm\n * - Each rib hosts Level-1 causes as short horizontal branches toward the head\n * - Rib length adapts to (max) cause count in its half so headers align\n *\n * This is an optimized v2 layout that improves on the naive fixed-slope design:\n * 1. Dynamic row heights — a Level-1 cause with N sub-causes reserves\n * (baseRow + N·subRow) of vertical space so nothing overlaps.\n * 2. Per-half aligned headers — ribs in the same half share the same outer Y\n * so category pills form a clean visual row.\n * 3. Column-pairing — top and bottom ribs share the same spine X.\n * 4. Smart canvas sizing — derives width/height from content, respecting\n * optional user overrides from `config width = …` / `config height = …`.\n * 5. Label-aware extents — long cause labels extend the canvas rather than\n * clipping, so multi-lingual / verbose content is first-class.\n * 6. Label bboxes exposed for the renderer to build a text-gap mask.\n */\n\n// ─── Public Types ─────────────────────────────────────────────\n\nexport interface FishboneLayoutCause {\n label: string;\n /** Rib index (0 = first category) */\n ribIndex: number;\n /** Slot index on the rib (0 = closest to spine) */\n slotIndex: number;\n /** Cause start point on the rib */\n ribX: number;\n ribY: number;\n /** Horizontal branch end point (label starts just beyond) */\n branchX: number;\n branchY: number;\n /** Label anchor (x where text starts, y baseline) */\n labelX: number;\n labelY: number;\n labelAnchor: \"start\" | \"end\";\n /** Direction this cause branch sticks out: \"head\" = toward head, \"tail\" = toward tail. */\n causeSide: \"head\" | \"tail\";\n /** Sub-causes (Level 2) stacked below the main label */\n subCauses: FishboneLayoutSubCause[];\n}\n\nexport interface FishboneLayoutSubCause {\n label: string;\n x: number;\n y: number;\n tickX1: number;\n tickX2: number;\n tickY: number;\n anchor: \"start\" | \"end\";\n}\n\nexport interface FishboneLayoutRib {\n index: number;\n half: \"top\" | \"bottom\";\n label: string;\n color: string;\n /** Where rib meets spine */\n spineX: number;\n spineY: number;\n /** Far end of rib (where header pill sits) */\n endX: number;\n endY: number;\n /** Header pill geometry */\n headerX: number;\n headerY: number;\n headerW: number;\n headerH: number;\n causes: FishboneLayoutCause[];\n}\n\nexport interface FishboneBBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FishboneLayoutResult {\n width: number;\n height: number;\n orientation: \"ltr\" | \"rtl\";\n spineY: number;\n spineStartX: number;\n spineEndX: number;\n tailForkTipTop: { x: number; y: number };\n tailForkTipBot: { x: number; y: number };\n head: {\n x: number; // spine-attached x\n y: number; // spine-attached y (= spineY)\n tipX: number; // pointy tip\n tipY: number;\n w: number;\n h: number;\n label: string;\n };\n ribs: FishboneLayoutRib[];\n /** Label bounding boxes (for text-gap mask) */\n textBBoxes: FishboneBBox[];\n title?: string;\n}\n\n// ─── Geometry constants (tunable, exported for renderer parity) ──\n\nexport const FB_CONST = {\n PADDING: 40,\n HEAD_W: 90,\n HEAD_H: 80,\n TAIL_LEN: 40,\n SPINE_OFFSET_FROM_TAIL: 40, // distance from canvas left to spine start\n RIB_SLOPE: 0.6, // dx/dy — consistent across all ribs\n RIB_BASE_EXTENT_Y: 30, // vertical distance of first slot from spine\n ROW_HEIGHT: 30, // vertical gap between Level-1 slots\n SUB_ROW_HEIGHT: 17,\n BRANCH_LEN: 30, // horizontal Level-1 branch length\n SUB_TICK_LEN: 10,\n HEADER_W: 132,\n HEADER_H: 34,\n HEADER_GAP: 12, // gap between rib endpoint and header pill\n COL_STEP: 130, // spine x gap between adjacent ribs\n COL_FIRST_OFFSET: 170, // first rib's distance from spine start\n LABEL_FONT: 12,\n HEADER_FONT: 14,\n SUB_FONT: 11,\n EFFECT_FONT: 14,\n LABEL_GAP: 6, // gap from branch end to label\n MIN_ROWS_PER_HALF: 4, // aesthetic minimum rib length\n COL_GAP_BETWEEN_LABELS: 18, // min horizontal breathing between adjacent ribs' label columns\n HEAD_PAD_X: 44, // total horizontal padding around effect text inside head\n HEAD_PAD_Y: 20, // min vertical padding around effect text inside head\n TITLE_CLEARANCE: 24, // extra gap between title baseline and top header pill\n} as const;\n\n// ─── Default palette (13-FISHBONE-STANDARD §5.4) ─────────────\n\n\n// ─── Text measurement (CJK-aware approximation) ───────────────\n\nexport function estimateTextWidth(s: string, fontSize: number): number {\n let w = 0;\n for (const ch of s) {\n const cp = ch.codePointAt(0) ?? 0;\n // CJK unified ideographs + kana + Hangul + fullwidth\n const isWide =\n (cp >= 0x3000 && cp <= 0x30ff) ||\n (cp >= 0x3400 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7af) ||\n (cp >= 0xff00 && cp <= 0xffef);\n w += fontSize * (isWide ? 1.0 : 0.56);\n }\n return w;\n}\n\n// ─── Density presets ──────────────────────────────────────────\n\ninterface DensityTunables {\n rowHeight: number;\n subRowHeight: number;\n colStep: number;\n headerW: number;\n headerH: number;\n headerGap: number;\n minRowsPerHalf: number;\n colFirstOffset: number;\n}\n\nconst DENSITY: Record<\"compact\" | \"normal\" | \"spacious\", DensityTunables> = {\n compact: {\n rowHeight: 24,\n subRowHeight: 15,\n colStep: 110,\n headerW: 118,\n headerH: 30,\n headerGap: 8,\n minRowsPerHalf: 3,\n colFirstOffset: 140,\n },\n normal: {\n rowHeight: 30,\n subRowHeight: 17,\n colStep: 130,\n headerW: 132,\n headerH: 34,\n headerGap: 12,\n minRowsPerHalf: 4,\n colFirstOffset: 170,\n },\n spacious: {\n rowHeight: 36,\n subRowHeight: 19,\n colStep: 150,\n headerW: 148,\n headerH: 38,\n headerGap: 16,\n minRowsPerHalf: 5,\n colFirstOffset: 200,\n },\n};\n\n// ─── Public API ───────────────────────────────────────────────\n\nexport function layoutFishbone(ast: FishboneAST, opts?: { palette?: readonly string[] }): FishboneLayoutResult {\n const majors = ast.majors.length > 0 ? ast.majors : [];\n const nRibs = majors.length;\n\n const density = ast.density ?? \"normal\";\n const D = DENSITY[density];\n const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;\n const causeSideSetting: FishboneCauseSide = ast.causeSide ?? \"head\";\n const sides = ast.sides ?? \"both\";\n\n // Partition ribs into top/bottom halves honoring per-category `side` overrides\n // and the `sides` setting. If a category has an explicit side, use it;\n // otherwise fall back to the global `sides` default (single-sided layouts\n // pin everything to that half; \"both\" alternates declaration order across\n // the two halves as before).\n const topMajors: FishboneNode[] = [];\n const botMajors: FishboneNode[] = [];\n if (sides === \"top\" || sides === \"bottom\") {\n const bucket = sides === \"top\" ? topMajors : botMajors;\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else bucket.push(m);\n }\n } else {\n const autoPool: FishboneNode[] = [];\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else autoPool.push(m);\n }\n // Greedy balance — push into whichever half currently has fewer ribs,\n // ties → top (matches the prior \"top gets the extra\" rule).\n for (const m of autoPool) {\n if (topMajors.length <= botMajors.length) topMajors.push(m);\n else botMajors.push(m);\n }\n }\n\n // Respect per-rib `order` (lower = closer to tail). Stable sort within half.\n const byOrder = (a: FishboneNode, b: FishboneNode): number => {\n const ao = a.order ?? Number.POSITIVE_INFINITY;\n const bo = b.order ?? Number.POSITIVE_INFINITY;\n return ao - bo;\n };\n topMajors.sort(byOrder);\n botMajors.sort(byOrder);\n\n const nTop = topMajors.length;\n const nBot = botMajors.length;\n // Keep legacy var names alive\n void nRibs;\n\n // Row count per rib = max(subCauses) for that rib's Level-1 list.\n // Extent per rib = sum of rowHeights for slots 0..n-1.\n const ribRowHeights = (m: FishboneNode): number[] => {\n if (m.children.length === 0) return [];\n return m.children.map(\n (c) => D.rowHeight + c.children.length * D.subRowHeight\n );\n };\n\n const topExtents = topMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n const botExtents = botMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n\n // ── Head sizing (computed early so it can influence half-extent padding) ──\n const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);\n // Grow H proportionally with W to maintain ≈2:1 W:H ratio (avoids flat sliver).\n const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;\n const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));\n // At y ± font/2, available width = W * (1 − font/H) due to triangle taper.\n const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;\n const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));\n\n // Head extends ±headEffectiveH/2 from spine — guarantee half extents cover it.\n const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;\n\n const topHalfExtent =\n nTop > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(topExtents.length ? topExtents : [0])\n )\n : sides === \"bottom\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n const botHalfExtent =\n nBot > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(botExtents.length ? botExtents : [0])\n )\n : sides === \"top\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n\n const nCols = Math.max(nTop, nBot, 1);\n\n // ── Adaptive column step: widest Level-1 label + branch + gap + breathing ──\n let maxCauseLabelW = 0;\n let maxSubLabelW = 0;\n for (const m of majors) {\n for (const c of m.children) {\n maxCauseLabelW = Math.max(\n maxCauseLabelW,\n estimateTextWidth(c.label, FB_CONST.LABEL_FONT)\n );\n for (const sc of c.children) {\n maxSubLabelW = Math.max(\n maxSubLabelW,\n estimateTextWidth(sc.label, FB_CONST.SUB_FONT)\n );\n }\n }\n }\n // Label column needs to fit the widest Level-1 label AND any Level-2 tick+label\n // that sits under it (sub causes are indented by SUB_TICK_LEN + 4 from labelX).\n const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;\n const labelColW = Math.max(maxCauseLabelW, subExtent);\n // When causes can sit on both sides, each column must reserve label space on both sides.\n const labelExtentsPerCol = causeSideSetting === \"both\" ? 2 : 1;\n const minColStep =\n FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;\n const colStep = Math.max(\n D.colStep,\n Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))\n );\n\n // ── Canvas sizing ───────────────────────────────────────────\n const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;\n const firstRibX = spineStartX + D.colFirstOffset;\n const lastRibX = firstRibX + (nCols - 1) * colStep;\n // Reserve room for the last rib's label column before the head begins.\n const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);\n\n const headX = spineEndX;\n const headTipXAdj = headX + headEffectiveW;\n\n const width =\n ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);\n\n const title = ast.title;\n const titleReserve = title ? FB_CONST.TITLE_CLEARANCE + 20 : 0;\n\n const spineY =\n FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;\n\n const height =\n ast.height ??\n Math.ceil(\n spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING\n );\n\n // ── Ribs ────────────────────────────────────────────────────\n const ribs: FishboneLayoutRib[] = [];\n const palette = opts?.palette ?? resolveFishboneTheme(\"default\").palette;\n const textBBoxes: FishboneBBox[] = [];\n\n const buildHalfRibs = (\n halfMajors: FishboneNode[],\n startIndex: number,\n half: \"top\" | \"bottom\",\n halfExtent: number\n ): void => {\n for (let i = 0; i < halfMajors.length; i++) {\n const major = halfMajors[i]!;\n const globalIdx = startIndex + i;\n const color = major.color ?? palette[globalIdx % palette.length]!;\n const spineX = firstRibX + i * colStep;\n\n // Aligned rib endpoint Y → same for all ribs in half.\n const endY = half === \"top\" ? spineY - halfExtent : spineY + halfExtent;\n const endX = spineX - halfExtent * ribSlope;\n\n // Header pill positioned along the rib's slope extension.\n // The rib direction: for every 1 unit of Y away from spine, X moves -ribSlope.\n const extraDist = D.headerGap + D.headerH / 2;\n const headerCenterY =\n half === \"top\" ? endY - extraDist : endY + extraDist;\n // Continue the slope: pill center X follows the same dx/dy as the rib.\n const headerCenterX = endX - extraDist * ribSlope;\n const headerW = Math.max(\n D.headerW,\n estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28\n );\n const headerX = headerCenterX - headerW / 2;\n const headerY = headerCenterY - D.headerH / 2;\n\n textBBoxes.push({\n x: headerX,\n y: headerY,\n w: headerW,\n h: D.headerH,\n });\n\n // Cause slots — cumulative along rib from spine outward.\n const causes: FishboneLayoutCause[] = [];\n let accum = FB_CONST.RIB_BASE_EXTENT_Y; // distance from spine to first slot center\n for (let s = 0; s < major.children.length; s++) {\n const child = major.children[s]!;\n const rowH =\n D.rowHeight + child.children.length * D.subRowHeight;\n // vertical offset for this slot (center of row)\n const slotOffset = accum + rowH / 2 - D.rowHeight / 2;\n const ribY =\n half === \"top\" ? spineY - slotOffset : spineY + slotOffset;\n const ribX = spineX - slotOffset * ribSlope;\n\n // Resolve cause direction for this slot.\n const causeDir: \"head\" | \"tail\" =\n causeSideSetting === \"tail\"\n ? \"tail\"\n : causeSideSetting === \"both\"\n ? s % 2 === 0\n ? \"head\"\n : \"tail\"\n : \"head\";\n\n const branchY = ribY;\n const branchX =\n causeDir === \"head\"\n ? ribX + FB_CONST.BRANCH_LEN\n : ribX - FB_CONST.BRANCH_LEN;\n const labelX =\n causeDir === \"head\"\n ? branchX + FB_CONST.LABEL_GAP\n : branchX - FB_CONST.LABEL_GAP;\n const labelY = branchY;\n const labelAnchor: \"start\" | \"end\" =\n causeDir === \"head\" ? \"start\" : \"end\";\n\n // Text bbox for mask\n const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? labelX - 2 : labelX - labelW - 2,\n y: labelY - FB_CONST.LABEL_FONT / 2 - 2,\n w: labelW + 4,\n h: FB_CONST.LABEL_FONT + 4,\n });\n\n // Sub-causes stack below the main label\n const subCauses: FishboneLayoutSubCause[] = [];\n for (let si = 0; si < child.children.length; si++) {\n const sub = child.children[si]!;\n const subY = labelY + (si + 1) * D.subRowHeight;\n const tickX1 =\n causeDir === \"head\" ? labelX + 2 : labelX - 2;\n const tickX2 =\n causeDir === \"head\"\n ? tickX1 + FB_CONST.SUB_TICK_LEN\n : tickX1 - FB_CONST.SUB_TICK_LEN;\n const subX =\n causeDir === \"head\" ? tickX2 + 4 : tickX2 - 4;\n subCauses.push({\n label: sub.label,\n x: subX,\n y: subY,\n tickX1,\n tickX2,\n tickY: subY,\n anchor: causeDir === \"head\" ? \"start\" : \"end\",\n });\n const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? subX - 2 : subX - subW - 2,\n y: subY - FB_CONST.SUB_FONT / 2 - 2,\n w: subW + 4,\n h: FB_CONST.SUB_FONT + 4,\n });\n }\n\n causes.push({\n label: child.label,\n ribIndex: globalIdx,\n slotIndex: s,\n ribX,\n ribY,\n branchX,\n branchY,\n labelX,\n labelY,\n labelAnchor,\n causeSide: causeDir,\n subCauses,\n });\n\n accum += rowH;\n }\n\n ribs.push({\n index: globalIdx,\n half,\n label: major.label,\n color,\n spineX,\n spineY,\n endX,\n endY,\n headerX,\n headerY,\n headerW,\n headerH: D.headerH,\n causes,\n });\n }\n };\n\n buildHalfRibs(topMajors, 0, \"top\", topHalfExtent);\n buildHalfRibs(botMajors, nTop, \"bottom\", botHalfExtent);\n\n // ── Head polygon (right-facing default) ─────────────────────\n const head = {\n x: headX,\n y: spineY,\n tipX: headTipXAdj,\n tipY: spineY,\n w: headEffectiveW,\n h: headEffectiveH,\n label: ast.effect,\n };\n\n // Effect label bbox (for mask around it — though usually effect sits in head\n // which has its own fill, we still add it so any crossing line punches out).\n textBBoxes.push({\n x: headX + 4,\n y: spineY - headEffectiveH / 2 + 4,\n w: headEffectiveW - 8,\n h: headEffectiveH - 8,\n });\n\n // Note: rtl (head-on-left) support: mirror transform applied in renderer\n // rather than recomputing coordinates — simpler and visually identical.\n\n return {\n width,\n height,\n orientation: ast.orientation,\n spineY,\n spineStartX,\n spineEndX,\n tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },\n tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },\n head,\n ribs,\n textBBoxes,\n title,\n };\n}\n\nfunction sumOrMin(arr: number[], min: number): number {\n if (arr.length === 0) return min;\n const s = arr.reduce((a, b) => a + b, 0);\n return Math.max(s, min);\n}\n","import type { FishboneAST } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n line as lineEl,\n rect,\n text as textEl,\n polygon,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { layoutFishbone, type FishboneLayoutResult, type FishboneBBox } from \"./layout\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\nconst CSS = `\n.sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fb-title { font: 600 16px sans-serif; fill: #111; }\n.sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }\n.sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }\n.sx-fb-head { stroke-width: 0.5; }\n.sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-rib { stroke-width: 1.5; fill: none; }\n.sx-fb-header-pill { stroke-width: 0.6; }\n.sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }\n.sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }\n.sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }\n.sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }\n`.trim();\n\nfunction lighten(hex: string, amount: number): string {\n // amount in [0, 1]; shifts toward white\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r + (255 - r) * amount);\n const gg = Math.round(g + (255 - g) * amount);\n const bb = Math.round(b + (255 - b) * amount);\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction darken(hex: string, amount: number): string {\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r * (1 - amount));\n const gg = Math.round(g * (1 - amount));\n const bb = Math.round(b * (1 - amount));\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\nfunction buildMask(id: string, w: number, h: number, bboxes: FishboneBBox[]): string {\n const base = rect({ x: 0, y: 0, width: w, height: h, fill: \"white\" });\n const holes = bboxes\n .map((b) =>\n rect({\n x: b.x,\n y: b.y,\n width: b.w,\n height: b.h,\n fill: \"black\",\n rx: 2,\n })\n )\n .join(\"\\n\");\n return el(\"mask\", { id, maskUnits: \"userSpaceOnUse\" }, [base, holes]);\n}\n\nfunction renderHead(layout: FishboneLayoutResult, ltr: boolean): string {\n const h = layout.head;\n const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);\n const leftX = ltr ? h.x : h.x;\n const rightX = ltr ? h.tipX : tipX;\n // Polygon pointing toward head direction\n const points = ltr\n ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}`\n : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;\n const fill = \"#faece7\";\n const stroke = \"#993c1d\";\n // Bias text toward the wide base (35% from base, 65% from tip) so it reads\n // balanced inside the tapering triangle rather than shifted toward the tip.\n const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;\n return group({ class: \"sx-fb-head-g\" }, [\n polygon({\n points,\n class: \"sx-fb-head\",\n fill,\n stroke,\n }),\n textEl(\n {\n x: textX,\n y: h.y,\n class: \"sx-fb-head-text\",\n fill: darken(stroke, 0.3),\n },\n h.label\n ),\n ]);\n}\n\nfunction renderRibs(layout: FishboneLayoutResult, maskUrl: string): string {\n const parts: string[] = [];\n for (const rib of layout.ribs) {\n const pillFill = lighten(rib.color, 0.82);\n const pillStroke = rib.color;\n const headerTextFill = darken(rib.color, 0.3);\n\n // Rib line (with mask to punch out text overlaps)\n parts.push(\n lineEl({\n x1: rib.spineX,\n y1: rib.spineY,\n x2: rib.endX,\n y2: rib.endY,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n\n // Extend the rib line to the pill center along the same slope.\n parts.push(\n lineEl({\n x1: rib.endX,\n y1: rib.endY,\n x2: rib.headerX + rib.headerW / 2,\n y2: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n })\n );\n\n // Header pill\n parts.push(\n rect({\n x: rib.headerX,\n y: rib.headerY,\n width: rib.headerW,\n height: rib.headerH,\n rx: 8,\n class: \"sx-fb-header-pill\",\n fill: pillFill,\n stroke: pillStroke,\n })\n );\n parts.push(\n textEl(\n {\n x: rib.headerX + rib.headerW / 2,\n y: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-header-text\",\n fill: headerTextFill,\n },\n rib.label\n )\n );\n\n // Branches + labels\n for (const cause of rib.causes) {\n parts.push(\n lineEl({\n x1: cause.ribX,\n y1: cause.ribY,\n x2: cause.branchX,\n y2: cause.branchY,\n class: \"sx-fb-branch\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n parts.push(\n textEl(\n {\n x: cause.labelX,\n y: cause.labelY,\n class: \"sx-fb-cause-label\",\n \"text-anchor\": cause.labelAnchor,\n },\n cause.label\n )\n );\n\n // Sub-causes (Level 2)\n for (const sub of cause.subCauses) {\n parts.push(\n lineEl({\n x1: sub.tickX1,\n y1: sub.tickY,\n x2: sub.tickX2,\n y2: sub.tickY,\n class: \"sx-fb-sub-tick\",\n stroke: rib.color,\n })\n );\n parts.push(\n textEl(\n {\n x: sub.x,\n y: sub.y,\n class: \"sx-fb-sub-label\",\n \"text-anchor\": sub.anchor,\n },\n sub.label\n )\n );\n }\n }\n }\n return group({ class: \"sx-fb-ribs\" }, parts);\n}\n\nexport function renderFishboneAST(ast: FishboneAST, options: { theme?: string } = {}): string {\n const themeName = options.theme ?? ast.metadata?.[\"theme\"] ?? \"default\";\n const tokens = resolveFishboneTheme(themeName);\n const layout = layoutFishbone(ast, { palette: tokens.palette });\n const ltr = layout.orientation !== \"rtl\";\n const maskId = `sx-fb-mask-${randomId()}`;\n const maskUrl = `url(#${maskId})`;\n\n const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);\n\n const spine = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.spineEndX,\n y2: layout.spineY,\n class: \"sx-fb-spine\",\n });\n\n const tailTop = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipTop.x,\n y2: layout.tailForkTipTop.y,\n class: \"sx-fb-tail\",\n });\n const tailBot = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipBot.x,\n y2: layout.tailForkTipBot.y,\n class: \"sx-fb-tail\",\n });\n\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 28,\n class: \"sx-fb-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title\n )\n : \"\";\n\n const head = renderHead(layout, ltr);\n const ribs = renderRibs(layout, maskUrl);\n\n const inner = [\n titleEl(layout.title ? `${layout.title} — Fishbone diagram` : \"Fishbone diagram\"),\n descEl(\n `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`\n ),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n tailTop,\n tailBot,\n spine,\n head,\n ribs,\n ];\n\n // For RTL (head on left), mirror horizontally via transform.\n if (!ltr) {\n const mirrored = group(\n {\n transform: `translate(${layout.width} 0) scale(-1 1)`,\n },\n [tailTop, tailBot, spine, head, ribs]\n );\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n [\n titleEl(layout.title ?? \"Fishbone\"),\n descEl(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n mirrored,\n ]\n );\n }\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n inner\n );\n}\n\nexport function renderFishbone(text: string, options: { theme?: string } = {}): string {\n const ast = parseFishboneDSL(text);\n return renderFishboneAST(ast, options);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { renderFishbone } from \"./renderer\";\n\nexport const fishbone: DiagramPlugin = {\n type: \"fishbone\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fishbone\");\n },\n render(text: string): string {\n return renderFishbone(text);\n },\n};\n\nexport { parseFishboneDSL } from \"./parser\";\nexport { renderFishbone, renderFishboneAST } from \"./renderer\";\nexport { layoutFishbone, FB_CONST } from \"./layout\";\n"]}
|