@cadview/core 0.1.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/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/index.cjs +4048 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +510 -0
- package/dist/index.d.ts +510 -0
- package/dist/index.js +4018 -0
- package/dist/index.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parser/tokenizer.ts","../src/parser/sections/header.ts","../src/parser/sections/tables.ts","../src/parser/entities/base.ts","../src/parser/entities/line.ts","../src/parser/entities/circle.ts","../src/parser/entities/arc.ts","../src/parser/entities/lwpolyline.ts","../src/parser/entities/polyline.ts","../src/parser/entities/ellipse.ts","../src/parser/entities/spline.ts","../src/parser/entities/text.ts","../src/parser/entities/mtext.ts","../src/parser/entities/insert.ts","../src/parser/entities/dimension.ts","../src/parser/entities/hatch.ts","../src/parser/entities/point.ts","../src/parser/sections/entities.ts","../src/parser/sections/blocks.ts","../src/parser/index.ts","../src/parser/colors.ts","../src/renderer/theme.ts","../src/renderer/camera.ts","../src/renderer/resolve-color.ts","../src/renderer/entities/draw-line.ts","../src/renderer/entities/draw-circle.ts","../src/renderer/entities/draw-arc.ts","../src/utils/math.ts","../src/renderer/entities/draw-polyline.ts","../src/renderer/entities/draw-ellipse.ts","../src/utils/spline.ts","../src/renderer/entities/draw-spline.ts","../src/renderer/entities/draw-text.ts","../src/renderer/entities/draw-insert.ts","../src/renderer/entities/draw-dimension.ts","../src/renderer/entities/draw-hatch.ts","../src/renderer/entities/draw-point.ts","../src/renderer/entities/draw-entity.ts","../src/renderer/canvas-renderer.ts","../src/viewer/layers.ts","../src/viewer/events.ts","../src/viewer/input-handler.ts","../src/utils/bbox.ts","../src/viewer/selection.ts","../src/viewer/measure.ts","../src/viewer/viewer.ts"],"names":["RBush"],"mappings":"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A;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAEO,SAAS,SAAS,GAAA,EAAiC;AACxD,EAAA,IAAI,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,GAAA,EAAK,OAAO,MAAA;AACrC,EAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,GAAM,GAAA,EAAK,OAAO,MAAA;AACjC,EAAA,OAAO,WAAW,GAAG,CAAA;AACvB;AAEO,SAAS,iBAAA,CAAkB,KAAa,WAAA,EAA8B;AAC3E,EAAA,IAAI,GAAA,KAAQ,CAAA,EAAG,OAAO,WAAA,GAAc,SAAA,GAAY,SAAA;AAChD,EAAA,OAAO,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA,KAAM,cAAc,SAAA,GAAY,SAAA,CAAA;AACjE;AAEO,SAAS,eAAe,SAAA,EAA2B;AACxD,EAAA,MAAM,CAAA,GAAK,aAAa,EAAA,GAAM,GAAA;AAC9B,EAAA,MAAM,CAAA,GAAK,aAAa,CAAA,GAAK,GAAA;AAC7B,EAAA,MAAM,IAAI,SAAA,GAAY,GAAA;AACtB,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAChH;;;ACrRO,IAAM,MAAA,GAAqC;AAAA,EAChD,IAAA,EAAM;AAAA,IACJ,eAAA,EAAiB,SAAA;AAAA,IACjB,kBAAA,EAAoB,SAAA;AAAA,IACpB,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,eAAA,EAAiB,SAAA;AAAA,IACjB,kBAAA,EAAoB,SAAA;AAAA,IACpB,cAAA,EAAgB,SAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB;AAAA;AAEpB;;;ACtBO,SAAS,aAAA,CAAc,EAAA,EAAmB,EAAA,EAAY,EAAA,EAA8B;AACzF,EAAA,OAAO;AAAA,IACL,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,OAAA;AAAA,IACnB,CAAC,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG;AAAA,GACtB;AACF;AAEO,SAAS,aAAA,CAAc,EAAA,EAAmB,EAAA,EAAY,EAAA,EAA8B;AACzF,EAAA,OAAO;AAAA,IAAA,CACJ,EAAA,GAAK,EAAA,CAAG,OAAA,IAAW,EAAA,CAAG,KAAA;AAAA,IACvB,EAAE,EAAA,GAAK,EAAA,CAAG,OAAA,CAAA,GAAW,EAAA,CAAG;AAAA,GAC1B;AACF;AAEO,SAAS,cAAA,CAAe,KAA+B,EAAA,EAAyB;AACrF,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,GAAA,CAAI,YAAA,CAAa,EAAA,CAAG,KAAA,GAAQ,GAAA,EAAK,GAAG,CAAA,EAAG,CAAC,EAAA,CAAG,KAAA,GAAQ,KAAK,EAAA,CAAG,OAAA,GAAU,GAAA,EAAK,EAAA,CAAG,UAAU,GAAG,CAAA;AAC5F;AAEO,SAAS,SAAA,CACd,aACA,YAAA,EACA,IAAA,EAAc,MACd,IAAA,EAAc,IAAA,EACd,UAAkB,IAAA,EACH;AACf,EAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,EAAA,MAAM,cAAc,IAAA,GAAO,IAAA;AAE3B,EAAA,IAAI,UAAA,IAAc,CAAA,IAAK,WAAA,IAAe,CAAA,EAAG;AACvC,IAAA,OAAO,EAAE,OAAO,CAAA,EAAG,OAAA,EAAS,cAAc,CAAA,EAAG,OAAA,EAAS,eAAe,CAAA,EAAE;AAAA,EACzE;AAEA,EAAA,MAAM,SAAS,WAAA,GAAc,UAAA;AAC7B,EAAA,MAAM,SAAS,YAAA,GAAe,WAAA;AAC9B,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,QAAQ,MAAM,CAAA,IAAK,IAAI,OAAA,GAAU,CAAA,CAAA;AAExD,EAAA,MAAM,OAAA,GAAA,CAAW,OAAO,IAAA,IAAQ,CAAA;AAChC,EAAA,MAAM,OAAA,GAAA,CAAW,OAAO,IAAA,IAAQ,CAAA;AAChC,EAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAAI,OAAA,GAAU,KAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,CAAA,GAAI,OAAA,GAAU,KAAA;AAE7C,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAQ;AACnC;AAEO,SAAS,WAAA,CACd,IACA,OAAA,EACA,OAAA,EACA,YACA,QAAA,GAAmB,IAAA,EACnB,WAAmB,GAAA,EACJ;AACf,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,IAAI,QAAA,EAAU,EAAA,CAAG,KAAA,GAAQ,UAAU,CAAC,CAAA;AAC7E,EAAA,MAAM,YAAA,GAAe,WAAW,EAAA,CAAG,KAAA;AAEnC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,OAAA,GAAA,CAAW,OAAA,GAAU,EAAA,CAAG,OAAA,IAAW,YAAA;AAAA,IAC5C,OAAA,EAAS,OAAA,GAAA,CAAW,OAAA,GAAU,EAAA,CAAG,OAAA,IAAW;AAAA,GAC9C;AACF;AAEO,IAAM,SAAN,MAAa;AAAA,EACV,YAA2B,EAAE,KAAA,EAAO,GAAG,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,EAC9D,QAAA;AAAA,EACA,QAAA;AAAA,EAER,YAAY,OAAA,EAA+C;AACzD,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AAAA,EAC1B;AAAA,EAEA,YAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,aAAa,EAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AAAA,EACnB;AAAA,EAEA,GAAA,CAAI,IAAY,EAAA,EAAkB;AAChC,IAAA,IAAA,CAAK,SAAA,GAAY;AAAA,MACf,GAAG,IAAA,CAAK,SAAA;AAAA,MACR,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,OAAA,GAAU,EAAA;AAAA,MAClC,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,OAAA,GAAU;AAAA,KACpC;AAAA,EACF;AAAA,EAEA,IAAA,CAAK,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAAsB;AAC3D,IAAA,IAAA,CAAK,SAAA,GAAY,WAAA;AAAA,MACf,IAAA,CAAK,SAAA;AAAA,MAAW,OAAA;AAAA,MAAS,OAAA;AAAA,MAAS,MAAA;AAAA,MAClC,IAAA,CAAK,QAAA;AAAA,MAAU,IAAA,CAAK;AAAA,KACtB;AAAA,EACF;AACF;;;AC7FO,SAAS,eAAA,CAAgB,UAAkB,KAAA,EAAsB;AACtE,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,KAAA,KAAU,SAAS,SAAA,GAAY,SAAA;AAAA,EACxC;AACA,EAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,SAAA;AAC/B;AAcO,SAAS,kBAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACA,WAAA,EACQ;AAER,EAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,IAAA,MAAM,CAAA,GAAK,MAAA,CAAO,SAAA,IAAa,EAAA,GAAM,GAAA;AACrC,IAAA,MAAM,CAAA,GAAK,MAAA,CAAO,SAAA,IAAa,CAAA,GAAK,GAAA;AACpC,IAAA,MAAM,CAAA,GAAI,OAAO,SAAA,GAAY,GAAA;AAC7B,IAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AAEtB,IAAA,OAAO,WAAA,IAAe,MAAA,CAAO,KAAK,CAAA,CAAE,kBAAA;AAAA,EACtC;AAEA,EAAA,IAAI,MAAA,CAAO,UAAU,GAAA,EAAK;AAExB,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC5C;AAGA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACrC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAW;AACjC,MAAA,MAAM,CAAA,GAAK,KAAA,CAAM,SAAA,IAAa,EAAA,GAAM,GAAA;AACpC,MAAA,MAAM,CAAA,GAAK,KAAA,CAAM,SAAA,IAAa,CAAA,GAAK,GAAA;AACnC,MAAA,MAAM,CAAA,GAAI,MAAM,SAAA,GAAY,GAAA;AAC5B,MAAA,OAAO,CAAA,IAAA,EAAO,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACrC,IAAA,OAAO,eAAA,CAAgB,UAAU,KAAK,CAAA;AAAA,EACxC;AAGA,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,kBAAA;AACvB;;;ACjEO,SAAS,QAAA,CAAS,KAA+B,MAAA,EAA6B;AACnF,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAC,CAAA;AACzC,EAAA,GAAA,CAAI,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AACrC,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACLO,SAAS,UAAA,CAAW,KAA+B,MAAA,EAA+B;AACvF,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACxB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACvE,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACLO,SAAS,OAAA,CAAQ,KAA+B,MAAA,EAA4B;AACjF,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AAExB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAA;AAE3C,EAAA,GAAA,CAAI,SAAA,EAAU;AAGd,EAAA,GAAA,CAAI,GAAA;AAAA,IACF,OAAO,MAAA,CAAO,CAAA;AAAA,IACd,OAAO,MAAA,CAAO,CAAA;AAAA,IACd,MAAA,CAAO,MAAA;AAAA,IACP,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACyCO,SAAS,UAAA,CACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,KAAA,EAC0G;AAC1G,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAEzC,EAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,IAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,aAAA,EAAe,KAAA,EAAM;AAAA,EACvF;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,KAAA,GAAQ,CAAA;AAC1C,EAAA,MAAM,WAAW,KAAA,GAAQ,CAAA,KAAM,CAAA,GAAI,OAAA,IAAW,MAAM,CAAA,GAAI,OAAA,CAAA;AAGxD,EAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,EAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AAGvB,EAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,GAAK,KAAA;AACpB,EAAA,MAAM,QAAQ,EAAA,GAAK,KAAA;AAGnB,EAAA,MAAM,IAAI,MAAA,GAAS,OAAA;AAKnB,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,EAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,IAAA,GAAO,CAAA,GAAI,KAAA;AAC3B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,IAAA,GAAO,CAAA,GAAI,KAAA;AAG3B,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC9C,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAG5C,EAAA,MAAM,gBAAgB,KAAA,GAAQ,CAAA;AAE9B,EAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,UAAA,EAAY,UAAU,aAAA,EAAc;AAC/D;AAKO,SAAS,aACd,GAAA,EACA,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,KAAA,EACM;AACN,EAAA,MAAM,MAAM,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,KAAK,CAAA;AAC5C,EAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,MAAA,EAAQ,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAA,EAAU,GAAA,CAAI,aAAa,CAAA;AACrF;;;ACtHO,SAAS,cAAA,CAAe,KAA+B,MAAA,EAAmC;AAC/F,EAAA,MAAM,QAAQ,MAAA,CAAO,QAAA;AACrB,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAEtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,CAAG,GAAG,KAAA,CAAM,CAAC,EAAG,CAAC,CAAA;AAEnC,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAE5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AAEzC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,KAAK,IAAI,KAAA,EAAO;AACnC,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,GAAA,EAAK,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvE;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;AAEO,SAAS,YAAA,CAAa,KAA+B,MAAA,EAAiC;AAC3F,EAAA,MAAM,QAAQ,MAAA,CAAO,QAAA;AACrB,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAEtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,CAAG,GAAG,KAAA,CAAM,CAAC,EAAG,CAAC,CAAA;AAEnC,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAE5D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,EAAO;AAC3B,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA,EAAG,OAAA,CAAQ,GAAG,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;AC9CO,SAAS,WAAA,CAAY,KAA+B,MAAA,EAAgC;AACzF,EAAA,MAAM,cAAc,IAAA,CAAK,IAAA;AAAA,IACvB,MAAA,CAAO,SAAA,CAAU,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA,IAAK,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,IAAK;AAAA,GAC5E;AACA,EAAA,IAAI,WAAA,GAAc,KAAA,IAAS,MAAA,CAAO,UAAA,IAAc,CAAA,EAAG;AAEnD,EAAA,MAAM,WAAA,GAAc,cAAc,MAAA,CAAO,UAAA;AACzC,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA;AAElE,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,OAAA;AAAA,IACF,OAAO,MAAA,CAAO,CAAA;AAAA,IACd,OAAO,MAAA,CAAO,CAAA;AAAA,IACd,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,CAAO,UAAA;AAAA,IACP,MAAA,CAAO,QAAA;AAAA,IACP;AAAA,GACF;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;AClBO,SAAS,MAAA,CACd,MAAA,EACA,aAAA,EACA,KAAA,EACA,GACA,OAAA,EACS;AAET,EAAA,MAAM,CAAA,GAAI,cAAc,MAAA,GAAS,CAAA;AACjC,EAAA,IAAI,CAAA,GAAI,MAAA;AACR,EAAA,OAAO,IAAI,CAAA,IAAK,KAAA,CAAM,CAAA,GAAI,CAAC,KAAK,CAAA,EAAG,CAAA,EAAA;AAGnC,EAAA,MAAM,IAAe,EAAC;AACtB,EAAA,MAAM,IAAc,EAAC;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,EAAQ,CAAA,EAAA,EAAK;AAChC,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,GAAS,CAAA;AACzB,IAAA,CAAA,CAAE,KAAK,EAAE,GAAG,aAAA,CAAc,GAAG,GAAG,CAAA;AAChC,IAAA,CAAA,CAAE,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAG,IAAI,CAAG,CAAA;AAAA,EACrC;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,MAAA,EAAQ,CAAA,EAAA,EAAK;AAChC,IAAA,KAAA,IAAS,CAAA,GAAI,MAAA,EAAQ,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,CAAA,GAAI,IAAI,MAAA,GAAS,CAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,IAAI,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AACjD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,EAAO;AAC7B,MAAA,MAAM,KAAA,GAAA,CAAS,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,KAAA;AAE/B,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAC,KAAK,CAAA,GAAI,KAAA,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA;AAClB,QAAA,MAAM,OAAO,EAAA,GAAK,EAAA;AAClB,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA,EAAO;AAC5B,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,IAAA;AAC3C,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,IAAA;AAC3C,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAI,EAAA,IAAM,IAAA;AAC3C,QAAA,CAAA,CAAE,CAAC,CAAA,GAAI,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA,IAAS,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AACjD,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA,IAAS,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AACjD,QAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA,GAAA,CAAK,CAAA,GAAI,KAAA,IAAS,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,GAAI,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAM,CAAA;AACjB;AAKO,SAAS,oBAAoB,SAAA,EAAiC;AACnE,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,OAAO,UAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,CAAE,CAAA;AAExE,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,IAAI,SAAA,CAAU,MAAA;AACpB,EAAA,MAAM,QAAA,GAAW,EAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAE3C,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,KAAM,CAAA,KAAM,IAAI,CAAA,GAAI,QAAA,GAAW,QAAA,GAAW,CAAA,CAAA,EAAI,CAAA,EAAA,EAAK;AACjE,MAAA,MAAM,IAAI,CAAA,GAAI,QAAA;AACd,MAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,MAAA,MAAM,KAAK,EAAA,GAAK,CAAA;AAGhB,MAAA,MAAM,CAAA,GAAI,GAAA,IACP,CAAA,GAAI,EAAA,CAAG,KACP,CAAC,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA,GAAA,CAChB,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,MACzC,CAAC,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,EAAA,CAAA;AAEzC,MAAA,MAAM,CAAA,GAAI,GAAA,IACP,CAAA,GAAI,EAAA,CAAG,KACP,CAAC,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,CAAA,GAAA,CAChB,CAAA,GAAI,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,IAAK,MACzC,CAAC,EAAA,CAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,IAAK,EAAA,CAAA;AAGzC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CAAe,QAAyB,SAAA,EAA8B;AAEpF,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,IAAI,OAAO,aAAA,CAAc,MAAA,KAAW,KAAK,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,EAAG;AACrE,IAAA,OAAO,mBAAA,CAAoB,OAAO,SAAS,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,OAAO,aAAA,CAAc,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA,SAAU,EAAC;AAC7D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,aAAA,CAAc,SAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAEnF,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA,CAAO,SAAS,CAAC,CAAA;AAEjE,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAG1B,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,MAAA,CAAO,cAAc,MAAA,GAAS,EAAA;AAAA,IAC9B,IAAA,CAAK,IAAA,CAAA,CAAM,IAAA,GAAO,IAAA,IAAQ,SAAS;AAAA,GACrC;AACA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,GAAI,CAAA;AAE7C,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAO,OAAA,GAAU,MAAA;AAE7D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,YAAA,EAAc,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,IAAA,GAAA,CAAQ,IAAA,GAAO,IAAA,KAAS,CAAA,GAAI,YAAA,CAAA;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,aAAA,EAAe,MAAA,CAAO,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA;AAC9E,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,MAAA;AACT;;;ACtIO,SAAS,UAAA,CAAW,GAAA,EAA+B,MAAA,EAAyB,SAAA,EAAyB;AAC1G,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAC/C,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAEvB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,CAAG,GAAG,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA,CAAG,GAAG,MAAA,CAAO,CAAC,EAAG,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,MAAA,CAAO,QAAQ,CAAA,EAAG;AACpB,IAAA,GAAA,CAAI,SAAA,EAAU;AAAA,EAChB;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACfA,IAAM,YAAA,GAAuC;AAAA,EAC3C,UAAA,EAAgB,mBAAA;AAAA,EAChB,OAAA,EAAgB,mBAAA;AAAA,EAChB,WAAA,EAAgB,mBAAA;AAAA,EAChB,YAAA,EAAgB,0BAAA;AAAA,EAChB,aAAA,EAAgB,0BAAA;AAAA,EAChB,SAAA,EAAgB,WAAA;AAAA,EAChB,aAAA,EAAgB,WAAA;AAAA,EAChB,WAAA,EAAgB,0BAAA;AAAA,EAChB,cAAA,EAAgB,0BAAA;AAAA,EAChB,WAAA,EAAgB,0BAAA;AAAA,EAChB,aAAA,EAAgB,0BAAA;AAAA,EAChB,YAAA,EAAgB;AAClB,CAAA;AAEA,SAAS,WAAW,SAAA,EAA2B;AAC7C,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,WAAA,EAAY,CAAE,IAAA,EAAK;AACzC,EAAA,OAAO,YAAA,CAAa,GAAG,CAAA,IAAK,YAAA;AAC9B;AAEO,SAAS,QAAA,CAAS,GAAA,EAA+B,MAAA,EAAuB,SAAA,EAAyB;AACtG,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,YAAY,CAAA,EAAG;AAGnD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,OAAO,MAAA,KAAW,CAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,iBAAiB,MAAA,CAAO,cAAA,GAC/B,OAAO,cAAA,CAAe,CAAA,GACtB,OAAO,cAAA,CAAe,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,iBAAiB,MAAA,CAAO,cAAA,GAC/B,OAAO,cAAA,CAAe,CAAA,GACtB,OAAO,cAAA,CAAe,CAAA;AAE1B,EAAA,GAAA,CAAI,IAAA,EAAK;AAGT,EAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AAGpB,EAAA,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAA;AAGf,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,GAAA,CAAI,OAAO,CAAC,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,MAAA,CAAO,gBAAgB,CAAA,EAAK;AAC9B,IAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,YAAA,GAAe,IAAA,CAAK,KAAK,GAAG,CAAA;AACzD,IAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACnC;AAGA,EAAA,MAAM,QAAA,GAAA,CAAY,MAAA,CAAO,eAAA,GAAkB,CAAA,MAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAA,CAAc,MAAA,CAAO,eAAA,GAAkB,CAAA,MAAO,CAAA;AACpD,EAAA,IAAI,QAAA,EAAU,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA;AAC7B,EAAA,IAAI,UAAA,EAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AACtD,EAAA,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,MAAM,MAAM,QAAQ,CAAA,CAAA;AAGzC,EAAA,QAAQ,OAAO,MAAA;AAAQ,IACrB,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAAQ,MAAA;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAAU,MAAA;AAAA,IAClC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAAS,MAAA;AAAA,IACjC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAAQ,MAAA;AAAA;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAAU,MAAA;AAAA;AAAA,IAClC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAAQ,MAAA;AAAA;AAAA,IAChC;AAAS,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAAA;AAI3B,EAAA,QAAQ,OAAO,MAAA;AAAQ,IACrB,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AAAc,MAAA;AAAA,IACzC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAU,MAAA;AAAA,IACrC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAU,MAAA;AAAA,IACrC,KAAK,CAAA;AAAG,MAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAAO,MAAA;AAAA,IAClC;AAAS,MAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AAAA;AAG9B,EAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,GAAA,CAAI,OAAA,EAAQ;AACd;AAKA,SAAS,qBAAqB,IAAA,EAAsB;AAClD,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,CACpB,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,CACxC,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CACrB,OAAA,CAAQ,MAAA,EAAQ,MAAQ,CAAA,CACxB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CACjB,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CACjB,OAAA,CAAQ,YAAA,EAAc,EAAE,EACxB,IAAA,EAAK;AACV;AAEO,SAAS,SAAA,CAAU,GAAA,EAA+B,MAAA,EAAwB,SAAA,EAAyB;AACxG,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,YAAY,CAAA,EAAG;AAEnD,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,UAAU,MAAA,CAAO,cAAA,CAAe,CAAA,EAAG,MAAA,CAAO,eAAe,CAAC,CAAA;AAC9D,EAAA,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAA;AAGf,EAAA,MAAM,WAAW,MAAA,CAAO,aAAA,GACpB,IAAA,CAAK,KAAA,CAAM,OAAO,aAAA,CAAc,CAAA,EAAG,MAAA,CAAO,aAAA,CAAc,CAAC,CAAA,GAAA,CACxD,MAAA,CAAO,QAAA,IAAY,CAAA,IAAK,KAAK,EAAA,GAAK,GAAA;AACvC,EAAA,IAAI,QAAA,EAAU,GAAA,CAAI,MAAA,CAAO,CAAC,QAAQ,CAAA;AAGlC,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAElC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,iBAAA,IAAqB,GAAA,CAAA;AAChE,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,CAAO,KAAA,IAAS,UAAU,CAAA;AACtD,EAAA,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,MAAM,MAAM,QAAQ,CAAA,CAAA;AAIzC,EAAA,MAAM,GAAA,GAAA,CAAQ,MAAA,CAAO,eAAA,GAAkB,CAAA,IAAK,CAAA;AAC5C,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,MAAA,CAAO,eAAA,GAAkB,KAAK,CAAC,CAAA;AACvD,EAAA,MAAM,UAAA,GAAgC,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAChE,EAAA,GAAA,CAAI,SAAA,GAAY,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA;AAGnC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,UAAA;AACnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,CAAA;AAAG,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAAQ,MAAA;AAAA;AAAA,IAChC,KAAK,CAAA;AAAG,MAAA,MAAA,GAAS,MAAA,CAAO,SAAS,WAAA,GAAc,CAAA;AAAG,MAAA;AAAA;AAAA,IAClD,KAAK,CAAA;AAAG,MAAA,MAAA,GAAS,OAAO,MAAA,GAAS,WAAA;AAAa,MAAA;AAAA;AAGhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,GAAA,CAAI,SAAS,KAAA,CAAM,CAAC,GAAI,CAAA,EAAG,MAAA,GAAS,IAAI,UAAU,CAAA;AAAA,EACpD;AAEA,EAAA,GAAA,CAAI,OAAA,EAAQ;AACd;;;AC/IA,IAAM,gBAAA,GAAmB,GAAA;AAElB,SAAS,UAAA,CACd,KACA,MAAA,EACA,GAAA,EACA,IACA,KAAA,EACA,SAAA,EACA,QAAgB,CAAA,EACV;AACN,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAE9B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,OAAO,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,KAAA,EAAO;AAGZ,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,WAAW,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,QAAQ,CAAA;AAExC,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,GAAA,CAAI,IAAA,EAAK;AAGT,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,cAAA,CAAe,CAAA,GAAI,MAAM,MAAA,CAAO,aAAA;AAClD,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,cAAA,CAAe,CAAA,GAAI,MAAM,MAAA,CAAO,UAAA;AAClD,MAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AAGpB,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MAC5C;AAGA,MAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA;AAGtC,MAAA,GAAA,CAAI,SAAA,CAAU,CAAC,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,KAAA,CAAM,UAAU,CAAC,CAAA;AAGpD,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AACnF,MAAA,MAAM,iBAAA,GAAoB,aAAa,iBAAA,IAAqB,CAAA,CAAA;AAG5D,MAAA,KAAA,MAAW,WAAA,IAAe,MAAM,QAAA,EAAU;AACxC,QAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,WAAA,EAAa,GAAA,CAAI,QAAQ,KAAK,CAAA;AAC/D,QAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,QAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAEhB,QAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AACjC,UAAA,UAAA,CAAW,KAAK,WAAA,EAAgC,GAAA,EAAK,IAAI,KAAA,EAAO,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAAA,QAC9F,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,GAAA,EAAK,WAAA,EAA0B,GAAA,EAAK,EAAA,EAAI,OAAO,iBAAiB,CAAA;AAAA,QAC7E;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IACd;AAAA,EACF;AACF;;;AC7DO,SAAS,cACd,GAAA,EACA,MAAA,EACA,GAAA,EACA,EAAA,EACA,OACA,SAAA,EACM;AAEN,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,OAAO,SAAS,CAAA;AAC7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,WAAA,IAAe,MAAM,QAAA,EAAU;AACxC,QAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,WAAA,EAAa,GAAA,CAAI,QAAQ,KAAK,CAAA;AAC/D,QAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,QAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,QAAA,UAAA,CAAW,GAAA,EAAK,WAAA,EAA0B,GAAA,EAAK,EAAA,EAAI,OAAO,SAAS,CAAA;AAAA,MACrE;AACA,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA,EAAW;AACxC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA;AACjD,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA;AACjD,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF;;;ACtCO,SAAS,SAAA,CAAU,KAA+B,MAAA,EAA8B;AACrF,EAAA,IAAI,MAAA,CAAO,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AAEvC,EAAA,GAAA,CAAI,SAAA,EAAU;AAEd,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,aAAA,EAAe;AACvC,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,IAAc,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AACzE,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA;AACnC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAChC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA;AAEtC,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,KAAA,EAAO;AAC3B,UAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAAA,QAC3B,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,GAAA,EAAK,KAAK,CAAA,EAAG,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA;AAAA,QACzD;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,SAAA,EAAU;AAAA,IACnC,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,KAAK,KAAA,EAAO;AAC9C,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,UAAA,IAAI,CAAA,KAAM,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAClD,UAAA,GAAA,CAAI,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO;AAC9B,UAAA,IAAI,MAAM,CAAA,EAAG;AACX,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA;AACjF,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA;AACjF,YAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,UACnB;AACA,UAAA,GAAA,CAAI,GAAA;AAAA,YACF,KAAK,MAAA,CAAO,CAAA;AAAA,YAAG,KAAK,MAAA,CAAO,CAAA;AAAA,YAAG,IAAA,CAAK,MAAA;AAAA,YACnC,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAA;AAAA,YAC5B,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAA;AAAA,YAC1B,CAAC,IAAA,CAAK;AAAA,WACR;AAAA,QACF;AAAA,MAEF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,IAAA,GAAA,CAAI,KAAK,SAAS,CAAA;AAClB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,EACpB;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACpDO,SAAS,SAAA,CAAU,GAAA,EAA+B,MAAA,EAAwB,SAAA,EAAyB;AACxG,EAAA,MAAM,OAAO,SAAA,GAAY,CAAA;AACzB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClE,EAAA,GAAA,CAAI,IAAA,EAAK;AACX;;;ACQO,SAAS,WACd,GAAA,EACA,MAAA,EACA,GAAA,EACA,EAAA,EACA,OACA,SAAA,EACM;AACN,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AAAc,MAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAC1C,KAAK,QAAA;AAAc,MAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAC5C,KAAK,KAAA;AAAc,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IACzC,KAAK,YAAA;AAAc,MAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAChD,KAAK,UAAA;AAAc,MAAA,YAAA,CAAa,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAC9C,KAAK,SAAA;AAAc,MAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAC7C,KAAK,QAAA;AAAc,MAAA,UAAA,CAAW,GAAA,EAAK,QAAQ,SAAS,CAAA;AAAG,MAAA;AAAA,IACvD,KAAK,MAAA;AAAc,MAAA,QAAA,CAAS,GAAA,EAAK,QAAQ,SAAS,CAAA;AAAG,MAAA;AAAA,IACrD,KAAK,OAAA;AAAc,MAAA,SAAA,CAAU,GAAA,EAAK,QAAQ,SAAS,CAAA;AAAG,MAAA;AAAA,IACtD,KAAK,QAAA;AAAc,MAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,OAAO,SAAS,CAAA;AAAG,MAAA;AAAA,IACvE,KAAK,WAAA;AAAc,MAAA,aAAA,CAAc,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,OAAO,SAAS,CAAA;AAAG,MAAA;AAAA,IAC1E,KAAK,OAAA;AAAc,MAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAG,MAAA;AAAA,IAC3C,KAAK,OAAA;AAAc,MAAA,SAAA,CAAU,GAAA,EAAK,QAAQ,SAAS,CAAA;AAAG,MAAA;AAAA;AAE1D;;;AC3BO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAoB,MAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAClB,IAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,KAAA,EAAO,OAAO,CAAA;AACpD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EAClB;AAAA,EAdQ,GAAA;AAAA,EACA,KAAA,GAAgB,CAAA;AAAA,EAChB,MAAA,GAAiB,CAAA;AAAA,EAczB,UAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,GAAQ,GAAA;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,GAAA;AAAA,EAErC;AAAA,EAEA,MAAA,CACE,GAAA,EACA,EAAA,EACA,KAAA,EACA,eACA,mBAAA,EACM;AACN,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AAGvC,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,CAAE,eAAA;AAC9B,IAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAG1C,IAAA,cAAA,CAAe,KAAK,EAAE,CAAA;AAGtB,IAAA,MAAM,SAAA,GAAY,IAAI,EAAA,CAAG,KAAA;AAGzB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAGf,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAG7B,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAGrB,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAGtC,MAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,MAAA,EAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA;AAG1D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAGhB,MAAA,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,EAAA,EAAI,OAAO,SAAS,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,mBAAA,IAAuB,CAAA,IAAK,mBAAA,GAAsB,GAAA,CAAI,SAAS,MAAA,EAAQ;AACzE,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,mBAAmB,CAAA;AAElD,MAAA,cAAA,CAAe,KAAK,EAAE,CAAA;AACtB,MAAA,GAAA,CAAI,WAAA,GAAc,MAAA,CAAO,KAAK,CAAA,CAAE,cAAA;AAChC,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,CAAE,cAAA;AAC9B,MAAA,GAAA,CAAI,YAAY,SAAA,GAAY,CAAA;AAC5B,MAAA,UAAA,CAAW,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,EAAA,EAAI,OAAO,SAAS,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,YAAY,KAAA,EAAoB;AAC9B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,CAAE,eAAA;AAC9B,IAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EAC5C;AAAA,EAEA,OAAA,GAAgB;AAAA,EAEhB;AACF;;;ACtHO,IAAM,eAAN,MAAmB;AAAA,EAChB,MAAA,uBAAoC,GAAA,EAAI;AAAA,EACxC,UAAA,uBAAuC,GAAA,EAAI;AAAA,EAC3C,cAAA,uBAA0C,GAAA,EAAI;AAAA,EAC9C,YAAA,GAAmC,IAAA;AAAA,EAE3C,UAAU,MAAA,EAAqC;AAE7C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,GAAA,CAAI,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAK,MAAA,EAAQ;AACvC,MAAA,IAAA,CAAK,UAAA,CAAW,IAAI,IAAA,EAAM,CAAC,MAAM,KAAA,IAAS,CAAC,MAAM,QAAQ,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,YAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,UAAA,CAAW,MAAc,OAAA,EAAwB;AAC/C,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,UAAU,IAAA,EAAuB;AAC/B,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACtC;AAAA,EAEA,gBAAA,CAAiB,MAAc,KAAA,EAAqB;AAClD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,iBAAiB,IAAA,EAAkC;AACjD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AAAA,EACrC;AAAA,EAEA,oBAAA,GAAoC;AAClC,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,YAAA;AAEnC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,KAAK,UAAA,EAAY;AAC/C,MAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AACF;;;AC9BO,IAAM,eAAN,MAAwE;AAAA,EACrE,SAAA,uBAAiD,GAAA,EAAI;AAAA,EAE7D,EAAA,CAAsB,OAAU,QAAA,EAAsC;AACpE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAiB,IAAI,KAAK,CAAA;AAAA,IAC/C;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA,CAAG,IAAI,QAAyB,CAAA;AAAA,EACpE;AAAA,EAEA,GAAA,CAAuB,OAAU,QAAA,EAAsC;AACrE,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA,EAAG,OAAO,QAAyB,CAAA;AAAA,EACvE;AAAA,EAEA,IAAA,CAAwB,OAAU,IAAA,EAAkB;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAe,CAAA;AACpD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,QAAA,EAAA,CAAG,IAAI,CAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAAA,GAA2B;AACzB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF;;;ACnDO,IAAM,eAAN,MAAmB;AAAA,EAgBxB,WAAA,CACU,QACA,MAAA,EACR;AAFQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAER,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAA,KAAa,CAAA,CAAE,cAAA,EAAe;AAEpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AACzD,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AACzD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACjE,IAAA,MAAA,CAAO,iBAAiB,YAAA,EAAc,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAC3E,IAAA,MAAA,CAAO,iBAAiB,WAAA,EAAa,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,OAAO,CAAA;AACzE,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AACnD,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAAA,EAC3D;AAAA,EApCQ,SAAA,GAAY,KAAA;AAAA,EACZ,KAAA,GAAQ,CAAA;AAAA,EACR,KAAA,GAAQ,CAAA;AAAA,EACR,OAAA,uBAAqD,GAAA,EAAI;AAAA;AAAA,EAGzD,aAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EAyBR,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AACjE,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AACjE,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,YAAY,CAAA;AAC/D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC7D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,UAAU,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,aAAa,CAAA;AAAA,EACnE;AAAA;AAAA,EAIQ,kBAAkB,CAAA,EAAuB;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AACjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,IAAA,KAAS,KAAA,EAAO;AACpC,MAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAEzB,MAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB,WAAW,CAAA,CAAE,MAAA,KAAW,MAAM,IAAA,KAAS,QAAA,IAAY,SAAS,SAAA,CAAA,EAAY;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,CAAA,EAAiB,CAAA,EAAW,CAAA,EAAiB;AAC5D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,GAAS,UAAA;AAAA,EAC7B;AAAA,EAEQ,kBAAkB,CAAA,EAAuB;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAA;AACpB,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAA;AACpB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,EAAA,EAAI,EAAE,CAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,MAAA,CAAO,eAAA,CAAgB,CAAA,EAAG,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAA,EAAuB;AAC7C,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,qBAAA,CAAsB,CAAA,CAAE,SAAS,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,GAAS,IAAA,CAAK,OAAO,OAAA,EAAQ,KAAM,QAAQ,MAAA,GAAS,WAAA;AAAA,IACxE;AAAA,EACF;AAAA;AAAA,EAIQ,YAAY,CAAA,EAAqB;AACvC,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,CAAK,IAAA,CAAK,EAAE,MAAM,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACvC,IAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA;AAEvC,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA;AAAA,EACrC;AAAA;AAAA,EAIQ,iBAAiB,CAAA,EAAqB;AAC5C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAA,EAAqB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,KAAK,OAAA,CAAQ,IAAA,KAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrD,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAE7C,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAG,IAAI,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,EAAG,KAAK,CAAC,CAAA,CAAG,IAAI,IAAA,CAAK,CAAC,EAAG,CAAC,CAAA;AAC5E,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,OAAA,GAAU,GAAG,OAAA,EAAS,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,OAAO,CAAA;AAE5E,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,MAAM,aAAa,QAAA,GAAW,QAAA;AAE9B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,QAAA,MAAM,WAAA,GAAA,CAAe,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,GAAI,KAAK,CAAC,CAAA,CAAG,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,IAAA;AACzD,QAAA,MAAM,WAAA,GAAA,CAAe,IAAA,CAAK,CAAC,CAAA,CAAG,CAAA,GAAI,KAAK,CAAC,CAAA,CAAG,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,GAAA;AACzD,QAAA,MAAM,eAAe,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,OAAA,IAAW,IAAI,IAAA,CAAK,IAAA;AACzD,QAAA,MAAM,eAAe,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,OAAA,IAAW,IAAI,IAAA,CAAK,GAAA;AAEzD,QAAA,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,WAAA,EAAa,WAAA,EAAa,UAAU,CAAA;AAC3D,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,WAAA,GAAc,WAAA,EAAa,cAAc,WAAW,CAAA;AAAA,MAC5E;AAAA,IACF,CAAA,MAAA,IAAW,KAAK,OAAA,CAAQ,IAAA,KAAS,KAAK,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5D,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,UAAU,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,MAAA,CAAO,SAAA;AAAA,UACV,CAAA,CAAE,UAAU,IAAA,CAAK,CAAA;AAAA,UACjB,CAAA,CAAE,UAAU,IAAA,CAAK;AAAA,SACnB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,eAAe,CAAA,EAAqB;AAC1C,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,cAAc,CAAA,EAAG;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,UAAU,CAAA;AAAA,IAClC;AAAA,EACF;AACF,CAAA;;;ACnKO,SAAS,sBAAsB,QAAA,EAAoC;AACxE,EAAA,IAAI,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC5B,EAAA,IAAI,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC7B,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC/B,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,SAAS,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAK,GAAI,IAAA;AAC/C;AAEO,SAAS,kBAAkB,MAAA,EAAgC;AAChE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QAC3C,IAAA,EAAM,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QAC3C,IAAA,EAAM,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,QAC3C,IAAA,EAAM,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC;AAAA,OAC7C;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO;AAAA,OACjC;AAAA,IACF,KAAK,KAAA,EAAO;AAEV,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QAC/B,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO;AAAA,OACjC;AAAA,IACF;AAAA,IACA,KAAK,YAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACzC,MAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,GAAQ,QAAA,EAAU,KAAA,GAAQ,WAAW,KAAA,GAAQ,CAAA,QAAA;AACnE,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IAC9D;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,CAAA,IAAK,CAAC,CAAA;AAC5E,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,QAAA;AAAA,QACxB,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,QAAA;AAAA,QACxB,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI,QAAA;AAAA,QACxB,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,CAAA,GAAI;AAAA,OAC1B;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA,GAAI,OAAO,MAAA,GAAS,MAAA,CAAO,KAAK,MAAA,GAAS,GAAA;AAAA,QACrE,IAAA,EAAM,MAAA,CAAO,cAAA,CAAe,CAAA,GAAI,MAAA,CAAO;AAAA,OACzC;AAAA,IACF,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,MAAA,CAAO,cAAA,CAAe,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,QACvC,MAAM,MAAA,CAAO,cAAA,CAAe,KAAK,MAAA,CAAO,KAAA,IAAS,OAAO,MAAA,GAAS,EAAA,CAAA;AAAA,QACjE,IAAA,EAAM,MAAA,CAAO,cAAA,CAAe,CAAA,GAAI,MAAA,CAAO;AAAA,OACzC;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,MAAA,CAAO,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9C,MAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,GAAQ,QAAA,EAAU,KAAA,GAAQ,WAAW,KAAA,GAAQ,CAAA,QAAA;AACnE,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,aAAA,EAAe;AACpC,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,IAC9D;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,QAAA,CAAS,CAAA;AAAA,QACtB,IAAA,EAAM,OAAO,QAAA,CAAS,CAAA;AAAA,QACtB,IAAA,EAAM,OAAO,QAAA,CAAS,CAAA;AAAA,QACtB,IAAA,EAAM,OAAO,QAAA,CAAS;AAAA,OACxB;AAAA,IACF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,cAAA,CAAe,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAO,cAAA,CAAe;AAAA,OAC9B;AAAA,IACF,KAAK,WAAA;AACH,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,OAAO;AAAA,UACL,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,MAAA,CAAO,SAAA,EAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,UACpH,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,MAAA,CAAO,SAAA,EAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,UACpH,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,MAAA,CAAO,SAAA,EAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,UACpH,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,GAAG,MAAA,CAAO,SAAA,EAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC;AAAA,SACtH;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,GAAQ,QAAA,EAAU,KAAA,GAAQ,WAAW,KAAA,GAAQ,CAAA,QAAA;AACnE,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,aAAA,EAAe;AACvC,QAAA,IAAI,KAAK,QAAA,EAAU;AACjB,UAAA,KAAA,MAAW,CAAA,IAAK,KAAK,QAAA,EAAU;AAC7B,YAAA,SAAA,GAAY,IAAA;AACZ,YAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,YAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,YAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAC3B,YAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,SAAA,GAAY,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM,GAAI,IAAA;AAAA,IAC9E;AAAA,IACA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;;;ACjIA,IAAM,gBAAA,GAAmB,CAAA;AAElB,IAAM,eAAN,MAAmB;AAAA,EAChB,IAAA,GAA2B,IAAIA,sBAAA,EAAM;AAAA,EACrC,QAAuB,EAAC;AAAA,EAEhC,MAAM,QAAA,EAA6B;AACjC,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,MAAM,IAAA,CAAK;AAAA,QACd,GAAG,IAAA;AAAA,QACH,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAA,CAAO,IAAA,EAAc,IAAA,EAAc,IAAA,EAAc,IAAA,EAA6B;AAC5E,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAO,EAAE,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,EACpD;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAChB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AACF;AAMO,SAAS,QACd,EAAA,EACA,EAAA,EACA,QAAA,EACA,YAAA,EACA,eACA,KAAA,EACQ;AACR,EAAA,MAAM,YAAY,gBAAA,GAAmB,KAAA;AAErC,EAAA,MAAM,aAAa,YAAA,CAAa,MAAA;AAAA,IAC9B,EAAA,GAAK,SAAA;AAAA,IAAW,EAAA,GAAK,SAAA;AAAA,IACrB,EAAA,GAAK,SAAA;AAAA,IAAW,EAAA,GAAK;AAAA,GACvB;AAEA,EAAA,IAAI,QAAA,GAAW,SAAA;AACf,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,KAAA,IAAS,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/C,IAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAErB,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,EAAA,EAAI,EAAA,EAAI,MAAM,CAAA;AAC5C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,SAAA,GAAY,IAAA,CAAK,WAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,EAAA,EAAY,EAAA,EAAY,MAAA,EAA2B;AAClF,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,OAAO,kBAAA,CAAmB,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAE9F,KAAK,QAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,MAAA,CAAO,MAAA,CAAO,GAAG,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAElF,KAAK,KAAA;AACH,MAAA,OAAO,cAAA;AAAA,QACL,EAAA;AAAA,QAAI,EAAA;AAAA,QACJ,OAAO,MAAA,CAAO,CAAA;AAAA,QAAG,OAAO,MAAA,CAAO,CAAA;AAAA,QAC/B,MAAA,CAAO,MAAA;AAAA,QACP,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAA;AAAA,QAC9B,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK;AAAA,OAC9B;AAAA,IAEF,KAAK,YAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,OAAA,GAAU,QAAA;AACd,MAAA,MAAM,QAAQ,MAAA,CAAO,QAAA;AACrB,MAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAC5D,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,QAAA,MAAM,CAAA,GAAI,KAAA,CAAA,CAAO,CAAA,GAAI,CAAA,IAAK,MAAM,MAAM,CAAA;AACtC,QAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACvD,QAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,IAEA,KAAK,SAAA;AACH,MAAA,OAAO,kBAAA;AAAA,QACL,EAAA;AAAA,QAAI,EAAA;AAAA,QACJ,OAAO,MAAA,CAAO,CAAA;AAAA,QAAG,OAAO,MAAA,CAAO,CAAA;AAAA,QAC/B,MAAA,CAAO,SAAA;AAAA,QAAW,MAAA,CAAO;AAAA,OAC3B;AAAA,IAEF,KAAK,MAAA;AAAA,IACL,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,IAAA,GAAO,kBAAkB,MAAM,CAAA;AACrC,MAAA,IAAI,CAAC,MAAM,OAAO,QAAA;AAClB,MAAA,OAAO,eAAA,CAAgB,EAAA,EAAI,EAAA,EAAI,IAAA,CAAK,IAAA,EAAM,KAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3E;AAAA,IAEA,KAAK,OAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,MAAA,CAAO,SAAS,CAAA,EAAG,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,IAElE,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,OAAA,GAAU,QAAA;AACd,MAAA,MAAM,MAAM,MAAA,CAAO,aAAA;AACnB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,CAAA,GAAI,mBAAmB,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA,CAAG,GAAG,GAAA,CAAI,CAAC,EAAG,CAAA,EAAG,GAAA,CAAI,IAAI,CAAC,CAAA,CAAG,GAAG,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,CAAG,CAAC,CAAA;AACvF,QAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,IAEA;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAIO,SAAS,mBACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACJ;AACR,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAEnD,EAAA,IAAI,MAAM,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,MAAM,EAAA,IAAM,KAAA;AAC5C,EAAA,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AAE9B,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,EAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,EAAA;AACvB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAA,EAAO,KAAK,KAAK,CAAA;AAC1C;AAEO,SAAS,iBAAA,CACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,IACZ,MAAA,EACQ;AACR,EAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,MAAM,CAAA;AACvD;AAEO,SAAS,eACd,EAAA,EAAY,EAAA,EACZ,IAAY,EAAA,EACZ,MAAA,EACA,YACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACzC,EAAA,MAAM,SAAA,GAAA,CAAc,SAAS,CAAA,GAAI,IAAA,CAAK,MAAO,CAAA,GAAI,IAAA,CAAK,EAAA,KAAO,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA;AACtE,EAAA,MAAM,SAAA,GAAA,CAAc,cAAc,CAAA,GAAI,IAAA,CAAK,MAAO,CAAA,GAAI,IAAA,CAAK,EAAA,KAAO,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA;AAC3E,EAAA,MAAM,OAAA,GAAA,CAAY,YAAY,CAAA,GAAI,IAAA,CAAK,MAAO,CAAA,GAAI,IAAA,CAAK,EAAA,KAAO,CAAA,GAAI,IAAA,CAAK,EAAA,CAAA;AAEvE,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAA,GACvB,SAAA,IAAa,aAAa,SAAA,IAAa,OAAA,GACvC,SAAA,IAAa,SAAA,IAAa,SAAA,IAAa,OAAA;AAE3C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,MAAM,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IACd,EAAA,IAAM,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,UAAU,CAAA,CAAA;AAAA,IACvC,EAAA,IAAM,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,GACzC;AACA,EAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,IACd,EAAA,IAAM,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,QAAQ,CAAA,CAAA;AAAA,IACrC,EAAA,IAAM,EAAA,GAAK,MAAA,GAAS,IAAA,CAAK,IAAI,QAAQ,CAAA;AAAA,GACvC;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACxB;AAEO,SAAS,gBACd,EAAA,EAAY,EAAA,EACZ,IAAA,EAAc,IAAA,EACd,MAAc,IAAA,EACN;AACR,EAAA,IAAI,EAAA,IAAM,QAAQ,EAAA,IAAM,IAAA,IAAQ,MAAM,IAAA,IAAQ,EAAA,IAAM,MAAM,OAAO,CAAA;AACjE,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,EAAA,EAAI,CAAA,EAAG,KAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,OAAO,EAAA,EAAI,CAAA,EAAG,KAAK,IAAI,CAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC1B;AAEO,SAAS,mBACd,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,WACA,UAAA,EACQ;AACR,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,UAAU,CAAC,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,QAAQ,CAAA;AAC9B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,QAAQ,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,GAAK,EAAA,IAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,GAAA;AAC7C,EAAA,MAAM,MAAA,GAAA,CAAU,EAAA,GAAK,EAAA,IAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,GAAA;AAE7C,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,SAAA,CAAU,KAAK,CAAC,CAAA;AACvD,EAAA,MAAM,IAAI,CAAA,GAAI,UAAA;AAEd,EAAA,IAAI,CAAA,GAAI,OAAO,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAEjD,EAAA,MAAM,OAAA,GAAU,UAAU,CAAA,GAAI,CAAA,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAA;AACvC,EAAA,IAAI,IAAA,GAAO,OAAO,OAAO,CAAA;AACzB,EAAA,MAAM,UAAA,GAAc,SAAS,IAAA,GAAQ,CAAA;AACrC,EAAA,MAAM,UAAA,GAAc,SAAS,IAAA,GAAQ,CAAA;AACrC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,UAAA,EAAY,SAAS,UAAU,CAAA;AAC5D;;;AC1NO,IAAM,cAAN,MAAkB;AAAA,EACvB,KAAA,GAAsB,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,EACtC,WAAA,GAAiC,IAAA;AAAA,EAEjC,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,aAAA,EAAc;AACpC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,EAAO;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,WAAA,CAAY,EAAA,EAAY,EAAA,EAAY,IAAA,EAA8C;AAChF,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,GAAQ,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAEjD,IAAA,QAAQ,IAAA,CAAK,MAAM,KAAA;AAAO,MACxB,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,UACX,KAAA,EAAO,cAAA;AAAA,UACP,UAAA,EAAY,KAAA;AAAA,UACZ,WAAW,IAAA,IAAQ;AAAA,SACrB;AACA,QAAA,OAAO,IAAA;AAAA,MAET,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,UAAA;AACtB,QAAA,MAAM,EAAA,GAAK,KAAA;AACX,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACrB,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA;AACrB,QAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC5C,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,GAAI,MAAM,IAAA,CAAK,EAAA;AAE9C,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,YAAY,EAAA,EAAI,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,KAAA,EAAM;AAE/E,QAAA,OAAO;AAAA,UACL,QAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAQ,EAAA;AAAA,UACR,MAAA,EAAQ,EAAA;AAAA,UACR,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE;AAAA,SACjB;AAAA,MACF;AAAA,MAEA,KAAK,MAAA;AAEH,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,KAAA,EAAO,cAAA,EAAgB,YAAY,KAAA,EAAM;AACxD,QAAA,OAAO,IAAA;AAAA,MAET;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF;AAAA,EAEA,WAAW,IAAA,EAA+B;AACxC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AACF;AAIO,SAAS,SAAA,CACd,EAAA,EACA,EAAA,EACA,QAAA,EACA,cACA,KAAA,EACA,SAAA,mBAA2B,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,UAAA,EAAY,QAAQ,CAAC,CAAA,EACvD;AACd,EAAA,MAAM,YAAY,EAAA,GAAK,KAAA;AACvB,EAAA,MAAM,UAAwB,EAAC;AAE/B,EAAA,MAAM,aAAa,YAAA,CAAa,MAAA;AAAA,IAC9B,EAAA,GAAK,SAAA;AAAA,IAAW,EAAA,GAAK,SAAA;AAAA,IACrB,EAAA,GAAK,SAAA;AAAA,IAAW,EAAA,GAAK;AAAA,GACvB;AAEA,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA;AAEjB,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AACtF,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QACpF;AACA,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AAC7C,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AAC7C,UAAA,UAAA,CAAW,SAAS,EAAA,EAAI,EAAA,EAAI,YAAY,GAAA,EAAK,EAAA,EAAI,IAAI,SAAS,CAAA;AAAA,QAChE;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,QAAA,EAAU,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QACxF;AACA,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,KAAA,MAAW,KAAA,IAAS,CAAC,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,IAAA,CAAK,EAAA,EAAI,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAG;AAC9D,YAAA,MAAM,EAAA,GAAK,OAAO,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AAC3D,YAAA,MAAM,EAAA,GAAK,OAAO,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AAC3D,YAAA,UAAA,CAAW,SAAS,EAAA,EAAI,EAAA,EAAI,YAAY,GAAA,EAAK,EAAA,EAAI,IAAI,SAAS,CAAA;AAAA,UAChE;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,KAAA,EAAO;AACV,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,QAAA,EAAU,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QACxF;AACA,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,EAAA,GAAK,GAAA;AAC/C,UAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAA;AAC3C,UAAA,UAAA,CAAW,OAAA,EAAS,OAAO,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAClK,UAAA,UAAA,CAAW,OAAA,EAAS,OAAO,MAAA,CAAO,CAAA,GAAI,OAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAM,GAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QAChK;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,YAAA;AAAA,MACL,KAAK,UAAA,EAAY;AACf,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,KAAA,MAAW,CAAA,IAAK,OAAO,QAAA,EAAU;AAC/B,YAAA,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,CAAE,GAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,UAClE;AAAA,QACF;AACA,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAO,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACnD,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAC3B,YAAA,MAAM,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AAC/B,YAAA,UAAA,CAAW,OAAA,EAAA,CAAU,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,EAAA,CAAI,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,IAAI,SAAS,CAAA;AAAA,UAC1F;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,SAAA,EAAW;AACd,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,QAAA,EAAU,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QACxF;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,cAAA,CAAe,CAAA,EAAG,MAAA,CAAO,cAAA,CAAe,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QAC1G;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,UAAA,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,cAAA,CAAe,CAAA,EAAG,MAAA,CAAO,cAAA,CAAe,CAAA,EAAG,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAS,CAAA;AAAA,QAC1G;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAEA,EAAA,OAAA,CAAQ,IAAA;AAAA,IAAK,CAAC,GAAG,CAAA,KACf,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,CAAE,KAAA,CAAM,IAAI,EAAE,CAAA,GACzC,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,CAAE,KAAA,CAAM,CAAA,GAAI,EAAE;AAAA,GAC3C;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,UAAA,CACP,SACA,CAAA,EAAW,CAAA,EACX,MACA,WAAA,EACA,EAAA,EAAY,IACZ,SAAA,EACM;AACN,EAAA,IAAI,KAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAA,GAAI,EAAE,KAAK,SAAA,EAAW;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,EAAE,GAAG,CAAA,EAAE,EAAG,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,EACrD;AACF;AAIO,SAAS,qBACd,GAAA,EACA,EAAA,EACA,WAAA,EACA,YAAA,EACA,cACA,KAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,GAAA,CAAI,aAAa,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAEjC,EAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAG1B,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,WAAA,CAAY,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,WAAA,CAAY,WAAA,CAAY,MAAM,CAAC,CAAA;AACnG,IAAA,iBAAA,CAAkB,KAAK,EAAA,EAAI,EAAA,EAAI,YAAY,WAAA,CAAY,IAAA,EAAM,OAAO,YAAY,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,cAAA,EAAgB;AAClC,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,KAAA,CAAM,UAAA,CAAW,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC3E,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,OAAA;AAEJ,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,WAAA,CAAY,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,WAAA,CAAY,WAAA,CAAY,MAAM,CAAC,CAAA;AAC3G,MAAA,OAAA,GAAU,MAAA;AACV,MAAA,OAAA,GAAU,MAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,YAAA;AACV,MAAA,OAAA,GAAU,YAAA;AAAA,IACZ;AAGA,IAAA,GAAA,CAAI,cAAc,MAAA,CAAO,YAAA;AACzB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,kBAAA,CAAmB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,MAAA,CAAO,YAAY,CAAA;AACrD,IAAA,kBAAA,CAAmB,GAAA,EAAK,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,YAAY,CAAA;AAG7D,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,GAAA,GAAM,WAAA,CAAY,YAAY,KAAA,CAAM,CAAA;AACpC,MAAA,GAAA,GAAM,WAAA,CAAY,YAAY,KAAA,CAAM,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,CAAC,KAAK,GAAG,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,cAAc,YAAY,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,WAAW,CAAA,EAAG,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC1E,IAAA,gBAAA,CAAiB,GAAA,EAAA,CAAM,MAAM,OAAA,IAAW,CAAA,EAAA,CAAI,MAAM,OAAA,IAAW,CAAA,EAAG,MAAM,KAAK,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAQ;AAC1B,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,KAAA,CAAM,UAAA,CAAW,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC3E,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,aAAA,CAAc,EAAA,EAAI,KAAA,CAAM,WAAA,CAAY,CAAA,EAAG,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA;AAG7E,IAAA,GAAA,CAAI,cAAc,MAAA,CAAO,YAAA;AACzB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,kBAAA,CAAmB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,MAAA,CAAO,YAAY,CAAA;AACrD,IAAA,kBAAA,CAAmB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,MAAA,CAAO,YAAY,CAAA;AACrD,IAAA,gBAAA,CAAiB,GAAA,EAAA,CAAM,MAAM,GAAA,IAAO,CAAA,EAAA,CAAI,MAAM,GAAA,IAAO,CAAA,EAAG,KAAA,CAAM,QAAA,EAAU,KAAK,CAAA;AAAA,EAC/E;AACF;AAEA,SAAS,iBAAA,CAAkB,GAAA,EAA+B,CAAA,EAAW,CAAA,EAAW,MAAgB,KAAA,EAAqB;AACnH,EAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,IAAA,GAAO,CAAA;AAEb,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,UAAA;AACH,MAAA,GAAA,CAAI,UAAA,CAAW,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,CAAA;AACrD,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA;AAC1B,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,GAAO,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACtC,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AACrC,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA;AAAA;AAEN;AAEA,SAAS,kBAAA,CAAmB,GAAA,EAA+B,CAAA,EAAW,CAAA,EAAW,KAAA,EAAqB;AACpG,EAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/B,EAAA,GAAA,CAAI,IAAA,EAAK;AACX;AAEA,SAAS,gBAAA,CACP,GAAA,EACA,CAAA,EAAW,CAAA,EACX,UACA,KAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAEhC,EAAA,GAAA,CAAI,IAAA,GAAO,gBAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,CAAA;AACZ,EAAA,MAAM,GAAA,GAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,GAAQ,CAAA,GAAI,GAAA;AACpC,EAAA,MAAM,MAAM,CAAA,GAAI,EAAA;AAChB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,GAAQ,GAAA,GAAM,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,EAAA;AAEZ,EAAA,GAAA,CAAI,SAAA,GAAY,KAAA,KAAU,MAAA,GAAS,iBAAA,GAAoB,uBAAA;AACvD,EAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAE/B,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,CAAE,YAAA;AAC9B,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAC9B;;;AC1TO,IAAM,YAAN,MAAgB;AAAA,EACb,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA,GAA0B,IAAA;AAAA,EAC1B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,mBAAA,GAA8B,EAAA;AAAA,EAC9B,aAAA,GAAyB,KAAA;AAAA,EACzB,SAAA,GAAqB,KAAA;AAAA,EACrB,YAAA,GAAuB,CAAA;AAAA,EACvB,YAAA,GAAuB,CAAA;AAAA,EAE/B,WAAA,CAAY,QAA2B,OAAA,EAA4B;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,KAAA,EAAO,SAAS,KAAA,IAAS,MAAA;AAAA,MACzB,iBAAiB,OAAA,EAAS,eAAA;AAAA,MAC1B,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,MACjC,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,MAC7B,OAAA,EAAS,SAAS,OAAA,IAAW,GAAA;AAAA,MAC7B,SAAA,EAAW,SAAS,SAAA,IAAa,GAAA;AAAA,MACjC,WAAA,EAAa,SAAS,WAAA,IAAe;AAAA,KACvC;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,EAAa;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,YAAA,EAAa;AAChC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,EAAa;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,EAAY;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,OAAA,CAAQ,WAAA;AAGhC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAA;AAGjD,IAAA,IAAA,CAAK,iBAAiB,IAAI,cAAA,CAAe,MAAM,IAAA,CAAK,QAAQ,CAAA;AAC5D,IAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,MAAM,CAAA;AAGlC,IAAA,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,KAAK,WAAW,CAAA;AAG5D,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA,EAIA,MAAM,SAAS,IAAA,EAA2B;AACxC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,WAAW,GAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,GAAA,GAAM,SAAS,GAAG,CAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA,EAEA,gBAAgB,MAAA,EAA2B;AACzC,IAAA,IAAA,CAAK,GAAA,GAAM,SAAS,MAAM,CAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AACX,IAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAC3B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,YAAY,UAAA,EAAW;AAC5B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAGf,IAAA,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAG3C,IAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAGzC,IAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,UAAA,EAAW;AAC5B,IAAA,IAAI,IAAA,CAAK,gBAAgB,SAAA,EAAW;AAClC,MAAA,IAAA,CAAK,YAAY,QAAA,EAAS;AAAA,IAC5B;AAGA,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA,EAIA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAEf,IAAA,MAAM,MAAA,GAAS,KAAK,qBAAA,EAAsB;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,YAAA;AAAA,MACV,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,IAAI;AAAA,KACvF;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC5D;AAAA,EAEA,OAAO,KAAA,EAAqB;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,GAAQ,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,GAAS,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,cAAa,CAAE,KAAA;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC5D;AAAA,EAEA,KAAA,CAAM,QAAgB,MAAA,EAAsB;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC/C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACpC,IAAA,MAAM,SAAA,GAAY,MAAA,GAAS,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,OAAA;AACzC,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,GAAS,EAAA,CAAG,QAAQ,EAAA,CAAG,OAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,SAAA;AAC5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,SAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACtB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC5D;AAAA,EAEA,gBAAA,GAAkC;AAChC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,CAAO,cAAa,EAAE;AAAA,EACzC;AAAA;AAAA,EAGA,YAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA;AAAA,EACtB;AAAA;AAAA,EAIA,SAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,aAAa,YAAA,EAAa;AAAA,EACxC;AAAA,EAEA,eAAA,CAAgB,MAAc,OAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,YAAA,CAAa,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,aAAA,CAAc,MAAc,KAAA,EAAqB;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,IAAA,EAAM,KAAK,CAAA;AAC9C,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA,EAIA,SAAS,KAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,QAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,EACtB;AAAA,EAEA,mBAAmB,KAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,QAAQ,eAAA,GAAkB,KAAA;AAC/B,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA;AAAA,EAIA,QAAQ,IAAA,EAAkB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,SAAA,IAAa,IAAA,KAAS,SAAA,EAAW;AACxD,MAAA,IAAA,CAAK,YAAY,UAAA,EAAW;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAErD,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,IAAA,CAAK,YAAY,QAAA,EAAS;AAAA,IAC5B;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,mBAAA,GAAsB,EAAA;AAAA,IAC7B;AACA,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEQ,iBAAiB,IAAA,EAAoB;AAC3C,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,KAAA;AAAO,QAAA,OAAO,MAAA;AAAA,MACnB,KAAK,QAAA;AAAU,QAAA,OAAO,WAAA;AAAA,MACtB,KAAK,SAAA;AAAW,QAAA,OAAO,WAAA;AAAA;AACzB,EACF;AAAA;AAAA,EAIA,EAAA,CACE,OACA,QAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,GAAA,CACE,OACA,QAAA,EACM;AACN,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,EAClC;AAAA;AAAA,EAIA,WAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,QAAA,IAAY,EAAC;AAAA,EAChC;AAAA;AAAA,EAIA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,SAAS,UAAA,EAAW;AACzB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,aAAa,OAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,QAAQ,kBAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAA;AAAA,EACb;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,SAAA,EAAW;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,IAAI,KAAK,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,MAAA,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA;AAAA,MACZ,IAAA,CAAK,GAAA;AAAA,MACL,IAAA,CAAK,OAAO,YAAA,EAAa;AAAA,MACzB,KAAK,OAAA,CAAQ,KAAA;AAAA,MACb,IAAA,CAAK,aAAa,oBAAA,EAAqB;AAAA,MACvC,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,IAAI,KAAK,WAAA,KAAgB,SAAA,IAAa,KAAK,WAAA,CAAY,KAAA,CAAM,UAAU,MAAA,EAAQ;AAC7E,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAW;AACrC,MAAA,oBAAA;AAAA,QACE,GAAA;AAAA,QACA,IAAA,CAAK,OAAO,YAAA,EAAa;AAAA,QACzB,IAAA,CAAK,WAAA;AAAA,QACL,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,YAAA;AAAA,QACL,KAAK,OAAA,CAAQ;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,SAAA,CAAU,IAAY,EAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACtB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,UAAA,CAAW,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAAsB;AACjE,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AACzC,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGA,WAAA,CAAY,SAAiB,OAAA,EAAuB;AAClD,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACpC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,aAAA,CAAc,EAAA,EAAI,SAAS,OAAO,CAAA;AAEnD,IAAA,QAAQ,KAAK,WAAA;AAAa,MACxB,KAAK,QAAA;AACH,QAAA,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,EAAA,EAAI,OAAA,EAAS,OAAO,CAAA;AAC1C,QAAA;AAAA,MACF,KAAK,SAAA,EAAW;AACd,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,IAAA,CAAK,IAAI,QAAA,EAAU,IAAA,CAAK,YAAA,EAAc,EAAA,CAAG,KAAK,CAAA;AAC9E,QAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAK,IAAA;AAC5C,QAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,EAAA,EAAI,IAAI,IAAI,CAAA;AACxD,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AAAA,QACrC;AACA,QAAA;AAAA,MACF;AAAA;AACF,EACF;AAAA;AAAA,EAGA,eAAA,CAAgB,SAAiB,OAAA,EAAuB;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,WAAA,KAAgB,SAAA,IAAa,IAAA,CAAK,GAAA,EAAK;AAC9C,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa;AACpC,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,aAAA,CAAc,EAAA,EAAI,SAAS,OAAO,CAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,IAAA,CAAK,IAAI,QAAA,EAAU,IAAA,CAAK,YAAA,EAAc,EAAA,CAAG,KAAK,CAAA;AAC9E,MAAA,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,KAAA,CAAM,CAAC,KAAK,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAkB;AACzE,IAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACf,IAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,MACZ,EAAA;AAAA,MAAI,EAAA;AAAA,MACJ,KAAK,GAAA,CAAI,QAAA;AAAA,MACT,IAAA,CAAK,YAAA;AAAA,MACL,IAAA,CAAK,aAAa,oBAAA,EAAqB;AAAA,MACvC,IAAA,CAAK,MAAA,CAAO,YAAA,EAAa,CAAE;AAAA,KAC7B;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,IAAA,IAAI,KAAA,IAAS,CAAA,IAAK,IAAA,CAAK,GAAA,EAAK;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA;AACtC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,QAAA,EAAU;AAAA,UAC1B,MAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,UAAA,EAAY,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAAA,UAC3B,WAAA,EAAa,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAAG,SAC7B,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAA,GAA2F;AACjG,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,OAAO,IAAA;AAEtB,IAAA,IAAI,KAAK,GAAA,CAAI,MAAA,CAAO,UAAU,IAAA,CAAK,GAAA,CAAI,OAAO,MAAA,EAAQ;AACpD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA;AAAA,QAC7B,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA;AAAA,QAC7B,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAA;AAAA,QAC7B,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO;AAAA,OAC/B;AAAA,IACF;AAEA,IAAA,OAAO,qBAAA,CAAsB,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,EAChD;AACF","file":"index.cjs","sourcesContent":["export interface DxfToken {\n code: number;\n value: string;\n}\n\n/**\n * Fast tokenizer: splits raw DXF text into (code, value) pairs.\n * Uses indexOf scanning for performance on large files.\n * Handles \\r\\n, \\n, and \\r line endings.\n */\nexport function tokenize(content: string): DxfToken[] {\n // Normalize line endings\n const text = content.replace(/\\r\\n?/g, '\\n');\n const tokens: DxfToken[] = [];\n const len = text.length;\n let pos = 0;\n\n while (pos < len) {\n // Skip empty lines\n while (pos < len && text.charCodeAt(pos) === 10) pos++;\n if (pos >= len) break;\n\n // Read group code line\n let lineEnd = text.indexOf('\\n', pos);\n if (lineEnd === -1) lineEnd = len;\n const codeLine = text.substring(pos, lineEnd).trim();\n pos = lineEnd + 1;\n\n // Parse group code as integer\n const code = parseInt(codeLine, 10);\n if (isNaN(code)) {\n // Skip malformed pair — advance past value line too\n if (pos < len) {\n lineEnd = text.indexOf('\\n', pos);\n if (lineEnd === -1) lineEnd = len;\n pos = lineEnd + 1;\n }\n continue;\n }\n\n // Read value line\n if (pos >= len) break;\n lineEnd = text.indexOf('\\n', pos);\n if (lineEnd === -1) lineEnd = len;\n // Trim only trailing whitespace (preserve leading spaces — some values need them)\n const value = text.substring(pos, lineEnd).replace(/\\s+$/, '');\n pos = lineEnd + 1;\n\n tokens.push({ code, value });\n }\n\n return tokens;\n}\n\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfHeader, Point3D } from '../types.js';\n\nexport function parseHeader(tokens: DxfToken[], i: number, header: DxfHeader): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDSEC') return i + 1;\n\n if (token.code === 9) {\n const varName = token.value;\n i++;\n\n switch (varName) {\n case '$ACADVER':\n if (i < tokens.length) { header.acadVersion = tokens[i]!.value; i++; }\n break;\n case '$EXTMIN':\n if (i < tokens.length) {\n const result = readHeaderPoint3D(tokens, i);\n header.extMin = result.point;\n i = result.nextIndex;\n }\n break;\n case '$EXTMAX':\n if (i < tokens.length) {\n const result = readHeaderPoint3D(tokens, i);\n header.extMax = result.point;\n i = result.nextIndex;\n }\n break;\n case '$INSUNITS':\n if (i < tokens.length) { header.insUnits = parseInt(tokens[i]!.value, 10); i++; }\n break;\n case '$MEASUREMENT':\n if (i < tokens.length) { header.measurement = parseInt(tokens[i]!.value, 10); i++; }\n break;\n case '$LTSCALE':\n if (i < tokens.length) { header.ltScale = parseFloat(tokens[i]!.value); i++; }\n break;\n case '$DWGCODEPAGE':\n if (i < tokens.length) { header.dwgCodePage = tokens[i]!.value; i++; }\n break;\n case '$HANDSEED':\n if (i < tokens.length) { header.handleSeed = tokens[i]!.value; i++; }\n break;\n default:\n // Skip unknown variables by reading until next code 9 or code 0\n while (i < tokens.length && tokens[i]!.code !== 9 && tokens[i]!.code !== 0) {\n header[varName] = tokens[i]!.value;\n i++;\n }\n }\n } else {\n i++;\n }\n }\n return i;\n}\n\nfunction readHeaderPoint3D(tokens: DxfToken[], i: number): { point: Point3D; nextIndex: number } {\n const point: Point3D = { x: 0, y: 0, z: 0 };\n // Read codes 10/20/30 (or whatever X/Y/Z codes follow)\n while (i < tokens.length) {\n const code = tokens[i]!.code;\n if (code === 10) { point.x = parseFloat(tokens[i]!.value); i++; }\n else if (code === 20) { point.y = parseFloat(tokens[i]!.value); i++; }\n else if (code === 30) { point.z = parseFloat(tokens[i]!.value); i++; }\n else break;\n }\n return { point, nextIndex: i };\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfDocument, DxfLayer, DxfLineType, DxfStyle } from '../types.js';\n\nexport function parseTables(tokens: DxfToken[], i: number, doc: DxfDocument): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDSEC') return i + 1;\n\n if (token.code === 0 && token.value === 'TABLE') {\n i++;\n if (i >= tokens.length) break;\n // code 2 = table type name\n const tableType = tokens[i]!.value;\n i++;\n\n switch (tableType) {\n case 'LAYER':\n i = parseLayerTable(tokens, i, doc.layers);\n break;\n case 'LTYPE':\n i = parseLTypeTable(tokens, i, doc.lineTypes);\n break;\n case 'STYLE':\n i = parseStyleTable(tokens, i, doc.styles);\n break;\n default:\n // Skip unknown tables\n i = skipTable(tokens, i);\n break;\n }\n } else {\n i++;\n }\n }\n return i;\n}\n\nfunction skipTable(tokens: DxfToken[], i: number): number {\n while (i < tokens.length) {\n if (tokens[i]!.code === 0 && tokens[i]!.value === 'ENDTAB') return i + 1;\n i++;\n }\n return i;\n}\n\nfunction parseLayerTable(tokens: DxfToken[], i: number, layers: Map<string, DxfLayer>): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDTAB') return i + 1;\n\n if (token.code === 0 && token.value === 'LAYER') {\n i++;\n const layer: DxfLayer = {\n name: '0',\n color: 7,\n lineType: 'Continuous',\n flags: 0,\n lineWeight: -3,\n isOff: false,\n isFrozen: false,\n isLocked: false,\n };\n\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 2: layer.name = tag.value; break;\n case 6: layer.lineType = tag.value; break;\n case 62: layer.color = parseInt(tag.value, 10); break;\n case 70: layer.flags = parseInt(tag.value, 10); break;\n case 370: layer.lineWeight = parseInt(tag.value, 10); break;\n case 420: layer.trueColor = parseInt(tag.value, 10); break;\n }\n i++;\n }\n\n layers.set(layer.name, layer);\n } else {\n i++;\n }\n }\n return i;\n}\n\nfunction parseLTypeTable(tokens: DxfToken[], i: number, lineTypes: Map<string, DxfLineType>): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDTAB') return i + 1;\n\n if (token.code === 0 && token.value === 'LTYPE') {\n i++;\n const lt: DxfLineType = {\n name: '',\n description: '',\n pattern: [],\n totalLength: 0,\n };\n\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 2: lt.name = tag.value; break;\n case 3: lt.description = tag.value; break;\n case 40: lt.totalLength = parseFloat(tag.value); break;\n case 49: lt.pattern.push(parseFloat(tag.value)); break;\n }\n i++;\n }\n\n if (lt.name) lineTypes.set(lt.name, lt);\n } else {\n i++;\n }\n }\n return i;\n}\n\nfunction parseStyleTable(tokens: DxfToken[], i: number, styles: Map<string, DxfStyle>): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDTAB') return i + 1;\n\n if (token.code === 0 && token.value === 'STYLE') {\n i++;\n const style: DxfStyle = {\n name: '',\n fontName: '',\n bigFontName: '',\n height: 0,\n widthFactor: 1,\n obliqueAngle: 0,\n };\n\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 2: style.name = tag.value; break;\n case 3: style.fontName = tag.value; break;\n case 4: style.bigFontName = tag.value; break;\n case 40: style.height = parseFloat(tag.value); break;\n case 41: style.widthFactor = parseFloat(tag.value); break;\n case 50: style.obliqueAngle = parseFloat(tag.value); break;\n }\n i++;\n }\n\n if (style.name) styles.set(style.name, style);\n } else {\n i++;\n }\n }\n return i;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfEntityBase, Point3D } from '../types.js';\n\n/**\n * Parse common entity properties shared by all entity types.\n * Handles: handle, layer, color, trueColor, lineType, lineTypeScale,\n * lineWeight, visibility, and extrusion direction.\n */\nexport function parseBaseEntity(tags: DxfToken[]): DxfEntityBase {\n const base: DxfEntityBase = {\n type: '',\n layer: '0',\n color: 256, // BYLAYER\n lineType: 'BYLAYER',\n lineTypeScale: 1.0,\n lineWeight: -1, // BYLAYER\n visible: true,\n extrusion: { x: 0, y: 0, z: 1 },\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 5: base.handle = tag.value; break;\n case 8: base.layer = tag.value; break;\n case 6: base.lineType = tag.value; break;\n case 48: base.lineTypeScale = parseFloat(tag.value); break;\n case 60: base.visible = tag.value === '0' || tag.value === ''; break;\n case 62: base.color = parseInt(tag.value, 10); break;\n case 370: base.lineWeight = parseInt(tag.value, 10); break;\n case 420: base.trueColor = parseInt(tag.value, 10); break;\n case 210: base.extrusion.x = parseFloat(tag.value); break;\n case 220: base.extrusion.y = parseFloat(tag.value); break;\n case 230: base.extrusion.z = parseFloat(tag.value); break;\n }\n }\n\n return base;\n}\n\n/** Read a Point3D from tokens starting at position i (expects codes 10/20/30 or similar) */\nexport function readPoint3D(tags: DxfToken[], startIndex: number): { point: Point3D; consumed: number } {\n const point: Point3D = { x: 0, y: 0, z: 0 };\n let consumed = 0;\n let i = startIndex;\n\n if (i < tags.length) {\n point.x = parseFloat(tags[i]!.value);\n consumed++;\n i++;\n }\n if (i < tags.length && (tags[i]!.code === 20 || tags[i]!.code === 21 || tags[i]!.code === 22 || tags[i]!.code === 23 || tags[i]!.code === 24 || tags[i]!.code === 25)) {\n point.y = parseFloat(tags[i]!.value);\n consumed++;\n i++;\n }\n if (i < tags.length && (tags[i]!.code === 30 || tags[i]!.code === 31 || tags[i]!.code === 32 || tags[i]!.code === 33 || tags[i]!.code === 34 || tags[i]!.code === 35)) {\n point.z = parseFloat(tags[i]!.value);\n consumed++;\n }\n\n return { point, consumed };\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfLineEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseLine(tags: DxfToken[]): DxfLineEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfLineEntity = {\n ...base,\n type: 'LINE',\n start: { x: 0, y: 0, z: 0 },\n end: { x: 0, y: 0, z: 0 },\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 10: entity.start.x = parseFloat(tag.value); break;\n case 20: entity.start.y = parseFloat(tag.value); break;\n case 30: entity.start.z = parseFloat(tag.value); break;\n case 11: entity.end.x = parseFloat(tag.value); break;\n case 21: entity.end.y = parseFloat(tag.value); break;\n case 31: entity.end.z = parseFloat(tag.value); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfCircleEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseCircle(tags: DxfToken[]): DxfCircleEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfCircleEntity = {\n ...base,\n type: 'CIRCLE',\n center: { x: 0, y: 0, z: 0 },\n radius: 0,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 10: entity.center.x = parseFloat(tag.value); break;\n case 20: entity.center.y = parseFloat(tag.value); break;\n case 30: entity.center.z = parseFloat(tag.value); break;\n case 40: entity.radius = parseFloat(tag.value); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfArcEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseArc(tags: DxfToken[]): DxfArcEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfArcEntity = {\n ...base,\n type: 'ARC',\n center: { x: 0, y: 0, z: 0 },\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 10: entity.center.x = parseFloat(tag.value); break;\n case 20: entity.center.y = parseFloat(tag.value); break;\n case 30: entity.center.z = parseFloat(tag.value); break;\n case 40: entity.radius = parseFloat(tag.value); break;\n case 50: entity.startAngle = parseFloat(tag.value); break;\n case 51: entity.endAngle = parseFloat(tag.value); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfLwPolylineEntity, DxfLwPolylineVertex } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseLwPolyline(tags: DxfToken[]): DxfLwPolylineEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfLwPolylineEntity = {\n ...base,\n type: 'LWPOLYLINE',\n vertices: [],\n closed: false,\n constantWidth: 0,\n elevation: 0,\n };\n\n let currentVertex: DxfLwPolylineVertex | null = null;\n\n for (const tag of tags) {\n switch (tag.code) {\n case 70:\n entity.closed = (parseInt(tag.value, 10) & 1) !== 0;\n break;\n case 38:\n entity.elevation = parseFloat(tag.value);\n break;\n case 43:\n entity.constantWidth = parseFloat(tag.value);\n break;\n case 10:\n // New vertex starts at each code 10\n if (currentVertex) entity.vertices.push(currentVertex);\n currentVertex = { x: parseFloat(tag.value), y: 0, bulge: 0, startWidth: 0, endWidth: 0 };\n break;\n case 20:\n if (currentVertex) currentVertex.y = parseFloat(tag.value);\n break;\n case 40:\n if (currentVertex) currentVertex.startWidth = parseFloat(tag.value);\n break;\n case 41:\n if (currentVertex) currentVertex.endWidth = parseFloat(tag.value);\n break;\n case 42:\n if (currentVertex) currentVertex.bulge = parseFloat(tag.value);\n break;\n }\n }\n if (currentVertex) entity.vertices.push(currentVertex);\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfPolylineEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parsePolyline(tags: DxfToken[]): DxfPolylineEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfPolylineEntity = {\n ...base,\n type: 'POLYLINE',\n vertices: [], // filled in by entities dispatcher from VERTEX entities\n closed: false,\n is3d: false,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 70: {\n const flags = parseInt(tag.value, 10);\n entity.closed = (flags & 1) !== 0;\n entity.is3d = (flags & 8) !== 0;\n break;\n }\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfEllipseEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseEllipse(tags: DxfToken[]): DxfEllipseEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfEllipseEntity = {\n ...base,\n type: 'ELLIPSE',\n center: { x: 0, y: 0, z: 0 },\n majorAxis: { x: 1, y: 0, z: 0 },\n minorRatio: 1,\n startParam: 0,\n endParam: Math.PI * 2,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 10: entity.center.x = parseFloat(tag.value); break;\n case 20: entity.center.y = parseFloat(tag.value); break;\n case 30: entity.center.z = parseFloat(tag.value); break;\n case 11: entity.majorAxis.x = parseFloat(tag.value); break;\n case 21: entity.majorAxis.y = parseFloat(tag.value); break;\n case 31: entity.majorAxis.z = parseFloat(tag.value); break;\n case 40: entity.minorRatio = parseFloat(tag.value); break;\n case 41: entity.startParam = parseFloat(tag.value); break;\n case 42: entity.endParam = parseFloat(tag.value); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfSplineEntity, Point3D } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseSpline(tags: DxfToken[]): DxfSplineEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfSplineEntity = {\n ...base,\n type: 'SPLINE',\n degree: 3,\n flags: 0,\n knots: [],\n controlPoints: [],\n fitPoints: [],\n weights: [],\n };\n\n let currentCP: Point3D | null = null;\n let currentFP: Point3D | null = null;\n\n for (const tag of tags) {\n switch (tag.code) {\n case 70: entity.flags = parseInt(tag.value, 10); break;\n case 71: entity.degree = parseInt(tag.value, 10); break;\n // 72 = knot count, 73 = control point count, 74 = fit point count — informational, skip\n case 40: entity.knots.push(parseFloat(tag.value)); break;\n case 41: entity.weights.push(parseFloat(tag.value)); break;\n case 10:\n if (currentCP) entity.controlPoints.push(currentCP);\n currentCP = { x: parseFloat(tag.value), y: 0, z: 0 };\n break;\n case 20:\n if (currentCP) currentCP.y = parseFloat(tag.value);\n break;\n case 30:\n if (currentCP) currentCP.z = parseFloat(tag.value);\n break;\n case 11:\n if (currentFP) entity.fitPoints.push(currentFP);\n currentFP = { x: parseFloat(tag.value), y: 0, z: 0 };\n break;\n case 21:\n if (currentFP) currentFP.y = parseFloat(tag.value);\n break;\n case 31:\n if (currentFP) currentFP.z = parseFloat(tag.value);\n break;\n case 12:\n if (!entity.startTangent) entity.startTangent = { x: 0, y: 0, z: 0 };\n entity.startTangent.x = parseFloat(tag.value);\n break;\n case 22:\n if (entity.startTangent) entity.startTangent.y = parseFloat(tag.value);\n break;\n case 32:\n if (entity.startTangent) entity.startTangent.z = parseFloat(tag.value);\n break;\n case 13:\n if (!entity.endTangent) entity.endTangent = { x: 0, y: 0, z: 0 };\n entity.endTangent.x = parseFloat(tag.value);\n break;\n case 23:\n if (entity.endTangent) entity.endTangent.y = parseFloat(tag.value);\n break;\n case 33:\n if (entity.endTangent) entity.endTangent.z = parseFloat(tag.value);\n break;\n }\n }\n if (currentCP) entity.controlPoints.push(currentCP);\n if (currentFP) entity.fitPoints.push(currentFP);\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfTextEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseText(tags: DxfToken[]): DxfTextEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfTextEntity = {\n ...base,\n type: 'TEXT',\n text: '',\n insertionPoint: { x: 0, y: 0, z: 0 },\n height: 1,\n rotation: 0,\n widthFactor: 1,\n obliqueAngle: 0,\n style: 'STANDARD',\n hAlign: 0,\n vAlign: 0,\n generationFlags: 0,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 1: entity.text = tag.value; break;\n case 10: entity.insertionPoint.x = parseFloat(tag.value); break;\n case 20: entity.insertionPoint.y = parseFloat(tag.value); break;\n case 30: entity.insertionPoint.z = parseFloat(tag.value); break;\n case 11:\n if (!entity.alignmentPoint) entity.alignmentPoint = { x: 0, y: 0, z: 0 };\n entity.alignmentPoint.x = parseFloat(tag.value);\n break;\n case 21:\n if (!entity.alignmentPoint) entity.alignmentPoint = { x: 0, y: 0, z: 0 };\n entity.alignmentPoint.y = parseFloat(tag.value);\n break;\n case 31:\n if (!entity.alignmentPoint) entity.alignmentPoint = { x: 0, y: 0, z: 0 };\n entity.alignmentPoint.z = parseFloat(tag.value);\n break;\n case 40: entity.height = parseFloat(tag.value); break;\n case 41: entity.widthFactor = parseFloat(tag.value); break;\n case 50: entity.rotation = parseFloat(tag.value); break;\n case 51: entity.obliqueAngle = parseFloat(tag.value); break;\n case 7: entity.style = tag.value; break;\n case 71: entity.generationFlags = parseInt(tag.value, 10); break;\n case 72: entity.hAlign = parseInt(tag.value, 10); break;\n case 73: entity.vAlign = parseInt(tag.value, 10); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfMTextEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseMText(tags: DxfToken[]): DxfMTextEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfMTextEntity = {\n ...base,\n type: 'MTEXT',\n text: '',\n insertionPoint: { x: 0, y: 0, z: 0 },\n height: 1,\n width: 0,\n attachmentPoint: 1,\n drawingDirection: 1,\n rotation: 0,\n lineSpacingStyle: 1,\n lineSpacingFactor: 1,\n style: 'STANDARD',\n bgFill: 0,\n bgFillScale: 1.5,\n };\n\n const textChunks: string[] = [];\n\n for (const tag of tags) {\n switch (tag.code) {\n case 1:\n textChunks.push(tag.value); // final chunk\n break;\n case 3:\n textChunks.push(tag.value); // intermediate chunk\n break;\n case 7: entity.style = tag.value; break;\n case 10: entity.insertionPoint.x = parseFloat(tag.value); break;\n case 20: entity.insertionPoint.y = parseFloat(tag.value); break;\n case 30: entity.insertionPoint.z = parseFloat(tag.value); break;\n case 11:\n if (!entity.textDirection) entity.textDirection = { x: 0, y: 0, z: 0 };\n entity.textDirection.x = parseFloat(tag.value);\n break;\n case 21:\n if (!entity.textDirection) entity.textDirection = { x: 0, y: 0, z: 0 };\n entity.textDirection.y = parseFloat(tag.value);\n break;\n case 31:\n if (!entity.textDirection) entity.textDirection = { x: 0, y: 0, z: 0 };\n entity.textDirection.z = parseFloat(tag.value);\n break;\n case 40: entity.height = parseFloat(tag.value); break;\n case 41: entity.width = parseFloat(tag.value); break;\n case 44: entity.lineSpacingFactor = parseFloat(tag.value); break;\n case 50: entity.rotation = parseFloat(tag.value); break;\n case 71: entity.attachmentPoint = parseInt(tag.value, 10); break;\n case 72: entity.drawingDirection = parseInt(tag.value, 10); break;\n case 73: entity.lineSpacingStyle = parseInt(tag.value, 10); break;\n case 90: entity.bgFill = parseInt(tag.value, 10); break;\n }\n }\n\n entity.text = textChunks.join('');\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfInsertEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseInsert(tags: DxfToken[]): DxfInsertEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfInsertEntity = {\n ...base,\n type: 'INSERT',\n blockName: '',\n insertionPoint: { x: 0, y: 0, z: 0 },\n scaleX: 1,\n scaleY: 1,\n scaleZ: 1,\n rotation: 0,\n columnCount: 1,\n rowCount: 1,\n columnSpacing: 0,\n rowSpacing: 0,\n attribs: [],\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 2: entity.blockName = tag.value; break;\n case 10: entity.insertionPoint.x = parseFloat(tag.value); break;\n case 20: entity.insertionPoint.y = parseFloat(tag.value); break;\n case 30: entity.insertionPoint.z = parseFloat(tag.value); break;\n case 41: entity.scaleX = parseFloat(tag.value); break;\n case 42: entity.scaleY = parseFloat(tag.value); break;\n case 43: entity.scaleZ = parseFloat(tag.value); break;\n case 44: entity.columnSpacing = parseFloat(tag.value); break;\n case 45: entity.rowSpacing = parseFloat(tag.value); break;\n case 50: entity.rotation = parseFloat(tag.value); break;\n case 70: entity.columnCount = parseInt(tag.value, 10) || 1; break;\n case 71: entity.rowCount = parseInt(tag.value, 10) || 1; break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfDimensionEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseDimension(tags: DxfToken[]): DxfDimensionEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfDimensionEntity = {\n ...base,\n type: 'DIMENSION',\n blockName: '',\n dimStyle: 'STANDARD',\n dimType: 0,\n defPoint: { x: 0, y: 0, z: 0 },\n textMidpoint: { x: 0, y: 0, z: 0 },\n textOverride: '',\n rotation: 0,\n textRotation: 0,\n leaderLength: 0,\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 1: entity.textOverride = tag.value; break;\n case 2: entity.blockName = tag.value; break;\n case 3: entity.dimStyle = tag.value; break;\n case 10: entity.defPoint.x = parseFloat(tag.value); break;\n case 20: entity.defPoint.y = parseFloat(tag.value); break;\n case 30: entity.defPoint.z = parseFloat(tag.value); break;\n case 11: entity.textMidpoint.x = parseFloat(tag.value); break;\n case 21: entity.textMidpoint.y = parseFloat(tag.value); break;\n case 31: entity.textMidpoint.z = parseFloat(tag.value); break;\n case 13:\n if (!entity.defPoint2) entity.defPoint2 = { x: 0, y: 0, z: 0 };\n entity.defPoint2.x = parseFloat(tag.value); break;\n case 23:\n if (!entity.defPoint2) entity.defPoint2 = { x: 0, y: 0, z: 0 };\n entity.defPoint2.y = parseFloat(tag.value); break;\n case 33:\n if (!entity.defPoint2) entity.defPoint2 = { x: 0, y: 0, z: 0 };\n entity.defPoint2.z = parseFloat(tag.value); break;\n case 14:\n if (!entity.defPoint3) entity.defPoint3 = { x: 0, y: 0, z: 0 };\n entity.defPoint3.x = parseFloat(tag.value); break;\n case 24:\n if (!entity.defPoint3) entity.defPoint3 = { x: 0, y: 0, z: 0 };\n entity.defPoint3.y = parseFloat(tag.value); break;\n case 34:\n if (!entity.defPoint3) entity.defPoint3 = { x: 0, y: 0, z: 0 };\n entity.defPoint3.z = parseFloat(tag.value); break;\n case 15:\n if (!entity.defPoint4) entity.defPoint4 = { x: 0, y: 0, z: 0 };\n entity.defPoint4.x = parseFloat(tag.value); break;\n case 25:\n if (!entity.defPoint4) entity.defPoint4 = { x: 0, y: 0, z: 0 };\n entity.defPoint4.y = parseFloat(tag.value); break;\n case 35:\n if (!entity.defPoint4) entity.defPoint4 = { x: 0, y: 0, z: 0 };\n entity.defPoint4.z = parseFloat(tag.value); break;\n case 16:\n if (!entity.defPoint5) entity.defPoint5 = { x: 0, y: 0, z: 0 };\n entity.defPoint5.x = parseFloat(tag.value); break;\n case 26:\n if (!entity.defPoint5) entity.defPoint5 = { x: 0, y: 0, z: 0 };\n entity.defPoint5.y = parseFloat(tag.value); break;\n case 36:\n if (!entity.defPoint5) entity.defPoint5 = { x: 0, y: 0, z: 0 };\n entity.defPoint5.z = parseFloat(tag.value); break;\n case 40: entity.leaderLength = parseFloat(tag.value); break;\n case 50: entity.rotation = parseFloat(tag.value); break;\n case 53: entity.textRotation = parseFloat(tag.value); break;\n case 70: entity.dimType = parseInt(tag.value, 10); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfHatchEntity, DxfHatchBoundaryPath, DxfHatchEdge, Point2D } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parseHatch(tags: DxfToken[]): DxfHatchEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfHatchEntity = {\n ...base,\n type: 'HATCH',\n patternName: '',\n solidFill: true,\n associative: false,\n hatchStyle: 0,\n patternType: 1,\n patternAngle: 0,\n patternScale: 1,\n boundaryPaths: [],\n };\n\n let i = 0;\n // First pass: get non-boundary properties\n while (i < tags.length) {\n const tag = tags[i]!;\n switch (tag.code) {\n case 2: entity.patternName = tag.value; break;\n case 41: entity.patternScale = parseFloat(tag.value); break;\n case 52: entity.patternAngle = parseFloat(tag.value); break;\n case 70: entity.solidFill = tag.value === '1'; break;\n case 71: entity.associative = tag.value === '1'; break;\n case 75: entity.hatchStyle = parseInt(tag.value, 10); break;\n case 76: entity.patternType = parseInt(tag.value, 10); break;\n case 91: {\n // Number of boundary paths — now parse them\n const pathCount = parseInt(tag.value, 10);\n i++;\n for (let p = 0; p < pathCount && i < tags.length; p++) {\n const result = parseBoundaryPath(tags, i);\n entity.boundaryPaths.push(result.path);\n i = result.nextIndex;\n }\n continue; // skip the i++ at bottom\n }\n }\n i++;\n }\n\n return entity;\n}\n\nfunction parseBoundaryPath(tags: DxfToken[], i: number): { path: DxfHatchBoundaryPath; nextIndex: number } {\n // First tag should be code 92 (path type flag)\n let flags = 0;\n if (i < tags.length && tags[i]!.code === 92) {\n flags = parseInt(tags[i]!.value, 10);\n i++;\n }\n\n const isPolyline = (flags & 2) !== 0;\n\n if (isPolyline) {\n return parsePolylinePath(tags, i, flags);\n } else {\n return parseEdgePath(tags, i, flags);\n }\n}\n\nfunction parsePolylinePath(tags: DxfToken[], i: number, flags: number): { path: DxfHatchBoundaryPath; nextIndex: number } {\n const path: DxfHatchBoundaryPath = {\n type: 'polyline',\n vertices: [],\n bulges: [],\n flags,\n };\n\n // Code 72 = has bulge flag\n let hasBulge = false;\n if (i < tags.length && tags[i]!.code === 72) {\n hasBulge = tags[i]!.value === '1';\n i++;\n }\n\n // Code 73 = is closed\n if (i < tags.length && tags[i]!.code === 73) {\n path.isClosed = tags[i]!.value === '1';\n i++;\n }\n\n // Code 93 = number of vertices\n let vertexCount = 0;\n if (i < tags.length && tags[i]!.code === 93) {\n vertexCount = parseInt(tags[i]!.value, 10);\n i++;\n }\n\n for (let v = 0; v < vertexCount && i < tags.length; v++) {\n const vertex: Point2D = { x: 0, y: 0 };\n if (tags[i]!.code === 10) {\n vertex.x = parseFloat(tags[i]!.value);\n i++;\n }\n if (i < tags.length && tags[i]!.code === 20) {\n vertex.y = parseFloat(tags[i]!.value);\n i++;\n }\n path.vertices!.push(vertex);\n\n if (hasBulge && i < tags.length && tags[i]!.code === 42) {\n path.bulges!.push(parseFloat(tags[i]!.value));\n i++;\n } else if (hasBulge) {\n path.bulges!.push(0);\n }\n }\n\n // Skip source boundary objects count (code 97) and handles (code 330)\n while (i < tags.length && (tags[i]!.code === 97 || tags[i]!.code === 330)) {\n if (tags[i]!.code === 97) {\n const count = parseInt(tags[i]!.value, 10);\n i++;\n for (let s = 0; s < count && i < tags.length && tags[i]!.code === 330; s++) {\n i++;\n }\n } else {\n i++;\n }\n }\n\n return { path, nextIndex: i };\n}\n\nfunction parseEdgePath(tags: DxfToken[], i: number, flags: number): { path: DxfHatchBoundaryPath; nextIndex: number } {\n const path: DxfHatchBoundaryPath = {\n type: 'edges',\n edges: [],\n flags,\n };\n\n // Code 93 = number of edges\n let edgeCount = 0;\n if (i < tags.length && tags[i]!.code === 93) {\n edgeCount = parseInt(tags[i]!.value, 10);\n i++;\n }\n\n for (let e = 0; e < edgeCount && i < tags.length; e++) {\n // Code 72 = edge type\n if (tags[i]!.code !== 72) break;\n const edgeType = parseInt(tags[i]!.value, 10);\n i++;\n\n switch (edgeType) {\n case 1: { // Line\n const edge: DxfHatchEdge = {\n type: 'line',\n start: { x: 0, y: 0 },\n end: { x: 0, y: 0 },\n };\n if (i < tags.length && tags[i]!.code === 10) { edge.start.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 20) { edge.start.y = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 11) { edge.end.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 21) { edge.end.y = parseFloat(tags[i]!.value); i++; }\n path.edges!.push(edge);\n break;\n }\n case 2: { // Arc\n const edge: DxfHatchEdge = {\n type: 'arc',\n center: { x: 0, y: 0 },\n radius: 0,\n startAngle: 0,\n endAngle: 360,\n ccw: true,\n };\n if (i < tags.length && tags[i]!.code === 10) { edge.center.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 20) { edge.center.y = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 40) { edge.radius = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 50) { edge.startAngle = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 51) { edge.endAngle = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 73) { edge.ccw = tags[i]!.value === '1'; i++; }\n path.edges!.push(edge);\n break;\n }\n case 3: { // Ellipse\n const edge: DxfHatchEdge = {\n type: 'ellipse',\n center: { x: 0, y: 0 },\n majorAxis: { x: 1, y: 0 },\n minorRatio: 1,\n startAngle: 0,\n endAngle: Math.PI * 2,\n ccw: true,\n };\n if (i < tags.length && tags[i]!.code === 10) { edge.center.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 20) { edge.center.y = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 11) { edge.majorAxis.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 21) { edge.majorAxis.y = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 40) { edge.minorRatio = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 50) { edge.startAngle = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 51) { edge.endAngle = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 73) { edge.ccw = tags[i]!.value === '1'; i++; }\n path.edges!.push(edge);\n break;\n }\n case 4: { // Spline\n let degree = 3;\n const knots: number[] = [];\n const controlPoints: Point2D[] = [];\n\n if (i < tags.length && tags[i]!.code === 94) { degree = parseInt(tags[i]!.value, 10); i++; }\n // Code 73 = rational flag (skip)\n if (i < tags.length && tags[i]!.code === 73) { i++; }\n // Code 74 = periodic flag (skip)\n if (i < tags.length && tags[i]!.code === 74) { i++; }\n\n let knotCount = 0;\n if (i < tags.length && tags[i]!.code === 95) { knotCount = parseInt(tags[i]!.value, 10); i++; }\n let cpCount = 0;\n if (i < tags.length && tags[i]!.code === 96) { cpCount = parseInt(tags[i]!.value, 10); i++; }\n\n for (let k = 0; k < knotCount && i < tags.length && tags[i]!.code === 40; k++) {\n knots.push(parseFloat(tags[i]!.value));\n i++;\n }\n for (let c = 0; c < cpCount && i < tags.length; c++) {\n const pt: Point2D = { x: 0, y: 0 };\n if (tags[i]!.code === 10) { pt.x = parseFloat(tags[i]!.value); i++; }\n if (i < tags.length && tags[i]!.code === 20) { pt.y = parseFloat(tags[i]!.value); i++; }\n controlPoints.push(pt);\n }\n\n path.edges!.push({ type: 'spline', degree, knots, controlPoints });\n break;\n }\n default:\n // Unknown edge type, skip\n break;\n }\n }\n\n // Skip source boundary objects count (code 97) and handles (code 330)\n while (i < tags.length && (tags[i]!.code === 97 || tags[i]!.code === 330)) {\n if (tags[i]!.code === 97) {\n const count = parseInt(tags[i]!.value, 10);\n i++;\n for (let s = 0; s < count && i < tags.length && tags[i]!.code === 330; s++) {\n i++;\n }\n } else {\n i++;\n }\n }\n\n return { path, nextIndex: i };\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfPointEntity } from '../types.js';\nimport { parseBaseEntity } from './base.js';\n\nexport function parsePoint(tags: DxfToken[]): DxfPointEntity {\n const base = parseBaseEntity(tags);\n const entity: DxfPointEntity = {\n ...base,\n type: 'POINT',\n position: { x: 0, y: 0, z: 0 },\n };\n\n for (const tag of tags) {\n switch (tag.code) {\n case 10: entity.position.x = parseFloat(tag.value); break;\n case 20: entity.position.y = parseFloat(tag.value); break;\n case 30: entity.position.z = parseFloat(tag.value); break;\n }\n }\n\n return entity;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfEntity, DxfLwPolylineVertex, DxfAttrib } from '../types.js';\nimport { parseLine } from '../entities/line.js';\nimport { parseCircle } from '../entities/circle.js';\nimport { parseArc } from '../entities/arc.js';\nimport { parseLwPolyline } from '../entities/lwpolyline.js';\nimport { parsePolyline } from '../entities/polyline.js';\nimport { parseEllipse } from '../entities/ellipse.js';\nimport { parseSpline } from '../entities/spline.js';\nimport { parseText } from '../entities/text.js';\nimport { parseMText } from '../entities/mtext.js';\nimport { parseInsert } from '../entities/insert.js';\nimport { parseDimension } from '../entities/dimension.js';\nimport { parseHatch } from '../entities/hatch.js';\nimport { parsePoint } from '../entities/point.js';\n\nexport function parseEntities(tokens: DxfToken[], i: number, entities: DxfEntity[]): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code !== 0) { i++; continue; }\n\n const type = token.value;\n if (type === 'ENDSEC' || type === 'ENDBLK') return i + 1;\n\n i++; // advance past (0, TYPE)\n\n // Collect all tags until next code 0\n const entityTags: DxfToken[] = [];\n while (i < tokens.length && tokens[i]!.code !== 0) {\n entityTags.push(tokens[i]!);\n i++;\n }\n\n switch (type) {\n case 'LINE':\n entities.push(parseLine(entityTags));\n break;\n case 'CIRCLE':\n entities.push(parseCircle(entityTags));\n break;\n case 'ARC':\n entities.push(parseArc(entityTags));\n break;\n case 'LWPOLYLINE':\n entities.push(parseLwPolyline(entityTags));\n break;\n case 'ELLIPSE':\n entities.push(parseEllipse(entityTags));\n break;\n case 'SPLINE':\n entities.push(parseSpline(entityTags));\n break;\n case 'TEXT':\n entities.push(parseText(entityTags));\n break;\n case 'MTEXT':\n entities.push(parseMText(entityTags));\n break;\n case 'INSERT': {\n const insert = parseInsert(entityTags);\n // Check if code 66=1 is in tags (ATTRIBs follow)\n const hasAttribs = entityTags.some(t => t.code === 66 && t.value === '1');\n if (hasAttribs) {\n i = parseAttribs(tokens, i, insert.attribs);\n }\n entities.push(insert);\n break;\n }\n case 'DIMENSION':\n entities.push(parseDimension(entityTags));\n break;\n case 'HATCH':\n entities.push(parseHatch(entityTags));\n break;\n case 'POINT':\n entities.push(parsePoint(entityTags));\n break;\n case 'POLYLINE': {\n const polyline = parsePolyline(entityTags);\n // Read VERTEX entities until SEQEND\n i = parseVertices(tokens, i, polyline.vertices);\n entities.push(polyline);\n break;\n }\n // Unknown entity types are silently skipped\n default:\n break;\n }\n }\n return i;\n}\n\n/**\n * Parse VERTEX entities following a POLYLINE until SEQEND.\n */\nfunction parseVertices(tokens: DxfToken[], i: number, vertices: DxfLwPolylineVertex[]): number {\n while (i < tokens.length) {\n if (tokens[i]!.code !== 0) { i++; continue; }\n\n const type = tokens[i]!.value;\n if (type === 'SEQEND') return i + 1;\n if (type === 'ENDSEC' || type === 'ENDBLK') return i; // unexpected end\n\n if (type === 'VERTEX') {\n i++;\n const vertex: DxfLwPolylineVertex = { x: 0, y: 0, bulge: 0, startWidth: 0, endWidth: 0 };\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 10: vertex.x = parseFloat(tag.value); break;\n case 20: vertex.y = parseFloat(tag.value); break;\n case 42: vertex.bulge = parseFloat(tag.value); break;\n case 40: vertex.startWidth = parseFloat(tag.value); break;\n case 41: vertex.endWidth = parseFloat(tag.value); break;\n }\n i++;\n }\n vertices.push(vertex);\n } else {\n // Skip unexpected entity type within POLYLINE\n i++;\n while (i < tokens.length && tokens[i]!.code !== 0) i++;\n }\n }\n return i;\n}\n\n/**\n * Parse ATTRIB entities following an INSERT (code 66=1) until SEQEND.\n */\nfunction parseAttribs(tokens: DxfToken[], i: number, attribs: DxfAttrib[]): number {\n while (i < tokens.length) {\n if (tokens[i]!.code !== 0) { i++; continue; }\n\n const type = tokens[i]!.value;\n if (type === 'SEQEND') return i + 1;\n if (type === 'ENDSEC' || type === 'ENDBLK') return i; // unexpected end\n\n if (type === 'ATTRIB') {\n i++;\n const attrib: DxfAttrib = {\n tag: '',\n text: '',\n insertionPoint: { x: 0, y: 0, z: 0 },\n height: 1,\n rotation: 0,\n style: 'STANDARD',\n layer: '0',\n color: 256,\n };\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 1: attrib.text = tag.value; break;\n case 2: attrib.tag = tag.value; break;\n case 7: attrib.style = tag.value; break;\n case 8: attrib.layer = tag.value; break;\n case 10: attrib.insertionPoint.x = parseFloat(tag.value); break;\n case 20: attrib.insertionPoint.y = parseFloat(tag.value); break;\n case 30: attrib.insertionPoint.z = parseFloat(tag.value); break;\n case 40: attrib.height = parseFloat(tag.value); break;\n case 50: attrib.rotation = parseFloat(tag.value); break;\n case 62: attrib.color = parseInt(tag.value, 10); break;\n }\n i++;\n }\n attribs.push(attrib);\n } else {\n // Skip unexpected entity type\n i++;\n while (i < tokens.length && tokens[i]!.code !== 0) i++;\n }\n }\n return i;\n}\n","import type { DxfToken } from '../tokenizer.js';\nimport type { DxfBlock, DxfEntity, Point3D } from '../types.js';\nimport { parseEntities } from './entities.js';\n\nexport function parseBlocks(tokens: DxfToken[], i: number, blocks: Map<string, DxfBlock>): number {\n while (i < tokens.length) {\n const token = tokens[i]!;\n if (token.code === 0 && token.value === 'ENDSEC') return i + 1;\n\n if (token.code === 0 && token.value === 'BLOCK') {\n i++;\n const block: DxfBlock = {\n name: '',\n basePoint: { x: 0, y: 0, z: 0 } as Point3D,\n entities: [] as DxfEntity[],\n flags: 0,\n };\n\n // Parse block header tags until we hit a code 0 (which is either an entity or ENDBLK)\n while (i < tokens.length && tokens[i]!.code !== 0) {\n const tag = tokens[i]!;\n switch (tag.code) {\n case 2: block.name = tag.value; break;\n case 8: /* layer — skip for blocks */ break;\n case 10: block.basePoint.x = parseFloat(tag.value); break;\n case 20: block.basePoint.y = parseFloat(tag.value); break;\n case 30: block.basePoint.z = parseFloat(tag.value); break;\n case 70: block.flags = parseInt(tag.value, 10); break;\n }\n i++;\n }\n\n // Parse block entities (between BLOCK header and ENDBLK)\n // parseEntities will stop at ENDBLK and return i+1 past it\n i = parseEntities(tokens, i, block.entities);\n\n // Store block (skip model/paper space — their entities are in ENTITIES section)\n if (block.name && !block.name.startsWith('*Model_Space') && !block.name.startsWith('*Paper_Space')) {\n blocks.set(block.name, block);\n }\n } else {\n i++;\n }\n }\n return i;\n}\n","import type { DxfDocument, DxfHeader } from './types.js';\nimport { tokenize } from './tokenizer.js';\nimport { parseHeader } from './sections/header.js';\nimport { parseTables } from './sections/tables.js';\nimport { parseBlocks } from './sections/blocks.js';\nimport { parseEntities } from './sections/entities.js';\n\nconst BINARY_DXF_SENTINEL = 'AutoCAD Binary DXF';\n\nconst CODEPAGE_MAP: Record<string, string> = {\n 'ANSI_874': 'windows-874',\n 'ANSI_932': 'shift_jis',\n 'ANSI_936': 'gbk',\n 'ANSI_949': 'euc-kr',\n 'ANSI_950': 'big5',\n 'ANSI_1250': 'windows-1250',\n 'ANSI_1251': 'windows-1251',\n 'ANSI_1252': 'windows-1252',\n 'ANSI_1253': 'windows-1253',\n 'ANSI_1254': 'windows-1254',\n 'ANSI_1255': 'windows-1255',\n 'ANSI_1256': 'windows-1256',\n 'ANSI_1257': 'windows-1257',\n 'ANSI_1258': 'windows-1258',\n};\n\n// Versions >= AC1021 (R2007) use UTF-8\nconst UTF8_MIN_VERSION = 'AC1021';\n\nfunction createDefaultHeader(): DxfHeader {\n return {\n acadVersion: '',\n insUnits: 0,\n measurement: 0,\n ltScale: 1,\n };\n}\n\n/**\n * Decode Unicode escape sequences (\\U+XXXX) commonly found in DXF strings.\n */\nfunction decodeUnicodeEscapes(text: string): string {\n return text.replace(/\\\\U\\+([0-9A-Fa-f]{4})/g, (_, hex: string) =>\n String.fromCodePoint(parseInt(hex, 16))\n );\n}\n\n/**\n * Detect encoding and decode input to string.\n */\nfunction decodeInput(input: string | ArrayBuffer): string {\n if (typeof input === 'string') {\n return decodeUnicodeEscapes(input);\n }\n\n // ArrayBuffer path\n const bytes = new Uint8Array(input);\n\n // Check for binary DXF sentinel\n const sentinelBytes = new TextDecoder('ascii').decode(bytes.slice(0, BINARY_DXF_SENTINEL.length));\n if (sentinelBytes === BINARY_DXF_SENTINEL) {\n throw new Error('Binary DXF format is not supported. Please export as ASCII DXF.');\n }\n\n // First pass: decode as UTF-8\n let text = new TextDecoder('utf-8').decode(input);\n\n // Quick parse to find $ACADVER\n const versionMatch = text.match(/\\$ACADVER[\\s\\S]*?\\n\\s*1\\s*\\n\\s*(\\S+)/);\n const version = versionMatch?.[1] ?? '';\n\n // If pre-R2007, may need codepage re-decode\n if (version && version < UTF8_MIN_VERSION) {\n // Find $DWGCODEPAGE\n const cpMatch = text.match(/\\$DWGCODEPAGE[\\s\\S]*?\\n\\s*3\\s*\\n\\s*(\\S+)/);\n const codepage = cpMatch?.[1] ?? '';\n const encoding = CODEPAGE_MAP[codepage] ?? 'windows-1252';\n\n if (encoding !== 'utf-8') {\n text = new TextDecoder(encoding).decode(input);\n }\n }\n\n return decodeUnicodeEscapes(text);\n}\n\nfunction skipSection(tokens: ReturnType<typeof tokenize>, i: number): number {\n while (i < tokens.length) {\n if (tokens[i]!.code === 0 && tokens[i]!.value === 'ENDSEC') {\n return i + 1;\n }\n i++;\n }\n return i;\n}\n\n/**\n * Ensure layer \"0\" exists — it's required by DXF spec.\n */\nfunction ensureDefaultLayer(doc: DxfDocument): void {\n if (!doc.layers.has('0')) {\n doc.layers.set('0', {\n name: '0',\n color: 7,\n lineType: 'Continuous',\n flags: 0,\n lineWeight: -3,\n isOff: false,\n isFrozen: false,\n isLocked: false,\n });\n }\n}\n\n/**\n * Compute derived flags from raw layer data.\n * - isOff: color < 0 (layer OFF). Store Math.abs(color) as the actual color.\n * - isFrozen: flags & 1\n * - isLocked: flags & 4\n */\nfunction computeDerivedLayerFlags(doc: DxfDocument): void {\n for (const [, layer] of doc.layers) {\n layer.isOff = layer.color < 0;\n if (layer.isOff) {\n layer.color = Math.abs(layer.color);\n }\n layer.isFrozen = (layer.flags & 1) !== 0;\n layer.isLocked = (layer.flags & 4) !== 0;\n }\n}\n\n/**\n * Error thrown when DXF parsing fails.\n */\nexport class DxfParseError extends Error {\n constructor(message: string, public readonly cause?: unknown) {\n super(message);\n this.name = 'DxfParseError';\n }\n}\n\n/**\n * Parse a DXF file from string or ArrayBuffer.\n *\n * @throws {DxfParseError} If the input is empty, malformed, or cannot be parsed.\n */\nexport function parseDxf(input: string | ArrayBuffer): DxfDocument {\n // Validate input\n if (typeof input === 'string') {\n if (input.length === 0) {\n throw new DxfParseError('Input is empty. Expected a DXF string or ArrayBuffer.');\n }\n } else if (input instanceof ArrayBuffer) {\n if (input.byteLength === 0) {\n throw new DxfParseError('Input ArrayBuffer is empty.');\n }\n } else {\n throw new DxfParseError('Invalid input type. Expected a string or ArrayBuffer.');\n }\n\n let text: string;\n try {\n text = decodeInput(input);\n } catch (err) {\n if (err instanceof Error && err.message.includes('Binary DXF')) {\n throw err; // Re-throw binary DXF error as-is\n }\n throw new DxfParseError('Failed to decode DXF input.', err);\n }\n\n let tokens: ReturnType<typeof tokenize>;\n try {\n tokens = tokenize(text);\n } catch (err) {\n throw new DxfParseError('Failed to tokenize DXF content.', err);\n }\n\n if (tokens.length === 0) {\n throw new DxfParseError('DXF content produced no tokens. The input may not be a valid DXF file.');\n }\n\n const doc: DxfDocument = {\n header: createDefaultHeader(),\n layers: new Map(),\n lineTypes: new Map(),\n styles: new Map(),\n blocks: new Map(),\n entities: [],\n };\n\n try {\n let i = 0;\n while (i < tokens.length) {\n const token = tokens[i]!;\n\n if (token.code === 0 && token.value === 'SECTION') {\n i++;\n if (i >= tokens.length) break;\n const sectionName = tokens[i]!.value;\n i++;\n\n switch (sectionName) {\n case 'HEADER':\n i = parseHeader(tokens, i, doc.header);\n break;\n case 'TABLES':\n i = parseTables(tokens, i, doc);\n break;\n case 'BLOCKS':\n i = parseBlocks(tokens, i, doc.blocks);\n break;\n case 'ENTITIES':\n i = parseEntities(tokens, i, doc.entities);\n break;\n default:\n // Skip CLASSES, OBJECTS, THUMBNAILIMAGE, etc.\n i = skipSection(tokens, i);\n break;\n }\n } else if (token.code === 0 && token.value === 'EOF') {\n break;\n } else {\n i++;\n }\n }\n } catch (err) {\n throw new DxfParseError('Failed to parse DXF sections.', err);\n }\n\n // Post-processing\n ensureDefaultLayer(doc);\n computeDerivedLayerFlags(doc);\n\n return doc;\n}\n","/**\n * AutoCAD Color Index (ACI) — 256-color palette.\n *\n * Sources cross-referenced:\n * - ezdxf DXF_DEFAULT_COLORS (https://github.com/mozman/ezdxf)\n * - gohtx.com ACI table (https://gohtx.com/acadcolors.php)\n * - temblast.com ACI table (https://www.temblast.com/songview/color3.htm)\n *\n * Index 0 = BYBLOCK placeholder (black)\n * Index 1–9 = Standard named colors + grays\n * Index 10–249 = Extended HSV-based color wheel (24 hues × 10 shades)\n * Index 250–255 = Grayscale ramp (dark → light)\n */\nexport const ACI_COLORS: readonly string[] = [\n '#000000', // 0: BYBLOCK\n '#FF0000', // 1: Red\n '#FFFF00', // 2: Yellow\n '#00FF00', // 3: Green\n '#00FFFF', // 4: Cyan\n '#0000FF', // 5: Blue\n '#FF00FF', // 6: Magenta\n '#FFFFFF', // 7: White\n '#808080', // 8: Dark gray\n '#C0C0C0', // 9: Light gray\n '#FF0000', // 10\n '#FF7F7F', // 11\n '#A50000', // 12\n '#A55252', // 13\n '#7F0000', // 14\n '#7F3F3F', // 15\n '#4C0000', // 16\n '#4C2626', // 17\n '#260000', // 18\n '#261313', // 19\n '#FF3F00', // 20\n '#FF9F7F', // 21\n '#A52900', // 22\n '#A56752', // 23\n '#7F1F00', // 24\n '#7F4F3F', // 25\n '#4C1300', // 26\n '#4C2F26', // 27\n '#260900', // 28\n '#261713', // 29\n '#FF7F00', // 30\n '#FFBF7F', // 31\n '#A55200', // 32\n '#A57C52', // 33\n '#7F3F00', // 34\n '#7F5F3F', // 35\n '#4C2600', // 36\n '#4C3926', // 37\n '#261300', // 38\n '#261C13', // 39\n '#FFBF00', // 40\n '#FFDF7F', // 41\n '#A57C00', // 42\n '#A59152', // 43\n '#7F5F00', // 44\n '#7F6F3F', // 45\n '#4C3900', // 46\n '#4C4226', // 47\n '#261C00', // 48\n '#262113', // 49\n '#FFFF00', // 50\n '#FFFF7F', // 51\n '#A5A500', // 52\n '#A5A552', // 53\n '#7F7F00', // 54\n '#7F7F3F', // 55\n '#4C4C00', // 56\n '#4C4C26', // 57\n '#262600', // 58\n '#262613', // 59\n '#BFFF00', // 60\n '#DFFF7F', // 61\n '#7CA500', // 62\n '#91A552', // 63\n '#5F7F00', // 64\n '#6F7F3F', // 65\n '#394C00', // 66\n '#424C26', // 67\n '#1C2600', // 68\n '#212613', // 69\n '#7FFF00', // 70\n '#BFFF7F', // 71\n '#52A500', // 72\n '#7CA552', // 73\n '#3F7F00', // 74\n '#5F7F3F', // 75\n '#264C00', // 76\n '#394C26', // 77\n '#132600', // 78\n '#1C2613', // 79\n '#3FFF00', // 80\n '#9FFF7F', // 81\n '#29A500', // 82\n '#67A552', // 83\n '#1F7F00', // 84\n '#4F7F3F', // 85\n '#134C00', // 86\n '#2F4C26', // 87\n '#092600', // 88\n '#172613', // 89\n '#00FF00', // 90\n '#7FFF7F', // 91\n '#00A500', // 92\n '#52A552', // 93\n '#007F00', // 94\n '#3F7F3F', // 95\n '#004C00', // 96\n '#264C26', // 97\n '#002600', // 98\n '#132613', // 99\n '#00FF3F', // 100\n '#7FFF9F', // 101\n '#00A529', // 102\n '#52A567', // 103\n '#007F1F', // 104\n '#3F7F4F', // 105\n '#004C13', // 106\n '#264C2F', // 107\n '#002609', // 108\n '#132617', // 109\n '#00FF7F', // 110\n '#7FFFBF', // 111\n '#00A552', // 112\n '#52A57C', // 113\n '#007F3F', // 114\n '#3F7F5F', // 115\n '#004C26', // 116\n '#264C39', // 117\n '#002613', // 118\n '#13261C', // 119\n '#00FFBF', // 120\n '#7FFFDF', // 121\n '#00A57C', // 122\n '#52A591', // 123\n '#007F5F', // 124\n '#3F7F6F', // 125\n '#004C39', // 126\n '#264C42', // 127\n '#00261C', // 128\n '#132621', // 129\n '#00FFFF', // 130\n '#7FFFFF', // 131\n '#00A5A5', // 132\n '#52A5A5', // 133\n '#007F7F', // 134\n '#3F7F7F', // 135\n '#004C4C', // 136\n '#264C4C', // 137\n '#002626', // 138\n '#132626', // 139\n '#00BFFF', // 140\n '#7FDFFF', // 141\n '#007CA5', // 142\n '#5291A5', // 143\n '#005F7F', // 144\n '#3F6F7F', // 145\n '#00394C', // 146\n '#26424C', // 147\n '#001C26', // 148\n '#132126', // 149\n '#007FFF', // 150\n '#7FBFFF', // 151\n '#0052A5', // 152\n '#527CA5', // 153\n '#003F7F', // 154\n '#3F5F7F', // 155\n '#00264C', // 156\n '#26394C', // 157\n '#001326', // 158\n '#131C26', // 159\n '#003FFF', // 160\n '#7F9FFF', // 161\n '#0029A5', // 162\n '#5267A5', // 163\n '#001F7F', // 164\n '#3F4F7F', // 165\n '#00134C', // 166\n '#262F4C', // 167\n '#000926', // 168\n '#131726', // 169\n '#0000FF', // 170\n '#7F7FFF', // 171\n '#0000A5', // 172\n '#5252A5', // 173\n '#00007F', // 174\n '#3F3F7F', // 175\n '#00004C', // 176\n '#26264C', // 177\n '#000026', // 178\n '#131326', // 179\n '#3F00FF', // 180\n '#9F7FFF', // 181\n '#2900A5', // 182\n '#6752A5', // 183\n '#1F007F', // 184\n '#4F3F7F', // 185\n '#13004C', // 186\n '#2F264C', // 187\n '#090026', // 188\n '#171326', // 189\n '#7F00FF', // 190\n '#BF7FFF', // 191\n '#5200A5', // 192\n '#7C52A5', // 193\n '#3F007F', // 194\n '#5F3F7F', // 195\n '#26004C', // 196\n '#39264C', // 197\n '#130026', // 198\n '#1C1326', // 199\n '#BF00FF', // 200\n '#DF7FFF', // 201\n '#7C00A5', // 202\n '#9152A5', // 203\n '#5F007F', // 204\n '#6F3F7F', // 205\n '#39004C', // 206\n '#42264C', // 207\n '#1C0026', // 208\n '#211326', // 209\n '#FF00FF', // 210\n '#FF7FFF', // 211\n '#A500A5', // 212\n '#A552A5', // 213\n '#7F007F', // 214\n '#7F3F7F', // 215\n '#4C004C', // 216\n '#4C264C', // 217\n '#260026', // 218\n '#261326', // 219\n '#FF00BF', // 220\n '#FF7FDF', // 221\n '#A5007C', // 222\n '#A55291', // 223\n '#7F005F', // 224\n '#7F3F6F', // 225\n '#4C0039', // 226\n '#4C2642', // 227\n '#26001C', // 228\n '#261321', // 229\n '#FF007F', // 230\n '#FF7FBF', // 231\n '#A50052', // 232\n '#A5527C', // 233\n '#7F003F', // 234\n '#7F3F5F', // 235\n '#4C0026', // 236\n '#4C2639', // 237\n '#260013', // 238\n '#26131C', // 239\n '#FF003F', // 240\n '#FF7F9F', // 241\n '#A50029', // 242\n '#A55267', // 243\n '#7F001F', // 244\n '#7F3F4F', // 245\n '#4C0013', // 246\n '#4C262F', // 247\n '#260009', // 248\n '#261317', // 249\n '#333333', // 250: Gray (darkest)\n '#505050', // 251: Gray\n '#696969', // 252: Gray\n '#828282', // 253: Gray\n '#BEBEBE', // 254: Gray\n '#FFFFFF', // 255: Gray (lightest)\n] as const;\n\nexport function aciToHex(aci: number): string | undefined {\n if (aci === 0 || aci === 256) return undefined;\n if (aci < 0 || aci > 255) return undefined;\n return ACI_COLORS[aci];\n}\n\nexport function aciToDisplayColor(aci: number, isDarkTheme: boolean): string {\n if (aci === 7) return isDarkTheme ? '#FFFFFF' : '#000000';\n return ACI_COLORS[Math.abs(aci)] ?? (isDarkTheme ? '#FFFFFF' : '#000000');\n}\n\nexport function trueColorToHex(trueColor: number): string {\n const r = (trueColor >> 16) & 0xFF;\n const g = (trueColor >> 8) & 0xFF;\n const b = trueColor & 0xFF;\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n","export type Theme = 'dark' | 'light';\n\nexport interface ThemeConfig {\n backgroundColor: string;\n defaultEntityColor: string;\n selectionColor: string;\n measureColor: string;\n gridColor: string;\n crosshairColor: string;\n}\n\nexport const THEMES: Record<Theme, ThemeConfig> = {\n dark: {\n backgroundColor: '#1a1a2e',\n defaultEntityColor: '#ffffff',\n selectionColor: '#00ff88',\n measureColor: '#ffaa00',\n gridColor: '#333333',\n crosshairColor: '#555555',\n },\n light: {\n backgroundColor: '#ffffff',\n defaultEntityColor: '#000000',\n selectionColor: '#0066ff',\n measureColor: '#ff6600',\n gridColor: '#dddddd',\n crosshairColor: '#cccccc',\n },\n};\n","export interface ViewTransform {\n scale: number;\n offsetX: number;\n offsetY: number;\n}\n\nexport function worldToScreen(vt: ViewTransform, wx: number, wy: number): [number, number] {\n return [\n wx * vt.scale + vt.offsetX,\n -wy * vt.scale + vt.offsetY,\n ];\n}\n\nexport function screenToWorld(vt: ViewTransform, sx: number, sy: number): [number, number] {\n return [\n (sx - vt.offsetX) / vt.scale,\n -(sy - vt.offsetY) / vt.scale,\n ];\n}\n\nexport function applyTransform(ctx: CanvasRenderingContext2D, vt: ViewTransform): void {\n const dpr = window.devicePixelRatio || 1;\n ctx.setTransform(vt.scale * dpr, 0, 0, -vt.scale * dpr, vt.offsetX * dpr, vt.offsetY * dpr);\n}\n\nexport function fitToView(\n canvasWidth: number,\n canvasHeight: number,\n minX: number, minY: number,\n maxX: number, maxY: number,\n padding: number = 0.05,\n): ViewTransform {\n const worldWidth = maxX - minX;\n const worldHeight = maxY - minY;\n\n if (worldWidth <= 0 || worldHeight <= 0) {\n return { scale: 1, offsetX: canvasWidth / 2, offsetY: canvasHeight / 2 };\n }\n\n const scaleX = canvasWidth / worldWidth;\n const scaleY = canvasHeight / worldHeight;\n const scale = Math.min(scaleX, scaleY) * (1 - padding * 2);\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n const offsetX = canvasWidth / 2 - centerX * scale;\n const offsetY = canvasHeight / 2 + centerY * scale;\n\n return { scale, offsetX, offsetY };\n}\n\nexport function zoomAtPoint(\n vt: ViewTransform,\n screenX: number,\n screenY: number,\n zoomFactor: number,\n minScale: number = 0.0001,\n maxScale: number = 100000,\n): ViewTransform {\n const newScale = Math.max(minScale, Math.min(maxScale, vt.scale * zoomFactor));\n const actualFactor = newScale / vt.scale;\n\n return {\n scale: newScale,\n offsetX: screenX - (screenX - vt.offsetX) * actualFactor,\n offsetY: screenY - (screenY - vt.offsetY) * actualFactor,\n };\n}\n\nexport class Camera {\n private transform: ViewTransform = { scale: 1, offsetX: 0, offsetY: 0 };\n private minScale: number;\n private maxScale: number;\n\n constructor(options: { minZoom: number; maxZoom: number }) {\n this.minScale = options.minZoom;\n this.maxScale = options.maxZoom;\n }\n\n getTransform(): ViewTransform {\n return this.transform;\n }\n\n setTransform(vt: ViewTransform): void {\n this.transform = vt;\n }\n\n pan(dx: number, dy: number): void {\n this.transform = {\n ...this.transform,\n offsetX: this.transform.offsetX + dx,\n offsetY: this.transform.offsetY + dy,\n };\n }\n\n zoom(screenX: number, screenY: number, factor: number): void {\n this.transform = zoomAtPoint(\n this.transform, screenX, screenY, factor,\n this.minScale, this.maxScale,\n );\n }\n}\n","import type { DxfEntityBase, DxfLayer } from '../parser/types.js';\nimport type { Theme } from './theme.js';\nimport { THEMES } from './theme.js';\nimport { aciToHex } from '../parser/colors.js';\n\n/**\n * Get display color for an ACI color index, handling color 7 theme swap.\n */\nexport function getDisplayColor(aciColor: number, theme: Theme): string {\n if (aciColor === 7) {\n return theme === 'dark' ? '#ffffff' : '#000000';\n }\n return aciToHex(aciColor) ?? '#ffffff';\n}\n\n/**\n * Resolve the display color for an entity.\n *\n * Resolution order:\n * 1. Entity true color (code 420) - highest priority\n * 2. Entity ACI color (code 62):\n * - 1-255: use ACI color table\n * - 0 (BYBLOCK): use parent INSERT color, or default if no parent\n * - 256 (BYLAYER): use layer color\n * 3. Layer color (from LAYER table)\n * 4. Default theme color (fallback)\n */\nexport function resolveEntityColor(\n entity: DxfEntityBase,\n layers: Map<string, DxfLayer>,\n theme: Theme,\n parentColor?: string,\n): string {\n // 1. True color\n if (entity.trueColor !== undefined) {\n const r = (entity.trueColor >> 16) & 0xFF;\n const g = (entity.trueColor >> 8) & 0xFF;\n const b = entity.trueColor & 0xFF;\n return `rgb(${r},${g},${b})`;\n }\n\n // 2. ACI color\n if (entity.color === 0) {\n // BYBLOCK: use parent color or theme default\n return parentColor ?? THEMES[theme].defaultEntityColor;\n }\n\n if (entity.color !== 256) {\n // Explicit ACI color (1-255)\n return getDisplayColor(entity.color, theme);\n }\n\n // 3. BYLAYER (256): resolve from layer\n const layer = layers.get(entity.layer);\n if (layer) {\n if (layer.trueColor !== undefined) {\n const r = (layer.trueColor >> 16) & 0xFF;\n const g = (layer.trueColor >> 8) & 0xFF;\n const b = layer.trueColor & 0xFF;\n return `rgb(${r},${g},${b})`;\n }\n const layerAci = Math.abs(layer.color); // negative = off, use absolute\n return getDisplayColor(layerAci, theme);\n }\n\n // 4. Fallback\n return THEMES[theme].defaultEntityColor;\n}\n","import type { DxfLineEntity } from '../../parser/types.js';\n\nexport function drawLine(ctx: CanvasRenderingContext2D, entity: DxfLineEntity): void {\n ctx.beginPath();\n ctx.moveTo(entity.start.x, entity.start.y);\n ctx.lineTo(entity.end.x, entity.end.y);\n ctx.stroke();\n}\n","import type { DxfCircleEntity } from '../../parser/types.js';\n\nexport function drawCircle(ctx: CanvasRenderingContext2D, entity: DxfCircleEntity): void {\n if (entity.radius <= 0) return;\n ctx.beginPath();\n ctx.arc(entity.center.x, entity.center.y, entity.radius, 0, Math.PI * 2);\n ctx.stroke();\n}\n","import type { DxfArcEntity } from '../../parser/types.js';\n\nexport function drawArc(ctx: CanvasRenderingContext2D, entity: DxfArcEntity): void {\n if (entity.radius <= 0) return;\n\n const startRad = entity.startAngle * Math.PI / 180;\n const endRad = entity.endAngle * Math.PI / 180;\n\n ctx.beginPath();\n // Canvas arc with negative Y scale (setTransform d=-scale):\n // anticlockwise=false renders DXF CCW arcs correctly in flipped-Y space\n ctx.arc(\n entity.center.x,\n entity.center.y,\n entity.radius,\n startRad,\n endRad,\n false,\n );\n ctx.stroke();\n}\n","import type { Point3D } from '../parser/types.js';\n\nexport function normalize3D(v: Point3D): Point3D {\n const len = Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);\n if (len === 0) return { x: 0, y: 0, z: 0 };\n return { x: v.x / len, y: v.y / len, z: v.z / len };\n}\n\nexport function cross3D(a: Point3D, b: Point3D): Point3D {\n return {\n x: a.y * b.z - a.z * b.y,\n y: a.z * b.x - a.x * b.z,\n z: a.x * b.y - a.y * b.x,\n };\n}\n\n/**\n * Arbitrary Axis Algorithm (per DXF specification).\n * Given an extrusion vector (the OCS Z-axis), compute the OCS X and Y axes.\n */\nexport function arbitraryAxisAlgorithm(extrusion: Point3D): { ax: Point3D; ay: Point3D; az: Point3D } {\n const THRESHOLD = 1 / 64;\n const az = normalize3D(extrusion);\n\n let ax: Point3D;\n if (Math.abs(az.x) < THRESHOLD && Math.abs(az.y) < THRESHOLD) {\n // Near world Z-axis: cross with world Y\n ax = normalize3D(cross3D({ x: 0, y: 1, z: 0 }, az));\n } else {\n // Cross with world Z\n ax = normalize3D(cross3D({ x: 0, y: 0, z: 1 }, az));\n }\n\n const ay = normalize3D(cross3D(az, ax));\n return { ax, ay, az };\n}\n\n/**\n * Transform a point from OCS to WCS.\n */\nexport function ocsToWcs(point: Point3D, extrusion: Point3D): Point3D {\n // Optimization: skip if extrusion is default (0, 0, 1)\n if (extrusion.x === 0 && extrusion.y === 0 && extrusion.z === 1) {\n return point;\n }\n\n const { ax, ay, az } = arbitraryAxisAlgorithm(extrusion);\n return {\n x: point.x * ax.x + point.y * ay.x + point.z * az.x,\n y: point.x * ax.y + point.y * ay.y + point.z * az.y,\n z: point.x * ax.z + point.y * ay.z + point.z * az.z,\n };\n}\n\n/**\n * Convert a bulge value between two points to arc parameters.\n *\n * Bulge = tan(included_angle / 4)\n * Positive bulge = arc bulges to the LEFT of the direction P1 -> P2 (CCW)\n * Negative bulge = arc bulges to the RIGHT (CW)\n */\nexport function bulgeToArc(\n x1: number, y1: number,\n x2: number, y2: number,\n bulge: number,\n): { cx: number; cy: number; radius: number; startAngle: number; endAngle: number; anticlockwise: boolean } {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const chord = Math.sqrt(dx * dx + dy * dy);\n\n if (chord < 1e-10) {\n // Degenerate: points are the same\n return { cx: x1, cy: y1, radius: 0, startAngle: 0, endAngle: 0, anticlockwise: false };\n }\n\n const sagitta = Math.abs(bulge) * chord / 2;\n const radius = ((chord / 2) ** 2 + sagitta ** 2) / (2 * sagitta);\n\n // Midpoint of chord\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n\n // Perpendicular direction (left of P1->P2)\n const perpX = -dy / chord;\n const perpY = dx / chord;\n\n // Distance from midpoint to center\n const d = radius - sagitta;\n\n // Center: offset from midpoint perpendicular to chord\n // Positive bulge: center is to the left\n // Negative bulge: center is to the right\n const sign = bulge > 0 ? 1 : -1;\n const cx = mx + sign * d * perpX;\n const cy = my + sign * d * perpY;\n\n // Angles from center to start/end points\n const startAngle = Math.atan2(y1 - cy, x1 - cx);\n const endAngle = Math.atan2(y2 - cy, x2 - cx);\n\n // Bulge > 0 means CCW, < 0 means CW\n const anticlockwise = bulge < 0;\n\n return { cx, cy, radius, startAngle, endAngle, anticlockwise };\n}\n\n/**\n * Draw a bulge arc segment on the canvas context.\n */\nexport function drawBulgeArc(\n ctx: CanvasRenderingContext2D,\n x1: number, y1: number,\n x2: number, y2: number,\n bulge: number,\n): void {\n const arc = bulgeToArc(x1, y1, x2, y2, bulge);\n if (arc.radius < 1e-10) {\n ctx.lineTo(x2, y2);\n return;\n }\n ctx.arc(arc.cx, arc.cy, arc.radius, arc.startAngle, arc.endAngle, arc.anticlockwise);\n}\n","import type { DxfLwPolylineEntity, DxfPolylineEntity } from '../../parser/types.js';\nimport { drawBulgeArc } from '../../utils/math.js';\n\nexport function drawLwPolyline(ctx: CanvasRenderingContext2D, entity: DxfLwPolylineEntity): void {\n const verts = entity.vertices;\n if (verts.length < 2) return;\n\n ctx.beginPath();\n ctx.moveTo(verts[0]!.x, verts[0]!.y);\n\n const count = entity.closed ? verts.length : verts.length - 1;\n\n for (let i = 0; i < count; i++) {\n const current = verts[i]!;\n const next = verts[(i + 1) % verts.length]!;\n\n if (Math.abs(current.bulge) < 1e-10) {\n ctx.lineTo(next.x, next.y);\n } else {\n drawBulgeArc(ctx, current.x, current.y, next.x, next.y, current.bulge);\n }\n }\n\n ctx.stroke();\n}\n\nexport function drawPolyline(ctx: CanvasRenderingContext2D, entity: DxfPolylineEntity): void {\n const verts = entity.vertices;\n if (verts.length < 2) return;\n\n ctx.beginPath();\n ctx.moveTo(verts[0]!.x, verts[0]!.y);\n\n const count = entity.closed ? verts.length : verts.length - 1;\n\n for (let i = 0; i < count; i++) {\n const current = verts[i]!;\n const next = verts[(i + 1) % verts.length]!;\n const bulge = current.bulge ?? 0;\n\n if (Math.abs(bulge) < 1e-10) {\n ctx.lineTo(next.x, next.y);\n } else {\n drawBulgeArc(ctx, current.x, current.y, next.x, next.y, bulge);\n }\n }\n\n ctx.stroke();\n}\n","import type { DxfEllipseEntity } from '../../parser/types.js';\n\nexport function drawEllipse(ctx: CanvasRenderingContext2D, entity: DxfEllipseEntity): void {\n const majorLength = Math.sqrt(\n entity.majorAxis.x ** 2 + entity.majorAxis.y ** 2 + entity.majorAxis.z ** 2\n );\n if (majorLength < 1e-10 || entity.minorRatio <= 0) return;\n\n const minorLength = majorLength * entity.minorRatio;\n const rotation = Math.atan2(entity.majorAxis.y, entity.majorAxis.x);\n\n ctx.beginPath();\n ctx.ellipse(\n entity.center.x,\n entity.center.y,\n majorLength,\n minorLength,\n rotation,\n entity.startParam,\n entity.endParam,\n false,\n );\n ctx.stroke();\n}\n","import type { Point2D, Point3D, DxfSplineEntity } from '../parser/types.js';\n\n/**\n * Evaluate a B-spline curve at parameter t using De Boor's algorithm.\n */\nexport function deBoor(\n degree: number,\n controlPoints: Point3D[],\n knots: number[],\n t: number,\n weights?: number[],\n): Point3D {\n // Find knot span index\n const n = controlPoints.length - 1;\n let k = degree;\n while (k < n && knots[k + 1] <= t) k++;\n\n // Copy affected control points\n const d: Point3D[] = [];\n const w: number[] = [];\n for (let j = 0; j <= degree; j++) {\n const idx = k - degree + j;\n d.push({ ...controlPoints[idx] });\n w.push(weights ? weights[idx] : 1.0);\n }\n\n // De Boor recursion\n for (let r = 1; r <= degree; r++) {\n for (let j = degree; j >= r; j--) {\n const i = k - degree + j;\n const denom = knots[i + degree - r + 1] - knots[i];\n if (Math.abs(denom) < 1e-10) continue;\n const alpha = (t - knots[i]) / denom;\n\n if (weights) {\n // NURBS: weighted interpolation\n const w0 = w[j - 1] * (1 - alpha);\n const w1 = w[j] * alpha;\n const wSum = w0 + w1;\n if (Math.abs(wSum) < 1e-10) continue;\n d[j].x = (d[j - 1].x * w0 + d[j].x * w1) / wSum;\n d[j].y = (d[j - 1].y * w0 + d[j].y * w1) / wSum;\n d[j].z = (d[j - 1].z * w0 + d[j].z * w1) / wSum;\n w[j] = wSum;\n } else {\n d[j].x = (1 - alpha) * d[j - 1].x + alpha * d[j].x;\n d[j].y = (1 - alpha) * d[j - 1].y + alpha * d[j].y;\n d[j].z = (1 - alpha) * d[j - 1].z + alpha * d[j].z;\n }\n }\n }\n\n return d[degree];\n}\n\n/**\n * Convert fit points to a polyline using Catmull-Rom interpolation.\n */\nexport function fitPointsToPolyline(fitPoints: Point3D[]): Point2D[] {\n if (fitPoints.length < 2) return fitPoints.map(p => ({ x: p.x, y: p.y }));\n\n const result: Point2D[] = [];\n const n = fitPoints.length;\n const segments = 10; // subdivisions per segment\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = fitPoints[Math.max(0, i - 1)];\n const p1 = fitPoints[i];\n const p2 = fitPoints[Math.min(n - 1, i + 1)];\n const p3 = fitPoints[Math.min(n - 1, i + 2)];\n\n for (let j = 0; j <= (i === n - 2 ? segments : segments - 1); j++) {\n const t = j / segments;\n const t2 = t * t;\n const t3 = t2 * t;\n\n // Catmull-Rom basis\n const x = 0.5 * (\n (2 * p1.x) +\n (-p0.x + p2.x) * t +\n (2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) * t2 +\n (-p0.x + 3 * p1.x - 3 * p2.x + p3.x) * t3\n );\n const y = 0.5 * (\n (2 * p1.y) +\n (-p0.y + p2.y) * t +\n (2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) * t2 +\n (-p0.y + 3 * p1.y - 3 * p2.y + p3.y) * t3\n );\n\n result.push({ x, y });\n }\n }\n\n return result;\n}\n\n/**\n * Evaluate a spline entity into an array of points for rendering.\n */\nexport function evaluateSpline(entity: DxfSplineEntity, pixelSize: number): Point2D[] {\n // Degree 1: just return control points as-is (polyline)\n if (entity.degree === 1) {\n return entity.controlPoints.map(p => ({ x: p.x, y: p.y }));\n }\n\n // If only fit points (no control points or knots): approximate with Catmull-Rom\n if (entity.controlPoints.length === 0 && entity.fitPoints.length >= 2) {\n return fitPointsToPolyline(entity.fitPoints);\n }\n\n // Validate: need at least degree+1 control points and proper knot vector\n if (entity.controlPoints.length < entity.degree + 1) return [];\n if (entity.knots.length < entity.controlPoints.length + entity.degree + 1) return [];\n\n const points: Point2D[] = [];\n const tMin = entity.knots[entity.degree];\n const tMax = entity.knots[entity.knots.length - entity.degree - 1];\n\n if (tMax <= tMin) return [];\n\n // Adaptive: more points for longer/more complex splines\n const numPoints = Math.max(\n entity.controlPoints.length * 10,\n Math.ceil((tMax - tMin) / pixelSize),\n );\n const cappedPoints = Math.min(numPoints, 5000); // upper bound\n\n const weights = entity.weights.length > 0 ? entity.weights : undefined;\n\n for (let i = 0; i <= cappedPoints; i++) {\n const t = tMin + (tMax - tMin) * (i / cappedPoints);\n const p = deBoor(entity.degree, entity.controlPoints, entity.knots, t, weights);\n points.push({ x: p.x, y: p.y });\n }\n\n return points;\n}\n","import type { DxfSplineEntity } from '../../parser/types.js';\nimport { evaluateSpline } from '../../utils/spline.js';\n\nexport function drawSpline(ctx: CanvasRenderingContext2D, entity: DxfSplineEntity, pixelSize: number): void {\n const points = evaluateSpline(entity, pixelSize);\n if (points.length < 2) return;\n\n ctx.beginPath();\n ctx.moveTo(points[0]!.x, points[0]!.y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i]!.x, points[i]!.y);\n }\n\n if (entity.flags & 1) { // closed\n ctx.closePath();\n }\n ctx.stroke();\n}\n","import type { DxfTextEntity, DxfMTextEntity } from '../../parser/types.js';\n\nconst CAD_FONT_MAP: Record<string, string> = {\n 'standard': 'Arial, sans-serif',\n 'arial': 'Arial, sans-serif',\n 'arial.ttf': 'Arial, sans-serif',\n 'romans.shx': '\"Courier New\", monospace',\n 'simplex.shx': '\"Courier New\", monospace',\n 'txt.shx': 'monospace',\n 'monotxt.shx': 'monospace',\n 'isocp.shx': '\"Courier New\", monospace',\n 'isocpeur.shx': '\"Courier New\", monospace',\n 'times.ttf': '\"Times New Roman\", serif',\n 'timesnr.ttf': '\"Times New Roman\", serif',\n 'gothic.ttf': '\"Century Gothic\", sans-serif',\n};\n\nfunction mapCADFont(styleName: string): string {\n const key = styleName.toLowerCase().trim();\n return CAD_FONT_MAP[key] || 'sans-serif';\n}\n\nexport function drawText(ctx: CanvasRenderingContext2D, entity: DxfTextEntity, pixelSize: number): void {\n if (!entity.text || entity.height < pixelSize * 3) return; // skip tiny text\n\n // Determine insertion point\n const useAlignPoint = entity.hAlign !== 0 || entity.vAlign !== 0;\n const px = useAlignPoint && entity.alignmentPoint\n ? entity.alignmentPoint.x\n : entity.insertionPoint.x;\n const py = useAlignPoint && entity.alignmentPoint\n ? entity.alignmentPoint.y\n : entity.insertionPoint.y;\n\n ctx.save();\n\n // Move to insertion point (in world coords, already flipped)\n ctx.translate(px, py);\n\n // Un-flip Y for text rendering\n ctx.scale(1, -1);\n\n // Apply entity rotation (degrees -> radians, negate because Y was flipped)\n if (entity.rotation) {\n ctx.rotate(-entity.rotation * Math.PI / 180);\n }\n\n // Apply width factor as horizontal scale\n if (entity.widthFactor !== 1.0) {\n ctx.scale(entity.widthFactor, 1);\n }\n\n // Apply oblique angle as skew\n if (entity.obliqueAngle) {\n const skew = Math.tan(entity.obliqueAngle * Math.PI / 180);\n ctx.transform(1, 0, skew, 1, 0, 0);\n }\n\n // Generation flags\n const backward = (entity.generationFlags & 2) !== 0;\n const upsideDown = (entity.generationFlags & 4) !== 0;\n if (backward) ctx.scale(-1, 1);\n if (upsideDown) ctx.scale(1, -1);\n\n // Font\n const fontName = mapCADFont(entity.style || 'Standard');\n ctx.font = `${entity.height}px ${fontName}`;\n\n // Horizontal alignment\n switch (entity.hAlign) {\n case 0: ctx.textAlign = 'left'; break;\n case 1: ctx.textAlign = 'center'; break;\n case 2: ctx.textAlign = 'right'; break;\n case 3: ctx.textAlign = 'left'; break; // ALIGNED\n case 4: ctx.textAlign = 'center'; break; // MIDDLE\n case 5: ctx.textAlign = 'left'; break; // FIT\n default: ctx.textAlign = 'left';\n }\n\n // Vertical alignment\n switch (entity.vAlign) {\n case 0: ctx.textBaseline = 'alphabetic'; break;\n case 1: ctx.textBaseline = 'bottom'; break;\n case 2: ctx.textBaseline = 'middle'; break;\n case 3: ctx.textBaseline = 'top'; break;\n default: ctx.textBaseline = 'alphabetic';\n }\n\n ctx.fillText(entity.text, 0, 0);\n ctx.restore();\n}\n\n/**\n * Strip MTEXT formatting codes for basic text rendering.\n */\nfunction stripMTextFormatting(text: string): string {\n return text\n .replace(/\\\\P/g, '\\n') // paragraph break\n .replace(/\\\\[fFHWQTCAaLlOoKk][^;]*;/g, '') // formatting commands with ;\n .replace(/\\\\\\\\/g, '\\\\') // escaped backslash\n .replace(/\\\\~/g, '\\u00A0') // non-breaking space\n .replace(/\\{/g, '') // scope open\n .replace(/\\}/g, '') // scope close\n .replace(/\\\\S[^;]*;/g, '') // stacked fractions\n .trim();\n}\n\nexport function drawMText(ctx: CanvasRenderingContext2D, entity: DxfMTextEntity, pixelSize: number): void {\n if (!entity.text || entity.height < pixelSize * 3) return;\n\n ctx.save();\n ctx.translate(entity.insertionPoint.x, entity.insertionPoint.y);\n ctx.scale(1, -1); // un-flip Y\n\n // Rotation: text direction overrides rotation angle\n const rotation = entity.textDirection\n ? Math.atan2(entity.textDirection.y, entity.textDirection.x)\n : (entity.rotation || 0) * Math.PI / 180;\n if (rotation) ctx.rotate(-rotation);\n\n // Parse text and strip formatting for v1 (basic implementation)\n const plainText = stripMTextFormatting(entity.text);\n const lines = plainText.split('\\n');\n\n const lineHeight = entity.height * (entity.lineSpacingFactor || 1.4);\n const fontName = mapCADFont(entity.style || 'Standard');\n ctx.font = `${entity.height}px ${fontName}`;\n\n // Attachment point alignment\n // 1=TL, 2=TC, 3=TR, 4=ML, 5=MC, 6=MR, 7=BL, 8=BC, 9=BR\n const col = ((entity.attachmentPoint - 1) % 3); // 0=left, 1=center, 2=right\n const row = Math.floor((entity.attachmentPoint - 1) / 3); // 0=top, 1=middle, 2=bottom\n const alignments: CanvasTextAlign[] = ['left', 'center', 'right'];\n ctx.textAlign = alignments[col] ?? 'left';\n\n // Vertical offset based on attachment row\n let startY = 0;\n const totalHeight = lines.length * lineHeight;\n switch (row) {\n case 0: startY = entity.height; break; // top: first line baseline\n case 1: startY = entity.height - totalHeight / 2; break; // middle\n case 2: startY = entity.height - totalHeight; break; // bottom\n }\n\n for (let i = 0; i < lines.length; i++) {\n ctx.fillText(lines[i]!, 0, startY + i * lineHeight);\n }\n\n ctx.restore();\n}\n","import type { DxfInsertEntity, DxfDocument, DxfEntity } from '../../parser/types.js';\nimport type { ViewTransform } from '../camera.js';\nimport type { Theme } from '../theme.js';\nimport { resolveEntityColor } from '../resolve-color.js';\nimport { drawEntity } from './draw-entity.js';\n\nconst MAX_INSERT_DEPTH = 100;\n\nexport function drawInsert(\n ctx: CanvasRenderingContext2D,\n entity: DxfInsertEntity,\n doc: DxfDocument,\n vt: ViewTransform,\n theme: Theme,\n pixelSize: number,\n depth: number = 0,\n): void {\n if (depth > MAX_INSERT_DEPTH) return;\n\n const block = doc.blocks.get(entity.blockName);\n if (!block) return;\n\n // Handle MINSERT (grid of blocks)\n const cols = Math.max(1, entity.columnCount);\n const rows = Math.max(1, entity.rowCount);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n ctx.save();\n\n // Insertion point + grid offset\n const ox = entity.insertionPoint.x + col * entity.columnSpacing;\n const oy = entity.insertionPoint.y + row * entity.rowSpacing;\n ctx.translate(ox, oy);\n\n // Rotation (degrees -> radians)\n if (entity.rotation) {\n ctx.rotate(entity.rotation * Math.PI / 180);\n }\n\n // Scale\n ctx.scale(entity.scaleX, entity.scaleY);\n\n // Offset by block base point\n ctx.translate(-block.basePoint.x, -block.basePoint.y);\n\n // Adjust line width to compensate for scale\n const scaleCompensation = Math.max(Math.abs(entity.scaleX), Math.abs(entity.scaleY));\n const adjustedPixelSize = pixelSize / (scaleCompensation || 1);\n\n // Render block entities\n for (const blockEntity of block.entities) {\n const color = resolveEntityColor(blockEntity, doc.layers, theme);\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = adjustedPixelSize;\n\n if (blockEntity.type === 'INSERT') {\n drawInsert(ctx, blockEntity as DxfInsertEntity, doc, vt, theme, adjustedPixelSize, depth + 1);\n } else {\n drawEntity(ctx, blockEntity as DxfEntity, doc, vt, theme, adjustedPixelSize);\n }\n }\n\n ctx.restore();\n }\n }\n}\n","import type { DxfDimensionEntity, DxfDocument, DxfEntity } from '../../parser/types.js';\nimport type { ViewTransform } from '../camera.js';\nimport type { Theme } from '../theme.js';\nimport { resolveEntityColor } from '../resolve-color.js';\nimport { drawEntity } from './draw-entity.js';\n\nexport function drawDimension(\n ctx: CanvasRenderingContext2D,\n entity: DxfDimensionEntity,\n doc: DxfDocument,\n vt: ViewTransform,\n theme: Theme,\n pixelSize: number,\n): void {\n // Prefer rendering from the geometry block\n if (entity.blockName) {\n const block = doc.blocks.get(entity.blockName);\n if (block) {\n for (const blockEntity of block.entities) {\n const color = resolveEntityColor(blockEntity, doc.layers, theme);\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = pixelSize;\n drawEntity(ctx, blockEntity as DxfEntity, doc, vt, theme, pixelSize);\n }\n return;\n }\n }\n\n // Fallback: render from definition points (simplified)\n if (entity.defPoint2 && entity.defPoint3) {\n ctx.beginPath();\n ctx.moveTo(entity.defPoint2.x, entity.defPoint2.y);\n ctx.lineTo(entity.defPoint.x, entity.defPoint.y);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(entity.defPoint3.x, entity.defPoint3.y);\n ctx.lineTo(entity.defPoint.x, entity.defPoint.y);\n ctx.stroke();\n }\n}\n","import type { DxfHatchEntity } from '../../parser/types.js';\nimport { drawBulgeArc } from '../../utils/math.js';\n\nexport function drawHatch(ctx: CanvasRenderingContext2D, entity: DxfHatchEntity): void {\n if (entity.boundaryPaths.length === 0) return;\n\n ctx.beginPath();\n\n for (const path of entity.boundaryPaths) {\n if (path.type === 'polyline' && path.vertices && path.vertices.length > 0) {\n const firstVert = path.vertices[0]!;\n ctx.moveTo(firstVert.x, firstVert.y);\n for (let i = 1; i < path.vertices.length; i++) {\n const prev = path.vertices[i - 1]!;\n const curr = path.vertices[i]!;\n const bulge = path.bulges?.[i - 1] ?? 0;\n\n if (Math.abs(bulge) < 1e-10) {\n ctx.lineTo(curr.x, curr.y);\n } else {\n drawBulgeArc(ctx, prev.x, prev.y, curr.x, curr.y, bulge);\n }\n }\n if (path.isClosed) ctx.closePath();\n } else if (path.type === 'edges' && path.edges) {\n for (let i = 0; i < path.edges.length; i++) {\n const edge = path.edges[i]!;\n if (edge.type === 'line') {\n if (i === 0) ctx.moveTo(edge.start.x, edge.start.y);\n ctx.lineTo(edge.end.x, edge.end.y);\n } else if (edge.type === 'arc') {\n if (i === 0) {\n const sx = edge.center.x + edge.radius * Math.cos(edge.startAngle * Math.PI / 180);\n const sy = edge.center.y + edge.radius * Math.sin(edge.startAngle * Math.PI / 180);\n ctx.moveTo(sx, sy);\n }\n ctx.arc(\n edge.center.x, edge.center.y, edge.radius,\n edge.startAngle * Math.PI / 180,\n edge.endAngle * Math.PI / 180,\n !edge.ccw,\n );\n }\n // ellipse and spline edges: skipped in v1\n }\n }\n }\n\n if (entity.solidFill) {\n ctx.globalAlpha = 0.3;\n ctx.fill('evenodd');\n ctx.globalAlpha = 1.0;\n }\n ctx.stroke();\n}\n","import type { DxfPointEntity } from '../../parser/types.js';\n\nexport function drawPoint(ctx: CanvasRenderingContext2D, entity: DxfPointEntity, pixelSize: number): void {\n const size = pixelSize * 3; // 3px dot\n ctx.beginPath();\n ctx.arc(entity.position.x, entity.position.y, size, 0, Math.PI * 2);\n ctx.fill();\n}\n","import type { DxfEntity, DxfDocument } from '../../parser/types.js';\nimport type { ViewTransform } from '../camera.js';\nimport type { Theme } from '../theme.js';\nimport { drawLine } from './draw-line.js';\nimport { drawCircle } from './draw-circle.js';\nimport { drawArc } from './draw-arc.js';\nimport { drawLwPolyline, drawPolyline } from './draw-polyline.js';\nimport { drawEllipse } from './draw-ellipse.js';\nimport { drawSpline } from './draw-spline.js';\nimport { drawText, drawMText } from './draw-text.js';\nimport { drawInsert } from './draw-insert.js';\nimport { drawDimension } from './draw-dimension.js';\nimport { drawHatch } from './draw-hatch.js';\nimport { drawPoint } from './draw-point.js';\n\nexport function drawEntity(\n ctx: CanvasRenderingContext2D,\n entity: DxfEntity,\n doc: DxfDocument,\n vt: ViewTransform,\n theme: Theme,\n pixelSize: number,\n): void {\n switch (entity.type) {\n case 'LINE': drawLine(ctx, entity); break;\n case 'CIRCLE': drawCircle(ctx, entity); break;\n case 'ARC': drawArc(ctx, entity); break;\n case 'LWPOLYLINE': drawLwPolyline(ctx, entity); break;\n case 'POLYLINE': drawPolyline(ctx, entity); break;\n case 'ELLIPSE': drawEllipse(ctx, entity); break;\n case 'SPLINE': drawSpline(ctx, entity, pixelSize); break;\n case 'TEXT': drawText(ctx, entity, pixelSize); break;\n case 'MTEXT': drawMText(ctx, entity, pixelSize); break;\n case 'INSERT': drawInsert(ctx, entity, doc, vt, theme, pixelSize); break;\n case 'DIMENSION': drawDimension(ctx, entity, doc, vt, theme, pixelSize); break;\n case 'HATCH': drawHatch(ctx, entity); break;\n case 'POINT': drawPoint(ctx, entity, pixelSize); break;\n }\n}\n","import type { DxfDocument } from '../parser/types.js';\nimport type { ViewTransform } from './camera.js';\nimport type { Theme } from './theme.js';\nimport { THEMES } from './theme.js';\nimport { applyTransform } from './camera.js';\nimport { resolveEntityColor } from './resolve-color.js';\nimport { drawEntity } from './entities/index.js';\n\n// Re-export for convenience\nexport { resolveEntityColor } from './resolve-color.js';\n\nexport class CanvasRenderer {\n private ctx: CanvasRenderingContext2D;\n private width: number = 0;\n private height: number = 0;\n\n constructor(private canvas: HTMLCanvasElement) {\n const ctx = canvas.getContext('2d', { alpha: false });\n if (!ctx) {\n throw new Error(\n 'Failed to get 2D rendering context. The canvas may already have a different context type, ' +\n 'or canvas rendering is not available in this environment.'\n );\n }\n this.ctx = ctx;\n this.updateSize();\n }\n\n getContext(): CanvasRenderingContext2D {\n return this.ctx;\n }\n\n getWidth(): number {\n return this.width;\n }\n\n getHeight(): number {\n return this.height;\n }\n\n updateSize(): void {\n const dpr = window.devicePixelRatio || 1;\n const rect = this.canvas.getBoundingClientRect();\n this.width = rect.width;\n this.height = rect.height;\n this.canvas.width = rect.width * dpr;\n this.canvas.height = rect.height * dpr;\n // DPR is baked into setTransform calls in render/applyTransform\n }\n\n render(\n doc: DxfDocument,\n vt: ViewTransform,\n theme: Theme,\n visibleLayers: Set<string>,\n selectedEntityIndex: number,\n ): void {\n const ctx = this.ctx;\n const dpr = window.devicePixelRatio || 1;\n\n // 1. Clear in screen space (reset transform then apply DPR scale)\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.fillStyle = THEMES[theme].backgroundColor;\n ctx.fillRect(0, 0, this.width, this.height);\n\n // 2. Apply world transform\n applyTransform(ctx, vt);\n\n // 3. Compute pixel size in world space for constant-screen-width lines\n const pixelSize = 1 / vt.scale;\n\n // 4. Set common rendering state\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n // 5. Render entities\n for (let i = 0; i < doc.entities.length; i++) {\n const entity = doc.entities[i]!;\n\n // Skip invisible entities\n if (!entity.visible) continue;\n\n // Skip entities on hidden/frozen/off layers\n if (!visibleLayers.has(entity.layer)) continue;\n\n // Resolve color\n const color = resolveEntityColor(entity, doc.layers, theme);\n\n // Set stroke/fill\n ctx.strokeStyle = color;\n ctx.fillStyle = color;\n ctx.lineWidth = pixelSize; // 1px constant screen width\n\n // Draw entity\n drawEntity(ctx, entity, doc, vt, theme, pixelSize);\n }\n\n // 6. Draw selection highlight\n if (selectedEntityIndex >= 0 && selectedEntityIndex < doc.entities.length) {\n const selEntity = doc.entities[selectedEntityIndex]!;\n // Re-apply transform (in case last entity changed it)\n applyTransform(ctx, vt);\n ctx.strokeStyle = THEMES[theme].selectionColor;\n ctx.fillStyle = THEMES[theme].selectionColor;\n ctx.lineWidth = pixelSize * 3; // 3px highlight\n drawEntity(ctx, selEntity, doc, vt, theme, pixelSize);\n }\n }\n\n renderEmpty(theme: Theme): void {\n const ctx = this.ctx;\n const dpr = window.devicePixelRatio || 1;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.fillStyle = THEMES[theme].backgroundColor;\n ctx.fillRect(0, 0, this.width, this.height);\n }\n\n destroy(): void {\n // no-op — lifecycle cleanup hook for future use\n }\n}\n","import type { DxfLayer } from '../parser/types.js';\n\nexport class LayerManager {\n private layers: Map<string, DxfLayer> = new Map();\n private visibility: Map<string, boolean> = new Map();\n private colorOverrides: Map<string, string> = new Map();\n private visibleCache: Set<string> | null = null;\n\n setLayers(layers: Map<string, DxfLayer>): void {\n // Defensive copy — avoid shared mutation with DxfDocument\n this.layers = new Map(layers);\n this.visibility.clear();\n this.colorOverrides.clear();\n this.visibleCache = null;\n for (const [name, layer] of this.layers) {\n this.visibility.set(name, !layer.isOff && !layer.isFrozen);\n }\n }\n\n getAllLayers(): DxfLayer[] {\n return Array.from(this.layers.values());\n }\n\n setVisible(name: string, visible: boolean): void {\n this.visibility.set(name, visible);\n this.visibleCache = null; // Invalidate cache\n }\n\n isVisible(name: string): boolean {\n return this.visibility.get(name) ?? true;\n }\n\n setColorOverride(name: string, color: string): void {\n this.colorOverrides.set(name, color);\n }\n\n getColorOverride(name: string): string | undefined {\n return this.colorOverrides.get(name);\n }\n\n getVisibleLayerNames(): Set<string> {\n if (this.visibleCache) return this.visibleCache;\n\n const visible = new Set<string>();\n for (const [name, isVisible] of this.visibility) {\n if (isVisible) visible.add(name);\n }\n this.visibleCache = visible;\n return visible;\n }\n\n clear(): void {\n this.layers.clear();\n this.visibility.clear();\n this.colorOverrides.clear();\n this.visibleCache = null;\n }\n}\n","import type { Point2D, DxfEntity } from '../parser/types.js';\nimport type { ViewTransform } from '../renderer/camera.js';\n\nexport interface SelectEvent {\n entity: DxfEntity;\n entityIndex: number;\n worldPoint: Point2D;\n screenPoint: Point2D;\n}\n\nexport interface MeasureEvent {\n distance: number;\n angle: number;\n deltaX: number;\n deltaY: number;\n points: [Point2D, Point2D];\n}\n\nexport interface CadViewerEventMap {\n select: SelectEvent;\n measure: MeasureEvent;\n viewchange: ViewTransform;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventCallback = (data: any) => void;\n\nexport class EventEmitter<T extends Record<string, any> = Record<string, any>> {\n private listeners: Map<string, Set<EventCallback>> = new Map();\n\n on<K extends keyof T>(event: K, callback: (data: T[K]) => void): void {\n if (!this.listeners.has(event as string)) {\n this.listeners.set(event as string, new Set());\n }\n this.listeners.get(event as string)!.add(callback as EventCallback);\n }\n\n off<K extends keyof T>(event: K, callback: (data: T[K]) => void): void {\n this.listeners.get(event as string)?.delete(callback as EventCallback);\n }\n\n emit<K extends keyof T>(event: K, data: T[K]): void {\n const callbacks = this.listeners.get(event as string);\n if (callbacks) {\n for (const cb of callbacks) {\n cb(data);\n }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import type { CadViewer } from './viewer.js';\n\nexport class InputHandler {\n private isPanning = false;\n private lastX = 0;\n private lastY = 0;\n private touches: Map<number, { x: number; y: number }> = new Map();\n\n // Bound event handlers (for cleanup)\n private onPointerDown: (e: PointerEvent) => void;\n private onPointerMove: (e: PointerEvent) => void;\n private onPointerUp: (e: PointerEvent) => void;\n private onWheel: (e: WheelEvent) => void;\n private onTouchStart: (e: TouchEvent) => void;\n private onTouchMove: (e: TouchEvent) => void;\n private onTouchEnd: (e: TouchEvent) => void;\n private onContextMenu: (e: Event) => void;\n\n constructor(\n private canvas: HTMLCanvasElement,\n private viewer: CadViewer,\n ) {\n this.onPointerDown = this.handlePointerDown.bind(this);\n this.onPointerMove = this.handlePointerMove.bind(this);\n this.onPointerUp = this.handlePointerUp.bind(this);\n this.onWheel = this.handleWheel.bind(this);\n this.onTouchStart = this.handleTouchStart.bind(this);\n this.onTouchMove = this.handleTouchMove.bind(this);\n this.onTouchEnd = this.handleTouchEnd.bind(this);\n this.onContextMenu = (e: Event) => e.preventDefault();\n\n canvas.addEventListener('pointerdown', this.onPointerDown);\n canvas.addEventListener('pointermove', this.onPointerMove);\n canvas.addEventListener('pointerup', this.onPointerUp);\n canvas.addEventListener('wheel', this.onWheel, { passive: false });\n canvas.addEventListener('touchstart', this.onTouchStart, { passive: false });\n canvas.addEventListener('touchmove', this.onTouchMove, { passive: false });\n canvas.addEventListener('touchend', this.onTouchEnd);\n canvas.addEventListener('contextmenu', this.onContextMenu);\n }\n\n destroy(): void {\n this.canvas.removeEventListener('pointerdown', this.onPointerDown);\n this.canvas.removeEventListener('pointermove', this.onPointerMove);\n this.canvas.removeEventListener('pointerup', this.onPointerUp);\n this.canvas.removeEventListener('wheel', this.onWheel);\n this.canvas.removeEventListener('touchstart', this.onTouchStart);\n this.canvas.removeEventListener('touchmove', this.onTouchMove);\n this.canvas.removeEventListener('touchend', this.onTouchEnd);\n this.canvas.removeEventListener('contextmenu', this.onContextMenu);\n }\n\n // --- Pointer Events (Mouse) ---\n\n private handlePointerDown(e: PointerEvent): void {\n const tool = this.viewer.getTool();\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n if (e.button === 0 && tool === 'pan') {\n this.startPan(e, x, y);\n } else if (e.button === 1) {\n // Middle click: always pan\n this.startPan(e, x, y);\n } else if (e.button === 0 && (tool === 'select' || tool === 'measure')) {\n this.viewer.handleClick(x, y);\n }\n }\n\n private startPan(e: PointerEvent, x: number, y: number): void {\n this.isPanning = true;\n this.lastX = x;\n this.lastY = y;\n this.canvas.setPointerCapture(e.pointerId);\n this.canvas.style.cursor = 'grabbing';\n }\n\n private handlePointerMove(e: PointerEvent): void {\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n if (this.isPanning) {\n const dx = x - this.lastX;\n const dy = y - this.lastY;\n this.lastX = x;\n this.lastY = y;\n this.viewer.handlePan(dx, dy);\n } else {\n // Report mouse position for snap preview\n this.viewer.handleMouseMove(x, y);\n }\n }\n\n private handlePointerUp(e: PointerEvent): void {\n if (this.isPanning) {\n this.isPanning = false;\n this.canvas.releasePointerCapture(e.pointerId);\n this.canvas.style.cursor = this.viewer.getTool() === 'pan' ? 'grab' : 'crosshair';\n }\n }\n\n // --- Wheel (Zoom) ---\n\n private handleWheel(e: WheelEvent): void {\n e.preventDefault();\n\n const rect = this.canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const delta = -Math.sign(e.deltaY);\n const speed = this.viewer.getZoomSpeed();\n const factor = delta > 0 ? speed : 1 / speed;\n\n this.viewer.handleZoom(x, y, factor);\n }\n\n // --- Touch Events (Pinch-to-Zoom) ---\n\n private handleTouchStart(e: TouchEvent): void {\n e.preventDefault();\n for (const t of Array.from(e.changedTouches)) {\n this.touches.set(t.identifier, { x: t.clientX, y: t.clientY });\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n e.preventDefault();\n\n if (this.touches.size === 2 && e.touches.length === 2) {\n const t0 = e.touches[0]!;\n const t1 = e.touches[1]!;\n const prev = Array.from(this.touches.values());\n\n const prevDist = Math.hypot(prev[0]!.x - prev[1]!.x, prev[0]!.y - prev[1]!.y);\n const currDist = Math.hypot(t0.clientX - t1.clientX, t0.clientY - t1.clientY);\n\n if (prevDist > 0) {\n const zoomFactor = currDist / prevDist;\n\n const rect = this.canvas.getBoundingClientRect();\n const prevCenterX = (prev[0]!.x + prev[1]!.x) / 2 - rect.left;\n const prevCenterY = (prev[0]!.y + prev[1]!.y) / 2 - rect.top;\n const currCenterX = (t0.clientX + t1.clientX) / 2 - rect.left;\n const currCenterY = (t0.clientY + t1.clientY) / 2 - rect.top;\n\n this.viewer.handleZoom(prevCenterX, prevCenterY, zoomFactor);\n this.viewer.handlePan(currCenterX - prevCenterX, currCenterY - prevCenterY);\n }\n } else if (this.touches.size === 1 && e.touches.length === 1) {\n const t = e.touches[0]!;\n const prev = this.touches.get(t.identifier);\n if (prev) {\n this.viewer.handlePan(\n t.clientX - prev.x,\n t.clientY - prev.y,\n );\n }\n }\n\n for (const t of Array.from(e.changedTouches)) {\n this.touches.set(t.identifier, { x: t.clientX, y: t.clientY });\n }\n }\n\n private handleTouchEnd(e: TouchEvent): void {\n for (const t of Array.from(e.changedTouches)) {\n this.touches.delete(t.identifier);\n }\n }\n}\n","import type { DxfEntity } from '../parser/types.js';\n\nexport interface BBox {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function computeEntitiesBounds(entities: DxfEntity[]): BBox | null {\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n let hasAny = false;\n\n for (const entity of entities) {\n const bbox = computeEntityBBox(entity);\n if (!bbox) continue;\n hasAny = true;\n minX = Math.min(minX, bbox.minX);\n minY = Math.min(minY, bbox.minY);\n maxX = Math.max(maxX, bbox.maxX);\n maxY = Math.max(maxY, bbox.maxY);\n }\n\n return hasAny ? { minX, minY, maxX, maxY } : null;\n}\n\nexport function computeEntityBBox(entity: DxfEntity): BBox | null {\n switch (entity.type) {\n case 'LINE':\n return {\n minX: Math.min(entity.start.x, entity.end.x),\n minY: Math.min(entity.start.y, entity.end.y),\n maxX: Math.max(entity.start.x, entity.end.x),\n maxY: Math.max(entity.start.y, entity.end.y),\n };\n case 'CIRCLE':\n return {\n minX: entity.center.x - entity.radius,\n minY: entity.center.y - entity.radius,\n maxX: entity.center.x + entity.radius,\n maxY: entity.center.y + entity.radius,\n };\n case 'ARC': {\n // Conservative: use full circle bounds\n return {\n minX: entity.center.x - entity.radius,\n minY: entity.center.y - entity.radius,\n maxX: entity.center.x + entity.radius,\n maxY: entity.center.y + entity.radius,\n };\n }\n case 'LWPOLYLINE':\n case 'POLYLINE': {\n if (entity.vertices.length === 0) return null;\n let pMinX = Infinity, pMinY = Infinity, pMaxX = -Infinity, pMaxY = -Infinity;\n for (const v of entity.vertices) {\n pMinX = Math.min(pMinX, v.x);\n pMinY = Math.min(pMinY, v.y);\n pMaxX = Math.max(pMaxX, v.x);\n pMaxY = Math.max(pMaxY, v.y);\n }\n return { minX: pMinX, minY: pMinY, maxX: pMaxX, maxY: pMaxY };\n }\n case 'ELLIPSE': {\n const majorLen = Math.sqrt(entity.majorAxis.x ** 2 + entity.majorAxis.y ** 2);\n return {\n minX: entity.center.x - majorLen,\n minY: entity.center.y - majorLen,\n maxX: entity.center.x + majorLen,\n maxY: entity.center.y + majorLen,\n };\n }\n case 'TEXT':\n return {\n minX: entity.insertionPoint.x,\n minY: entity.insertionPoint.y,\n maxX: entity.insertionPoint.x + entity.height * entity.text.length * 0.6,\n maxY: entity.insertionPoint.y + entity.height,\n };\n case 'MTEXT':\n return {\n minX: entity.insertionPoint.x,\n minY: entity.insertionPoint.y - entity.height,\n maxX: entity.insertionPoint.x + (entity.width || entity.height * 10),\n maxY: entity.insertionPoint.y + entity.height,\n };\n case 'SPLINE': {\n if (entity.controlPoints.length === 0) return null;\n let sMinX = Infinity, sMinY = Infinity, sMaxX = -Infinity, sMaxY = -Infinity;\n for (const p of entity.controlPoints) {\n sMinX = Math.min(sMinX, p.x);\n sMinY = Math.min(sMinY, p.y);\n sMaxX = Math.max(sMaxX, p.x);\n sMaxY = Math.max(sMaxY, p.y);\n }\n return { minX: sMinX, minY: sMinY, maxX: sMaxX, maxY: sMaxY };\n }\n case 'POINT':\n return {\n minX: entity.position.x,\n minY: entity.position.y,\n maxX: entity.position.x,\n maxY: entity.position.y,\n };\n case 'INSERT':\n return {\n minX: entity.insertionPoint.x,\n minY: entity.insertionPoint.y,\n maxX: entity.insertionPoint.x,\n maxY: entity.insertionPoint.y,\n };\n case 'DIMENSION':\n if (entity.defPoint) {\n return {\n minX: Math.min(entity.defPoint.x, entity.defPoint2?.x ?? entity.defPoint.x, entity.defPoint3?.x ?? entity.defPoint.x),\n minY: Math.min(entity.defPoint.y, entity.defPoint2?.y ?? entity.defPoint.y, entity.defPoint3?.y ?? entity.defPoint.y),\n maxX: Math.max(entity.defPoint.x, entity.defPoint2?.x ?? entity.defPoint.x, entity.defPoint3?.x ?? entity.defPoint.x),\n maxY: Math.max(entity.defPoint.y, entity.defPoint2?.y ?? entity.defPoint.y, entity.defPoint3?.y ?? entity.defPoint.y),\n };\n }\n return null;\n case 'HATCH': {\n let hMinX = Infinity, hMinY = Infinity, hMaxX = -Infinity, hMaxY = -Infinity;\n let hasPoints = false;\n for (const path of entity.boundaryPaths) {\n if (path.vertices) {\n for (const v of path.vertices) {\n hasPoints = true;\n hMinX = Math.min(hMinX, v.x);\n hMinY = Math.min(hMinY, v.y);\n hMaxX = Math.max(hMaxX, v.x);\n hMaxY = Math.max(hMaxY, v.y);\n }\n }\n }\n return hasPoints ? { minX: hMinX, minY: hMinY, maxX: hMaxX, maxY: hMaxY } : null;\n }\n default:\n return null;\n }\n}\n","import RBush from 'rbush';\nimport type { DxfEntity, Point3D } from '../parser/types.js';\nimport { computeEntityBBox } from '../utils/bbox.js';\n\nexport interface SpatialItem {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n entityIndex: number;\n}\n\nconst HIT_TOLERANCE_PX = 5;\n\nexport class SpatialIndex {\n private tree: RBush<SpatialItem> = new RBush();\n private items: SpatialItem[] = [];\n\n build(entities: DxfEntity[]): void {\n this.items = [];\n for (let i = 0; i < entities.length; i++) {\n const entity = entities[i]!;\n const bbox = computeEntityBBox(entity);\n if (!bbox) continue;\n this.items.push({\n ...bbox,\n entityIndex: i,\n });\n }\n this.tree.clear();\n this.tree.load(this.items);\n }\n\n search(minX: number, minY: number, maxX: number, maxY: number): SpatialItem[] {\n return this.tree.search({ minX, minY, maxX, maxY });\n }\n\n clear(): void {\n this.tree.clear();\n this.items = [];\n }\n}\n\n/**\n * Find the nearest entity to a world point.\n * Returns entity index, or -1 if nothing is within tolerance.\n */\nexport function hitTest(\n wx: number,\n wy: number,\n entities: DxfEntity[],\n spatialIndex: SpatialIndex,\n visibleLayers: Set<string>,\n scale: number,\n): number {\n const tolerance = HIT_TOLERANCE_PX / scale;\n\n const candidates = spatialIndex.search(\n wx - tolerance, wy - tolerance,\n wx + tolerance, wy + tolerance,\n );\n\n let bestDist = tolerance;\n let bestIndex = -1;\n\n for (let i = candidates.length - 1; i >= 0; i--) {\n const item = candidates[i]!;\n const entity = entities[item.entityIndex];\n if (!entity) continue;\n\n if (!visibleLayers.has(entity.layer)) continue;\n if (!entity.visible) continue;\n\n const dist = distanceToEntity(wx, wy, entity);\n if (dist < bestDist) {\n bestDist = dist;\n bestIndex = item.entityIndex;\n }\n }\n\n return bestIndex;\n}\n\nexport function distanceToEntity(wx: number, wy: number, entity: DxfEntity): number {\n switch (entity.type) {\n case 'LINE':\n return distPointToSegment(wx, wy, entity.start.x, entity.start.y, entity.end.x, entity.end.y);\n\n case 'CIRCLE':\n return distPointToCircle(wx, wy, entity.center.x, entity.center.y, entity.radius);\n\n case 'ARC':\n return distPointToArc(\n wx, wy,\n entity.center.x, entity.center.y,\n entity.radius,\n entity.startAngle * Math.PI / 180,\n entity.endAngle * Math.PI / 180,\n );\n\n case 'LWPOLYLINE':\n case 'POLYLINE': {\n let minDist = Infinity;\n const verts = entity.vertices;\n const count = entity.closed ? verts.length : verts.length - 1;\n for (let i = 0; i < count; i++) {\n const a = verts[i]!;\n const b = verts[(i + 1) % verts.length]!;\n const d = distPointToSegment(wx, wy, a.x, a.y, b.x, b.y);\n minDist = Math.min(minDist, d);\n }\n return minDist;\n }\n\n case 'ELLIPSE':\n return distPointToEllipse(\n wx, wy,\n entity.center.x, entity.center.y,\n entity.majorAxis, entity.minorRatio,\n );\n\n case 'TEXT':\n case 'MTEXT': {\n const bbox = computeEntityBBox(entity);\n if (!bbox) return Infinity;\n return distPointToRect(wx, wy, bbox.minX, bbox.minY, bbox.maxX, bbox.maxY);\n }\n\n case 'POINT':\n return Math.hypot(wx - entity.position.x, wy - entity.position.y);\n\n case 'SPLINE': {\n let minDist = Infinity;\n const pts = entity.controlPoints;\n for (let i = 0; i < pts.length - 1; i++) {\n const d = distPointToSegment(wx, wy, pts[i]!.x, pts[i]!.y, pts[i + 1]!.x, pts[i + 1]!.y);\n minDist = Math.min(minDist, d);\n }\n return minDist;\n }\n\n default:\n return Infinity;\n }\n}\n\n// --- Primitive distance functions ---\n\nexport function distPointToSegment(\n px: number, py: number,\n x1: number, y1: number,\n x2: number, y2: number,\n): number {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n\n if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n\n let t = ((px - x1) * dx + (py - y1) * dy) / lenSq;\n t = Math.max(0, Math.min(1, t));\n\n const projX = x1 + t * dx;\n const projY = y1 + t * dy;\n return Math.hypot(px - projX, py - projY);\n}\n\nexport function distPointToCircle(\n px: number, py: number,\n cx: number, cy: number,\n radius: number,\n): number {\n return Math.abs(Math.hypot(px - cx, py - cy) - radius);\n}\n\nexport function distPointToArc(\n px: number, py: number,\n cx: number, cy: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n): number {\n const angle = Math.atan2(py - cy, px - cx);\n const normAngle = ((angle % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n const normStart = ((startAngle % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n const normEnd = ((endAngle % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n\n const inArc = normStart <= normEnd\n ? normAngle >= normStart && normAngle <= normEnd\n : normAngle >= normStart || normAngle <= normEnd;\n\n if (inArc) {\n return Math.abs(Math.hypot(px - cx, py - cy) - radius);\n }\n\n const d1 = Math.hypot(\n px - (cx + radius * Math.cos(startAngle)),\n py - (cy + radius * Math.sin(startAngle)),\n );\n const d2 = Math.hypot(\n px - (cx + radius * Math.cos(endAngle)),\n py - (cy + radius * Math.sin(endAngle)),\n );\n return Math.min(d1, d2);\n}\n\nexport function distPointToRect(\n px: number, py: number,\n minX: number, minY: number,\n maxX: number, maxY: number,\n): number {\n if (px >= minX && px <= maxX && py >= minY && py <= maxY) return 0;\n const dx = Math.max(minX - px, 0, px - maxX);\n const dy = Math.max(minY - py, 0, py - maxY);\n return Math.hypot(dx, dy);\n}\n\nexport function distPointToEllipse(\n px: number, py: number,\n cx: number, cy: number,\n majorAxis: Point3D,\n minorRatio: number,\n): number {\n const rotation = Math.atan2(majorAxis.y, majorAxis.x);\n const cos = Math.cos(-rotation);\n const sin = Math.sin(-rotation);\n const localX = (px - cx) * cos - (py - cy) * sin;\n const localY = (px - cx) * sin + (py - cy) * cos;\n\n const a = Math.sqrt(majorAxis.x ** 2 + majorAxis.y ** 2);\n const b = a * minorRatio;\n\n if (a < 1e-10) return Math.hypot(px - cx, py - cy);\n\n const scaledY = localY * (a / b);\n const dist = Math.hypot(localX, scaledY);\n if (dist < 1e-10) return a; // at center\n const onEllipseX = (localX / dist) * a;\n const onEllipseY = (localY / dist) * b;\n return Math.hypot(localX - onEllipseX, localY - onEllipseY);\n}\n","import type { Point2D, DxfEntity } from '../parser/types.js';\nimport type { ViewTransform } from '../renderer/camera.js';\nimport type { Theme } from '../renderer/theme.js';\nimport type { MeasureEvent } from './events.js';\nimport type { SpatialIndex } from './selection.js';\nimport { THEMES } from '../renderer/theme.js';\nimport { worldToScreen, screenToWorld } from '../renderer/camera.js';\n\nexport type SnapType = 'endpoint' | 'midpoint' | 'center' | 'nearest';\n\nexport interface SnapResult {\n point: Point2D;\n type: SnapType;\n entityIndex: number;\n}\n\nexport type MeasureState =\n | { phase: 'idle' }\n | { phase: 'first-point' }\n | { phase: 'second-point'; firstPoint: Point2D; firstSnap?: SnapResult }\n | { phase: 'done'; firstPoint: Point2D; secondPoint: Point2D; distance: number; angle: number };\n\nexport class MeasureTool {\n state: MeasureState = { phase: 'idle' };\n currentSnap: SnapResult | null = null;\n\n activate(): void {\n this.state = { phase: 'first-point' };\n this.currentSnap = null;\n }\n\n deactivate(): void {\n this.state = { phase: 'idle' };\n this.currentSnap = null;\n }\n\n handleClick(wx: number, wy: number, snap: SnapResult | null): MeasureEvent | null {\n const point = snap ? snap.point : { x: wx, y: wy };\n\n switch (this.state.phase) {\n case 'first-point':\n this.state = {\n phase: 'second-point',\n firstPoint: point,\n firstSnap: snap ?? undefined,\n };\n return null;\n\n case 'second-point': {\n const p1 = this.state.firstPoint;\n const p2 = point;\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const angle = Math.atan2(dy, dx) * 180 / Math.PI;\n\n this.state = { phase: 'done', firstPoint: p1, secondPoint: p2, distance, angle };\n\n return {\n distance,\n angle,\n deltaX: dx,\n deltaY: dy,\n points: [p1, p2],\n };\n }\n\n case 'done':\n // Reset and start new measurement\n this.state = { phase: 'second-point', firstPoint: point };\n return null;\n\n default:\n return null;\n }\n }\n\n handleMove(snap: SnapResult | null): void {\n this.currentSnap = snap;\n }\n}\n\n// --- Snap System ---\n\nexport function findSnaps(\n wx: number,\n wy: number,\n entities: DxfEntity[],\n spatialIndex: SpatialIndex,\n scale: number,\n snapTypes: Set<SnapType> = new Set(['endpoint', 'midpoint', 'center']),\n): SnapResult[] {\n const tolerance = 10 / scale;\n const results: SnapResult[] = [];\n\n const candidates = spatialIndex.search(\n wx - tolerance, wy - tolerance,\n wx + tolerance, wy + tolerance,\n );\n\n for (const item of candidates) {\n const entity = entities[item.entityIndex];\n if (!entity) continue;\n const idx = item.entityIndex;\n\n switch (entity.type) {\n case 'LINE': {\n if (snapTypes.has('endpoint')) {\n addIfClose(results, entity.start.x, entity.start.y, 'endpoint', idx, wx, wy, tolerance);\n addIfClose(results, entity.end.x, entity.end.y, 'endpoint', idx, wx, wy, tolerance);\n }\n if (snapTypes.has('midpoint')) {\n const mx = (entity.start.x + entity.end.x) / 2;\n const my = (entity.start.y + entity.end.y) / 2;\n addIfClose(results, mx, my, 'midpoint', idx, wx, wy, tolerance);\n }\n break;\n }\n\n case 'CIRCLE': {\n if (snapTypes.has('center')) {\n addIfClose(results, entity.center.x, entity.center.y, 'center', idx, wx, wy, tolerance);\n }\n if (snapTypes.has('endpoint')) {\n for (const angle of [0, Math.PI / 2, Math.PI, 3 * Math.PI / 2]) {\n const qx = entity.center.x + entity.radius * Math.cos(angle);\n const qy = entity.center.y + entity.radius * Math.sin(angle);\n addIfClose(results, qx, qy, 'endpoint', idx, wx, wy, tolerance);\n }\n }\n break;\n }\n\n case 'ARC': {\n if (snapTypes.has('center')) {\n addIfClose(results, entity.center.x, entity.center.y, 'center', idx, wx, wy, tolerance);\n }\n if (snapTypes.has('endpoint')) {\n const startRad = entity.startAngle * Math.PI / 180;\n const endRad = entity.endAngle * Math.PI / 180;\n addIfClose(results, entity.center.x + entity.radius * Math.cos(startRad), entity.center.y + entity.radius * Math.sin(startRad), 'endpoint', idx, wx, wy, tolerance);\n addIfClose(results, entity.center.x + entity.radius * Math.cos(endRad), entity.center.y + entity.radius * Math.sin(endRad), 'endpoint', idx, wx, wy, tolerance);\n }\n break;\n }\n\n case 'LWPOLYLINE':\n case 'POLYLINE': {\n if (snapTypes.has('endpoint')) {\n for (const v of entity.vertices) {\n addIfClose(results, v.x, v.y, 'endpoint', idx, wx, wy, tolerance);\n }\n }\n if (snapTypes.has('midpoint')) {\n for (let i = 0; i < entity.vertices.length - 1; i++) {\n const a = entity.vertices[i]!;\n const b = entity.vertices[i + 1]!;\n addIfClose(results, (a.x + b.x) / 2, (a.y + b.y) / 2, 'midpoint', idx, wx, wy, tolerance);\n }\n }\n break;\n }\n\n case 'ELLIPSE': {\n if (snapTypes.has('center')) {\n addIfClose(results, entity.center.x, entity.center.y, 'center', idx, wx, wy, tolerance);\n }\n break;\n }\n\n case 'TEXT': {\n if (snapTypes.has('endpoint')) {\n addIfClose(results, entity.insertionPoint.x, entity.insertionPoint.y, 'endpoint', idx, wx, wy, tolerance);\n }\n break;\n }\n case 'MTEXT': {\n if (snapTypes.has('endpoint')) {\n addIfClose(results, entity.insertionPoint.x, entity.insertionPoint.y, 'endpoint', idx, wx, wy, tolerance);\n }\n break;\n }\n }\n }\n\n results.sort((a, b) =>\n Math.hypot(a.point.x - wx, a.point.y - wy) -\n Math.hypot(b.point.x - wx, b.point.y - wy)\n );\n\n return results;\n}\n\nfunction addIfClose(\n results: SnapResult[],\n x: number, y: number,\n type: SnapType,\n entityIndex: number,\n wx: number, wy: number,\n tolerance: number,\n): void {\n if (Math.hypot(x - wx, y - wy) <= tolerance) {\n results.push({ point: { x, y }, type, entityIndex });\n }\n}\n\n// --- Overlay Rendering ---\n\nexport function renderMeasureOverlay(\n ctx: CanvasRenderingContext2D,\n vt: ViewTransform,\n measureTool: MeasureTool,\n mouseScreenX: number,\n mouseScreenY: number,\n theme: Theme,\n): void {\n const config = THEMES[theme];\n ctx.setTransform(1, 0, 0, 1, 0, 0); // switch to screen space\n\n const state = measureTool.state;\n\n // Draw snap indicator\n if (measureTool.currentSnap) {\n const [sx, sy] = worldToScreen(vt, measureTool.currentSnap.point.x, measureTool.currentSnap.point.y);\n drawSnapIndicator(ctx, sx, sy, measureTool.currentSnap.type, config.measureColor);\n }\n\n if (state.phase === 'second-point') {\n const [sx1, sy1] = worldToScreen(vt, state.firstPoint.x, state.firstPoint.y);\n let targetX: number;\n let targetY: number;\n\n if (measureTool.currentSnap) {\n const [snapSx, snapSy] = worldToScreen(vt, measureTool.currentSnap.point.x, measureTool.currentSnap.point.y);\n targetX = snapSx;\n targetY = snapSy;\n } else {\n targetX = mouseScreenX;\n targetY = mouseScreenY;\n }\n\n // Dashed dimension line\n ctx.strokeStyle = config.measureColor;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([6, 3]);\n ctx.beginPath();\n ctx.moveTo(sx1, sy1);\n ctx.lineTo(targetX, targetY);\n ctx.stroke();\n ctx.setLineDash([]);\n\n // Endpoint markers\n drawEndpointMarker(ctx, sx1, sy1, config.measureColor);\n drawEndpointMarker(ctx, targetX, targetY, config.measureColor);\n\n // Live distance label\n let twx: number;\n let twy: number;\n if (measureTool.currentSnap) {\n twx = measureTool.currentSnap.point.x;\n twy = measureTool.currentSnap.point.y;\n } else {\n [twx, twy] = screenToWorld(vt, mouseScreenX, mouseScreenY);\n }\n const dist = Math.hypot(twx - state.firstPoint.x, twy - state.firstPoint.y);\n drawMeasureLabel(ctx, (sx1 + targetX) / 2, (sy1 + targetY) / 2, dist, theme);\n }\n\n if (state.phase === 'done') {\n const [sx1, sy1] = worldToScreen(vt, state.firstPoint.x, state.firstPoint.y);\n const [sx2, sy2] = worldToScreen(vt, state.secondPoint.x, state.secondPoint.y);\n\n // Solid dimension line\n ctx.strokeStyle = config.measureColor;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(sx1, sy1);\n ctx.lineTo(sx2, sy2);\n ctx.stroke();\n\n drawEndpointMarker(ctx, sx1, sy1, config.measureColor);\n drawEndpointMarker(ctx, sx2, sy2, config.measureColor);\n drawMeasureLabel(ctx, (sx1 + sx2) / 2, (sy1 + sy2) / 2, state.distance, theme);\n }\n}\n\nfunction drawSnapIndicator(ctx: CanvasRenderingContext2D, x: number, y: number, type: SnapType, color: string): void {\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n const size = 8;\n\n switch (type) {\n case 'endpoint':\n ctx.strokeRect(x - size / 2, y - size / 2, size, size);\n break;\n case 'midpoint':\n ctx.beginPath();\n ctx.moveTo(x, y - size / 2);\n ctx.lineTo(x + size / 2, y + size / 2);\n ctx.lineTo(x - size / 2, y + size / 2);\n ctx.closePath();\n ctx.stroke();\n break;\n case 'center':\n ctx.beginPath();\n ctx.arc(x, y, size / 2, 0, Math.PI * 2);\n ctx.stroke();\n break;\n case 'nearest':\n ctx.beginPath();\n ctx.moveTo(x - size / 2, y - size / 2);\n ctx.lineTo(x + size / 2, y + size / 2);\n ctx.moveTo(x + size / 2, y - size / 2);\n ctx.lineTo(x - size / 2, y + size / 2);\n ctx.stroke();\n break;\n }\n}\n\nfunction drawEndpointMarker(ctx: CanvasRenderingContext2D, x: number, y: number, color: string): void {\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.arc(x, y, 4, 0, Math.PI * 2);\n ctx.fill();\n}\n\nfunction drawMeasureLabel(\n ctx: CanvasRenderingContext2D,\n x: number, y: number,\n distance: number,\n theme: Theme,\n): void {\n const label = distance.toFixed(4);\n\n ctx.font = '13px monospace';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'bottom';\n\n const metrics = ctx.measureText(label);\n const pad = 4;\n const bgX = x - metrics.width / 2 - pad;\n const bgY = y - 20;\n const bgW = metrics.width + pad * 2;\n const bgH = 18;\n\n ctx.fillStyle = theme === 'dark' ? 'rgba(0,0,0,0.8)' : 'rgba(255,255,255,0.9)';\n ctx.fillRect(bgX, bgY, bgW, bgH);\n\n ctx.fillStyle = THEMES[theme].measureColor;\n ctx.fillText(label, x, y - 6);\n}\n","import type { DxfDocument, DxfEntity, DxfLayer } from '../parser/types.js';\nimport type { ViewTransform } from '../renderer/camera.js';\nimport type { Theme } from '../renderer/theme.js';\nimport type { CadViewerEventMap } from './events.js';\nimport { parseDxf } from '../parser/index.js';\nimport { CanvasRenderer } from '../renderer/canvas-renderer.js';\nimport { Camera, fitToView, screenToWorld } from '../renderer/camera.js';\nimport { LayerManager } from './layers.js';\nimport { EventEmitter } from './events.js';\nimport { InputHandler } from './input-handler.js';\nimport { SpatialIndex, hitTest } from './selection.js';\nimport { MeasureTool, findSnaps, renderMeasureOverlay } from './measure.js';\nimport { computeEntitiesBounds } from '../utils/bbox.js';\n\nexport type Tool = 'pan' | 'select' | 'measure';\n\nexport interface CadViewerOptions {\n theme?: Theme;\n backgroundColor?: string;\n antialias?: boolean;\n minZoom?: number;\n maxZoom?: number;\n zoomSpeed?: number;\n initialTool?: Tool;\n}\n\ninterface ResolvedOptions {\n theme: Theme;\n backgroundColor: string | undefined;\n antialias: boolean;\n minZoom: number;\n maxZoom: number;\n zoomSpeed: number;\n initialTool: Tool;\n}\n\nexport class CadViewer {\n private canvas: HTMLCanvasElement;\n private renderer: CanvasRenderer;\n private camera: Camera;\n private layerManager: LayerManager;\n private emitter: EventEmitter<CadViewerEventMap>;\n private spatialIndex: SpatialIndex;\n private measureTool: MeasureTool;\n private doc: DxfDocument | null = null;\n private options: ResolvedOptions;\n private currentTool: Tool;\n private inputHandler: InputHandler;\n private resizeObserver: ResizeObserver;\n private selectedEntityIndex: number = -1;\n private renderPending: boolean = false;\n private destroyed: boolean = false;\n private mouseScreenX: number = 0;\n private mouseScreenY: number = 0;\n\n constructor(canvas: HTMLCanvasElement, options?: CadViewerOptions) {\n this.canvas = canvas;\n this.options = {\n theme: options?.theme ?? 'dark',\n backgroundColor: options?.backgroundColor,\n antialias: options?.antialias ?? true,\n minZoom: options?.minZoom ?? 0.0001,\n maxZoom: options?.maxZoom ?? 100000,\n zoomSpeed: options?.zoomSpeed ?? 1.1,\n initialTool: options?.initialTool ?? 'pan',\n };\n\n this.renderer = new CanvasRenderer(canvas);\n this.camera = new Camera(this.options);\n this.layerManager = new LayerManager();\n this.emitter = new EventEmitter();\n this.spatialIndex = new SpatialIndex();\n this.measureTool = new MeasureTool();\n this.currentTool = this.options.initialTool;\n\n // Input handling\n this.inputHandler = new InputHandler(canvas, this);\n\n // Auto-resize on container resize\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(canvas);\n\n // Set cursor\n canvas.style.cursor = this.getCursorForTool(this.currentTool);\n\n // Initial render (empty canvas with background)\n this.requestRender();\n }\n\n // === Loading ===\n\n async loadFile(file: File): Promise<void> {\n const buffer = await file.arrayBuffer();\n this.loadArrayBuffer(buffer);\n }\n\n loadString(dxf: string): void {\n this.doc = parseDxf(dxf);\n this.onDocumentLoaded();\n }\n\n loadArrayBuffer(buffer: ArrayBuffer): void {\n this.doc = parseDxf(buffer);\n this.onDocumentLoaded();\n }\n\n /**\n * Clear the current document and reset all state without destroying the viewer.\n */\n clearDocument(): void {\n this.doc = null;\n this.selectedEntityIndex = -1;\n this.spatialIndex.clear();\n this.layerManager.clear();\n this.measureTool.deactivate();\n this.requestRender();\n }\n\n private onDocumentLoaded(): void {\n if (!this.doc) return;\n\n // Initialize layers\n this.layerManager.setLayers(this.doc.layers);\n\n // Build spatial index\n this.spatialIndex.build(this.doc.entities);\n\n // Reset selection and measurement\n this.selectedEntityIndex = -1;\n this.measureTool.deactivate();\n if (this.currentTool === 'measure') {\n this.measureTool.activate();\n }\n\n // Fit to view\n this.fitToView();\n }\n\n // === Camera Controls ===\n\n fitToView(): void {\n if (!this.doc) return;\n\n const bounds = this.computeDocumentBounds();\n if (!bounds) return;\n\n const rect = this.canvas.getBoundingClientRect();\n this.camera.setTransform(\n fitToView(rect.width, rect.height, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY)\n );\n this.requestRender();\n this.emitter.emit('viewchange', this.camera.getTransform());\n }\n\n zoomTo(scale: number): void {\n const rect = this.canvas.getBoundingClientRect();\n const centerX = rect.width / 2;\n const centerY = rect.height / 2;\n const factor = scale / this.camera.getTransform().scale;\n this.camera.zoom(centerX, centerY, factor);\n this.requestRender();\n this.emitter.emit('viewchange', this.camera.getTransform());\n }\n\n panTo(worldX: number, worldY: number): void {\n const rect = this.canvas.getBoundingClientRect();\n const vt = this.camera.getTransform();\n const currentSX = worldX * vt.scale + vt.offsetX;\n const currentSY = -worldY * vt.scale + vt.offsetY;\n const dx = rect.width / 2 - currentSX;\n const dy = rect.height / 2 - currentSY;\n this.camera.pan(dx, dy);\n this.requestRender();\n this.emitter.emit('viewchange', this.camera.getTransform());\n }\n\n getViewTransform(): ViewTransform {\n return { ...this.camera.getTransform() };\n }\n\n /** @internal */\n getZoomSpeed(): number {\n return this.options.zoomSpeed;\n }\n\n // === Layers ===\n\n getLayers(): DxfLayer[] {\n return this.layerManager.getAllLayers();\n }\n\n setLayerVisible(name: string, visible: boolean): void {\n this.layerManager.setVisible(name, visible);\n this.requestRender();\n }\n\n setLayerColor(name: string, color: string): void {\n this.layerManager.setColorOverride(name, color);\n this.requestRender();\n }\n\n // === Theme ===\n\n setTheme(theme: Theme): void {\n this.options.theme = theme;\n this.requestRender();\n }\n\n getTheme(): Theme {\n return this.options.theme;\n }\n\n setBackgroundColor(color: string): void {\n this.options.backgroundColor = color;\n this.requestRender();\n }\n\n // === Tools ===\n\n setTool(tool: Tool): void {\n if (this.currentTool === 'measure' && tool !== 'measure') {\n this.measureTool.deactivate();\n }\n this.currentTool = tool;\n this.canvas.style.cursor = this.getCursorForTool(tool);\n\n if (tool === 'measure') {\n this.measureTool.activate();\n }\n if (tool !== 'select') {\n this.selectedEntityIndex = -1;\n }\n this.requestRender();\n }\n\n getTool(): Tool {\n return this.currentTool;\n }\n\n private getCursorForTool(tool: Tool): string {\n switch (tool) {\n case 'pan': return 'grab';\n case 'select': return 'crosshair';\n case 'measure': return 'crosshair';\n }\n }\n\n // === Events ===\n\n on<K extends keyof CadViewerEventMap>(\n event: K,\n callback: (data: CadViewerEventMap[K]) => void,\n ): void {\n this.emitter.on(event, callback);\n }\n\n off<K extends keyof CadViewerEventMap>(\n event: K,\n callback: (data: CadViewerEventMap[K]) => void,\n ): void {\n this.emitter.off(event, callback);\n }\n\n // === Document Access ===\n\n getDocument(): DxfDocument | null {\n return this.doc;\n }\n\n getEntities(): DxfEntity[] {\n return this.doc?.entities ?? [];\n }\n\n // === Lifecycle ===\n\n resize(): void {\n this.renderer.updateSize();\n this.requestRender();\n }\n\n destroy(): void {\n this.destroyed = true;\n this.inputHandler.destroy();\n this.resizeObserver.disconnect();\n this.renderer.destroy();\n this.emitter.removeAllListeners();\n this.spatialIndex.clear();\n this.layerManager.clear();\n this.doc = null;\n }\n\n // === Internal (called by InputHandler) ===\n\n /** @internal */\n requestRender(): void {\n if (this.renderPending || this.destroyed) return;\n this.renderPending = true;\n requestAnimationFrame(() => {\n this.renderPending = false;\n if (this.destroyed) return;\n this.doRender();\n });\n }\n\n private doRender(): void {\n if (!this.doc) {\n this.renderer.renderEmpty(this.options.theme);\n return;\n }\n this.renderer.render(\n this.doc,\n this.camera.getTransform(),\n this.options.theme,\n this.layerManager.getVisibleLayerNames(),\n this.selectedEntityIndex,\n );\n\n // Render measurement overlay on top\n if (this.currentTool === 'measure' && this.measureTool.state.phase !== 'idle') {\n const ctx = this.renderer.getContext();\n renderMeasureOverlay(\n ctx,\n this.camera.getTransform(),\n this.measureTool,\n this.mouseScreenX,\n this.mouseScreenY,\n this.options.theme,\n );\n }\n }\n\n /** @internal */\n handlePan(dx: number, dy: number): void {\n this.camera.pan(dx, dy);\n this.requestRender();\n this.emitter.emit('viewchange', this.camera.getTransform());\n }\n\n /** @internal */\n handleZoom(screenX: number, screenY: number, factor: number): void {\n this.camera.zoom(screenX, screenY, factor);\n this.requestRender();\n this.emitter.emit('viewchange', this.camera.getTransform());\n }\n\n /** @internal */\n handleClick(screenX: number, screenY: number): void {\n if (!this.doc) return;\n const vt = this.camera.getTransform();\n const [wx, wy] = screenToWorld(vt, screenX, screenY);\n\n switch (this.currentTool) {\n case 'select':\n this.handleSelect(wx, wy, screenX, screenY);\n break;\n case 'measure': {\n const snaps = findSnaps(wx, wy, this.doc.entities, this.spatialIndex, vt.scale);\n const snap = snaps.length > 0 ? snaps[0]! : null;\n const result = this.measureTool.handleClick(wx, wy, snap);\n this.requestRender();\n if (result) {\n this.emitter.emit('measure', result);\n }\n break;\n }\n }\n }\n\n /** @internal — called by InputHandler for mouse move */\n handleMouseMove(screenX: number, screenY: number): void {\n this.mouseScreenX = screenX;\n this.mouseScreenY = screenY;\n\n if (this.currentTool === 'measure' && this.doc) {\n const vt = this.camera.getTransform();\n const [wx, wy] = screenToWorld(vt, screenX, screenY);\n const snaps = findSnaps(wx, wy, this.doc.entities, this.spatialIndex, vt.scale);\n this.measureTool.handleMove(snaps[0] ?? null);\n this.requestRender();\n }\n }\n\n private handleSelect(wx: number, wy: number, sx: number, sy: number): void {\n if (!this.doc) return;\n const index = hitTest(\n wx, wy,\n this.doc.entities,\n this.spatialIndex,\n this.layerManager.getVisibleLayerNames(),\n this.camera.getTransform().scale,\n );\n this.selectedEntityIndex = index;\n this.requestRender();\n\n if (index >= 0 && this.doc) {\n const entity = this.doc.entities[index];\n if (entity) {\n this.emitter.emit('select', {\n entity,\n entityIndex: index,\n worldPoint: { x: wx, y: wy },\n screenPoint: { x: sx, y: sy },\n });\n }\n }\n }\n\n private computeDocumentBounds(): { minX: number; minY: number; maxX: number; maxY: number } | null {\n if (!this.doc) return null;\n\n if (this.doc.header.extMin && this.doc.header.extMax) {\n return {\n minX: this.doc.header.extMin.x,\n minY: this.doc.header.extMin.y,\n maxX: this.doc.header.extMax.x,\n maxY: this.doc.header.extMax.y,\n };\n }\n\n return computeEntitiesBounds(this.doc.entities);\n }\n}\n"]}
|